ZGlmZiAtLWdpdCBhL3htbHNjaGVtYXMuYyBiL3htbHNjaGVtYXMuYwppbmRleCBkN2ZhNTE1Li5kMmRkYzU5IDEwMDY0NAotLS0gYS94bWxzY2hlbWFzLmMKKysrIGIveG1sc2NoZW1hcy5jCkBAIC0zODUyLDEzICszODUyLDIyIEBACiAgICAgaWYgKHR5cGUtPnR5cGUgIT0gWE1MX1NDSEVNQV9UWVBFX0JBU0lDKSB7CiAJeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgCiAJICAgIFhNTF9TQ0hFTUFQX0lOVEVSTkFMLAotCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVB2YWx1ZUF0dHJOb2RlLCB0aGUgZ2l2ZW4gIgorCSAgICAiSW50ZXJuYWwgZXJyb3I6IHhtbFNjaGVtYVBWYWxBdHRyTm9kZVZhbHVlLCB0aGUgZ2l2ZW4gIgogCSAgICAidHlwZSAnJXMnIGlzIG5vdCBhIGJ1aWx0LWluIHR5cGUuXG4iLAogCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKIAlyZXR1cm4gKC0xKTsKICAgICB9ICAgIAogICAgIHN3aXRjaCAodHlwZS0+YnVpbHRJblR5cGUpIHsKIAljYXNlIFhNTF9TQ0hFTUFTX05DTkFNRToKKwljYXNlIFhNTF9TQ0hFTUFTX1FOQU1FOgorCWNhc2UgWE1MX1NDSEVNQVNfQU5ZVVJJOgorCWNhc2UgWE1MX1NDSEVNQVNfVE9LRU46CisJY2FzZSBYTUxfU0NIRU1BU19MQU5HVUFHRToKKwkgICAgcmV0ID0geG1sU2NoZW1hVmFsUHJlZGVmVHlwZU5vZGUodHlwZSwgdmFsdWUsIE5VTEwsICh4bWxOb2RlUHRyKSBhdHRyKTsKKwkgICAgYnJlYWs7CisKKwkvKgorCWNhc2UgWE1MX1NDSEVNQVNfTkNOQU1FOgogCSAgICByZXQgPSB4bWxWYWxpZGF0ZU5DTmFtZSh2YWx1ZSwgMSk7CiAJICAgIGJyZWFrOwogCWNhc2UgWE1MX1NDSEVNQVNfUU5BTUU6CkBAIC0zOTAzLDEwICszOTEyLDExIEBACiAJICAgIGlmICh4bWxDaGVja0xhbmd1YWdlSUQodmFsdWUpICE9IDEpIAogCQlyZXQgPSAxOwogCSAgICBicmVhazsKKwkqLwogCWRlZmF1bHQ6IHsKIAkgICAgeG1sU2NoZW1hUEVycihjdHh0LCAoeG1sTm9kZVB0cikgYXR0ciwgCiAJCSAgICBYTUxfU0NIRU1BUF9JTlRFUk5BTCwKLQkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hUHZhbHVlQXR0ck5vZGUsICIKKwkJICAgICJJbnRlcm5hbCBlcnJvcjogeG1sU2NoZW1hUFZhbEF0dHJOb2RlVmFsdWUsICIKIAkJICAgICJ2YWx1ZWlkYXRpb24gdXNpbmcgdGhlIHR5cGUgJyVzJyBpcyBub3QgaW1wbGVtZW50ZWQgIgogCQkgICAgInlldC5cbiIsCiAJCSAgICB0eXBlLT5uYW1lLCBOVUxMKTsKQEAgLTM5MTYsNyArMzkyNiwxNCBAQAogICAgIC8qCiAgICAgKiBUT0RPOiBTaG91bGQgd2UgdXNlIHRoZSBTNFMgZXJyb3IgY29kZXMgaW5zdGVhZD8KICAgICAqLwotICAgIGlmIChyZXQgPiAwKSB7IAkKKyAgICBpZiAocmV0IDwgMCkgeworCXhtbFNjaGVtYVBFcnIoY3R4dCwgKHhtbE5vZGVQdHIpIGF0dHIsIAorCSAgICBYTUxfU0NIRU1BUF9JTlRFUk5BTCwKKwkgICAgIkludGVybmFsIGVycm9yOiB4bWxTY2hlbWFQVmFsQXR0ck5vZGVWYWx1ZSwgIgorCSAgICAiZmFpbGVkIHRvIHZhbGlkYXRlIGEgc2NoZW1hIGF0dHJpYnV0ZSB2YWx1ZS5cbiIsCisJICAgIE5VTEwsIE5VTEwpOworCXJldHVybiAoLTEpOworICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeyAJCiAJaWYgKHR5cGUtPmZsYWdzICYgWE1MX1NDSEVNQVNfVFlQRV9WQVJJRVRZX0xJU1QpIHsJICAgCiAJICAgIHhtbFNjaGVtYVBTaW1wbGVUeXBlRXJyKGN0eHQsIAogCQlYTUxfU0NIRU1BVl9DVkNfREFUQVRZUEVfVkFMSURfMV8yXzIsIApAQCAtNTI5NSw4ICs1MzEyLDcgQEAKIAkgICAgTlVMTCwgYXR0ciwgJnJlZk5zLCAmcmVmUHJlZml4LCAmcmVmKTsJCQkKIAkgCiAgICAgICAgIHNucHJpbnRmKGJ1ZiwgNDksICIjZVJlZiAlZCIsIGN0eHQtPmNvdW50ZXIrKyArIDEpOwotCW5hbWUgPSAoY29uc3QgeG1sQ2hhciAqKSBidWY7Ci0JcmV0ID0geG1sU2NoZW1hQWRkRWxlbWVudChjdHh0LCBzY2hlbWEsIG5hbWUsIE5VTEwsIG5vZGUsIDApOworCXJldCA9IHhtbFNjaGVtYUFkZEVsZW1lbnQoY3R4dCwgc2NoZW1hLCAoY29uc3QgeG1sQ2hhciAqKSBidWYsIE5VTEwsIG5vZGUsIDApOwogCWlmIChyZXQgPT0gTlVMTCkgewogCSAgICBpZiAocmVwTmFtZSAhPSBOVUxMKQogCQl4bWxGcmVlKHJlcE5hbWUpOwpAQCAtNTUzOCw3ICs1NTU0LDcgQEAKICAgICAvKgogICAgICogQW5kIG5vdyBmb3IgdGhlIGNoaWxkcmVuLi4uCiAgICAgKi8KLSAgICBjdHh0LT5jb250YWluZXIgPSBuYW1lOworICAgIGN0eHQtPmNvbnRhaW5lciA9IHJldC0+bmFtZTsKICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKIAlyZXQtPmFubm90ID0geG1sU2NoZW1hUGFyc2VBbm5vdGF0aW9uKGN0eHQsIHNjaGVtYSwgY2hpbGQpOwpAQCAtNTU4NSw3ICs1NjAxLDcgQEAKIAl9CQogCXdoaWxlICgoSVNfU0NIRU1BKGNoaWxkLCAidW5pcXVlIikpIHx8CiAJICAgIChJU19TQ0hFTUEoY2hpbGQsICJrZXkiKSkgfHwgKElTX1NDSEVNQShjaGlsZCwgImtleXJlZiIpKSkgewotCSAgICBUT0RPIGNoaWxkID0gY2hpbGQtPm5leHQ7CisJICAgIC8qVE9ETyovIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAJfQogCWlmIChjaGlsZCAhPSBOVUxMKSB7CiAJICAgIHhtbFNjaGVtYVBDb250ZW50RXJyKGN0eHQsCkBAIC02MDYwLDYgKzYwNzYsNyBAQAogICAgIHhtbFNjaGVtYVR5cGVQdHIgdHlwZSwgc3VidHlwZSwgbGFzdCA9IE5VTEw7CiAgICAgeG1sTm9kZVB0ciBjaGlsZCA9IE5VTEw7CiAgICAgeG1sQ2hhciBuYW1lWzMwXTsKKyAgICBjb25zdCB4bWxDaGFyICpvbGRjb250YWluZXI7CiAKICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKHNjaGVtYSA9PSBOVUxMKSB8fCAobm9kZSA9PSBOVUxMKSkKICAgICAgICAgcmV0dXJuIChOVUxMKTsKQEAgLTYwNzUsNyArNjA5Miw5IEBACiAKICAgICB0eXBlLT5taW5PY2N1cnMgPSB4bWxHZXRNaW5PY2N1cnMoY3R4dCwgbm9kZSwgMCwgMSwgMSwgIigwIHwgMSkiKTsKICAgICB0eXBlLT5tYXhPY2N1cnMgPSB4bWxHZXRNYXhPY2N1cnMoY3R4dCwgbm9kZSwgMSwgMSwgMSwgIjEiKTsgICAgCi0KKyAgICAKKyAgICBvbGRjb250YWluZXIgPSBjdHh0LT5jb250YWluZXI7CisgICAgY3R4dC0+Y29udGFpbmVyID0gKGNvbnN0IHhtbENoYXIgKikgbmFtZTsKICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKICAgICAgICAgdHlwZS0+YW5ub3QgPSB4bWxTY2hlbWFQYXJzZUFubm90YXRpb24oY3R4dCwgc2NoZW1hLCBjaGlsZCk7CkBAIC02MTA5LDcgKzYxMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAiPGFsbD4gaGFzIHVuZXhwZWN0ZWQgY29udGVudC5cbiIsIHR5cGUtPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIH0KLQorICAgIGN0eHQtPmNvbnRhaW5lciA9IG9sZGNvbnRhaW5lcjsKICAgICByZXR1cm4gKHR5cGUpOwogfQogCkBAIC03MDg1LDYgKzcxMDQsNyBAQAogICAgIHhtbE5vZGVQdHIgY2hpbGQgPSBOVUxMOwogICAgIHhtbENoYXIgbmFtZVszMF07CiAgICAgeG1sQXR0clB0ciBhdHRyOworICAgIGNvbnN0IHhtbENoYXIgKm9sZGNvbnRhaW5lcjsKIAogICAgIGlmICgoY3R4dCA9PSBOVUxMKSB8fCAoc2NoZW1hID09IE5VTEwpIHx8IChub2RlID09IE5VTEwpKQogICAgICAgICByZXR1cm4gKE5VTEwpOwpAQCAtNzEyNiw2ICs3MTQ2LDggQEAKICAgICAvKgogICAgICogQW5kIG5vdyBmb3IgdGhlIGNoaWxkcmVuLi4uCiAgICAgKi8KKyAgICBvbGRjb250YWluZXIgPSBjdHh0LT5jb250YWluZXI7CisgICAgY3R4dC0+Y29udGFpbmVyID0gKGNvbnN0IHhtbENoYXIgKikgbmFtZTsKICAgICBjaGlsZCA9IG5vZGUtPmNoaWxkcmVuOwogICAgIGlmIChJU19TQ0hFTUEoY2hpbGQsICJhbm5vdGF0aW9uIikpIHsKICAgICAgICAgdHlwZS0+YW5ub3QgPSB4bWxTY2hlbWFQYXJzZUFubm90YXRpb24oY3R4dCwgc2NoZW1hLCBjaGlsZCk7CkBAIC03MTY4LDcgKzcxOTAsNyBAQAogCSAgICBOVUxMLCB0eXBlLCBub2RlLCBjaGlsZCwgTlVMTCwKIAkgICAgIihhbm5vdGF0aW9uPywgKGVsZW1lbnQgfCBncm91cCB8IGNob2ljZSB8IHNlcXVlbmNlIHwgYW55KSopIik7CiAgICAgfQotCisgICAgY3R4dC0+Y29udGFpbmVyID0gb2xkY29udGFpbmVyOwogICAgIHJldHVybiAodHlwZSk7CiB9CiAKQEAgLTc5OTEsNyArODAxMyw2IEBACiAgICAgKi8KICAgICBpZiAoKGN0eHQgPT0gTlVMTCkgfHwgKG5vZGUgPT0gTlVMTCkpCiAgICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgCiAgICAgbmJlcnJvcnMgPSBjdHh0LT5uYmVycm9yczsKICAgICBjdHh0LT5uYmVycm9ycyA9IDA7CiAgICAgaWYgKElTX1NDSEVNQShub2RlLCAic2NoZW1hIikpIHsKQEAgLTEzNjI1LDMwICsxMzY0Niw3IEBACiAgICAgcmV0dXJuICgiSW50ZXJuYWwgRXJyb3IiKTsKIH0KIAotc3RhdGljIHhtbENoYXIgKgoteG1sU2NoZW1hV2hpdGVTcGFjZVJlcGxhY2UoY29uc3QgeG1sQ2hhciAqdmFsdWUpIHsKLSAgICBjb25zdCB4bWxDaGFyICpjdXIgPSB2YWx1ZTsgICAgCi0gICAgeG1sQ2hhciAqcmV0ID0gTlVMTCwgKm1jdXI7IAogCi0gICAgaWYgKHZhbHVlID09IE5VTEwpIAotCXJldHVybihOVUxMKTsKLSAgICAKLSAgICB3aGlsZSAoKCpjdXIgIT0gMCkgJiYgCi0JKCgoKmN1cikgIT0gMHhkKSAmJiAoKCpjdXIpICE9IDB4OSkgJiYgKCgqY3VyKSAhPSAweGEpKSkgewotCWN1cisrOwotICAgIH0KLSAgICBpZiAoKmN1ciA9PSAwKQotCXJldHVybiAoTlVMTCk7Ci0gICAgcmV0ID0geG1sU3RyZHVwKHZhbHVlKTsKLSAgICAvKiBUT0RPIEZJWE1FOiBJIGd1ZXNzIGdjYyB3aWxsIGJhcmsgYXQgdGhpcy4gKi8KLSAgICBtY3VyID0gKHhtbENoYXIgKikgIChyZXQgKyAoY3VyIC0gdmFsdWUpKTsKLSAgICBkbyB7Ci0JaWYgKCAoKCptY3VyKSA9PSAweGQpIHx8ICgoKm1jdXIpID09IDB4OSkgfHwgKCgqbWN1cikgPT0gMHhhKSApCi0JICAgICptY3VyID0gJyAnOwotCW1jdXIrKzsKLSAgICB9IHdoaWxlICgqbWN1ciAhPSAwKTsJICAgIAotICAgIHJldHVybihyZXQpOwotfQogCiBzdGF0aWMgaW50CiB4bWxTY2hlbWFHZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSh4bWxTY2hlbWFUeXBlUHRyIHR5cGUpCkBAIC0xMzY2MCwxMCArMTM2NTgsMTAgQEAKICAgICAqIGZyb20geHNkOnN0cmluZy4KICAgICAqLwogICAgIGlmICh0eXBlLT50eXBlID09IFhNTF9TQ0hFTUFfVFlQRV9CQVNJQykgewotCWlmICgodHlwZS0+YnVpbHRJblR5cGUgPT0gWE1MX1NDSEVNQVNfU1RSSU5HKSAmJgotICAgICAgICAgICAgKHR5cGUtPmJ1aWx0SW5UeXBlID09IFhNTF9TQ0hFTUFTX05PUk1TVFJJTkcpKQotCisJaWYgKHR5cGUtPmJ1aWx0SW5UeXBlID09IFhNTF9TQ0hFTUFTX1NUUklORykKIAkgICAgcmV0dXJuKFhNTF9TQ0hFTUFTX1ZBTF9XVFNQX1BSRVNFUlZFKTsKKwllbHNlIGlmICh0eXBlLT5idWlsdEluVHlwZSA9PSBYTUxfU0NIRU1BU19OT1JNU1RSSU5HKQorCSAgICByZXR1cm4oWE1MX1NDSEVNQVNfVkFMX1dUU1BfUkVQTEFDRSk7CiAJZWxzZSB7CiAJICAgIC8qCiAJICAgICogRm9yIGFsbCC3YXRvbWljtyBkYXRhdHlwZXMgb3RoZXIgdGhhbiBzdHJpbmcgKGFuZCB0eXBlcyC3ZGVyaXZlZLcgCg==