ZGlmZiAtLWdpdCBhL2NvbmYvbmdpbnguY29uZiBiL2NvbmYvbmdpbnguY29uZgppbmRleCBmZmUxYmY2Li5hNGMxZmM1IDEwMDY0NAotLS0gYS9jb25mL25naW54LmNvbmYKKysrIGIvY29uZi9uZ2lueC5jb25mCkBAIC0zNyw3ICszNyw3IEBACiAKICAgICAgICAgIyBkZW55IGFjY2VzcyB0byAuaHRhY2Nlc3MgZmlsZXMKICAgICAgICAgIwotICAgICAgICAjbG9jYXRpb24gfiBcLmh0IHsKKyAgICAgICAgI2xvY2F0aW9uIH4gL1wuaHQgewogICAgICAgICAjICAgIGRlbnkgIGFsbDsKICAgICAgICAgI30KICAgICB9CmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IDM2MmRiMjMuLjc1ZjhkMjYgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksMTI5IEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjEuMzgiIGRhdGU9IjA4LjA3LjIwMDUiPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIGxpbWl0X3JhdGUg0M/ExMXS1snXwcXU09Eg1yDSxdbJzcUg0NLPy9PJIMkgRmFzdENHSS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAibGltaXRfcmF0ZSIgZGlyZWN0aXZlIGlzIHN1cHBvcnRlZCBpbiBpbiBwcm94eSBhbmQgRmFzdENHSSBtb2RlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivXINLF1snNxSDQ0s/L08kgySBGYXN0Q0dJINDPxMTF0tbJ18HF1NPRINPU0s/LwSDawcfPzM/Xy8EgIlgtQWNjZWwtTGltaXQtUmF0ZSIKK9cgz9TXxdTFIMLcy8XOxMEuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgIlgtQWNjZWwtTGltaXQtUmF0ZSIgcmVzcG9uc2UgaGVhZGVyIGxpbmUgaXMgc3VwcG9ydGVkIGluIHByb3h5IGFuZCBGYXN0Q0dJCittb2RlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgYnJlYWsuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImJyZWFrIiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBsb2dfbm90X2ZvdW5kLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJsb2dfbm90X2ZvdW5kIiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgor0NLJINDF0sXOwdDSwdfMxc7JySDawdDSz9PBINMg0M/Nz93YwCDT1NLPy8kg2sHHz8zP18vBICJYLUFjY2VsLVJlZGlyZWN0IgorzsUgydrNxc7RzNPRIMvPxCDP1NfF1MEuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgd2FzIG5vdCBjaGFuZ2VkIHdoZW4gcmVxdWVzdCB3YXMgcmVkaXJlY3RlZAorYnkgdGhlICIiWC1BY2NlbC1SZWRpcmVjdCIgaGVhZGVyIGxpbmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgor0MXSxc3Fzs7ZxSwg1dPUwc7P18zFzs7ZxSDEydLFy9TJ18/KIHNldCDOxSDNz8fMySDJ09DPzNjaz9fB1NjT0SDXIFNTSS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSB2YXJpYWJsZXMgc2V0IGJ5IHRoZSAic2V0IiBkaXJlY3RpdmUgY291bGQgbm90IGJlIHVzZWQgaW4gU1NJLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK9DSySDXy8zA3sXOyckg1yBTU0kgws/MxcUgz8TOz8fPINXEwcyjzs7Px88g0M/E2sHQ0s/TwQorzc/HINDSz8naz8rUySBzZWdtZW50YXRpb24gZmF1bHQuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgc2VnbWVudGF0aW9uIGZhdWx0IG1heSBvY2N1cnJlZCBpZiB0aGUgU1NJIHBhZ2UgaGFzIG1vcmUgdGhhbiBvbmUKK3JlbW90ZSBzdWJyZXF1ZXN0LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8XTzMkg09TB1NXTzsHRINPU0s/LwSDXIM/U18XUxSDC3MvFzsTBINDF0sXEwdfBzMHT2CDXIMTX1cgg0MHLxdTByCwg1M8KK25naW54INPeydTBzCDP1NfF1CDOxdfF0s7ZzTsKK8/bycLLwSDQz9HXyczB09gg1yAwLjEuMjkuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CituZ2lueCB0cmVhdGVkIHRoZSBiYWNrZW5kIHJlc3BvbnNlIGFzIGludmFsaWQgaWYgdGhlIHN0YXR1cyBsaW5lIGluIHRoZQoraGVhZGVyIHdhcyB0cmFuc2ZlcnJlZCBpbiB0d28gcGFja2V0czsKK2J1ZyBhcHBlYXJlZCBpbiAwLjEuMjkuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBzc2lfdHlwZXMuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInNzaV90eXBlcyIgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgYXV0b2luZGV4X2V4YWN0X3NpemUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImF1dG9pbmRleF9leGFjdF9zaXplIiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX2F1dG9pbmRleF9tb2R1bGUgzsUg0M/ExMXS1snXwcwgxMzJzs7ZxSDJzcXOwSDGwcrMz9cg1yBVVEYtOC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlIGRpZCBub3Qgc3VwcG9ydCB0aGUgbG9uZyBmaWxlIG5hbWVzIGluIFVURi04LgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CitJTUFQL1BPUDMg0NLPy9PJLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIElNQVAvUE9QMyBwcm94eS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjEuMzciIGRhdGU9IjIzLjA2LjIwMDUiPgogCiA8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+CkBAIC0zMTYsNyArNDM5LDcgQEAKIAogPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KIDxwYXJhIGxhbmc9InJ1Ij4KLdcg0sXWyc3FINDSz8vTySDJIEZhc3RDR0kg0M/ExMXS1snXwcXU09Eg09TSz8vBINrBx8/Mz9fLwSBYLUFjY2VsLVJlZGlyZWN0CivXINLF1snNxSDQ0s/L08kgySBGYXN0Q0dJINDPxMTF0tbJ18HF1NPRINPU0s/LwSDawcfPzM/Xy8EgIlgtQWNjZWwtUmVkaXJlY3QiCiDXIM/U18XUxSDC3MvFzsTBLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmdpbnguaCBiL3NyYy9jb3JlL25naW54LmgKaW5kZXggZjlmMWEwNi4uMjIxYmEzOCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmdpbnguaAorKysgYi9zcmMvY29yZS9uZ2lueC5oCkBAIC04LDcgKzgsNyBAQAogI2RlZmluZSBfTkdJTlhfSF9JTkNMVURFRF8KIAogCi0jZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4xLjM3IgorI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4zOCIKIAogI2RlZmluZSBOR0lOWF9WQVIgICAgICAgICAgIk5HSU5YIgogI2RlZmluZSBOR1hfTkVXUElEX0VYVCAgICAgIi5uZXdiaW4iCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaAppbmRleCAwMjI0ZDk4Li4xMGE1Y2Q1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5oCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmgKQEAgLTEyOCw2ICsxMjgsNyBAQAogICAgIHVuc2lnbmVkICAgICAgICAgICAgc2luZ2xlX2Nvbm5lY3Rpb246MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgIHVuZXhwZWN0ZWRfZW9mOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICB0aW1lZG91dDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgY2xvc2VkOjE7CiAKICAgICB1bnNpZ25lZCAgICAgICAgICAgIHNlbmRmaWxlOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICBzbmRsb3dhdDoxOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3BhbGxvYy5jIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCmluZGV4IGU3Yzg4ODIuLjliYjUwZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9wYWxsb2MuYworKysgYi9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogICAgIHAgPSBuZ3hfYWxsb2Moc2l6ZSwgbG9nKTsKICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHAtPmxhc3QgPSAodV9jaGFyICopIHAgKyBzaXplb2Yobmd4X3Bvb2xfdCk7CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmMgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKaW5kZXggZTIxYTlmYy4uNTc1ZTYwZSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5jCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuYwpAQCAtNzUzLDIwICs3NTMsNjIgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGMgPCAweEMwKSB7Ci0gICAgICAgICAgICAvKiBpbnZhbGlkIHV0ZiAqLwotICAgICAgICAgICAgcmV0dXJuIHV0Zi0+bGVuOworICAgICAgICBpZiAoYyA+PSAweGMwKSB7CisgICAgICAgICAgICBmb3IgKGMgPDw9IDE7IGMgJiAweDgwOyBjIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoYyA8PD0gMTsgYyAmIDB4ODA7IGMgPDw9IDEpIHsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQorICAgICAgICAvKiBpbnZhbGlkIHV0ZiAqLworCisgICAgICAgIHJldHVybiB1dGYtPmxlbjsKICAgICB9CiAKICAgICByZXR1cm4gbGVuOwogfQogCiAKK3VfY2hhciAqCituZ3hfdXRmX2NweXN0cm4odV9jaGFyICpkc3QsIHVfY2hhciAqc3JjLCBzaXplX3QgbikKK3sKKyAgICB1X2NoYXIgIGM7CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIHJldHVybiBkc3Q7CisgICAgfQorCisgICAgZm9yICggLyogdm9pZCAqLyA7IC0tbjsgZHN0KyssIHNyYysrKSB7CisKKyAgICAgICAgYyA9ICpzcmM7CisgICAgICAgICpkc3QgPSBjOworCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgaWYgKCpkc3QgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZHN0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgPj0gMHhjMCkgeworICAgICAgICAgICAgZm9yIChjIDw8PSAxOyBjICYgMHg4MDsgYyA8PD0gMSkgeworICAgICAgICAgICAgICAgKisrZHN0ID0gKisrc3JjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGludmFsaWQgdXRmICovCisgICAgfQorCisgICAgKmRzdCA9ICdcMCc7CisKKyAgICByZXR1cm4gZHN0OworfQorCisKIHVpbnRwdHJfdAogbmd4X2VzY2FwZV91cmkodV9jaGFyICpkc3QsIHVfY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSwgbmd4X3VpbnRfdCB0eXBlKQogewpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3N0cmluZy5oIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5oCmluZGV4IGZmMjE2MTkuLjU0NWM2Y2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9zdHJpbmcuaAorKysgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKQEAgLTk3LDYgKzk3LDggQEAKIG5neF9pbnRfdCBuZ3hfZGVjb2RlX2Jhc2U2NChuZ3hfc3RyX3QgKmRzdCwgbmd4X3N0cl90ICpzcmMpOwogCiBzaXplX3Qgbmd4X3V0Zl9sZW5ndGgobmd4X3N0cl90ICp1dGYpOwordV9jaGFyICogbmd4X3V0Zl9jcHlzdHJuKHVfY2hhciAqZHN0LCB1X2NoYXIgKnNyYywgc2l6ZV90IG4pOworCiAKICNkZWZpbmUgTkdYX0VTQ0FQRV9VUkkgICAwCiAjZGVmaW5lIE5HWF9FU0NBUEVfQVJHUyAgMQpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jCmluZGV4IDEyMmIwOTEuLjgzOGIyN2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9ydHNpZ19tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcnRzaWdfbW9kdWxlLmMKQEAgLTc2MSw3ICs3NjEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGN5Y2xlLT5sb2csIDAsCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBjeWNsZS0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgInJ0IHNpZ25hbCBxdWV1ZSBvdmVyZmxvdyByZWNvdmVyZWQiKTsKIAogICAgIG92ZXJmbG93ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfcGlwZS5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKaW5kZXggZTE4NjIxMS4uNzRjZmFjMiAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMKQEAgLTE4Miw3ICsxODIsOCBAQAogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFwLT5jYWNoYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAmJiBwLT5kb3duc3RyZWFtLT5kYXRhID09IHAtPm91dHB1dF9jdHgKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgcC0+ZG93bnN0cmVhbS0+d3JpdGUtPnJlYWR5KQorICAgICAgICAgICAgICAgICAgICAgICAmJiBwLT5kb3duc3RyZWFtLT53cml0ZS0+cmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIXAtPmRvd25zdHJlYW0tPndyaXRlLT5kZWxheWVkKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogaWYgdGhlIGJ1ZnMgYXJlIG5vdCBuZWVkZWQgdG8gYmUgc2F2ZWQgaW4gYSBjYWNoZSBhbmQKQEAgLTQ2MSw3ICs0NjIsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHAtPmRvd25zdHJlYW0tPmRhdGEgIT0gcC0+b3V0cHV0X2N0eAotICAgICAgICAgICAgfHwgIXAtPmRvd25zdHJlYW0tPndyaXRlLT5yZWFkeSkKKyAgICAgICAgICAgIHx8ICFwLT5kb3duc3RyZWFtLT53cml0ZS0+cmVhZHkKKyAgICAgICAgICAgIHx8IHAtPmRvd25zdHJlYW0tPndyaXRlLT5kZWxheWVkKQogICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYwppbmRleCBlMjZkMjk0Li5kMTI4MzQwIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9tb2R1bGUuYwpAQCAtMzUsNiArMzUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9mbGFnX3QgICAgIGVuYWJsZTsKICAgICBuZ3hfZmxhZ190ICAgICBsb2NhbHRpbWU7CisgICAgbmd4X2ZsYWdfdCAgICAgZXhhY3Rfc2l6ZTsKIH0gbmd4X2h0dHBfYXV0b2luZGV4X2xvY19jb25mX3Q7CiAKIApAQCAtNjcsNiArNjgsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2F1dG9pbmRleF9sb2NfY29uZl90LCBsb2NhbHRpbWUpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJhdXRvaW5kZXhfZXhhY3Rfc2l6ZSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfYXV0b2luZGV4X2xvY19jb25mX3QsIGV4YWN0X3NpemUpLAorICAgICAgTlVMTCB9LAorCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCkBAIC0xMTcsMTAgKzEyNSwxMSBAQAogc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfYXV0b2luZGV4X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAqbGFzdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKmxhc3QsIHNjYWxlOworICAgIG9mZl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBjb3B5OwogICAgIG5neF90bV90ICAgICAgICAgICAgICAgICAgICAgICAgdG07Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgIHJjLCBzaXplOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgaSwgbGV2ZWw7CiAgICAgbmd4X2Vycl90ICAgICAgICAgICAgICAgICAgICAgICBlcnI7CiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAgICpiOwpAQCAtMzUxLDcgKzM2MCw3IEBACiAgICAgICAgICAgICArIE5HWF9IVFRQX0FVVE9JTkRFWF9OQU1FX0xFTiArIHNpemVvZigiJmd0OyIpIC0gMgogICAgICAgICAgICAgKyBzaXplb2YoIjwvYT4iKSAtIDEKICAgICAgICAgICAgICsgc2l6ZW9mKCIgMjgtU2VwLTE5NzAgMTI6MDAgIikgLSAxCi0gICAgICAgICAgICArIDE5CisgICAgICAgICAgICArIDIwCiAgICAgICAgICAgICArIDI7CiAgICAgfQogCkBAIC0zOTYsMTQgKzQwNSwyNyBAQAogICAgICAgICAqYi0+bGFzdCsrID0gJyInOwogICAgICAgICAqYi0+bGFzdCsrID0gJz4nOwogCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5c3RybihiLT5sYXN0LCBlbnRyeVtpXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9BVVRPSU5ERVhfTkFNRV9MRU4gKyAxKTsKLQogICAgICAgICBsZW4gPSBlbnRyeVtpXS51dGZfbGVuOwogCisgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIGlmIChsZW4gPiBOR1hfSFRUUF9BVVRPSU5ERVhfTkFNRV9MRU4pIHsKKyAgICAgICAgICAgICAgICBjb3B5ID0gTkdYX0hUVFBfQVVUT0lOREVYX05BTUVfTEVOIC0gMyArIDE7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29weSA9IE5HWF9IVFRQX0FVVE9JTkRFWF9OQU1FX0xFTiArIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfdXRmX2NweXN0cm4oYi0+bGFzdCwgZW50cnlbaV0ubmFtZS5kYXRhLCBjb3B5KTsKKyAgICAgICAgICAgIGxhc3QgPSBiLT5sYXN0OworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweXN0cm4oYi0+bGFzdCwgZW50cnlbaV0ubmFtZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0FVVE9JTkRFWF9OQU1FX0xFTiArIDEpOworICAgICAgICAgICAgbGFzdCA9IGItPmxhc3QgLSAzOworICAgICAgICB9CisKICAgICAgICAgaWYgKGxlbiA+IE5HWF9IVFRQX0FVVE9JTkRFWF9OQU1FX0xFTikgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCAtIDMsICIuLiZndDs8L2E+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiLi4mZ3Q7PC9hPiIpIC0gMSk7CisgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShsYXN0LCAiLi4mZ3Q7PC9hPiIsIHNpemVvZigiLi4mZ3Q7PC9hPiIpIC0gMSk7CiAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChlbnRyeVtpXS5kaXIgJiYgTkdYX0hUVFBfQVVUT0lOREVYX05BTUVfTEVOIC0gbGVuID4gMCkgewpAQCAtNDI3LDEyICs0NDksNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLm5neF90bV9ob3VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0ubmd4X3RtX21pbik7CiAKLSAgICAgICAgaWYgKGVudHJ5W2ldLmRpcikgewotICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgICIgICAgICAgICAgICAgICAgICAtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiICAgICAgICAgICAgICAgICAgLSIpIC0gMSk7CisgICAgICAgIGlmIChhbGNmLT5leGFjdF9zaXplKSB7CisgICAgICAgICAgICBpZiAoZW50cnlbaV0uZGlyKSB7CisgICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgICIgICAgICAgICAgICAgICAgICAtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIiAgICAgICAgICAgICAgICAgIC0iKSAtIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X3NwcmludGYoYi0+bGFzdCwgIiUxOU8iLCBlbnRyeVtpXS5zaXplKTsKKyAgICAgICAgICAgIH0gCiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfc3ByaW50ZihiLT5sYXN0LCAiJTE5TyIsIGVudHJ5W2ldLnNpemUpOworICAgICAgICAgICAgaWYgKGVudHJ5W2ldLmRpcikgeworICAgICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICAiICAgICAtIiwgc2l6ZW9mKCIgICAgIC0iKSAtIDEpOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IGVudHJ5W2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMTAyNCAqIDEwMjQgKiAxMDI0IC0gMSkgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gKG5neF9pbnRfdCkgKGxlbmd0aCAvICgxMDI0ICogMTAyNCAqIDEwMjQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChsZW5ndGggJSAoMTAyNCAqIDEwMjQgKiAxMDI0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gKDEwMjQgKiAxMDI0ICogMTAyNCAvIDIgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICdHJzsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMTAyNCAqIDEwMjQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSAobmd4X2ludF90KSAobGVuZ3RoIC8gKDEwMjQgKiAxMDI0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoICUgKDEwMjQgKiAxMDI0KSkgPiAoMTAyNCAqIDEwMjQgLyAyIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY2FsZSA9ICdNJzsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gOTk5OSkgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gKG5neF9pbnRfdCkgKGxlbmd0aCAvIDEwMjQpOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICUgMTAyNCA+IDUxMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gJ0snOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IChuZ3hfaW50X3QpIGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAnICc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICIlNmkiLCBzaXplKTsKKworICAgICAgICAgICAgICAgIGlmIChzY2FsZSAhPSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgKmItPmxhc3QrKyA9IHNjYWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgICpiLT5sYXN0KysgPSBDUjsKQEAgLTU1OSw2ICs2MjQsNyBAQAogCiAgICAgY29uZi0+ZW5hYmxlID0gTkdYX0NPTkZfVU5TRVQ7CiAgICAgY29uZi0+bG9jYWx0aW1lID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+ZXhhY3Rfc2l6ZSA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgcmV0dXJuIGNvbmY7CiB9CkBAIC01NzIsNiArNjM4LDcgQEAKIAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCAwKTsKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5sb2NhbHRpbWUsIHByZXYtPmxvY2FsdGltZSwgMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+ZXhhY3Rfc2l6ZSwgcHJldi0+ZXhhY3Rfc2l6ZSwgMSk7CiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwppbmRleCBmN2NiOTJjLi41OTZlNTI0IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBuZ3hfZmxhZ190ICAgICAgICAgICBlbmFibGU7CiAgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgbm9fYnVmZmVyOwogCi0gICAgbmd4X2FycmF5X3QgICAgICAgICAqdHlwZXM7ICAgICAvKiBhcnJheSBvZiBuZ3hfaHR0cF9nemlwX3R5cGVfdCAqLworICAgIG5neF9hcnJheV90ICAgICAgICAgKnR5cGVzOyAgICAgLyogYXJyYXkgb2Ygbmd4X3N0cl90ICovCiAKICAgICBuZ3hfYnVmc190ICAgICAgICAgICBidWZzOwogCkBAIC0yOSwxMiArMjksNiBAQAogfSBuZ3hfaHR0cF9nemlwX2NvbmZfdDsKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgbmFtZTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICBlbmFibGU7Ci19IG5neF9odHRwX2d6aXBfdHlwZV90OwotCi0KICNkZWZpbmUgTkdYX0hUVFBfR1pJUF9QUk9YSUVEX09GRiAgICAgICAweDAwMDIKICNkZWZpbmUgTkdYX0hUVFBfR1pJUF9QUk9YSUVEX0VYUElSRUQgICAweDAwMDQKICNkZWZpbmUgTkdYX0hUVFBfR1pJUF9QUk9YSUVEX05PX0NBQ0hFICAweDAwMDgKQEAgLTkxLDIwICs4NSwxOCBAQAogc3RhdGljIHZvaWQgKm5neF9odHRwX2d6aXBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9nemlwX3NldF90eXBlcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9nemlwX3NldF93aW5kb3cobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpOwotc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfc2V0X2hhc2gobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfd2luZG93KG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9nemlwX2hhc2gobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpOwogCiAKIHN0YXRpYyBuZ3hfY29uZl9udW1fYm91bmRzX3QgIG5neF9odHRwX2d6aXBfY29tcF9sZXZlbF9ib3VuZHMgPSB7CiAgICAgbmd4X2NvbmZfY2hlY2tfbnVtX2JvdW5kcywgMSwgOQogfTsKIAotc3RhdGljIG5neF9jb25mX3Bvc3RfaGFuZGxlcl9wdCAgbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93X3AgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93Owotc3RhdGljIG5neF9jb25mX3Bvc3RfaGFuZGxlcl9wdCAgbmd4X2h0dHBfZ3ppcF9zZXRfaGFzaF9wID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfZ3ppcF9zZXRfaGFzaDsKK3N0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX2d6aXBfd2luZG93X3AgPSBuZ3hfaHR0cF9nemlwX3dpbmRvdzsKK3N0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX2d6aXBfaGFzaF9wID0gbmd4X2h0dHBfZ3ppcF9oYXNoOwogCiAKIApAQCAtMTQ4LDcgKzE0MCw3IEBACiAKICAgICB7IG5neF9zdHJpbmcoImd6aXBfdHlwZXMiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl8xTU9SRSwKLSAgICAgIG5neF9odHRwX2d6aXBfc2V0X3R5cGVzLAorICAgICAgbmd4X2h0dHBfZ3ppcF90eXBlcywKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMIH0sCkBAIC0xNjUsMTQgKzE1NywxNCBAQAogICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2d6aXBfY29uZl90LCB3Yml0cyksCi0gICAgICAmbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93X3AgfSwKKyAgICAgICZuZ3hfaHR0cF9nemlwX3dpbmRvd19wIH0sCiAKICAgICB7IG5neF9zdHJpbmcoImd6aXBfaGFzaCIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2d6aXBfY29uZl90LCBtZW1sZXZlbCksCi0gICAgICAmbmd4X2h0dHBfZ3ppcF9zZXRfaGFzaF9wIH0sCisgICAgICAmbmd4X2h0dHBfZ3ppcF9oYXNoX3AgfSwKIAogICAgIHsgbmd4X3N0cmluZygiZ3ppcF9ub19idWZmZXIiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLApAQCAtMjcwLDEwICsyNjIsMTAgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX2d6aXBfaGVhZGVyX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICBpLCBmb3VuZDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgKnR5cGU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICBpOwogICAgIG5neF9odHRwX2d6aXBfY3R4X3QgICAqY3R4OwogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICAqY29uZjsKLSAgICBuZ3hfaHR0cF9nemlwX3R5cGVfdCAgKnR5cGU7CiAKICAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUpOwogCkBAIC0yOTcsMjQgKzI4OSwyMSBAQAogICAgIH0KIAogCi0gICAgZm91bmQgPSAwOwogICAgIHR5cGUgPSBjb25mLT50eXBlcy0+ZWx0czsKLQogICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT50eXBlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA+PSB0eXBlW2ldLm5hbWUubGVuCisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID49IHR5cGVbaV0ubGVuCiAgICAgICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVbaV0ubmFtZS5kYXRhLCB0eXBlW2ldLm5hbWUubGVuKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVbaV0uZGF0YSwgdHlwZVtpXS5sZW4pID09IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKLSAgICB9CisgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKIAogCitmb3VuZDoKKwogICAgIGlmIChyLT5oZWFkZXJzX2luLnZpYSkgewogICAgICAgICBpZiAoY29uZi0+cHJveGllZCAmIE5HWF9IVFRQX0daSVBfUFJPWElFRF9PRkYpIHsKICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CkBAIC0xMDMxLDcgKzEwMjAsNyBAQAogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICBuZ3hfaHR0cF9nemlwX3R5cGVfdCAgKnR5cGU7CisgICAgbmd4X3N0cl90ICAqdHlwZTsKIAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCAwKTsKIApAQCAtMTA1MSw4ICsxMDQwLDcgQEAKIAogICAgIGlmIChjb25mLT50eXBlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChwcmV2LT50eXBlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25mLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2d6aXBfdHlwZV90KSk7CisgICAgICAgICAgICBjb25mLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfc3RyX3QpKTsKICAgICAgICAgICAgIGlmIChjb25mLT50eXBlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICAgICAgfQpAQCAtMTA2Miw5ICsxMDUwLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHR5cGUtPm5hbWUubGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7Ci0gICAgICAgICAgICB0eXBlLT5uYW1lLmRhdGEgPSAodV9jaGFyICopICJ0ZXh0L2h0bWwiOwotICAgICAgICAgICAgdHlwZS0+ZW5hYmxlID0gMTsKKyAgICAgICAgICAgIHR5cGUtPmxlbiA9IHNpemVvZigidGV4dC9odG1sIikgLSAxOworICAgICAgICAgICAgdHlwZS0+ZGF0YSA9ICh1X2NoYXIgKikgInRleHQvaHRtbCI7CiAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbmYtPnR5cGVzID0gcHJldi0+dHlwZXM7CkBAIC0xMDc2LDE3ICsxMDYzLDE1IEBACiAKIAogc3RhdGljIGNoYXIgKgotbmd4X2h0dHBfZ3ppcF9zZXRfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK25neF9odHRwX2d6aXBfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9nemlwX2NvbmZfdCAqZ2NmID0gY29uZjsKIAotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAqdmFsdWU7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICBpOwotICAgIG5neF9odHRwX2d6aXBfdHlwZV90ICAqdHlwZTsKKyAgICBuZ3hfc3RyX3QgICAqdmFsdWUsICp0eXBlOworICAgIG5neF91aW50X3QgICBpOwogCiAgICAgaWYgKGdjZi0+dHlwZXMgPT0gTlVMTCkgewotICAgICAgICBnY2YtPnR5cGVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2d6aXBfdHlwZV90KSk7CisgICAgICAgIGdjZi0+dHlwZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCA0LCBzaXplb2Yobmd4X3N0cl90KSk7CiAgICAgICAgIGlmIChnY2YtPnR5cGVzID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQpAQCAtMTA5Niw5ICsxMDgxLDggQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHR5cGUtPm5hbWUubGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7Ci0gICAgICAgIHR5cGUtPm5hbWUuZGF0YSA9ICh1X2NoYXIgKikgInRleHQvaHRtbCI7Ci0gICAgICAgIHR5cGUtPmVuYWJsZSA9IDE7CisgICAgICAgIHR5cGUtPmxlbiA9IHNpemVvZigidGV4dC9odG1sIikgLSAxOworICAgICAgICB0eXBlLT5kYXRhID0gKHVfY2hhciAqKSAidGV4dC9odG1sIjsKICAgICB9CiAKICAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwpAQCAtMTExNCwxNCArMTA5OCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgdHlwZS0+bmFtZS5sZW4gPSB2YWx1ZVtpXS5sZW47CisgICAgICAgIHR5cGUtPmxlbiA9IHZhbHVlW2ldLmxlbjsKIAotICAgICAgICB0eXBlLT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCB0eXBlLT5uYW1lLmxlbiArIDEpOwotICAgICAgICBpZiAodHlwZS0+bmFtZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgdHlwZS0+ZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHR5cGUtPmxlbiArIDEpOworICAgICAgICBpZiAodHlwZS0+ZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfY3B5c3Rybih0eXBlLT5uYW1lLmRhdGEsIHZhbHVlW2ldLmRhdGEsIHR5cGUtPm5hbWUubGVuICsgMSk7CisgICAgICAgIG5neF9jcHlzdHJuKHR5cGUtPmRhdGEsIHZhbHVlW2ldLmRhdGEsIHR5cGUtPmxlbiArIDEpOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKQEAgLTExMjksNyArMTExMyw3IEBACiAKIAogc3RhdGljIGNoYXIgKgotbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93KG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQorbmd4X2h0dHBfZ3ppcF93aW5kb3cobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpCiB7CiAgICAgaW50ICpucCA9IGRhdGE7CiAKQEAgLTExNTMsNyArMTEzNyw3IEBACiAKIAogc3RhdGljIGNoYXIgKgotbmd4X2h0dHBfZ3ppcF9zZXRfaGFzaChuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKK25neF9odHRwX2d6aXBfaGFzaChuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKIHsKICAgICBpbnQgKm5wID0gZGF0YTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKaW5kZXggODM2MjViZS4uODU1MDNkMCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCkBAIC05MTQsNyArOTE0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIC8qIGVuZCBvZiByZXF1ZXN0IGxpbmUgKi8KKyAgICAgICAgLyogZW5kIG9mIHN0YXR1cyBsaW5lICovCiAgICAgICAgIGNhc2Ugc3dfYWxtb3N0X2RvbmU6CiAgICAgICAgICAgICBwLT5zdGF0dXNfZW5kID0gcG9zIC0gMTsKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKQEAgLTkyNiw3ICs5MjYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdS0+aGVhZGVyX2luLnBvcyA9IHBvcyArIDE7CisgICAgdS0+aGVhZGVyX2luLnBvcyA9IHBvczsKICAgICByLT5zdGF0ZSA9IHN0YXRlOwogCiAgICAgcmV0dXJuIE5HWF9BR0FJTjsKQEAgLTE4MDMsNyArMTgwMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxjZi0+cGVlcnMtPm51bWJlcjsgaSsrKSB7Ci0gICAgICAgICAgICBwbGNmLT5wZWVycy0+cGVlcltpXS51cmlfc2VwYXJhdG9yID0gIjoiOworICAgICAgICAgICAgcGxjZi0+cGVlcnMtPnBlZXJbaV0udXJpX3NlcGFyYXRvciA9ICIiOwogICAgICAgICB9CiAKICAgICAgICAgcGxjZi0+aG9zdF9oZWFkZXIgPSBpbmV0X3Vwc3RyZWFtLmhvc3RfaGVhZGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCmluZGV4IGVkN2FiZDYuLjVmNzNjMDIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMKQEAgLTM2LDYgKzM2LDggQEAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfcmV0dXJuKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9icmVhayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgIHZvaWQgKmNvbmYpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfaWYobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICogbmd4X2h0dHBfcmV3cml0ZV9pZl9jb25kaXRpb24obmd4X2NvbmZfdCAqY2YsCkBAIC02Niw2ICs2OCwxNCBAQAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygiYnJlYWsiKSwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX1NJRl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9OT0FSR1MsCisgICAgICBuZ3hfaHR0cF9yZXdyaXRlX2JyZWFrLAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygiaWYiKSwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0JMT0NLfE5HWF9DT05GXzFNT1JFLAogICAgICAgbmd4X2h0dHBfcmV3cml0ZV9pZiwKQEAgLTYwMSw2ICs2MTEsMjQgQEAKIAogCiBzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9yZXdyaXRlX2JyZWFrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOworCisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICpjb2RlOworCisgICAgY29kZSA9IG5neF9odHRwX3NjcmlwdF9zdGFydF9jb2RlKGNmLT5wb29sLCAmbGNmLT5jb2Rlcywgc2l6ZW9mKHVpbnRwdHJfdCkpOworICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgICpjb2RlID0gbmd4X2h0dHBfc2NyaXB0X2JyZWFrX2NvZGU7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKworc3RhdGljIGNoYXIgKgogbmd4X2h0dHBfcmV3cml0ZV9pZihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwppbmRleCAyOTkyZmY1Li44NTY3MjZhIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCkBAIC0yNCw2ICsyNCw4IEBACiAgICAgbmd4X2ZsYWdfdCAgICAgICAgc2lsZW50X2Vycm9yczsKICAgICBuZ3hfZmxhZ190ICAgICAgICBpZ25vcmVfcmVjeWNsZWRfYnVmZmVyczsKIAorICAgIG5neF9hcnJheV90ICAgICAgKnR5cGVzOyAgICAgLyogYXJyYXkgb2Ygbmd4X3N0cl90ICovCisKICAgICBzaXplX3QgICAgICAgICAgICBtaW5fZmlsZV9jaHVuazsKICAgICBzaXplX3QgICAgICAgICAgICB2YWx1ZV9sZW47CiB9IG5neF9odHRwX3NzaV9jb25mX3Q7CkBAIC0xMjcsNiArMTI5LDggQEAKIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKICAgICBuZ3hfaHR0cF9zc2lfZGF0ZV9nbXRfbG9jYWxfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZ210KTsKIAorc3RhdGljIGNoYXIgKm5neF9odHRwX3NzaV90eXBlcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKKwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfc3NpX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zc2lfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwKQEAgLTE2NCw2ICsxNjgsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIG1pbl9maWxlX2NodW5rKSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygic3NpX3R5cGVzIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCisgICAgICBuZ3hfaHR0cF9zc2lfdHlwZXMsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCkBAIC0yMDEsNyArMjEyLDcgQEAKIAogc3RhdGljIHVfY2hhciBuZ3hfaHR0cF9zc2lfc3RyaW5nW10gPSAiPCEtLSI7CiBzdGF0aWMgdV9jaGFyIG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmdbXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICJbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZGlyZWN0aXZlXSI7CisgICAgIlthbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXJlY3RpdmVdIjsKIAogc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9zc2lfbm9uZSA9IG5neF9zdHJpbmcoIihub25lKSIpOwogCkBAIC0yODAsMjUgKzI5MSwzNSBAQAogc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfc3NpX2hlYWRlcl9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogeworICAgIG5neF91aW50X3QgICAgICAgICAgICBpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICp0eXBlOwogICAgIG5neF9odHRwX3NzaV9jdHhfdCAgICpjdHg7CiAgICAgbmd4X2h0dHBfc3NpX2NvbmZfdCAgKmNvbmY7CiAKICAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CiAKLSAgICBpZiAoIWNvbmYtPmVuYWJsZSkgewotICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwotICAgIH0KLQotICAgIC8qIFRPRE86ICJ0ZXh0L2h0bWwiIC0+IGN1c3RvbSB0eXBlcyAqLwotCi0gICAgaWYgKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4gPT0gMAotICAgICAgICB8fCBuZ3hfc3RybmNhc2VjbXAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEsICJ0ZXh0L2h0bWwiLCA1KQotICAgICAgICAgICAhPSAwKQorICAgIGlmICghY29uZi0+ZW5hYmxlCisgICAgICAgIHx8IHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4gPT0gMCkKICAgICB7CiAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CiAgICAgfQogCiAKKyAgICB0eXBlID0gY29uZi0+dHlwZXMtPmVsdHM7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPnR5cGVzLT5uZWx0czsgaSsrKSB7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID49IHR5cGVbaV0ubGVuCisgICAgICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVtpXS5kYXRhLCB0eXBlW2ldLmxlbikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CisKKworZm91bmQ6CisKICAgICBjdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfc3NpX2N0eF90KSk7CiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CkBAIC0xNjMyLDYgKzE2NTMsNTYgQEAKIH0KIAogCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9zc2lfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICpzY2YgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgKnZhbHVlLCAqdHlwZTsKKyAgICBuZ3hfdWludF90ICAgaTsKKworICAgIGlmIChzY2YtPnR5cGVzID09IE5VTEwpIHsKKyAgICAgICAgc2NmLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfc3RyX3QpKTsKKyAgICAgICAgaWYgKHNjZi0+dHlwZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdHlwZSA9IG5neF9hcnJheV9wdXNoKHNjZi0+dHlwZXMpOworICAgICAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB0eXBlLT5sZW4gPSBzaXplb2YoInRleHQvaHRtbCIpIC0gMTsKKyAgICAgICAgdHlwZS0+ZGF0YSA9ICh1X2NoYXIgKikgInRleHQvaHRtbCI7CisgICAgfQorCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHM7IGkrKykgeworCisgICAgICAgIGlmIChuZ3hfc3RyY21wKHZhbHVlW2ldLmRhdGEsICJ0ZXh0L2h0bWwiKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGUgPSBuZ3hfYXJyYXlfcHVzaChzY2YtPnR5cGVzKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdHlwZS0+bGVuID0gdmFsdWVbaV0ubGVuOworCisgICAgICAgIHR5cGUtPmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCB0eXBlLT5sZW4gKyAxKTsKKyAgICAgICAgaWYgKHR5cGUtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X2NweXN0cm4odHlwZS0+ZGF0YSwgdmFsdWVbaV0uZGF0YSwgdHlwZS0+bGVuICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3NzaV9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKQogewpAQCAtMTY2MSw2ICsxNzMyLDEyIEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKKyAgICAvKgorICAgICAqIHNldCBieSBuZ3hfcGNhbGxvYygpOgorICAgICAqCisgICAgICogICAgIGNvbmYtPnR5cGVzID0gTlVMTDsKKyAgICAgKi8KKwogICAgIGNvbmYtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNvbmYtPnNpbGVudF9lcnJvcnMgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBjb25mLT5pZ25vcmVfcmVjeWNsZWRfYnVmZmVycyA9IE5HWF9DT05GX1VOU0VUOwpAQCAtMTY3OCw2ICsxNzU1LDggQEAKICAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX3NzaV9jb25mX3QgKmNvbmYgPSBjaGlsZDsKIAorICAgIG5neF9zdHJfdCAgKnR5cGU7CisKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5lbmFibGUsIHByZXYtPmVuYWJsZSwgMCk7CiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+c2lsZW50X2Vycm9ycywgcHJldi0+c2lsZW50X2Vycm9ycywgMCk7CiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+aWdub3JlX3JlY3ljbGVkX2J1ZmZlcnMsCkBAIC0xNjg2LDYgKzE3NjUsMjYgQEAKICAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPm1pbl9maWxlX2NodW5rLCBwcmV2LT5taW5fZmlsZV9jaHVuaywgMTAyNCk7CiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT52YWx1ZV9sZW4sIHByZXYtPnZhbHVlX2xlbiwgMjU2KTsKIAorICAgIGlmIChjb25mLT50eXBlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2LT50eXBlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb25mLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfc3RyX3QpKTsKKyAgICAgICAgICAgIGlmIChjb25mLT50eXBlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0eXBlID0gbmd4X2FycmF5X3B1c2goY29uZi0+dHlwZXMpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHlwZS0+bGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7CisgICAgICAgICAgICB0eXBlLT5kYXRhID0gKHVfY2hhciAqKSAidGV4dC9odG1sIjsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZi0+dHlwZXMgPSBwcmV2LT50eXBlczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwppbmRleCBhODRhNzBlLi41NGU2MjRmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwpAQCAtMjEwLDggKzIxMCwxMCBAQAogICAgICAgICAgICAgcmMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfbG9nX2Vycm9yKGxldmVsLCBsb2csIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfb3Blbl9maWxlX24gIiBcIiVzXCIgZmFpbGVkIiwgbmFtZS5kYXRhKTsKKyAgICAgICAgaWYgKHJjICE9IE5HWF9IVFRQX05PVF9GT1VORCB8fCBjbGNmLT5sb2dfbm90X2ZvdW5kKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKGxldmVsLCBsb2csIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X29wZW5fZmlsZV9uICIgXCIlc1wiIGZhaWxlZCIsIG5hbWUuZGF0YSk7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYwppbmRleCA1NTYxMTM0Li40NjcxNTQ4IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYwpAQCAtNjgsMTMgKzY4LDE3IEBACiAgICAgbmd4X291dHB1dF9jaGFpbl9jdHhfdCAgICAgICAqY3R4OwogICAgIG5neF9odHRwX2NvcHlfZmlsdGVyX2NvbmZfdCAgKmNvbmY7CiAKLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVycm9yKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImNvcHkgZmlsdGVyOiBcIiVWXCIiLCAmci0+dXJpKTsKIAorICAgIGlmIChyLT5jb25uZWN0aW9uLT5jbG9zZWQpIHsKKyAgICAgICAgcmMgPSBuZ3hfaHR0cF9uZXh0X2ZpbHRlcihyLCBpbik7CisKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJjb3B5IGNsb3NlZCBmaWx0ZXI6ICVpIFwiJVZcIiIsIHJjLCAmci0+dXJpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKwogICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZSk7CiAKICAgICBpZiAoY3R4ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IDFkMzk5NzAuLmFkNTA1ODUgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtMzI2LDYgKzMyNiwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCBtc2llX3BhZGRpbmcpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJsb2dfbm90X2ZvdW5kIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QsIGxvZ19ub3RfZm91bmQpLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJlcnJvcl9wYWdlIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0hUVFBfTElGX0NPTkYKICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl8yTU9SRSwKQEAgLTYzMyw2ICs2NDAsOCBAQAogICAgICAgICByZXR1cm4gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFk7CiAgICAgfQogCisgICAgci0+bGltaXRfcmF0ZSA9IGNsY2YtPmxpbWl0X3JhdGU7CisKICAgICBpZiAoY2xjZi0+aGFuZGxlcikgewogICAgICAgICByLT5jb250ZW50X2hhbmRsZXIgPSBjbGNmLT5oYW5kbGVyOwogICAgIH0KQEAgLTg2MiwxMCArODcxLDYgQEAKIHsKICAgICBuZ3hfaW50X3QgIHJjOwogCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPndyaXRlLT5lcnJvcikgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIG91dHB1dCBmaWx0ZXIgXCIlVlwiIiwgJnItPnVyaSk7CiAKQEAgLTg3Myw3ICs4NzgsNyBAQAogCiAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgewogICAgICAgICAvKiBOR1hfRVJST1IgbWF5IGJlIHJldHVybmVkIGJ5IGFueSBmaWx0ZXIgKi8KLSAgICAgICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVycm9yID0gMTsKKyAgICAgICAgci0+Y29ubmVjdGlvbi0+Y2xvc2VkID0gMTsKICAgICB9CiAKICAgICByZXR1cm4gcmM7CkBAIC0xNzI3LDYgKzE3MzIsNyBAQAogICAgIGxjZi0+cmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiA9IE5HWF9DT05GX1VOU0VUOwogICAgIGxjZi0+cG9ydF9pbl9yZWRpcmVjdCA9IE5HWF9DT05GX1VOU0VUOwogICAgIGxjZi0+bXNpZV9wYWRkaW5nID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgbGNmLT5sb2dfbm90X2ZvdW5kID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICByZXR1cm4gbGNmOwogfQpAQCAtMTg0MSw2ICsxODQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnJlc2V0X3RpbWVkb3V0X2Nvbm5lY3Rpb24sIDApOwogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnBvcnRfaW5fcmVkaXJlY3QsIHByZXYtPnBvcnRfaW5fcmVkaXJlY3QsIDEpOwogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPm1zaWVfcGFkZGluZywgcHJldi0+bXNpZV9wYWRkaW5nLCAxKTsKKyAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5sb2dfbm90X2ZvdW5kLCBwcmV2LT5sb2dfbm90X2ZvdW5kLCAxKTsKIAogICAgIGlmIChjb25mLT5vcGVuX2ZpbGVzID09IE5VTEwpIHsKICAgICAgICAgY29uZi0+b3Blbl9maWxlcyA9IHByZXYtPm9wZW5fZmlsZXM7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaAppbmRleCAxMTY0MDQ2Li4xZjZiMTg1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKQEAgLTIyNCw2ICsyMjQsNyBAQAogICAgIG5neF9mbGFnX3QgICAgcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbjsgLyogcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiAqLwogICAgIG5neF9mbGFnX3QgICAgcG9ydF9pbl9yZWRpcmVjdDsgICAgICAgIC8qIHBvcnRfaW5fcmVkaXJlY3QgKi8KICAgICBuZ3hfZmxhZ190ICAgIG1zaWVfcGFkZGluZzsgICAgICAgICAgICAvKiBtc2llX3BhZGRpbmcgKi8KKyAgICBuZ3hfZmxhZ190ICAgIGxvZ19ub3RfZm91bmQ7ICAgICAgICAgICAvKiBsb2dfbm90X2ZvdW5kICovCiAKICAgICBuZ3hfYXJyYXlfdCAgKmVycm9yX3BhZ2VzOyAgICAgICAgICAgICAvKiBlcnJvcl9wYWdlICovCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9tb2R1bGUuYwppbmRleCA4ZTQ3ODE2Li5kN2QzMzhmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZS5jCkBAIC00OCwxMyArNDgsMTggQEAKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAqbXI7CiAgICAgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCAgKnByLCAqKnBwcjsKIAotICAgIGlmIChyLT5jb25uZWN0aW9uLT53cml0ZS0+ZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9Ci0KICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiaHR0cCBwb3N0cG9uZSBmaWx0ZXIgXCIlVlwiICVwIiwgJnItPnVyaSwgaW4pOwogCisgICAgaWYgKHItPmNvbm5lY3Rpb24tPmNsb3NlZCkgeworCisgICAgICAgIGlmIChyLT5wb3N0cG9uZWQpIHsKKyAgICAgICAgICAgIHItPnBvc3Rwb25lZCA9IHItPnBvc3Rwb25lZC0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCiAgICAgaWYgKHIgIT0gci0+Y29ubmVjdGlvbi0+ZGF0YSB8fCAoci0+cG9zdHBvbmVkICYmIGluKSkgewogCiAgICAgICAgIGlmIChyLT5wb3N0cG9uZWQpIHsKQEAgLTExMiw3ICsxMTcsNyBAQAogCiAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgewogICAgICAgICAvKiBOR1hfRVJST1IgbWF5IGJlIHJldHVybmVkIGJ5IGFueSBmaWx0ZXIgKi8KLSAgICAgICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVycm9yID0gMTsKKyAgICAgICAgci0+Y29ubmVjdGlvbi0+Y2xvc2VkID0gMTsKICAgICB9CiAKICAgICByZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggOWNlZDAyOC4uZjQxYTg5MSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtOTAsMTEgKzkwLDYgQEAKICAgICB7IG5neF9zdHJpbmcoIlJhbmdlIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgcmFuZ2UpLAogICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCiAKLSNpZiAwCi0gICAgeyBuZ3hfc3RyaW5nKCJJZi1SYW5nZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGlmX3JhbmdlKSwKLSAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAotI2VuZGlmCi0KICNpZiAoTkdYX0hUVFBfR1pJUCkKICAgICB7IG5neF9zdHJpbmcoIkFjY2VwdC1FbmNvZGluZyIpLAogICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdF9lbmNvZGluZyksCkBAIC0xNDQxLDYgKzE0MzYsOCBAQAogICAgIHItPmRvbmUgPSAxOwogCiAgICAgaWYgKHIgIT0gci0+Y29ubmVjdGlvbi0+ZGF0YSkgeworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZmluYWxpemUgbm9uLWFjdGl2ZSByZXF1ZXN0OiBcIiVWXCIiLCAmci0+dXJpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTQ0OCwxMiArMTQ0NSwxOCBAQAogCiAgICAgICAgIHByID0gci0+cGFyZW50OwogCisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwYXJlbnQgcmVxdWVzdDogXCIlVlwiIiwgJnByLT51cmkpOworCiAgICAgICAgIGlmIChyYyAhPSBOR1hfQUdBSU4pIHsKICAgICAgICAgICAgIHByLT5jb25uZWN0aW9uLT5kYXRhID0gcHI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHItPnBvc3Rwb25lZCkgewogCisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHJlcXVlc3Q6IFwiJVZcIiBoYXMgcG9zdHBvbmVkIiwgJnByLT51cmkpOworCiAgICAgICAgICAgICBpZiAocmMgIT0gTkdYX0FHQUlOICYmIHByLT5wb3N0cG9uZWQtPnJlcXVlc3QgPT0gcikgewogICAgICAgICAgICAgICAgIHByLT5wb3N0cG9uZWQgPSBwci0+cG9zdHBvbmVkLT5uZXh0OwogCkBAIC0xNDYyLDkgKzE0NjUsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcmVxdWVzdDogXCIlVlwiIHN0aWxsIGhhcyBwb3N0cG9uZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByLT51cmkpOworCiAgICAgICAgICAgICBpZiAocHItPmRvbmUpIHsKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCB3YWtlIHJlcXVlc3Q6IFwiJVZcIiIsICZwci0+dXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCB3YWtlIHBhcmVudCByZXF1ZXN0OiBcIiVWXCIiLCAmcHItPnVyaSk7CiAKICAgICAgICAgICAgICAgICBwci0+d3JpdGVfZXZlbnRfaGFuZGxlcihwcik7CiAgICAgICAgICAgICB9CkBAIC0xNDgzLDcgKzE0OTAsNyBAQAogICAgICAgICAgICAgbmd4X2RlbF90aW1lcihyLT5jb25uZWN0aW9uLT53cml0ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocmMgPT0gTkdYX0hUVFBfQ0xJRU5UX0NMT1NFRF9SRVFVRVNUIHx8IHItPmNsb3NlZCkgeworICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+Y2xvc2VkKSB7CiAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE0OTIsMTMgKzE0OTksMTUgQEAKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBuZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlX2hhbmRsZXIociwgcmMpKTsKIAogICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SIHx8IHItPmNvbm5lY3Rpb24tPmNsb3NlZCkgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfQUdBSU4gfHwgci0+b3V0KSB7CisgICAgaWYgKHJjID09IE5HWF9BR0FJTiB8fCByLT5vdXQpIHsKICAgICAgICAgKHZvaWQpIG5neF9odHRwX3NldF93cml0ZV9oYW5kbGVyKHIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTU1Myw2ICsxNTYyLDEwIEBACiAKICAgICByLT53cml0ZV9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfd3JpdGVyOwogCisgICAgaWYgKHItPmNvbm5lY3Rpb24tPmNsb3NlZCkgeworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKwogICAgIHdldiA9IHItPmNvbm5lY3Rpb24tPndyaXRlOwogCiAgICAgaWYgKHdldi0+cmVhZHkgJiYgd2V2LT5kZWxheWVkKSB7CkBAIC0xNjczLDYgKzE2ODYsOSBAQAogbmd4X2h0dHBfcG9zdHBvbmVkX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICByYzsKKyNpZiAwCisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgKm1yOworI2VuZGlmCiAgICAgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCAgKnByOwogCiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCkBAIC0xNjg3LDIwICsxNzAzLDE2IEBACiAgICAgICAgIHJjID0gbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcihyLCBOVUxMKTsKIAogICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHBvc3Rwb25lZCBvdXRwdXQgZmlsdGVyOiAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcG9zdHBvbmVkIG91dHB1dCBmaWx0ZXI6ICVkIiwgcmMpOwogCiAgICAgICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIC8qIE5HWF9FUlJPUiBtYXkgYmUgcmV0dXJuZWQgYnkgYW55IGZpbHRlciAqLwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVycm9yID0gMTsKLQotICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByYyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBOR1hfRE9ORTsKLSAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiB3ZSB0cmVhdCBOR1hfRVJST1IgYXMgTkdYX09LLCBiZWNhdXNlIHdlIG5lZWQgdG8gY29tcGxldGUKKyAgICAgICAgICogYWxsIHBvc3Rwb25lZCByZXF1ZXN0cworICAgICAgICAgKi8KIAogICAgICAgICBwciA9IHItPnBvc3Rwb25lZDsKIApAQCAtMTcxMyw3ICsxNzI1LDcgQEAKICAgICByLT5jb25uZWN0aW9uLT5kYXRhID0gcjsKIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHBvc3Rwb25lZCByZXF1ZXN0IFwiJVZcIiIsICZyLT51cmkpOworICAgICAgICAgICAgICAgICAgICJodHRwIHdha2UgY2hpbGQgcmVxdWVzdCBcIiVWXCIiLCAmci0+dXJpKTsKIAogICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIocik7CiAKQEAgLTE4MzMsNyArMTg0NSw3IEBACiAKICAgICBpZiAobiA9PSBOR1hfRVJST1IpIHsKIAotICAgICAgICByLT5jbG9zZWQgPSAxOworICAgICAgICByLT5jb25uZWN0aW9uLT5jbG9zZWQgPSAxOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIGlmIGEgY2xpZW50IHJlcXVlc3QgYm9keSBpcyBkaXNjYXJkZWQgdGhlbiB3ZSBhbHJlYWR5IHNldApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCmluZGV4IDQ3MGY1ODQuLmQxYmE3NzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKQEAgLTMxMCw2ICszMTAsOCBAQAogCiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAgICAqKnZhcmlhYmxlczsKIAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdF9yYXRlOworCiAgICAgLyogdXNlZCB0byBsZWFybiB0aGUgQXBhY2hlIGNvbXBhdGlibGUgcmVzcG9uc2UgbGVuZ3RoIHdpdGhvdXQgYSBoZWFkZXIgKi8KICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NpemU7CiAKQEAgLTM2MSw3ICszNjMsNiBAQAogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwYWxpdmU6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZ2VyaW5nX2Nsb3NlOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjE7Ci0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZDoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHV0Zjg6MTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdF9ib2R5LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYwppbmRleCA0MmVkZmVmLi5lYjJlNmE1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobiA9PSAwIHx8IG4gPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICByLT5jbG9zZWQgPSAxOworICAgICAgICAgICAgYy0+Y2xvc2VkID0gMTsKICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9CQURfUkVRVUVTVDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCmluZGV4IDg5MjU2YjMuLjcxNmE2ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCkBAIC01NTgsNiArNTU4LDcgQEAKIAogICAgICAgICBpZiAoY29kZS0+YnJlYWtfY3ljbGUpIHsKICAgICAgICAgICAgIHItPnZhbGlkX2xvY2F0aW9uID0gMDsKKyAgICAgICAgICAgIHItPnVyaV9jaGFuZ2VkID0gMDsKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgci0+dXJpX2NoYW5nZWQgPSAxOwpAQCAtNzEzLDYgKzcxNCwxNSBAQAogCiAKIHZvaWQKK25neF9odHRwX3NjcmlwdF9icmVha19jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK3sKKyAgICBlLT5yZXF1ZXN0LT51cmlfY2hhbmdlZCA9IDA7CisKKyAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OworfQorCisKK3ZvaWQKIG5neF9odHRwX3NjcmlwdF9pZl9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKIHsKICAgICBuZ3hfaHR0cF9zY3JpcHRfaWZfY29kZV90ICAqY29kZTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKaW5kZXggZWI2ZjE3ZS4uMjE2MjU0MiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogdm9pZCBuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfZW5kX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKICNlbmRpZgogdm9pZCBuZ3hfaHR0cF9zY3JpcHRfcmV0dXJuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X2JyZWFrX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKIHZvaWQgbmd4X2h0dHBfc2NyaXB0X2lmX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKIHZvaWQgbmd4X2h0dHBfc2NyaXB0X2NvbXBsZXhfdmFsdWVfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwogdm9pZCBuZ3hfaHR0cF9zY3JpcHRfdmFsdWVfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZS5jCmluZGV4IDdhMzQxNTkuLjE0ZDRjODAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlLmMKQEAgLTI0NCw2ICsyNDQsOSBAQAogICAgIG5neF9odHRwX2Vycl9wYWdlX3QgICAgICAgKmVycl9wYWdlOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKKyAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzcGVjaWFsIHJlc3BvbnNlOiAlZCwgXCIlVlwiIiwgZXJyb3IsICZyLT51cmkpOworCiAgICAgcmMgPSBuZ3hfaHR0cF9kaXNjYXJkX2JvZHkocik7CiAKICAgICBpZiAocmMgPT0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwppbmRleCBkN2VlMDhmLi44NTcxYjg2IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKQEAgLTM5LDYgKzM5LDggQEAKICAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19saW1pdF9yYXRlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CiBzdGF0aWMgbmd4X2ludF90CkBAIC0xNDMsNiArMTQ1LDEwIEBACiAgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCwgeF9hY2NlbF9yZWRpcmVjdCksCiAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2lnbm9yZV9oZWFkZXJfbGluZSwgMCwgMCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJYLUFjY2VsLUxpbWl0LVJhdGUiKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19saW1pdF9yYXRlLCAwLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9pZ25vcmVfaGVhZGVyX2xpbmUsIDAsIDAgfSwKKwogI2lmIChOR1hfSFRUUF9HWklQKQogICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1FbmNvZGluZyIpLAogICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcl9saW5lLApAQCAtMjk5LDEyICszMDUsMTkgQEAKICAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAqYzsKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAqdTsKIAotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCB1cHN0cmVhbSBjaGVjayBjbGllbnQsIHdyaXRlIGV2ZW50OiVkIiwgZXYtPndyaXRlKTsKKyAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgdXBzdHJlYW0gY2hlY2sgY2xpZW50LCB3cml0ZSBldmVudDolZCwgXCIlVlwiIiwKKyAgICAgICAgICAgICAgICAgICBldi0+d3JpdGUsICZyLT51cmkpOwogCiAgICAgYyA9IHItPmNvbm5lY3Rpb247CiAgICAgdSA9IHItPnVwc3RyZWFtOwogCisgICAgaWYgKGMtPmNsb3NlZCkgeworICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfQ0xJRU5UX0NMT1NFRF9SRVFVRVNUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmICh1LT5wZWVyLmNvbm5lY3Rpb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzE4LDYgKzMzMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBldi0+ZW9mID0gMTsKKyAgICAgICAgYy0+Y2xvc2VkID0gMTsKIAogICAgICAgICBpZiAoZXYtPmtxX2Vycm5vKSB7CiAgICAgICAgICAgICBldi0+ZXJyb3IgPSAxOwpAQCAtMzI1LDkgKzMzOSw4IEBACiAKICAgICAgICAgaWYgKCF1LT5jYWNoYWJsZSAmJiB1LT5wZWVyLmNvbm5lY3Rpb24pIHsKICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBldi0+bG9nLCBldi0+a3FfZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJrZXZlbnQoKSByZXBvcnRlZCB0aGF0IGNsaWVudCBjbG9zZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlbWF0dXJlbHkgY29ubmVjdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAic28gdXBzdHJlYW0gY29ubmVjdGlvbiBpcyBjbG9zZWQgdG9vIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXZlbnQoKSByZXBvcnRlZCB0aGF0IGNsaWVudCBjbG9zZWQgcHJlbWF0dXJlbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiwgc28gdXBzdHJlYW0gY29ubmVjdGlvbiBpcyBjbG9zZWQgdG9vIik7CiAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNzQsNiArMzg3LDcgQEAKICAgICB9CiAKICAgICBldi0+ZW9mID0gMTsKKyAgICBjLT5jbG9zZWQgPSAxOwogCiAgICAgaWYgKG4gPT0gLTEpIHsKICAgICAgICAgaWYgKGVyciA9PSBOR1hfRUFHQUlOKSB7CkBAIC05MjQsNiArOTM4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lLmxlbiA9IDA7CisKICAgICAgICAgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT51cHN0cmVhbS0+aGVhZGVyc19pbi54X2FjY2VsX3JlZGlyZWN0LT52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwpAQCAtMTE1NSw5ICsxMTcxLDMzIEBACiAKICAgICBpZiAoZXYtPnRpbWVkb3V0KSB7CiAgICAgICAgIGlmIChldi0+d3JpdGUpIHsKLSAgICAgICAgICAgIHAtPmRvd25zdHJlYW1fZXJyb3IgPSAxOwotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgYy0+bG9nLCBOR1hfRVRJTUVET1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHRpbWVkIG91dCIpOworICAgICAgICAgICAgaWYgKGV2LT5kZWxheWVkKSB7CisKKyAgICAgICAgICAgICAgICBldi0+dGltZWRvdXQgPSAwOworICAgICAgICAgICAgICAgIGV2LT5kZWxheWVkID0gMDsKKworICAgICAgICAgICAgICAgIGlmICghZXYtPnJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9hZGRfdGltZXIoZXYsIHAtPnNlbmRfdGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9oYW5kbGVfd3JpdGVfZXZlbnQoZXYsIHAtPnNlbmRfbG93YXQpID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmd4X2V2ZW50X3BpcGUocCwgZXYtPndyaXRlKSA9PSBOR1hfQUJPUlQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwLT5kb3duc3RyZWFtX2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBjLT5sb2csIE5HWF9FVElNRURPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHRpbWVkIG91dCIpOworICAgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwLT51cHN0cmVhbV9lcnJvciA9IDE7IApAQCAtMTE2Niw2ICsxMjA2LDE3IEBACiAgICAgICAgIH0KIAogICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChldi0+d3JpdGUgJiYgZXYtPmRlbGF5ZWQpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZG93bnN0cmVhbSBkZWxheWVkIik7CisKKyAgICAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGV2LCBwLT5zZW5kX2xvd2F0KSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZ3hfZXZlbnRfcGlwZShwLCBldi0+d3JpdGUpID09IE5HWF9BQk9SVCkgewogICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCAwKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTEyODEsNiArMTMzMiw3IEBACiAgICAgfQogCiAgICAgaWYgKHItPmNvbm5lY3Rpb24tPndyaXRlLT5lb2YpIHsKKyAgICAgICAgci0+Y29ubmVjdGlvbi0+Y2xvc2VkID0gMTsKICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7CiAgICAgICAgIHJldHVybjsKQEAgLTE0MzIsNiArMTQ4NCwyNCBAQAogCiAKIHN0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfbGltaXRfcmF0ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBuZ3hfdWludF90IG9mZnNldCkKK3sgICAKKyAgICBuZ3hfaW50X3QgIG47CisKKyAgICByLT51cHN0cmVhbS0+aGVhZGVyc19pbi54X2FjY2VsX2xpbWl0X3JhdGUgPSBoOworCisgICAgbiA9IG5neF9hdG9pKGgtPnZhbHVlLmRhdGEsIGgtPnZhbHVlLmxlbik7CisKKyAgICBpZiAobiAhPSBOR1hfRVJST1IpIHsKKyAgICAgICAgci0+bGltaXRfcmF0ZSA9IChzaXplX3QpIG47CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF91cHN0cmVhbV9jb3B5X2hlYWRlcl9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3RhYmxlX2VsdF90ICpoLAogICAgIG5neF91aW50X3Qgb2Zmc2V0KQogewpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaCBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKaW5kZXggMDBhNjRhYy4uNDI4MjUzYyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCkBAIC00OCw2ICs0OCw3IEBACiAgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3RpbWVvdXQ7CiAgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RpbWVvdXQ7CiAgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICByZWFkX3RpbWVvdXQ7CisgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OwogCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2xvd2F0OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2J1ZmZlcl9zaXplOwpAQCAtMTAzLDYgKzEwNCw3IEBACiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICpldGFnOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqeF9hY2NlbF9leHBpcmVzOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqeF9hY2NlbF9yZWRpcmVjdDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKnhfYWNjZWxfbGltaXRfcmF0ZTsKIAogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF90eXBlOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF9sZW5ndGg7CkBAIC0xMjAsOCArMTIyLDYgQEAKIAogCiBzdHJ1Y3Qgbmd4X2h0dHBfdXBzdHJlYW1fcyB7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgICpyZXF1ZXN0OwotCiAgICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAgICAgICAgICBwZWVyOwogCiAgICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAgICAgICBwaXBlOwpAQCAtMTQ2LDYgKzE0Niw4IEBACiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgKCpyZXdyaXRlX3JlZGlyZWN0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBzaXplX3QgcHJlZml4KTsKIAorICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDsKKwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOwogCiAgICAgbmd4X2h0dHBfbG9nX2hhbmRsZXJfcHQgICAgICAgICBzYXZlZF9sb2dfaGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKaW5kZXggZDY2ZjBkYy4uMmE1Y2Y3ZCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKQEAgLTcwNiw3ICs3MDYsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZbaV0uaGFuZGxlciA9IGF2W25dLmhhbmRsZXI7CiAgICAgICAgICAgICAgICAgdltpXS5kYXRhID0gYXZbbl0uZGF0YTsKLSAgICAgICAgICAgICAgICB2W2ldLmZsYWdzID0gYXZbbl0uZmxhZ3MgfCBOR1hfSFRUUF9WQVJfSU5ERVhFRDsKKworICAgICAgICAgICAgICAgIGF2W25dLmZsYWdzIHw9IE5HWF9IVFRQX1ZBUl9JTkRFWEVEOworICAgICAgICAgICAgICAgIHZbaV0uZmxhZ3MgPSBhdltuXS5mbGFnczsKIAogICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUuYwppbmRleCBiODcyZjNkLi5hZjk1Yzk5IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jCkBAIC00Nyw2ICs0NywxMiBAQAogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAorICAgIGMgPSByLT5jb25uZWN0aW9uOworCisgICAgaWYgKGMtPmNsb3NlZCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKwogICAgIHNpemUgPSAwOwogICAgIGZsdXNoID0gMDsKICAgICBsYXN0ID0gMDsKQEAgLTE1MSw4ICsxNTcsNiBAQAogCiAgICAgKmxsID0gTlVMTDsKIAotICAgIGMgPSByLT5jb25uZWN0aW9uOwotCiAgICAgbmd4X2xvZ19kZWJ1ZzMoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgd3JpdGUgZmlsdGVyOiBsOiVkIGY6JWQgczolTyIsIGxhc3QsIGZsdXNoLCBzaXplKTsKIApAQCAtMTk3LDE5ICsyMDEsMjAgQEAKIAogICAgIHNlbnQgPSBjLT5zZW50OwogCi0gICAgY2hhaW4gPSBjLT5zZW5kX2NoYWluKGMsIHItPm91dCwgY2xjZi0+bGltaXRfcmF0ZSk7CisgICAgY2hhaW4gPSBjLT5zZW5kX2NoYWluKGMsIHItPm91dCwgci0+bGltaXRfcmF0ZSk7CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiaHR0cCB3cml0ZSBmaWx0ZXIgJXAiLCBjaGFpbik7CiAKLSAgICBpZiAoY2xjZi0+bGltaXRfcmF0ZSkgeworICAgIGlmIChyLT5saW1pdF9yYXRlKSB7CiAgICAgICAgIHNlbnQgPSBjLT5zZW50IC0gc2VudDsKICAgICAgICAgYy0+d3JpdGUtPmRlbGF5ZWQgPSAxOwogICAgICAgICBuZ3hfYWRkX3RpbWVyKHItPmNvbm5lY3Rpb24tPndyaXRlLAotICAgICAgICAgICAgICAgICAgICAgIChuZ3hfbXNlY190KSAoc2VudCAqIDEwMDAgLyBjbGNmLT5saW1pdF9yYXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgKG5neF9tc2VjX3QpIChzZW50ICogMTAwMCAvIHItPmxpbWl0X3JhdGUpKTsKICAgICB9CiAKICAgICBpZiAoY2hhaW4gPT0gTkdYX0NIQUlOX0VSUk9SKSB7CisgICAgICAgIGMtPmNsb3NlZCA9IDE7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcC5oIGIvc3JjL2ltYXAvbmd4X2ltYXAuaAppbmRleCA1YmEzOTAwLi44YTUwNmRiIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcC5oCisrKyBiL3NyYy9pbWFwL25neF9pbWFwLmgKQEAgLTM2LDYgKzM2LDEyIEBACiAKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgcHJvdG9jb2w7CiAKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAqcG9wM19jYXBhYmlsaXR5OworICAgIG5neF9idWZfdCAgICAgICAgICAgICppbWFwX2NhcGFiaWxpdHk7CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgcG9wM19jYXBhYmlsaXRpZXM7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgIGltYXBfY2FwYWJpbGl0aWVzOworCiAgICAgLyogc2VydmVyIGN0eCAqLwogICAgIG5neF9pbWFwX2NvbmZfY3R4X3QgICpjdHg7CiB9IG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdDsKQEAgLTUxLDExICs1NywyMCBAQAogCiAKIHR5cGVkZWYgZW51bSB7Ci0gICAgbmd4X3BvcDNfc3RhcnQgPSAwLAotICAgIG5neF9wb3AzX3VzZXIKKyAgICBuZ3hfaW1hcF9zdGFydCA9IDAsCisgICAgbmd4X2ltYXBfbG9naW4sCisgICAgbmd4X2ltYXBfdXNlciwKKyAgICBuZ3hfaW1hcF9wYXNzd2QsCiB9IG5neF9pbWFwX3N0YXRlX2U7CiAKIAordHlwZWRlZiBlbnVtIHsKKyAgICBuZ3hfcG9wM19zdGFydCA9IDAsCisgICAgbmd4X3BvcDNfdXNlciwKKyAgICBuZ3hfcG9wM19wYXNzd2QKK30gbmd4X3BvM19zdGF0ZV9lOworCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBuZ3hfcGVlcl9jb25uZWN0aW9uX3QgICB1cHN0cmVhbTsKICAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICpidWZmZXI7CkBAIC02OCw2ICs4Myw3IEBACiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAqY29ubmVjdGlvbjsKIAogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKmJ1ZmZlcjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICBvdXQ7CiAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgKipjdHg7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICoqbWFpbl9jb25mOwpAQCAtNzUsMzkgKzkxLDU1IEBACiAKICAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgICpwcm94eTsKIAotICAgIG5neF9pbWFwX3N0YXRlX2UgICAgICAgIGltYXBfc3RhdGU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgaW1hcF9zdGF0ZTsKIAogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgIHByb3RvY29sOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgcXVvdGVkOjE7CiAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICBsb2dpbjsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICBwYXNzd2Q7CiAKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICB0YWc7CisKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICBjb21tYW5kOwogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgIGFyZ3M7CiAKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICBsb2dpbl9hdHRlbXB0OworCiAgICAgLyogdXNlZCB0byBwYXJzZSBJTUFQL1BPUDMgY29tbWFuZCAqLwogCiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgc3RhdGU7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAqY21kX3N0YXJ0OwogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgKmFyZ19zdGFydDsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICphcmdfZW5kOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgIGxpdGVyYWxfbGVuOwogfSBuZ3hfaW1hcF9zZXNzaW9uX3Q7CiAKIAogI2RlZmluZSBOR1hfUE9QM19VU0VSICAgICAgIDEKICNkZWZpbmUgTkdYX1BPUDNfUEFTUyAgICAgICAyCi0jZGVmaW5lIE5HWF9QT1AzX0FQT1AgICAgICAgMwotI2RlZmluZSBOR1hfUE9QM19TVEFUICAgICAgIDQKLSNkZWZpbmUgTkdYX1BPUDNfTElTVCAgICAgICA1Ci0jZGVmaW5lIE5HWF9QT1AzX1JFVFIgICAgICAgNgotI2RlZmluZSBOR1hfUE9QM19ERUxFICAgICAgIDcKLSNkZWZpbmUgTkdYX1BPUDNfTk9PUCAgICAgICA4Ci0jZGVmaW5lIE5HWF9QT1AzX1JTRVQgICAgICAgOQotI2RlZmluZSBOR1hfUE9QM19UT1AgICAgICAgIDEwCi0jZGVmaW5lIE5HWF9QT1AzX1VJREwgICAgICAgMTEKLSNkZWZpbmUgTkdYX1BPUDNfUVVJVCAgICAgICAxMgorI2RlZmluZSBOR1hfUE9QM19DQVBBICAgICAgIDMKKyNkZWZpbmUgTkdYX1BPUDNfUVVJVCAgICAgICA0CisjZGVmaW5lIE5HWF9QT1AzX05PT1AgICAgICAgNQorI2RlZmluZSBOR1hfUE9QM19BUE9QICAgICAgIDYKKyNkZWZpbmUgTkdYX1BPUDNfU1RBVCAgICAgICA3CisjZGVmaW5lIE5HWF9QT1AzX0xJU1QgICAgICAgOAorI2RlZmluZSBOR1hfUE9QM19SRVRSICAgICAgIDkKKyNkZWZpbmUgTkdYX1BPUDNfREVMRSAgICAgICAxMAorI2RlZmluZSBOR1hfUE9QM19SU0VUICAgICAgIDExCisjZGVmaW5lIE5HWF9QT1AzX1RPUCAgICAgICAgMTIKKyNkZWZpbmUgTkdYX1BPUDNfVUlETCAgICAgICAxMwogCiAKLSNkZWZpbmUgTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EICAxMAorI2RlZmluZSBOR1hfSU1BUF9MT0dJTiAgICAgIDEKKyNkZWZpbmUgTkdYX0lNQVBfTE9HT1VUICAgICAyCisjZGVmaW5lIE5HWF9JTUFQX0NBUEFCSUxJVFkgMworI2RlZmluZSBOR1hfSU1BUF9OT09QICAgICAgIDQKKworI2RlZmluZSBOR1hfSU1BUF9ORVhUICAgICAgIDUKKworCisjZGVmaW5lIE5HWF9JTUFQX1BBUlNFX0lOVkFMSURfQ09NTUFORCAgMjAKIAogCiAjZGVmaW5lIE5HWF9JTUFQX1BST1hZX0lOVkFMSUQgIDEwCkBAIC0xMzUsOSArMTY3LDEyIEBACiAKIAogdm9pZCBuZ3hfaW1hcF9pbml0X2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYyk7Cit2b2lkIG5neF9pbWFwX2F1dGhfc3RhdGUobmd4X2V2ZW50X3QgKnJldik7Cit2b2lkIG5neF9wb3AzX2F1dGhfc3RhdGUobmd4X2V2ZW50X3QgKnJldik7CiB2b2lkIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiB2b2lkIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7CiAKK25neF9pbnRfdCBuZ3hfaW1hcF9wYXJzZV9jb21tYW5kKG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7CiBuZ3hfaW50X3Qgbmd4X3BvcDNfcGFyc2VfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX2F1dGhfaHR0cF9tb2R1bGUuYwppbmRleCBmYTk4NGI4Li5lNjY1OTNhIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9hdXRoX2h0dHBfbW9kdWxlLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfYXV0aF9odHRwX21vZHVsZS5jCkBAIC0xMiwyNCArMTIsNTQgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAqcGVlcnM7CisgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgICAgICpwZWVyczsKIAotICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgIHRpbWVvdXQ7CisgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgaG9zdF9oZWFkZXI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgdXJpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9oZWFkZXI7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICB1cmk7CiB9IG5neF9pbWFwX2F1dGhfaHR0cF9jb25mX3Q7CiAKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9idWZfdCAgICAgICAgICAgICAgKnJlcXVlc3Q7Ci0gICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAqcmVzcG9uc2U7Ci0gICAgbmd4X3BlZXJfY29ubmVjdGlvbl90ICAgcGVlcjsKLX0gbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90OwordHlwZWRlZiBzdHJ1Y3Qgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF9zICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3Q7CisKK3R5cGVkZWYgdm9pZCAoKm5neF9pbWFwX2F1dGhfaHR0cF9oYW5kbGVyX3B0KShuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90ICpjdHgpOworCitzdHJ1Y3Qgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF9zIHsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3Q7CisgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAgICpyZXNwb25zZTsKKyAgICBuZ3hfcGVlcl9jb25uZWN0aW9uX3QgICAgICAgICAgIHBlZXI7CisKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfaGFuZGxlcl9wdCAgIGhhbmRsZXI7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgaGFzaDsgICAvKiBubyBuZWVkZWQgPyAqLworCisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICpoZWFkZXJfbmFtZV9zdGFydDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9uYW1lX2VuZDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9zdGFydDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9lbmQ7CisKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIGFkZHI7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBwb3J0OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgZXJyOworCisgICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgICAgICBzbGVlcDsKKworICAgIG5neF9wZWVyc190ICAgICAgICAgICAgICAgICAgICAqcGVlcnM7Cit9OwogCiAKIHN0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF93cml0ZV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfYXV0aF9odHRwX3JlYWRfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKK3N0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9pZ25vcmVfc3RhdHVzX2xpbmUobmd4X2ltYXBfc2Vzc2lvbl90ICpzLAorICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jdHhfdCAqY3R4KTsKK3N0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9wcm9jZXNzX2hlYWRlcnMobmd4X2ltYXBfc2Vzc2lvbl90ICpzLAorICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jdHhfdCAqY3R4KTsKK3N0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfc2xlZXBfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2ltYXBfYXV0aF9odHRwX3BhcnNlX2hlYWRlcl9saW5lKG5neF9pbWFwX3Nlc3Npb25fdCAqcywKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QgKmN0eCk7CiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9hdXRoX2h0dHBfYmxvY2tfcmVhZChuZ3hfZXZlbnRfdCAqcmV2KTsKIHN0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfaHR0cF9kdW1teV9oYW5kbGVyKG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgbmd4X2J1Zl90ICpuZ3hfaW1hcF9hdXRoX2h0dHBfY3JlYXRlX3JlcXVlc3Qobmd4X2ltYXBfc2Vzc2lvbl90ICpzLApAQCAtMTI0LDYgKzE1NCw4IEBACiAgICAgY3R4LT5wZWVyLmNvbm5lY3Rpb24tPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9hdXRoX2h0dHBfcmVhZF9oYW5kbGVyOwogICAgIGN0eC0+cGVlci5jb25uZWN0aW9uLT53cml0ZS0+aGFuZGxlciA9IG5neF9pbWFwX2F1dGhfaHR0cF93cml0ZV9oYW5kbGVyOwogCisgICAgY3R4LT5oYW5kbGVyID0gbmd4X2ltYXBfYXV0aF9odHRwX2lnbm9yZV9zdGF0dXNfbGluZTsKKwogICAgIGlmIChyYyA9PSBOR1hfT0spIHsKICAgICAgICAgbmd4X2ltYXBfYXV0aF9odHRwX3dyaXRlX2hhbmRsZXIoY3R4LT5wZWVyLmNvbm5lY3Rpb24tPndyaXRlKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTk0LDcgKzIyNiw2IEBACiBuZ3hfaW1hcF9hdXRoX2h0dHBfcmVhZF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCiB7CiAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgIG4sIHNpemU7Ci0gICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgKnBlZXJzOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CiAgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QgICpjdHg7CkBAIC0yMjQsMjQgKzI1NSw2MDQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNpemUgPSBjdHgtPnJlc3BvbnNlLT5sYXN0IC0gY3R4LT5yZXNwb25zZS0+cG9zOworICAgIHNpemUgPSBjdHgtPnJlc3BvbnNlLT5lbmQgLSBjdHgtPnJlc3BvbnNlLT5sYXN0OwogCiAgICAgbiA9IG5neF9yZWN2KGMsIGN0eC0+cmVzcG9uc2UtPnBvcywgc2l6ZSk7CiAKLSAgICBpZiAobiA9PSBOR1hfRVJST1IgfHwgbiA9PSAwKSB7Ci0gICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGN0eC0+cGVlci5jb25uZWN0aW9uKTsKLSAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGN0eC0+cmVzcG9uc2UtPmxhc3QgKz0gbjsKKworICAgICAgICBjdHgtPmhhbmRsZXIocywgY3R4KTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChuID09IE5HWF9BR0FJTikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworfQogCiAKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX2h0dHBfaWdub3JlX3N0YXR1c19saW5lKG5neF9pbWFwX3Nlc3Npb25fdCAqcywKKyAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfY3R4X3QgKmN0eCkKK3sKKyAgICB1X2NoYXIgICpwLCBjaDsKKyAgICBlbnVtICB7CisgICAgICAgIHN3X3N0YXJ0ID0gMCwKKyAgICAgICAgc3dfSCwKKyAgICAgICAgc3dfSFQsCisgICAgICAgIHN3X0hUVCwKKyAgICAgICAgc3dfSFRUUCwKKyAgICAgICAgc3dfc2tpcCwKKyAgICAgICAgc3dfYWxtb3N0X2RvbmUKKyAgICB9IHN0YXRlOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImltYXAgYXV0aCBodHRwIHByb2Nlc3Mgc3RhdHVzIGxpbmUiKTsKKworICAgIHN0YXRlID0gY3R4LT5zdGF0ZTsKKworICAgIGZvciAocCA9IGN0eC0+cmVzcG9uc2UtPnBvczsgcCA8IGN0eC0+cmVzcG9uc2UtPmxhc3Q7IHArKykgeworICAgICAgICBjaCA9ICpwOworCisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKworICAgICAgICAvKiAiSFRUUC8iICovCisgICAgICAgIGNhc2Ugc3dfc3RhcnQ6CisgICAgICAgICAgICBpZiAoY2ggPT0gJ0gnKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGNhc2Ugc3dfSDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnVCcpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X0hUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGNhc2Ugc3dfSFQ6CisgICAgICAgICAgICBpZiAoY2ggPT0gJ1QnKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IVFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgY2FzZSBzd19IVFQ6CisgICAgICAgICAgICBpZiAoY2ggPT0gJ1AnKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IVFRQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBuZXh0OworCisgICAgICAgIGNhc2Ugc3dfSFRUUDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3NraXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgLyogYW55IHRleHQgdW50aWwgZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgY2FzZSBzd19za2lwOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOiAKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBlbmQgb2Ygc3RhdHVzIGxpbmUgKi8KKyAgICAgICAgY2FzZSBzd19hbG1vc3RfZG9uZToKKyAgICAgICAgICAgIGlmIChjaCA9PSBMRikgeworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciBzZW50IGludmFsaWQgcmVzcG9uc2UiKTsKKyAgICAgICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKGN0eC0+cGVlci5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5yZXNwb25zZS0+cG9zID0gcDsKKyAgICBjdHgtPnN0YXRlID0gc3RhdGU7CisKKyAgICByZXR1cm47CisKK25leHQ6CisKKyAgICBwID0gY3R4LT5yZXNwb25zZS0+c3RhcnQgLSAxOworCitkb25lOgorCisgICAgY3R4LT5yZXNwb25zZS0+cG9zID0gcCArIDE7CisgICAgY3R4LT5zdGF0ZSA9IDA7CisgICAgY3R4LT5oYW5kbGVyID0gbmd4X2ltYXBfYXV0aF9odHRwX3Byb2Nlc3NfaGVhZGVyczsKKyAgICBjdHgtPmhhbmRsZXIocywgY3R4KTsKK30KIAogCitzdGF0aWMgdm9pZAorbmd4X2ltYXBfYXV0aF9odHRwX3Byb2Nlc3NfaGVhZGVycyhuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsCisgICAgbmd4X2ltYXBfYXV0aF9odHRwX2N0eF90ICpjdHgpCit7CisgICAgdV9jaGFyICAgICAgICAgICAgICAqcDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBsZW4sIHNpemU7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgcmMsIHBvcnQsIG47CisgICAgc3RydWN0IHNvY2thZGRyX2luICAqc2luOwogCi0gICAgcGVlcnMgPSBOVUxMOworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCBwcm9jZXNzIGhlYWRlcnMiKTsKIAotICAgIG5neF9pbWFwX3Byb3h5X2luaXQocywgcGVlcnMpOworICAgIGZvciAoIDs7ICkgeworICAgICAgICByYyA9IG5neF9pbWFwX2F1dGhfaHR0cF9wYXJzZV9oZWFkZXJfbGluZShzLCBjdHgpOworCisgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKKworI2lmIChOR1hfREVCVUcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBuZ3hfc3RyX3QgIGtleSwgdmFsdWU7CisKKyAgICAgICAgICAgIGtleS5sZW4gPSBjdHgtPmhlYWRlcl9uYW1lX2VuZCAtIGN0eC0+aGVhZGVyX25hbWVfc3RhcnQ7CisgICAgICAgICAgICBrZXkuZGF0YSA9IGN0eC0+aGVhZGVyX25hbWVfc3RhcnQ7CisgICAgICAgICAgICB2YWx1ZS5sZW4gPSBjdHgtPmhlYWRlcl9lbmQgLSBjdHgtPmhlYWRlcl9zdGFydDsKKyAgICAgICAgICAgIHZhbHVlLmRhdGEgPSBjdHgtPmhlYWRlcl9zdGFydDsKKworICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19JTUFQLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIGhlYWRlcjogXCIlVjogJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LCAmdmFsdWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGxlbiA9IGN0eC0+aGVhZGVyX25hbWVfZW5kIC0gY3R4LT5oZWFkZXJfbmFtZV9zdGFydDsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSBzaXplb2YoIkF1dGgtU3RhdHVzIikgLSAxCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKGN0eC0+aGVhZGVyX25hbWVfc3RhcnQsICJBdXRoLVN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiQXV0aC1TdGF0dXMiKSAtIDEpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gY3R4LT5oZWFkZXJfZW5kIC0gY3R4LT5oZWFkZXJfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDIKKyAgICAgICAgICAgICAgICAgICAgJiYgY3R4LT5oZWFkZXJfc3RhcnRbMF0gPT0gJ08nCisgICAgICAgICAgICAgICAgICAgICYmIGN0eC0+aGVhZGVyX3N0YXJ0WzFdID09ICdLJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzLT5wcm90b2NvbCA9PSBOR1hfSU1BUF9QT1AzX1BST1RPQ09MKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplb2YoIi1FUlIiKSAtIDEgKyBsZW4gKyBzaXplb2YoQ1JMRikgLSAxOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHMtPnRhZy5sZW4gKyBzaXplb2YoIk5PIikgLSAxICsgbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcCA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjdHgtPmVyci5kYXRhID0gcDsKKworICAgICAgICAgICAgICAgIGlmIChzLT5wcm90b2NvbCA9PSBOR1hfSU1BUF9QT1AzX1BST1RPQ09MKSB7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAnLSc7ICpwKysgPSAnRSc7ICpwKysgPSAnUic7ICpwKysgPSAnUic7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwID0gbmd4X2NweW1lbShwLCBzLT50YWcuZGF0YSwgcy0+dGFnLmxlbik7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAnTic7ICpwKysgPSAnTyc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnArKyA9ICcgJzsKKyAgICAgICAgICAgICAgICBwID0gbmd4X2NweW1lbShwLCBjdHgtPmhlYWRlcl9zdGFydCwgbGVuKTsKKyAgICAgICAgICAgICAgICAqcCsrID0gQ1I7ICpwKysgPSBMRjsKKworICAgICAgICAgICAgICAgIGN0eC0+ZXJyLmxlbiA9IHAgLSBjdHgtPmVyci5kYXRhOworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gc2l6ZW9mKCJBdXRoLVNlcnZlciIpIC0gMQorICAgICAgICAgICAgICAgICYmIG5neF9zdHJuY2FzZWNtcChjdHgtPmhlYWRlcl9uYW1lX3N0YXJ0LCAiQXV0aC1TZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkF1dGgtU2VydmVyIikgLSAxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0eC0+YWRkci5sZW4gPSBjdHgtPmhlYWRlcl9lbmQgLSBjdHgtPmhlYWRlcl9zdGFydDsKKyAgICAgICAgICAgICAgICBjdHgtPmFkZHIuZGF0YSA9IGN0eC0+aGVhZGVyX3N0YXJ0OworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gc2l6ZW9mKCJBdXRoLVBvcnQiKSAtIDEKKyAgICAgICAgICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAoY3R4LT5oZWFkZXJfbmFtZV9zdGFydCwgIkF1dGgtUG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiQXV0aC1Qb3J0IikgLSAxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0eC0+cG9ydC5sZW4gPSBjdHgtPmhlYWRlcl9lbmQgLSBjdHgtPmhlYWRlcl9zdGFydDsKKyAgICAgICAgICAgICAgICBjdHgtPnBvcnQuZGF0YSA9IGN0eC0+aGVhZGVyX3N0YXJ0OworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW4gPT0gc2l6ZW9mKCJBdXRoLVVzZXIiKSAtIDEKKyAgICAgICAgICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAoY3R4LT5oZWFkZXJfbmFtZV9zdGFydCwgIkF1dGgtVXNlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiQXV0aC1Vc2VyIikgLSAxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMtPmxvZ2luLmxlbiA9IGN0eC0+aGVhZGVyX2VuZCAtIGN0eC0+aGVhZGVyX3N0YXJ0OworICAgICAgICAgICAgICAgIHMtPmxvZ2luLmRhdGEgPSBjdHgtPmhlYWRlcl9zdGFydDsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGVuID09IHNpemVvZigiQXV0aC1XYWl0IikgLSAxCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKGN0eC0+aGVhZGVyX25hbWVfc3RhcnQsICJBdXRoLVdhaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkF1dGgtV2FpdCIpIC0gMSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gbmd4X2F0b2koY3R4LT5oZWFkZXJfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX2VuZCAtIGN0eC0+aGVhZGVyX3N0YXJ0KTsKKworICAgICAgICAgICAgICAgIGlmIChuICE9IE5HWF9FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBjdHgtPnNsZWVwID0gbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaWdub3JlIG90aGVyIGhlYWRlcnMgKi8KKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gTkdYX0RPTkUpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1dGggaHR0cCBoZWFkZXIgZG9uZSIpOworCisgICAgICAgICAgICBuZ3hfY2xvc2VfY29ubmVjdGlvbihjdHgtPnBlZXIuY29ubmVjdGlvbik7CisKKyAgICAgICAgICAgIGlmIChjdHgtPmVyci5sZW4pIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgbmd4X3NlbmQocy0+Y29ubmVjdGlvbiwgY3R4LT5lcnIuZGF0YSwgY3R4LT5lcnIubGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChjdHgtPnNsZWVwID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5neF9hZGRfdGltZXIocy0+Y29ubmVjdGlvbi0+cmVhZCwgY3R4LT5zbGVlcCAqIDEwMDApOworCisgICAgICAgICAgICAgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX2F1dGhfc2xlZXBfaGFuZGxlcjsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN0eC0+YWRkci5sZW4gPT0gMCB8fCBjdHgtPnBvcnQubGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciBkaWQgbm90IHNlbmQgc2VydmVyIG9yIHBvcnQiKTsKKyAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN0eC0+cGVlcnMgPSBuZ3hfcGNhbGxvYyhzLT5jb25uZWN0aW9uLT5wb29sLCBzaXplb2Yobmd4X3BlZXJzX3QpKTsKKyAgICAgICAgICAgIGlmIChjdHgtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpbiA9IG5neF9wY2FsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICAgICAgICAgIGlmIChzaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgICAgICAgICAgcG9ydCA9IG5neF9hdG9pKGN0eC0+cG9ydC5kYXRhLCBjdHgtPnBvcnQubGVuKTsKKyAgICAgICAgICAgIGlmIChwb3J0ID09IE5HWF9FUlJPUiB8fCBwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzYpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciBzZW50IGludmFsaWQgc2VydmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0OlwiJVZcIiIsICZjdHgtPnBvcnQpOworICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2luLT5zaW5fcG9ydCA9IGh0b25zKChpbl9wb3J0X3QpIHBvcnQpOworCisgICAgICAgICAgICBjdHgtPmFkZHIuZGF0YVtjdHgtPmFkZHIubGVuXSA9ICdcMCc7CisgICAgICAgICAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigoY2hhciAqKSBjdHgtPmFkZHIuZGF0YSk7CisgICAgICAgICAgICBpZiAoc2luLT5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUpIHsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aCBodHRwIHNlcnZlciBzZW50IGludmFsaWQgc2VydmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzOlwiJVZcIiIsICZjdHgtPmFkZHIpOworICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3R4LT5wZWVycy0+bnVtYmVyID0gMTsKKworICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5zb2NrYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luOworICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5zb2NrbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisKKyAgICAgICAgICAgIGxlbiA9IGN0eC0+YWRkci5sZW4gKyAxICsgY3R4LT5wb3J0LmxlbjsKKworICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5uYW1lLmxlbiA9IGxlbjsKKworICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKHMtPmNvbm5lY3Rpb24tPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgICAgIGlmIChjdHgtPnBlZXJzLT5wZWVyWzBdLm5hbWUuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4gPSBjdHgtPmFkZHIubGVuOworCisgICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+cGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhLCBjdHgtPmFkZHIuZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgY3R4LT5wZWVycy0+cGVlclswXS5uYW1lLmRhdGFbbGVuKytdID0gJzonOworCisgICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+cGVlcnMtPnBlZXJbMF0ubmFtZS5kYXRhICsgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcnQuZGF0YSwgY3R4LT5wb3J0Lmxlbik7CisKKyAgICAgICAgICAgIGN0eC0+cGVlcnMtPnBlZXJbMF0udXJpX3NlcGFyYXRvciA9ICIiOworCisgICAgICAgICAgICBuZ3hfaW1hcF9wcm94eV9pbml0KHMsIGN0eC0+cGVlcnMpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogcmMgPT0gTkdYX0VSUk9SICovCisKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJhdXRoIGh0dHAgc2VydmVyIHNlbnQgaW52YWxpZCBoZWFkZXIgaW4gcmVzcG9uc2UiKTsKKyAgICAgICAgbmd4X2Nsb3NlX2Nvbm5lY3Rpb24oY3R4LT5wZWVyLmNvbm5lY3Rpb24pOworICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCituZ3hfaW1hcF9hdXRoX3NsZWVwX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKK3sKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOworICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgKnM7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHJldi0+bG9nLCAwLCAiaW1hcCBhdXRoIHNsZWVwIGhhbmRsZXIiKTsKKworICAgIGMgPSByZXYtPmRhdGE7CisgICAgcyA9IGMtPmRhdGE7CisKKyAgICBpZiAocmV2LT50aW1lZG91dCkgeworCisgICAgICAgIHJldi0+dGltZWRvdXQgPSAwOworCisgICAgICAgIGlmIChzLT5wcm90b2NvbCA9PSBOR1hfSU1BUF9QT1AzX1BST1RPQ09MKSB7CisgICAgICAgICAgICBzLT5pbWFwX3N0YXRlID0gbmd4X3BvcDNfc3RhcnQ7CisgICAgICAgICAgICBzLT5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X3BvcDNfYXV0aF9zdGF0ZTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9pbWFwX3N0YXJ0OworICAgICAgICAgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX2F1dGhfc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV2LT5yZWFkeSkgeworICAgICAgICAgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlcihyZXYpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChyZXYsIDApID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmV2LT5hY3RpdmUpIHsKKyAgICAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChyZXYsIDApID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaW1hcF9hdXRoX2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUobmd4X2ltYXBfc2Vzc2lvbl90ICpzLAorICAgIG5neF9pbWFwX2F1dGhfaHR0cF9jdHhfdCAqY3R4KQoreworICAgIHVfY2hhciAgICAgIGMsIGNoLCAqcDsKKyAgICBuZ3hfdWludF90ICBoYXNoOworICAgIGVudW0geworICAgICAgICBzd19zdGFydCA9IDAsCisgICAgICAgIHN3X25hbWUsCisgICAgICAgIHN3X3NwYWNlX2JlZm9yZV92YWx1ZSwKKyAgICAgICAgc3dfdmFsdWUsCisgICAgICAgIHN3X3NwYWNlX2FmdGVyX3ZhbHVlLAorICAgICAgICBzd19hbG1vc3RfZG9uZSwgCisgICAgICAgIHN3X2hlYWRlcl9hbG1vc3RfZG9uZQorICAgIH0gc3RhdGU7CisKKyAgICBzdGF0ZSA9IGN0eC0+c3RhdGU7IAorICAgIGhhc2ggPSBjdHgtPmhhc2g7CisKKyAgICBmb3IgKHAgPSBjdHgtPnJlc3BvbnNlLT5wb3M7IHAgPCBjdHgtPnJlc3BvbnNlLT5sYXN0OyBwKyspIHsKKyAgICAgICAgY2ggPSAqcDsKKworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisKKyAgICAgICAgLyogZmlyc3QgY2hhciAqLworICAgICAgICBjYXNlIHN3X3N0YXJ0OgorCisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX2VuZCA9IHA7IAorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfaGVhZGVyX2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMRjogCisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9kb25lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X25hbWU7CisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfbmFtZV9zdGFydCA9IHA7CisKKyAgICAgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc2ggPSBjOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgICAgICBoYXNoID0gY2g7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBoZWFkZXIgbmFtZSAqLworICAgICAgICBjYXNlIHN3X25hbWU6CisgICAgICAgICAgICBjID0gKHVfY2hhcikgKGNoIHwgMHgyMCk7CisgICAgICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsKKyAgICAgICAgICAgICAgICBoYXNoICs9IGM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9uYW1lX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zcGFjZV9iZWZvcmVfdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBoYXNoICs9IGNoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIGhhc2ggKz0gY2g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA9PSBDUikgeworICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX25hbWVfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPT0gTEYpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9uYW1lX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfc3RhcnQgPSBwOworICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworCisgICAgICAgIC8qIHNwYWNlKiBiZWZvcmUgaGVhZGVyIHZhbHVlICovCisgICAgICAgIGNhc2Ugc3dfc3BhY2VfYmVmb3JlX3ZhbHVlOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9lbmQgPSBwOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWxtb3N0X2RvbmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9lbmQgPSBwOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfc3RhcnQgPSBwOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBoZWFkZXIgdmFsdWUgKi8KKyAgICAgICAgY2FzZSBzd192YWx1ZToKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIGN0eC0+aGVhZGVyX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zcGFjZV9hZnRlcl92YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgY3R4LT5oZWFkZXJfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBjdHgtPmhlYWRlcl9lbmQgPSBwOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHNwYWNlKiBiZWZvcmUgZW5kIG9mIGhlYWRlciBsaW5lICovCisgICAgICAgIGNhc2Ugc3dfc3BhY2VfYWZ0ZXJfdmFsdWU6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3ZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogZW5kIG9mIGhlYWRlciBsaW5lICovCisgICAgICAgIGNhc2Ugc3dfYWxtb3N0X2RvbmU6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvKiBlbmQgb2YgaGVhZGVyICovCisgICAgICAgIGNhc2Ugc3dfaGVhZGVyX2FsbW9zdF9kb25lOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9kb25lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5yZXNwb25zZS0+cG9zID0gcDsKKyAgICBjdHgtPnN0YXRlID0gc3RhdGU7CisgICAgY3R4LT5oYXNoID0gaGFzaDsKKworICAgIHJldHVybiBOR1hfQUdBSU47CisKK2RvbmU6CisKKyAgICBjdHgtPnJlc3BvbnNlLT5wb3MgPSBwICsgMTsKKyAgICBjdHgtPnN0YXRlID0gc3dfc3RhcnQ7CisgICAgY3R4LT5oYXNoID0gaGFzaDsKKworICAgIHJldHVybiBOR1hfT0s7CisKK2hlYWRlcl9kb25lOgorCisgICAgY3R4LT5yZXNwb25zZS0+cG9zID0gcCArIDE7CisgICAgY3R4LT5zdGF0ZSA9IHN3X3N0YXJ0OworCisgICAgcmV0dXJuIE5HWF9ET05FOwogfQogCiAKQEAgLTI4OCw2ICs4OTksOCBAQAogICAgICAgICAgICsgc2l6ZW9mKCJBdXRoLVVzZXI6ICIpIC0gMSArIHMtPmxvZ2luLmxlbiArIHNpemVvZihDUkxGKSAtIDEKICAgICAgICAgICArIHNpemVvZigiQXV0aC1QYXNzOiAiKSAtIDEgKyBzLT5wYXNzd2QubGVuICsgc2l6ZW9mKENSTEYpIC0gMQogICAgICAgICAgICsgc2l6ZW9mKCJBdXRoLVByb3RvY29sOiBpbWFwIiBDUkxGKSAtIDEKKyAgICAgICAgICArIHNpemVvZigiQXV0aC1Mb2dpbi1BdHRlbXB0OiAiKSAtIDEgKyBOR1hfSU5UX1RfTEVOCisgICAgICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxCiAgICAgICAgICAgKyBzaXplb2YoIkNsaWVudC1JUDogIikgLSAxICsgcy0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmxlbgogICAgICAgICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMQogICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKQEAgLTMyNCw2ICs5MzcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiaW1hcCIpIC0gMSk7CiAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKKyAgICBiLT5sYXN0ID0gbmd4X3NwcmludGYoYi0+bGFzdCwgIkF1dGgtTG9naW4tQXR0ZW1wdDogJXVpIiBDUkxGLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sb2dpbl9hdHRlbXB0KTsKKwogICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJDbGllbnQtSVA6ICIsIHNpemVvZigiQ2xpZW50LUlQOiAiKSAtIDEpOwogICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHMtPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW4pOwpAQCAtMzM4LDcgKzk1NCw3IEBACiAKICAgICBsLmxlbiA9IGItPmxhc3QgLSBiLT5wb3M7CiAgICAgbC5kYXRhID0gYi0+cG9zOwotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSU1BUCwgcy0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJpbWFwIGF1dGggaHR0cCBoZWFkZXI6XG5cIiVWXCIiLCAmbCk7CiAgICAgfQogI2VuZGlmCkBAIC00NDAsNyArMTA1Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWhjZi0+cGVlcnMtPm51bWJlcjsgaSsrKSB7Ci0gICAgICAgICAgICBhaGNmLT5wZWVycy0+cGVlcltpXS51cmlfc2VwYXJhdG9yID0gIjoiOworICAgICAgICAgICAgYWhjZi0+cGVlcnMtPnBlZXJbaV0udXJpX3NlcGFyYXRvciA9ICIiOwogICAgICAgICB9CiAKICAgICAgICAgYWhjZi0+aG9zdF9oZWFkZXIgPSBpbmV0X3Vwc3RyZWFtLmhvc3RfaGVhZGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfY29yZV9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX2NvcmVfbW9kdWxlLmMKaW5kZXggYjRiZGU1Mi4uZTVkN2EyMCAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9jb3JlX21vZHVsZS5jCkBAIC0xOCw2ICsxOCw4IEBACiAgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2ltYXBfY29yZV9saXN0ZW4obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaW1hcF9jb3JlX2NhcGFiaWxpdHkobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKIAogCiBzdGF0aWMgbmd4X2NvbmZfZW51bV90ICBuZ3hfaW1hcF9jb3JlX3Byb2NvdG9sW10gPSB7CkBAIC0yNyw2ICsyOSwyMiBAQAogfTsKIAogCitzdGF0aWMgbmd4X3N0cl90ICBuZ3hfcG9wM19kZWZhdWx0X2NhcGFiaWxpdGllc1tdID0geworICAgIG5neF9zdHJpbmcoIlRPUCIpLAorICAgIG5neF9zdHJpbmcoIlVTRVIiKSwKKyAgICBuZ3hfc3RyaW5nKCJVSURMIiksCisgICAgbmd4X251bGxfc3RyaW5nCit9OworCisKK3N0YXRpYyBuZ3hfc3RyX3QgIG5neF9pbWFwX2RlZmF1bHRfY2FwYWJpbGl0aWVzW10gPSB7CisgICAgbmd4X3N0cmluZygiSU1BUDQiKSwKKyAgICBuZ3hfc3RyaW5nKCJJTUFQNHJldjEiKSwKKyAgICBuZ3hfc3RyaW5nKCJVSURQTFVTIiksCisgICAgbmd4X251bGxfc3RyaW5nCit9OworCisKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaW1hcF9jb3JlX2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoInNlcnZlciIpLApAQCAtNzEsNiArODksMjAgQEAKICAgICAgIG9mZnNldG9mKG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCwgdGltZW91dCksCiAgICAgICBOVUxMIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoInBvcDNfY2FwYWJpbGl0aWVzIiksCisgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCisgICAgICBuZ3hfaW1hcF9jb3JlX2NhcGFiaWxpdHksCisgICAgICBOR1hfSU1BUF9TUlZfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QsIHBvcDNfY2FwYWJpbGl0aWVzKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiaW1hcF9jYXBhYmlsaXRpZXMiKSwKKyAgICAgIE5HWF9JTUFQX01BSU5fQ09ORnxOR1hfSU1BUF9TUlZfQ09ORnxOR1hfQ09ORl8xTU9SRSwKKyAgICAgIG5neF9pbWFwX2NvcmVfY2FwYWJpbGl0eSwKKyAgICAgIE5HWF9JTUFQX1NSVl9DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCwgaW1hcF9jYXBhYmlsaXRpZXMpLAorICAgICAgTlVMTCB9LAorCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCkBAIC0xMjEsNyArMTUzLDcgQEAKICAgICAgICAgICAgIAogICAgIGNzY2YgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCkpOwogICAgIGlmIChjc2NmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBjc2NmLT5pbWFwX2NsaWVudF9idWZmZXJfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CkBAIC0xMjksNiArMTYxLDE4IEBACiAgICAgY3NjZi0+dGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CiAgICAgY3NjZi0+cHJvdG9jb2wgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOwogCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjc2NmLT5wb3AzX2NhcGFiaWxpdGllcywgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfc3RyX3QpKQorICAgICAgICAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJmNzY2YtPmltYXBfY2FwYWJpbGl0aWVzLCBjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9zdHJfdCkpCisgICAgICAgICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIHJldHVybiBjc2NmOwogfQogCkBAIC0xMzksNiArMTgzLDExIEBACiAgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAqY29uZiA9IGNoaWxkOwogCisgICAgc2l6ZV90ICAgICAgIHNpemU7CisgICAgbmd4X2J1Zl90ICAgKmI7CisgICAgbmd4X3N0cl90ICAgKmMsICpkOworICAgIG5neF91aW50X3QgICBpOworCiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT5pbWFwX2NsaWVudF9idWZmZXJfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmltYXBfY2xpZW50X2J1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgbmd4X3BhZ2VzaXplKTsKQEAgLTE0OCw2ICsxOTcsODggQEAKICAgICBuZ3hfY29uZl9tZXJnZV91bnNpZ25lZF92YWx1ZShjb25mLT5wcm90b2NvbCwgcHJldi0+cHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSU1BUF9JTUFQX1BST1RPQ09MKTsKIAorCisgICAgaWYgKGNvbmYtPnBvcDNfY2FwYWJpbGl0aWVzLm5lbHRzID09IDApIHsKKyAgICAgICAgY29uZi0+cG9wM19jYXBhYmlsaXRpZXMgPSBwcmV2LT5wb3AzX2NhcGFiaWxpdGllczsKKyAgICB9CisKKyAgICBpZiAoY29uZi0+cG9wM19jYXBhYmlsaXRpZXMubmVsdHMgPT0gMCkgeworCisgICAgICAgIGZvciAoZCA9IG5neF9wb3AzX2RlZmF1bHRfY2FwYWJpbGl0aWVzOyBkLT5sZW47IGQrKykgeworICAgICAgICAgICAgYyA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5wb3AzX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBpZiAoYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqYyA9ICpkOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZSA9IHNpemVvZigiK09LIENhcGFiaWxpdHkgbGlzdCBmb2xsb3dzIiBDUkxGKSAtIDEKKyAgICAgICAgICAgKyBzaXplb2YoIi4iIENSTEYpIC0gMTsKKworICAgIGMgPSBjb25mLT5wb3AzX2NhcGFiaWxpdGllcy5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5wb3AzX2NhcGFiaWxpdGllcy5uZWx0czsgaSsrKSB7CisgICAgICAgIHNpemUgKz0gY1tpXS5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworICAgIH0KKworICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKGNmLT5wb29sLCBzaXplKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiK09LIENhcGFiaWxpdHkgbGlzdCBmb2xsb3dzIiBDUkxGLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiK09LIENhcGFiaWxpdHkgbGlzdCBmb2xsb3dzIiBDUkxGKSAtIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPnBvcDNfY2FwYWJpbGl0aWVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgY1tpXS5kYXRhLCBjW2ldLmxlbik7CisgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworICAgIH0KKworICAgICpiLT5sYXN0KysgPSAnLic7ICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOworCisgICAgY29uZi0+cG9wM19jYXBhYmlsaXR5ID0gYjsKKworCisgICAgaWYgKGNvbmYtPmltYXBfY2FwYWJpbGl0aWVzLm5lbHRzID09IDApIHsKKyAgICAgICAgY29uZi0+aW1hcF9jYXBhYmlsaXRpZXMgPSBwcmV2LT5pbWFwX2NhcGFiaWxpdGllczsKKyAgICB9CisKKyAgICBpZiAoY29uZi0+aW1hcF9jYXBhYmlsaXRpZXMubmVsdHMgPT0gMCkgeworCisgICAgICAgIGZvciAoZCA9IG5neF9pbWFwX2RlZmF1bHRfY2FwYWJpbGl0aWVzOyBkLT5sZW47IGQrKykgeworICAgICAgICAgICAgYyA9IG5neF9hcnJheV9wdXNoKCZjb25mLT5pbWFwX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBpZiAoYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqYyA9ICpkOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZSA9IHNpemVvZigiKiBDQVBBQklMSVRZIikgLSAxICsgc2l6ZW9mKENSTEYpIC0gMTsKKworICAgIGMgPSBjb25mLT5pbWFwX2NhcGFiaWxpdGllcy5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5pbWFwX2NhcGFiaWxpdGllcy5uZWx0czsgaSsrKSB7CisgICAgICAgIHNpemUgKz0gMSArIGNbaV0ubGVuOworICAgIH0KKworICAgIGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKGNmLT5wb29sLCBzaXplKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiKiBDQVBBQklMSVRZIiwgc2l6ZW9mKCIqIENBUEFCSUxJVFkiKSAtIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPmltYXBfY2FwYWJpbGl0aWVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgKmItPmxhc3QrKyA9ICcgJzsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgY1tpXS5kYXRhLCBjW2ldLmxlbik7CisgICAgfQorCisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyAgICBjb25mLT5pbWFwX2NhcGFiaWxpdHkgPSBiOworCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCkBAIC0yOTYsMyArNDI3LDI5IEBACiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2ltYXBfY29yZV9jYXBhYmlsaXR5KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCit7CisgICAgY2hhciAgKnAgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgICpjLCAqdmFsdWU7CisgICAgbmd4X3VpbnRfdCAgICBpOworICAgIG5neF9hcnJheV90ICAqYTsKKworICAgIGEgPSAobmd4X2FycmF5X3QgKikgKHAgKyBjbWQtPm9mZnNldCk7CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgZm9yIChpID0gMTsgaSA8IGNmLT5hcmdzLT5uZWx0czsgaSsrKSB7CisgICAgICAgIGMgPSBuZ3hfYXJyYXlfcHVzaChhKTsKKyAgICAgICAgaWYgKGMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKmMgPSB2YWx1ZVtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKaW5kZXggNjgwYmYyMC4uNjQ2NGQ0YSAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYwpAQCAtOCwyMCArOCwxNSBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAjaW5jbHVkZSA8bmd4X2V2ZW50Lmg+CiAjaW5jbHVkZSA8bmd4X2ltYXAuaD4KLSNpbmNsdWRlIDxuZ2lueC5oPgogCiAKIHN0YXRpYyB2b2lkIG5neF9pbWFwX2luaXRfc2Vzc2lvbihuZ3hfZXZlbnRfdCAqcmV2KTsKLQotc3RhdGljIHZvaWQgbmd4X3BvcDNfYXV0aF9zdGF0ZShuZ3hfZXZlbnRfdCAqcmV2KTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X3BvcDNfcmVhZF9jb21tYW5kKG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7Ci0KLXN0YXRpYyB2b2lkIG5neF9pbWFwX2F1dGhfc3RhdGUobmd4X2V2ZW50X3QgKnJldik7CitzdGF0aWMgbmd4X2ludF90IG5neF9pbWFwX3JlYWRfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpOwogCiAKIHN0YXRpYyBuZ3hfc3RyX3QgIGdyZWV0aW5nc1tdID0gewotICAgbmd4X3N0cmluZygiK09LICIgTkdJTlhfVkVSICIgcmVhZHkiIENSTEYpLAotICAgbmd4X3N0cmluZygiKiBPSyAiIE5HSU5YX1ZFUiAiIHJlYWR5IiBDUkxGKQorICAgbmd4X3N0cmluZygiK09LIFBPUDMgcmVhZHkiIENSTEYpLAorICAgbmd4X3N0cmluZygiKiBPSyBJTUFQIHJlYWR5IiBDUkxGKQogfTsKIAogc3RhdGljIG5neF9zdHJfdCAgaW50ZXJuYWxfc2VydmVyX2Vycm9yc1tdID0gewpAQCAtMzIsNiArMjcsMTEgQEAKIHN0YXRpYyB1X2NoYXIgIHBvcDNfb2tbXSA9ICIrT0siIENSTEY7CiBzdGF0aWMgdV9jaGFyICBwb3AzX2ludmFsaWRfY29tbWFuZFtdID0gIi1FUlIgaW52YWxpZCBjb21tYW5kIiBDUkxGOwogCitzdGF0aWMgdV9jaGFyICBpbWFwX29rW10gPSAiT0siIENSTEY7CitzdGF0aWMgdV9jaGFyICBpbWFwX25leHRbXSA9ICIrIE9LIiBDUkxGOworc3RhdGljIHVfY2hhciAgaW1hcF9ieWVbXSA9ICIqIEJZRSIgQ1JMRjsKK3N0YXRpYyB1X2NoYXIgIGltYXBfaW52YWxpZF9jb21tYW5kW10gPSAiQkFEIGludmFsaWQgY29tbWFuZCIgQ1JMRjsKKwogCiB2b2lkCiBuZ3hfaW1hcF9pbml0X2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYykKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIHMgPSBuZ3hfcGNhbGxvYyhjLT5wb29sLCBzaXplb2Yobmd4X2ltYXBfc2Vzc2lvbl90KSk7CiAgICAgaWYgKHMgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtOTYsNyArOTYsNyBAQAogCiAgICAgcy0+Y3R4ID0gbmd4X3BjYWxsb2MoYy0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaW1hcF9tYXhfbW9kdWxlKTsKICAgICBpZiAocy0+Y3R4ID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKKyAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIHMtPnNydl9jb25mID0gY3R4LT5zcnZfY29uZjsKIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmcy0+YXJncywgYy0+cG9vbCwgMiwgc2l6ZW9mKG5neF9zdHJfdCkpID09IE5HWF9FUlJPUikgewotICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTE1LDE2ICsxMTUsMTggQEAKIAogICAgIGlmIChjc2NmLT5wcm90b2NvbCA9PSBOR1hfSU1BUF9QT1AzX1BST1RPQ09MKSB7CiAgICAgICAgIHNpemUgPSAxMjg7CisgICAgICAgIHMtPmltYXBfc3RhdGUgPSBuZ3hfcG9wM19zdGFydDsKICAgICAgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9wb3AzX2F1dGhfc3RhdGU7CiAKICAgICB9IGVsc2UgewogICAgICAgICBzaXplID0gY3NjZi0+aW1hcF9jbGllbnRfYnVmZmVyX3NpemU7CisgICAgICAgIHMtPmltYXBfc3RhdGUgPSBuZ3hfaW1hcF9zdGFydDsKICAgICAgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX2F1dGhfc3RhdGU7CiAgICAgfQogCiAgICAgcy0+YnVmZmVyID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCBzaXplKTsKICAgICBpZiAocy0+YnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKKyAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEzMiwyNyArMTM0LDE5NCBAQAogfQogCiAKLXN0YXRpYyB2b2lkCit2b2lkCiBuZ3hfaW1hcF9hdXRoX3N0YXRlKG5neF9ldmVudF90ICpyZXYpCiB7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAqdGV4dCwgKmxhc3QsICpvdXQsICpwOworICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgIHNpemUsIHRleHRfbGVuLCBsYXN0X2xlbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICphcmc7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgcXVpdCwgdGFnOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKKyAgICBuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgICpjc2NmOwogCiAgICAgYyA9IHJldi0+ZGF0YTsKKyAgICBzID0gYy0+ZGF0YTsKIAotICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCBjLT5sb2csIDAsICJpbWFwIGF1dGggc3RhdGUiKTsKKworICAgIGlmIChyZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBjLT5sb2csIE5HWF9FVElNRURPVVQsICJjbGllbnQgdGltZWQgb3V0Iik7CisgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYyA9IG5neF9pbWFwX3JlYWRfY29tbWFuZChzKTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLCAiaW1hcCBhdXRoOiAlaSIsIHJjKTsKKworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4gfHwgcmMgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBxdWl0ID0gMDsKKyAgICB0YWcgPSAxOworCisgICAgdGV4dCA9IE5VTEw7CisgICAgdGV4dF9sZW4gPSAwOworCisgICAgbGFzdCA9IGltYXBfb2s7CisgICAgbGFzdF9sZW4gPSBzaXplb2YoaW1hcF9vaykgLSAxOworCisgICAgaWYgKHJjID09IE5HWF9PSykgeworCisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLCAiaW1hcCBhdXRoIGNvbW1hbmQ6ICVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29tbWFuZCk7CisKKyAgICAgICAgc3dpdGNoIChzLT5jb21tYW5kKSB7CisKKyAgICAgICAgY2FzZSBOR1hfSU1BUF9MT0dJTjoKKyAgICAgICAgICAgIGlmIChzLT5hcmdzLm5lbHRzID09IDIpIHsKKworICAgICAgICAgICAgICAgIGFyZyA9IHMtPmFyZ3MuZWx0czsKKworICAgICAgICAgICAgICAgIHMtPmxvZ2luLmxlbiA9IGFyZ1swXS5sZW47CisgICAgICAgICAgICAgICAgcy0+bG9naW4uZGF0YSA9IG5neF9wYWxsb2MoYy0+cG9vbCwgcy0+bG9naW4ubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bG9naW4uZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmd4X21lbWNweShzLT5sb2dpbi5kYXRhLCBhcmdbMF0uZGF0YSwgcy0+bG9naW4ubGVuKTsKKworICAgICAgICAgICAgICAgIHMtPnBhc3N3ZC5sZW4gPSBhcmdbMV0ubGVuOworICAgICAgICAgICAgICAgIHMtPnBhc3N3ZC5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzLT5wYXNzd2QubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGFzc3dkLmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5neF9tZW1jcHkocy0+cGFzc3dkLmRhdGEsIGFyZ1sxXS5kYXRhLCBzLT5wYXNzd2QubGVuKTsKKworICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSU1BUCwgYy0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFwIGxvZ2luOlwiJVZcIiBwYXNzd2Q6XCIlVlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bG9naW4sICZzLT5wYXNzd2QpOworCisgICAgICAgICAgICAgICAgcy0+YXJncy5uZWx0cyA9IDA7CisgICAgICAgICAgICAgICAgcy0+YnVmZmVyLT5wb3MgPSBzLT5idWZmZXItPnN0YXJ0OworICAgICAgICAgICAgICAgIHMtPmJ1ZmZlci0+bGFzdCA9IHMtPmJ1ZmZlci0+c3RhcnQ7CisKKyAgICAgICAgICAgICAgICBpZiAocmV2LT50aW1lcl9zZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2RlbF90aW1lcihyZXYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHMtPmxvZ2luX2F0dGVtcHQrKzsKKworICAgICAgICAgICAgICAgIG5neF9pbWFwX2F1dGhfaHR0cF9pbml0KHMpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5HWF9JTUFQX0NBUEFCSUxJVFk6CisgICAgICAgICAgICBjc2NmID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihzLCBuZ3hfaW1hcF9jb3JlX21vZHVsZSk7CisgICAgICAgICAgICB0ZXh0ID0gY3NjZi0+aW1hcF9jYXBhYmlsaXR5LT5wb3M7CisgICAgICAgICAgICB0ZXh0X2xlbiA9IGNzY2YtPmltYXBfY2FwYWJpbGl0eS0+bGFzdCAtIGNzY2YtPmltYXBfY2FwYWJpbGl0eS0+cG9zOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOR1hfSU1BUF9MT0dPVVQ6CisgICAgICAgICAgICB0ZXh0ID0gaW1hcF9ieWU7CisgICAgICAgICAgICB0ZXh0X2xlbiA9IHNpemVvZihpbWFwX2J5ZSkgLSAxOworICAgICAgICAgICAgcXVpdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE5HWF9JTUFQX05PT1A6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmMgPSBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfSU1BUF9ORVhUKSB7CisgICAgICAgIGxhc3QgPSBpbWFwX25leHQ7CisgICAgICAgIGxhc3RfbGVuID0gc2l6ZW9mKGltYXBfbmV4dCkgLSAxOworICAgICAgICB0YWcgPSAwOworICAgIH0KKworICAgIGlmIChyYyA9PSBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQpIHsKKyAgICAgICAgbGFzdCA9IGltYXBfaW52YWxpZF9jb21tYW5kOworICAgICAgICBsYXN0X2xlbiA9IHNpemVvZihpbWFwX2ludmFsaWRfY29tbWFuZCkgLSAxOworICAgIH0KKworICAgIGlmICh0YWcpIHsKKyAgICAgICAgaWYgKHMtPm91dC5sZW4gPCB0ZXh0X2xlbiArIHMtPnRhZy5sZW4gKyBsYXN0X2xlbikgeworCisgICAgICAgICAgICBzLT5vdXQubGVuID0gdGV4dF9sZW4gKyBzLT50YWcubGVuICsgbGFzdF9sZW47CisgICAgICAgICAgICBzLT5vdXQuZGF0YSA9IG5neF9wYWxsb2MoYy0+cG9vbCwgcy0+b3V0Lmxlbik7CisgICAgICAgICAgICBpZiAocy0+b3V0LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0ID0gcy0+b3V0LmRhdGE7CisgICAgICAgIHAgPSBvdXQ7CisKKyAgICAgICAgaWYgKHRleHQpIHsKKyAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHRleHQsIHRleHRfbGVuKTsKKyAgICAgICAgfQorICAgICAgICBwID0gbmd4X2NweW1lbShwLCBzLT50YWcuZGF0YSwgcy0+dGFnLmxlbik7CisgICAgICAgIG5neF9tZW1jcHkocCwgbGFzdCwgbGFzdF9sZW4pOworCisgICAgICAgIHNpemUgPSB0ZXh0X2xlbiArIHMtPnRhZy5sZW4gKyBsYXN0X2xlbjsKKworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGxhc3Q7CisgICAgICAgIHNpemUgPSBsYXN0X2xlbjsKKyAgICB9CisKKyAgICBpZiAobmd4X3NlbmQoYywgb3V0LCBzaXplKSA8IHNpemUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgdHJlYXQgdGhlIGluY29tcGxldGUgc2VuZGluZyBhcyBOR1hfRVJST1IKKyAgICAgICAgICogYmVjYXVzZSBpdCBpcyB2ZXJ5IHN0cmFuZ2UgaGVyZQorICAgICAgICAgKi8KKyAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyA9PSBOR1hfSU1BUF9ORVhUKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocXVpdCkgeworICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcy0+YXJncy5uZWx0cyA9IDA7CisgICAgcy0+YnVmZmVyLT5wb3MgPSBzLT5idWZmZXItPnN0YXJ0OworICAgIHMtPmJ1ZmZlci0+bGFzdCA9IHMtPmJ1ZmZlci0+c3RhcnQ7CisgICAgcy0+dGFnLmxlbiA9IDA7CiB9CiAKIAotc3RhdGljIHZvaWQKK3ZvaWQKIG5neF9wb3AzX2F1dGhfc3RhdGUobmd4X2V2ZW50X3QgKnJldikKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICp0ZXh0OwotICAgIHNzaXplX3QgICAgICAgICAgICAgIHNpemU7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgcmM7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgcXVpdDsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICphcmc7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKLSAgICBuZ3hfaW1hcF9zZXNzaW9uX3QgICpzOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgKnRleHQ7CisgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBxdWl0OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgKmFyZzsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICpjOworICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgICAgICAgKnM7CisgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICAqY3NjZjsKIAogICAgIGMgPSByZXYtPmRhdGE7CiAgICAgcyA9IGMtPmRhdGE7CkBAIC0xNjUsNyArMzM0LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHJjID0gbmd4X3BvcDNfcmVhZF9jb21tYW5kKHMpOworICAgIHJjID0gbmd4X2ltYXBfcmVhZF9jb21tYW5kKHMpOwogCiAgICAgaWYgKHJjID09IE5HWF9BR0FJTiB8fCByYyA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTg4LDE2ICszNTcsMTYgQEAKIAogICAgICAgICAgICAgICAgICAgICBhcmcgPSBzLT5hcmdzLmVsdHM7CiAgICAgICAgICAgICAgICAgICAgIHMtPmxvZ2luLmxlbiA9IGFyZ1swXS5sZW47Ci0gICAgICAgICAgICAgICAgICAgIHMtPmxvZ2luLmRhdGEgPSBuZ3hfcGFsbG9jKGMtPnBvb2wsIHMtPmxvZ2luLmxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICBzLT5sb2dpbi5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzLT5sb2dpbi5sZW4pOwogICAgICAgICAgICAgICAgICAgICBpZiAocy0+bG9naW4uZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBuZ3hfY3B5c3RybihzLT5sb2dpbi5kYXRhLCBhcmdbMF0uZGF0YSwgcy0+bG9naW4ubGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIG5neF9tZW1jcHkocy0+bG9naW4uZGF0YSwgYXJnWzBdLmRhdGEsIHMtPmxvZ2luLmxlbik7CiAKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19JTUFQLCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3AzIGxvZ2luOiBcIiVzXCIiLCBzLT5sb2dpbi5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcDMgbG9naW46IFwiJVZcIiIsICZzLT5sb2dpbik7CiAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByYyA9IE5HWF9JTUFQX1BBUlNFX0lOVkFMSURfQ09NTUFORDsKQEAgLTIwNSwxMCArMzc0LDE5IEBACiAKICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgY2FzZSBOR1hfUE9QM19DQVBBOgorICAgICAgICAgICAgICAgIGNzY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKHMsIG5neF9pbWFwX2NvcmVfbW9kdWxlKTsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gY3NjZi0+cG9wM19jYXBhYmlsaXR5LT5wb3M7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGNzY2YtPnBvcDNfY2FwYWJpbGl0eS0+bGFzdCAtIGNzY2YtPnBvcDNfY2FwYWJpbGl0eS0+cG9zOworICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlIE5HWF9QT1AzX1FVSVQ6CiAgICAgICAgICAgICAgICAgcXVpdCA9IDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgIGNhc2UgTkdYX1BPUDNfTk9PUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBzLT5pbWFwX3N0YXRlID0gbmd4X3BvcDNfc3RhcnQ7CiAgICAgICAgICAgICAgICAgcmMgPSBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CkBAIC0yMjcsMjAgKzQwNSwyNSBAQAogCiAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHMtPmFyZ3MuZWx0czsKICAgICAgICAgICAgICAgICAgICAgcy0+cGFzc3dkLmxlbiA9IGFyZ1swXS5sZW47Ci0gICAgICAgICAgICAgICAgICAgIHMtPnBhc3N3ZC5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzLT5wYXNzd2QubGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHMtPnBhc3N3ZC5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzLT5wYXNzd2QubGVuKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3N3ZC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5neF9pbWFwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG5neF9jcHlzdHJuKHMtPnBhc3N3ZC5kYXRhLCBhcmdbMF0uZGF0YSwgcy0+cGFzc3dkLmxlbiArIDEpOworICAgICAgICAgICAgICAgICAgICBuZ3hfbWVtY3B5KHMtPnBhc3N3ZC5kYXRhLCBhcmdbMF0uZGF0YSwgcy0+cGFzc3dkLmxlbik7CiAKICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19JTUFQLCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3AzIHBhc3N3ZDogXCIlc1wiIiwgcy0+cGFzc3dkLmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wMyBwYXNzd2Q6IFwiJVZcIiIsICZzLT5wYXNzd2QpOwogCisgICAgICAgICAgICAgICAgICAgIHMtPmFyZ3MubmVsdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICBzLT5idWZmZXItPnBvcyA9IHMtPmJ1ZmZlci0+c3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlci0+bGFzdCA9IHMtPmJ1ZmZlci0+c3RhcnQ7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldi0+dGltZXJfc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZGVsX3RpbWVyKHJldik7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBuZ3hfaW1hcF9hdXRoX2h0dHBfaW5pdChzKTsKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0yNTEsMTAgKzQzNCwxOSBAQAogCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgIGNhc2UgTkdYX1BPUDNfQ0FQQToKKyAgICAgICAgICAgICAgICBjc2NmID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihzLCBuZ3hfaW1hcF9jb3JlX21vZHVsZSk7CisgICAgICAgICAgICAgICAgdGV4dCA9IGNzY2YtPnBvcDNfY2FwYWJpbGl0eS0+cG9zOworICAgICAgICAgICAgICAgIHNpemUgPSBjc2NmLT5wb3AzX2NhcGFiaWxpdHktPmxhc3QgLSBjc2NmLT5wb3AzX2NhcGFiaWxpdHktPnBvczsKKyAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSBOR1hfUE9QM19RVUlUOgogICAgICAgICAgICAgICAgIHF1aXQgPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICBjYXNlIE5HWF9QT1AzX05PT1A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9wb3AzX3N0YXJ0OwogICAgICAgICAgICAgICAgIHJjID0gTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EOwpAQCAtMjYyLDYgKzQ1NCwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBzdXBwcmVzcyB3YXJpbmluZ3MgKi8KKyAgICAgICAgY2FzZSBuZ3hfcG9wM19wYXNzd2Q6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjkxLDcgKzQ4Nyw3IEBACiAKIAogc3RhdGljIG5neF9pbnRfdAotbmd4X3BvcDNfcmVhZF9jb21tYW5kKG5neF9pbWFwX3Nlc3Npb25fdCAqcykKK25neF9pbWFwX3JlYWRfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCiB7CiAgICAgc3NpemVfdCAgICBuOwogICAgIG5neF9pbnRfdCAgcmM7CkBAIC0zMTAsMTYgKzUwNiwyMyBAQAogCiAgICAgaWYgKG4gPT0gTkdYX0FHQUlOKSB7CiAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocy0+Y29ubmVjdGlvbi0+cmVhZCwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKHMtPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKICAgICB9CiAKLSAgICByYyA9IG5neF9wb3AzX3BhcnNlX2NvbW1hbmQocyk7CisgICAgaWYgKHMtPnByb3RvY29sID09IE5HWF9JTUFQX1BPUDNfUFJPVE9DT0wpIHsKKyAgICAgICAgcmMgPSBuZ3hfcG9wM19wYXJzZV9jb21tYW5kKHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gbmd4X2ltYXBfcGFyc2VfY29tbWFuZChzKTsKKyAgICB9CiAKLSAgICBpZiAocmMgPT0gTkdYX0FHQUlOIHx8IHJjID09IE5HWF9JTUFQX1BBUlNFX0lOVkFMSURfQ09NTUFORCkgeworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4KKyAgICAgICAgfHwgcmMgPT0gTkdYX0lNQVBfTkVYVAorICAgICAgICB8fCByYyA9PSBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQpCisgICAgewogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCkBAIC0zMzIsMjAgKzUzNSw2IEBACiB9CiAKIAotI2lmIDAKLQotdm9pZAotbmd4X2ltYXBfY2xvc2Vfc2Vzc2lvbihuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCi17Ci0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCBzLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImNsb3NlIGltYXAgc2Vzc2lvbiIpOwotCi0gICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihzLT5jb25uZWN0aW9uKTsKLX0KLQotI2VuZGlmCi0KLQogdm9pZAogbmd4X2ltYXBfc2Vzc2lvbl9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iobmd4X2ltYXBfc2Vzc2lvbl90ICpzKQogewpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXBfcGFyc2UuYyBiL3NyYy9pbWFwL25neF9pbWFwX3BhcnNlLmMKaW5kZXggNmMxYzNlOS4uZTM5MjNlOCAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXBfcGFyc2UuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wYXJzZS5jCkBAIC0xMCw2NCArMTAsMTM0IEBACiAjaW5jbHVkZSA8bmd4X2ltYXAuaD4KIAogCi1uZ3hfaW50X3Qgbmd4X3BvcDNfcGFyc2VfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCituZ3hfaW50X3Qgbmd4X2ltYXBfcGFyc2VfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCiB7CiAgICAgdV9jaGFyICAgICAgY2gsICpwLCAqYzsKICAgICBuZ3hfc3RyX3QgICphcmc7CiAgICAgZW51bSB7CiAgICAgICAgIHN3X3N0YXJ0ID0gMCwKKyAgICAgICAgc3dfc3BhY2VzX2JlZm9yZV9jb21tYW5kLAorICAgICAgICBzd19jb21tYW5kLAogICAgICAgICBzd19zcGFjZXNfYmVmb3JlX2FyZ3VtZW50LAogICAgICAgICBzd19hcmd1bWVudCwKLSAgICAgICAgc3dfYWxtb3N0X2RvbmUsCi0gICAgICAgIHN3X2RvbmUKKyAgICAgICAgc3dfbGl0ZXJhbCwKKyAgICAgICAgc3dfc3RhcnRfbGl0ZXJhbF9hcmd1bWVudCwKKyAgICAgICAgc3dfbGl0ZXJhbF9hcmd1bWVudCwKKyAgICAgICAgc3dfZW5kX2xpdGVyYWxfYXJndW1lbnQsCisgICAgICAgIHN3X2FsbW9zdF9kb25lCiAgICAgfSBzdGF0ZTsKIAogICAgIHN0YXRlID0gcy0+c3RhdGU7Ci0gICAgcCA9IHMtPmJ1ZmZlci0+cG9zOwogCi0gICAgd2hpbGUgKHAgPCBzLT5idWZmZXItPmxhc3QgJiYgc3RhdGUgPCBzd19kb25lKSB7Ci0gICAgICAgIGNoID0gKnArKzsKKyAgICBmb3IgKHAgPSBzLT5idWZmZXItPnBvczsgcCA8IHMtPmJ1ZmZlci0+bGFzdDsgcCsrKSB7CisgICAgICAgIGNoID0gKnA7CiAKICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewogCi0gICAgICAgIC8qIFBPUDMgY29tbWFuZCAqLwotCisgICAgICAgIC8qIElNQVAgdGFnICovCiAgICAgICAgIGNhc2Ugc3dfc3RhcnQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBzLT50YWcubGVuID0gcCAtIHMtPmJ1ZmZlci0+c3RhcnQgKyAxOworICAgICAgICAgICAgICAgIHMtPnRhZy5kYXRhID0gcy0+YnVmZmVyLT5zdGFydDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3NwYWNlc19iZWZvcmVfY29tbWFuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EOworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IHN3X3N0YXJ0OworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X3NwYWNlc19iZWZvcmVfY29tbWFuZDoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IHN3X3N0YXJ0OworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gc3dfc3RhcnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9JTUFQX1BBUlNFX0lOVkFMSURfQ09NTUFORDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcy0+Y21kX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2NvbW1hbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X2NvbW1hbmQ6CiAgICAgICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09IENSIHx8IGNoID09IExGKSB7Ci0gICAgICAgICAgICAgICAgYyA9IHMtPmJ1ZmZlci0+c3RhcnQ7CiAKLSAgICAgICAgICAgICAgICBpZiAocCAtIDEgLSBjID09IDQpIHsKKyAgICAgICAgICAgICAgICBjID0gcy0+Y21kX3N0YXJ0OwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjWzBdID09ICdVJyAmJiBjWzFdID09ICdTJwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgY1syXSA9PSAnRScgJiYgY1szXSA9PSAnUicpCisgICAgICAgICAgICAgICAgc3dpdGNoIChwIC0gYykgeworCisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBpZiAoKGNbMF0gPT0gJ04nIHx8IGNbMF0gPT0gJ24nKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbMV0gPT0gJ08nfHwgY1sxXSA9PSAnbycpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1syXSA9PSAnTyd8fCBjWzJdID09ICdvJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzNdID09ICdQJ3x8IGNbM10gPT0gJ3AnKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29tbWFuZCA9IE5HWF9QT1AzX1VTRVI7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjWzBdID09ICdQJyAmJiBjWzFdID09ICdBJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNbMl0gPT0gJ1MnICYmIGNbM10gPT0gJ1MnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21tYW5kID0gTkdYX1BPUDNfUEFTUzsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNbMF0gPT0gJ1EnICYmIGNbMV0gPT0gJ1UnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY1syXSA9PSAnSScgJiYgY1szXSA9PSAnVCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbW1hbmQgPSBOR1hfUE9QM19RVUlUOwotCi0jaWYgMAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNbMF0gPT0gJ04nICYmIGNbMV0gPT0gJ08nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY1syXSA9PSAnTycgJiYgY1szXSA9PSAnUCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbW1hbmQgPSBOR1hfUE9QM19OT09QOwotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21tYW5kID0gTkdYX0lNQVBfTk9PUDsKIAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IHN3X3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjWzBdID09ICdMJ3x8IGNbMF0gPT0gJ2wnKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbMV0gPT0gJ08nfHwgY1sxXSA9PSAnbycpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1syXSA9PSAnRyd8fCBjWzJdID09ICdnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzNdID09ICdJJ3x8IGNbM10gPT0gJ2knKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbNF0gPT0gJ04nfHwgY1s0XSA9PSAnbicpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21tYW5kID0gTkdYX0lNQVBfTE9HSU47CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjWzBdID09ICdMJ3x8IGNbMF0gPT0gJ2wnKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbMV0gPT0gJ08nfHwgY1sxXSA9PSAnbycpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1syXSA9PSAnRyd8fCBjWzJdID09ICdnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzNdID09ICdPJ3x8IGNbM10gPT0gJ28nKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbNF0gPT0gJ1UnfHwgY1s0XSA9PSAndScpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1s1XSA9PSAnVCd8fCBjWzVdID09ICd0JykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbW1hbmQgPSBOR1hfSU1BUF9MT0dPVVQ7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgIGlmICgoY1swXSA9PSAnQyd8fCBjWzBdID09ICdjJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzFdID09ICdBJ3x8IGNbMV0gPT0gJ2EnKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbMl0gPT0gJ1AnfHwgY1syXSA9PSAncCcpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1szXSA9PSAnQSd8fCBjWzNdID09ICdhJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzRdID09ICdCJ3x8IGNbNF0gPT0gJ2InKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbNV0gPT0gJ0knfHwgY1s1XSA9PSAnaScpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1s2XSA9PSAnTCd8fCBjWzZdID09ICdsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjWzddID09ICdJJ3x8IGNbN10gPT0gJ2knKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNbOF0gPT0gJ1QnfHwgY1s4XSA9PSAndCcpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY1s5XSA9PSAnWSd8fCBjWzldID09ICd5JykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbW1hbmQgPSBOR1hfSU1BUF9DQVBBQklMSVRZOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkgewpAQCAtNzgsNDUgKzE0OCwyODcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNoIDwgJ0EnIHx8IGNoID4gJ1onKSB7Ci0gICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0lNQVBfUEFSU0VfSU5WQUxJRF9DT01NQU5EOworICAgICAgICAgICAgaWYgKChjaCA8ICdBJyB8fCBjaCA+ICdaJykgJiYgKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSkgeworICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgLyogdGhlIHNwYWNlcyBiZWZvcmUgdGhlIGFyZ3VtZW50ICovCiAgICAgICAgIGNhc2Ugc3dfc3BhY2VzX2JlZm9yZV9hcmd1bWVudDoKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDUjoKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwotICAgICAgICAgICAgICAgIHMtPmFyZ19lbmQgPSBwIC0gMTsKKyAgICAgICAgICAgICAgICBzLT5hcmdfZW5kID0gcDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19kb25lOwotICAgICAgICAgICAgICAgIHMtPmFyZ19lbmQgPSBwIC0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmFyZ3MubmVsdHMgPiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gc3dfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICAgICAgcy0+YXJnX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgaWYgKHMtPmFyZ3MubmVsdHMgPD0gMikgeworICAgICAgICAgICAgICAgICAgICBzLT5xdW90ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5hcmdfc3RhcnQgPSBwICsgMTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hcmd1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgIGlmIChzLT5hcmdzLm5lbHRzIDw9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19saXRlcmFsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAocy0+YXJncy5uZWx0cyA8PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmFyZ19zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYXJndW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYXJndW1lbnQ7Ci0gICAgICAgICAgICAgICAgcy0+YXJnX3N0YXJ0ID0gcCAtIDE7CisgICAgICAgIGNhc2Ugc3dfYXJndW1lbnQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBpZiAoIXMtPnF1b3RlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+cXVvdGVkID0gMDsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICAgICAgYXJnID0gbmd4X2FycmF5X3B1c2goJnMtPmFyZ3MpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmctPmxlbiA9IHAgLSBzLT5hcmdfc3RhcnQ7CisgICAgICAgICAgICAgICAgYXJnLT5kYXRhID0gcy0+YXJnX3N0YXJ0OworICAgICAgICAgICAgICAgIHMtPmFyZ19zdGFydCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgY2FzZSAnICc6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfc3BhY2VzX2JlZm9yZV9hcmd1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIC8qIHRoZSBhcmd1bWVudCAqLworICAgICAgICBjYXNlIHN3X2xpdGVyYWw6CisgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHMtPmxpdGVyYWxfbGVuID0gcy0+bGl0ZXJhbF9sZW4gKiAxMCArIChjaCAtICcwJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zdGFydF9saXRlcmFsX2FyZ3VtZW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBpbnZhbGlkOworCisgICAgICAgIGNhc2Ugc3dfc3RhcnRfbGl0ZXJhbF9hcmd1bWVudDoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIHMtPmJ1ZmZlci0+cG9zID0gcCArIDE7CisgICAgICAgICAgICAgICAgcy0+YXJnX3N0YXJ0ID0gcCArIDE7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBzd19saXRlcmFsX2FyZ3VtZW50OworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9ORVhUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBpbnZhbGlkOworCisgICAgICAgIGNhc2Ugc3dfbGl0ZXJhbF9hcmd1bWVudDoKKyAgICAgICAgICAgIGlmICgtLXMtPmxpdGVyYWxfbGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFyZyA9IG5neF9hcnJheV9wdXNoKCZzLT5hcmdzKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmctPmxlbiA9IHAgKyAxIC0gcy0+YXJnX3N0YXJ0OworICAgICAgICAgICAgYXJnLT5kYXRhID0gcy0+YXJnX3N0YXJ0OworICAgICAgICAgICAgcy0+YXJnX3N0YXJ0ID0gTlVMTDsKKyAgICAgICAgICAgIHN0YXRlID0gc3dfZW5kX2xpdGVyYWxfYXJndW1lbnQ7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugc3dfZW5kX2xpdGVyYWxfYXJndW1lbnQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgICAgICBpZiAocy0+YXJncy5uZWx0cyA8PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfbGl0ZXJhbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X2FsbW9zdF9kb25lOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmJ1ZmZlci0+cG9zID0gcDsKKyAgICBzLT5zdGF0ZSA9IHN0YXRlOworCisgICAgcmV0dXJuIE5HWF9BR0FJTjsKKworZG9uZToKKworICAgIHMtPmJ1ZmZlci0+cG9zID0gcCArIDE7CisKKyAgICBpZiAocy0+YXJnX3N0YXJ0KSB7CisgICAgICAgIGFyZyA9IG5neF9hcnJheV9wdXNoKCZzLT5hcmdzKTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGFyZy0+bGVuID0gcy0+YXJnX2VuZCAtIHMtPmFyZ19zdGFydDsKKyAgICAgICAgYXJnLT5kYXRhID0gcy0+YXJnX3N0YXJ0OworICAgICAgICBzLT5hcmdfc3RhcnQgPSBOVUxMOworICAgICAgICBzLT5jbWRfc3RhcnQgPSBOVUxMOworICAgICAgICBzLT5xdW90ZWQgPSAwOworICAgICAgICBzLT5saXRlcmFsX2xlbiA9IDA7CisgICAgfQorCisgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKKworICAgIHJldHVybiBOR1hfT0s7CisKK2ludmFsaWQ6CisKKyAgICBzLT5zdGF0ZSA9IHN3X3N0YXJ0OworICAgIHMtPnF1b3RlZCA9IDA7CisgICAgcy0+bGl0ZXJhbF9sZW4gPSAwOworCisgICAgcmV0dXJuIE5HWF9JTUFQX1BBUlNFX0lOVkFMSURfQ09NTUFORDsKK30KKworCituZ3hfaW50X3Qgbmd4X3BvcDNfcGFyc2VfY29tbWFuZChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCit7CisgICAgdV9jaGFyICAgICAgY2gsICpwLCAqYywgYzAsIGMxLCBjMiwgYzM7CisgICAgbmd4X3N0cl90ICAqYXJnOworICAgIGVudW0geworICAgICAgICBzd19zdGFydCA9IDAsCisgICAgICAgIHN3X3NwYWNlc19iZWZvcmVfYXJndW1lbnQsCisgICAgICAgIHN3X2FyZ3VtZW50LAorICAgICAgICBzd19hbG1vc3RfZG9uZQorICAgIH0gc3RhdGU7CisKKyAgICBzdGF0ZSA9IHMtPnN0YXRlOworCisgICAgZm9yIChwID0gcy0+YnVmZmVyLT5wb3M7IHAgPCBzLT5idWZmZXItPmxhc3Q7IHArKykgeworICAgICAgICBjaCA9ICpwOworCisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKworICAgICAgICAvKiBQT1AzIGNvbW1hbmQgKi8KKyAgICAgICAgY2FzZSBzd19zdGFydDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gQ1IgfHwgY2ggPT0gTEYpIHsKKyAgICAgICAgICAgICAgICBjID0gcy0+YnVmZmVyLT5zdGFydDsKKworICAgICAgICAgICAgICAgIGlmIChwIC0gYyA9PSA0KSB7CisKKyAgICAgICAgICAgICAgICAgICAgYzAgPSBuZ3hfdG91cHBlcihjWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYzEgPSBuZ3hfdG91cHBlcihjWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgYzIgPSBuZ3hfdG91cHBlcihjWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgYzMgPSBuZ3hfdG91cHBlcihjWzNdKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYzAgPT0gJ1UnICYmIGMxID09ICdTJyAmJiBjMiA9PSAnRScgJiYgYzMgPT0gJ1InKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21tYW5kID0gTkdYX1BPUDNfVVNFUjsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMwID09ICdQJyAmJiBjMSA9PSAnQScgJiYgYzIgPT0gJ1MnICYmIGMzID09ICdTJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29tbWFuZCA9IE5HWF9QT1AzX1BBU1M7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjMCA9PSAnUScgJiYgYzEgPT0gJ1UnICYmIGMyID09ICdJJyAmJiBjMyA9PSAnVCcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbW1hbmQgPSBOR1hfUE9QM19RVUlUOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYzAgPT0gJ0MnICYmIGMxID09ICdBJyAmJiBjMiA9PSAnUCcgJiYgYzMgPT0gJ0EnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21tYW5kID0gTkdYX1BPUDNfQ0FQQTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMwID09ICdOJyAmJiBjMSA9PSAnTycgJiYgYzIgPT0gJ08nICYmIGMzID09ICdQJykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29tbWFuZCA9IE5HWF9QT1AzX05PT1A7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zcGFjZXNfYmVmb3JlX2FyZ3VtZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENSOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGNoIDwgJ0EnIHx8IGNoID4gJ1onKSAmJiAoY2ggPCAnYScgfHwgY2ggPiAneicpKSB7CisgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X3NwYWNlc19iZWZvcmVfYXJndW1lbnQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1I6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKKyAgICAgICAgICAgICAgICBzLT5hcmdfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICAgICAgcy0+YXJnX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAocy0+YXJncy5uZWx0cyA8PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYXJndW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHMtPmFyZ19zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIHN3X2FyZ3VtZW50OgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnICc6CkBAIC0xMjYsNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJnLT5sZW4gPSBwIC0gMSAtIHMtPmFyZ19zdGFydDsKKyAgICAgICAgICAgICAgICBhcmctPmxlbiA9IHAgLSBzLT5hcmdfc3RhcnQ7CiAgICAgICAgICAgICAgICAgYXJnLT5kYXRhID0gcy0+YXJnX3N0YXJ0OwogICAgICAgICAgICAgICAgIHMtPmFyZ19zdGFydCA9IE5VTEw7CiAKQEAgLTEzOCw4ICs0NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIExGOgotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2RvbmU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xNDgsNDIgKzQ1OSw0MiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgLyogZW5kIG9mIHJlcXVlc3QgbGluZSAqLwogICAgICAgICBjYXNlIHN3X2FsbW9zdF9kb25lOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSBMRjoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2RvbmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IHN3X3N0YXJ0OwotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogc3VwcHJlc3Mgd2FybmluZyAqLwotICAgICAgICBjYXNlIHN3X2RvbmU6Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHMtPmJ1ZmZlci0+cG9zID0gcDsKKyAgICBzLT5zdGF0ZSA9IHN0YXRlOwogCi0gICAgaWYgKHN0YXRlID09IHN3X2RvbmUpIHsKLSAgICAgICAgaWYgKHMtPmFyZ19zdGFydCkgewotICAgICAgICAgICAgYXJnID0gbmd4X2FycmF5X3B1c2goJnMtPmFyZ3MpOwotICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZy0+bGVuID0gcy0+YXJnX2VuZCAtIHMtPmFyZ19zdGFydDsKLSAgICAgICAgICAgIGFyZy0+ZGF0YSA9IHMtPmFyZ19zdGFydDsKLSAgICAgICAgICAgIHMtPmFyZ19zdGFydCA9IE5VTEw7CisgICAgcmV0dXJuIE5HWF9BR0FJTjsKKworZG9uZToKKworICAgIHMtPmJ1ZmZlci0+cG9zID0gcCArIDE7CisKKyAgICBpZiAocy0+YXJnX3N0YXJ0KSB7CisgICAgICAgIGFyZyA9IG5neF9hcnJheV9wdXNoKCZzLT5hcmdzKTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9Ci0KLSAgICAgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKLSAgICAgICAgcmV0dXJuIE5HWF9PSzsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPnN0YXRlID0gc3RhdGU7Ci0gICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgICAgIGFyZy0+bGVuID0gcy0+YXJnX2VuZCAtIHMtPmFyZ19zdGFydDsKKyAgICAgICAgYXJnLT5kYXRhID0gcy0+YXJnX3N0YXJ0OworICAgICAgICBzLT5hcmdfc3RhcnQgPSBOVUxMOwogICAgIH0KKworICAgIHMtPnN0YXRlID0gc3dfc3RhcnQ7CisKKyAgICByZXR1cm4gTkdYX09LOworCitpbnZhbGlkOgorCisgICAgcy0+c3RhdGUgPSBzd19zdGFydDsKKworICAgIHJldHVybiBOR1hfSU1BUF9QQVJTRV9JTlZBTElEX0NPTU1BTkQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eV9tb2R1bGUuYyBiL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5X21vZHVsZS5jCmluZGV4IGIzYmVkYWUuLjUxNzdlMjggMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5X21vZHVsZS5jCisrKyBiL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5X21vZHVsZS5jCkBAIC0xNywxNiArMTcsMjMgQEAKIAogCiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9ibG9ja19yZWFkKG5neF9ldmVudF90ICpyZXYpOwotc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfYXV0aF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOworc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfaW1hcF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOworc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfcG9wM19oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOwogc3RhdGljIHZvaWQgbmd4X2ltYXBfcHJveHlfZHVtbXlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwotc3RhdGljIG5neF9pbnRfdCBuZ3hfaW1hcF9wcm94eV9yZWFkX3Jlc3BvbnNlKG5neF9pbWFwX3Nlc3Npb25fdCAqcyk7CitzdGF0aWMgbmd4X2ludF90IG5neF9pbWFwX3Byb3h5X3JlYWRfcmVzcG9uc2Uobmd4X2ltYXBfc2Vzc2lvbl90ICpzLAorICAgIG5neF91aW50X3Qgd2hhdCk7CiBzdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyKG5neF9ldmVudF90ICpldik7CitzdGF0aWMgdm9pZCBuZ3hfaW1hcF9wcm94eV9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iobmd4X2ltYXBfc2Vzc2lvbl90ICpzKTsKIHN0YXRpYyB2b2lkIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24obmd4X2ltYXBfc2Vzc2lvbl90ICpzKTsKIHN0YXRpYyB2b2lkICpuZ3hfaW1hcF9wcm94eV9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2ltYXBfcHJveHlfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LAogICAgIHZvaWQgKmNoaWxkKTsKIAogCisjZGVmaW5lIE5HWF9JTUFQX1dBSVRfT0sgICAgMAorI2RlZmluZSBOR1hfSU1BUF9XQUlUX05FWFQgIDEKKworCiBzdGF0aWMgbmd4X2NvbW1hbmRfdCAgbmd4X2ltYXBfcHJveHlfY29tbWFuZHNbXSA9IHsKICAgICB7IG5neF9zdHJpbmcoInByb3h5IiksCiAgICAgICBOR1hfSU1BUF9NQUlOX0NPTkZ8TkdYX0lNQVBfU1JWX0NPTkZ8TkdYX0NPTkZfRkxBRywKQEAgLTYxLDEyICs2OCwxMyBAQAogdm9pZAogbmd4X2ltYXBfcHJveHlfaW5pdChuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsIG5neF9wZWVyc190ICpwZWVycykKIHsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgIHJjOwotICAgIG5neF9pbWFwX3Byb3h5X2N0eF90ICAqcDsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfaW1hcF9wcm94eV9jdHhfdCAgICAgICpwOworICAgIG5neF9pbWFwX2NvcmVfc3J2X2NvbmZfdCAgKmNzY2Y7CiAKICAgICBwID0gbmd4X3BjYWxsb2Mocy0+Y29ubmVjdGlvbi0+cG9vbCwgc2l6ZW9mKG5neF9pbWFwX3Byb3h5X2N0eF90KSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKHMtPmNvbm5lY3Rpb24pOworICAgICAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNzksMTYgKzg3LDI3IEBACiAgICAgcmMgPSBuZ3hfZXZlbnRfY29ubmVjdF9wZWVyKCZwLT51cHN0cmVhbSk7CiAKICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24ocyk7CisgICAgICAgIG5neF9pbWFwX3Nlc3Npb25faW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgY3NjZiA9IG5neF9pbWFwX2dldF9tb2R1bGVfc3J2X2NvbmYocywgbmd4X2ltYXBfY29yZV9tb2R1bGUpOworICAgIG5neF9hZGRfdGltZXIocC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+cmVhZCwgY3NjZi0+dGltZW91dCk7CisKICAgICBwLT51cHN0cmVhbS5jb25uZWN0aW9uLT5kYXRhID0gczsKICAgICBwLT51cHN0cmVhbS5jb25uZWN0aW9uLT5wb29sID0gcy0+Y29ubmVjdGlvbi0+cG9vbDsKIAogICAgIHMtPmNvbm5lY3Rpb24tPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9ibG9ja19yZWFkOwotICAgIHAtPnVwc3RyZWFtLmNvbm5lY3Rpb24tPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9hdXRoX2hhbmRsZXI7CiAgICAgcC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9kdW1teV9oYW5kbGVyOworCisgICAgaWYgKHMtPnByb3RvY29sID09IE5HWF9JTUFQX1BPUDNfUFJPVE9DT0wpIHsKKyAgICAgICAgcC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X3BvcDNfaGFuZGxlcjsKKyAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9wb3AzX3N0YXJ0OworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2ltYXBfaGFuZGxlcjsKKyAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9pbWFwX3N0YXJ0OworICAgIH0KIH0KIAogCkBAIC0xMTAsNTMgKzEyOSwxODkgQEAKIAogCiBzdGF0aWMgdm9pZAotbmd4X2ltYXBfcHJveHlfYXV0aF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCituZ3hfaW1hcF9wcm94eV9pbWFwX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICpwOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgIHJjOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgIGxpbmU7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKLSAgICBuZ3hfaW1hcF9zZXNzaW9uX3QgICpzOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgKnA7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbGluZTsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICpjOworICAgIG5neF9pbWFwX3Nlc3Npb25fdCAgICAgICAgKnM7CisgICAgbmd4X2ltYXBfY29yZV9zcnZfY29uZl90ICAqY3NjZjsKIAotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IGF1dGggaGFuZGxlciIpOworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImltYXAgcHJveHkgaW1hcCBhdXRoIGhhbmRsZXIiKTsKIAogICAgIGMgPSByZXYtPmRhdGE7CiAgICAgcyA9IGMtPmRhdGE7CiAKICAgICBpZiAocmV2LT50aW1lZG91dCkgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCBOR1hfRVRJTUVET1VULCAiY2xpZW50IHRpbWVkIG91dCIpOwotICAgICAgICBuZ3hfaW1hcF9wcm94eV9jbG9zZV9zZXNzaW9uKHMpOworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfSU5GTywgYy0+bG9nLCBOR1hfRVRJTUVET1VULAorICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSB0aW1lZCBvdXQiKTsKKyAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKHMtPnByb3h5LT5idWZmZXIgPT0gTlVMTCkgewotICAgICAgICBzLT5wcm94eS0+YnVmZmVyID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLCAvKiBTVFVCICovIDQwOTYpOworICAgICAgICBjc2NmID0gbmd4X2ltYXBfZ2V0X21vZHVsZV9zcnZfY29uZihzLCBuZ3hfaW1hcF9jb3JlX21vZHVsZSk7CisKKyAgICAgICAgcy0+cHJveHktPmJ1ZmZlciA9IG5neF9jcmVhdGVfdGVtcF9idWYoYy0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NjZi0+cHJveHlfYnVmZmVyX3NpemUpOwogICAgICAgICBpZiAocy0+cHJveHktPmJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuZ3hfaW1hcF9wcm94eV9jbG9zZV9zZXNzaW9uKHMpOworICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmMgPSBuZ3hfaW1hcF9wcm94eV9yZWFkX3Jlc3BvbnNlKHMpOworICAgIHJjID0gbmd4X2ltYXBfcHJveHlfcmVhZF9yZXNwb25zZShzLCBzLT5pbWFwX3N0YXRlID09IG5neF9pbWFwX3N0YXJ0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0lNQVBfV0FJVF9PSyA6IE5HWF9JTUFQX1dBSVRfTkVYVCk7CiAKICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIC8qIFRPRE86IG5neF9pbWFwX3Byb3h5X2ZpbmFsaXplX3Nlc3Npb24ocywgTkdYX0lNQVBfSU5URVJOQUxfRVJST1IpICovCi0gICAgICAgIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24ocyk7CisgICAgICAgIG5neF9pbWFwX3Byb3h5X2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChzLT5pbWFwX3N0YXRlID09IG5neF9wb3AzX3N0YXJ0KSB7CisgICAgc3dpdGNoIChzLT5pbWFwX3N0YXRlKSB7CiAKLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCByZXYtPmxvZywgMCwgImltYXAgcHJveHkgc2VuZCB1c2VyIik7CisgICAgY2FzZSBuZ3hfaW1hcF9zdGFydDoKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCByZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImltYXAgcHJveHkgc2VuZCBsb2dpbiIpOwogCi0gICAgICAgIGxpbmUubGVuID0gc2l6ZW9mKCJVU0VSICIpICsgcy0+bG9naW4ubGVuIC0gMSArIDI7CisgICAgICAgIGxpbmUubGVuID0gcy0+dGFnLmxlbiArIHNpemVvZigiTE9HSU4gIikgLSAxCisgICAgICAgICAgICAgICAgICAgKyAxICsgTkdYX1NJWkVfVF9MRU4gKyAxICsgMjsKICAgICAgICAgbGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbik7CiAgICAgICAgIGlmIChsaW5lLmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfY2xvc2Vfc2Vzc2lvbihzKTsKKyAgICAgICAgICAgIG5neF9pbWFwX3Byb3h5X2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUubGVuID0gbmd4X3NwcmludGYobGluZS5kYXRhLCAiJVZMT0dJTiB7JXV6fSIgQ1JMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+dGFnLCBzLT5sb2dpbi5sZW4pCisgICAgICAgICAgICAgICAgICAgLSBsaW5lLmRhdGE7CisKKyAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9pbWFwX2xvZ2luOworICAgICAgICBicmVhazsKKworICAgIGNhc2Ugbmd4X2ltYXBfbG9naW46CisgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IHNlbmQgdXNlciIpOworCisgICAgICAgIGxpbmUubGVuID0gcy0+bG9naW4ubGVuICsgMSArIE5HWF9TSVpFX1RfTEVOICsgMSArIDI7CisgICAgICAgIGxpbmUuZGF0YSA9IG5neF9wYWxsb2MoYy0+cG9vbCwgbGluZS5sZW4pOworICAgICAgICBpZiAobGluZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9pbWFwX3Byb3h5X2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUubGVuID0gbmd4X3NwcmludGYobGluZS5kYXRhLCAiJVZ7JXV6fSIgQ1JMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bG9naW4sIHMtPnBhc3N3ZC5sZW4pCisgICAgICAgICAgICAgICAgICAgLSBsaW5lLmRhdGE7CisKKyAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9pbWFwX3VzZXI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBuZ3hfaW1hcF91c2VyOgorICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHJldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaW1hcCBwcm94eSBzZW5kIHBhc3N3ZCIpOworCisgICAgICAgIGxpbmUubGVuID0gcy0+cGFzc3dkLmxlbiArIDI7CisgICAgICAgIGxpbmUuZGF0YSA9IG5neF9wYWxsb2MoYy0+cG9vbCwgbGluZS5sZW4pOworICAgICAgICBpZiAobGluZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9pbWFwX3Byb3h5X2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGxpbmUuZGF0YSwgcy0+cGFzc3dkLmRhdGEsIHMtPnBhc3N3ZC5sZW4pOworICAgICAgICAqcCsrID0gQ1I7ICpwID0gTEY7CisKKyAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9pbWFwX3Bhc3N3ZDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKKyAgICAgICAgbGluZS5sZW4gPSAwOworICAgICAgICBsaW5lLmRhdGEgPSBOVUxMOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChuZ3hfc2VuZChjLCBsaW5lLmRhdGEsIGxpbmUubGVuKSA8IChzc2l6ZV90KSBsaW5lLmxlbikgeworICAgICAgICAvKgorICAgICAgICAgKiB3ZSB0cmVhdCB0aGUgaW5jb21wbGV0ZSBzZW5kaW5nIGFzIE5HWF9FUlJPUgorICAgICAgICAgKiBiZWNhdXNlIGl0IGlzIHZlcnkgc3RyYW5nZSBoZXJlCisgICAgICAgICAqLworICAgICAgICBuZ3hfaW1hcF9wcm94eV9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzLT5wcm94eS0+YnVmZmVyLT5wb3MgPSBzLT5wcm94eS0+YnVmZmVyLT5zdGFydDsKKyAgICBzLT5wcm94eS0+YnVmZmVyLT5sYXN0ID0gcy0+cHJveHktPmJ1ZmZlci0+c3RhcnQ7CisKKyAgICBpZiAocy0+aW1hcF9zdGF0ZSA9PSBuZ3hfaW1hcF9wYXNzd2QpIHsKKyAgICAgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7CisgICAgICAgIHMtPmNvbm5lY3Rpb24tPndyaXRlLT5oYW5kbGVyID0gbmd4X2ltYXBfcHJveHlfaGFuZGxlcjsKKyAgICAgICAgcmV2LT5oYW5kbGVyID0gbmd4X2ltYXBfcHJveHlfaGFuZGxlcjsKKyAgICAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorbmd4X2ltYXBfcHJveHlfcG9wM19oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpCit7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAqcDsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICBsaW5lOworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2ltYXBfc2Vzc2lvbl90ICAgICAgICAqczsKKyAgICBuZ3hfaW1hcF9jb3JlX3Nydl9jb25mX3QgICpjc2NmOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19JTUFQLCByZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaW1hcCBwcm94eSBwb3AzIGF1dGggaGFuZGxlciIpOworCisgICAgYyA9IHJldi0+ZGF0YTsKKyAgICBzID0gYy0+ZGF0YTsKKworICAgIGlmIChyZXYtPnRpbWVkb3V0KSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19JTkZPLCBjLT5sb2csIE5HWF9FVElNRURPVVQsCisgICAgICAgICAgICAgICAgICAgICAgInVwc3RyZWFtIHRpbWVkIG91dCIpOworICAgICAgICBuZ3hfaW1hcF9wcm94eV9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iocyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocy0+cHJveHktPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGNzY2YgPSBuZ3hfaW1hcF9nZXRfbW9kdWxlX3Nydl9jb25mKHMsIG5neF9pbWFwX2NvcmVfbW9kdWxlKTsKKworICAgICAgICBzLT5wcm94eS0+YnVmZmVyID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2NmLT5wcm94eV9idWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChzLT5wcm94eS0+YnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5neF9pbWFwX3Byb3h5X2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gbmd4X2ltYXBfcHJveHlfcmVhZF9yZXNwb25zZShzLCBOR1hfSU1BUF9XQUlUX09LKTsKKworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChzLT5pbWFwX3N0YXRlKSB7CisKKyAgICBjYXNlIG5neF9wb3AzX3N0YXJ0OgorICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0lNQVAsIHJldi0+bG9nLCAwLCAiaW1hcCBwcm94eSBzZW5kIHVzZXIiKTsKKworICAgICAgICBsaW5lLmxlbiA9IHNpemVvZigiVVNFUiAiKSAgLSAxICsgcy0+bG9naW4ubGVuICsgMjsKKyAgICAgICAgbGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbik7CisgICAgICAgIGlmIChsaW5lLmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE2NCw1MiArMzE5LDUyIEBACiAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHMtPmxvZ2luLmRhdGEsIHMtPmxvZ2luLmxlbik7CiAgICAgICAgICpwKysgPSBDUjsgKnAgPSBMRjsKIAotICAgICAgICBpZiAobmd4X3NlbmQoYywgbGluZS5kYXRhLCBsaW5lLmxlbikgPCAoc3NpemVfdCkgbGluZS5sZW4pIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB3ZSB0cmVhdCB0aGUgaW5jb21wbGV0ZSBzZW5kaW5nIGFzIE5HWF9FUlJPUgotICAgICAgICAgICAgICogYmVjYXVzZSBpdCBpcyB2ZXJ5IHN0cmFuZ2UgaGVyZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBuZ3hfaW1hcF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICBzLT5pbWFwX3N0YXRlID0gbmd4X3BvcDNfdXNlcjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIG5neF9wb3AzX3VzZXI6CisgICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IHNlbmQgcGFzcyIpOworCisgICAgICAgIGxpbmUubGVuID0gc2l6ZW9mKCJQQVNTICIpICAtIDEgKyBzLT5wYXNzd2QubGVuICsgMjsKKyAgICAgICAgbGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbik7CisgICAgICAgIGlmIChsaW5lLmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgcy0+aW1hcF9zdGF0ZSA9IG5neF9wb3AzX3VzZXI7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGxpbmUuZGF0YSwgIlBBU1MgIiwgc2l6ZW9mKCJQQVNTICIpIC0gMSk7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHMtPnBhc3N3ZC5kYXRhLCBzLT5wYXNzd2QubGVuKTsKKyAgICAgICAgKnArKyA9IENSOyAqcCA9IExGOwogCi0gICAgICAgIHMtPnByb3h5LT5idWZmZXItPnBvcyA9IHMtPnByb3h5LT5idWZmZXItPnN0YXJ0OwotICAgICAgICBzLT5wcm94eS0+YnVmZmVyLT5sYXN0ID0gcy0+cHJveHktPmJ1ZmZlci0+c3RhcnQ7CisgICAgICAgIHMtPmltYXBfc3RhdGUgPSBuZ3hfcG9wM19wYXNzd2Q7CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKKyAgICAgICAgbGluZS5sZW4gPSAwOworICAgICAgICBsaW5lLmRhdGEgPSBOVUxMOworI2VuZGlmCisgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSU1BUCwgcmV2LT5sb2csIDAsICJpbWFwIHByb3h5IHNlbmQgcGFzcyIpOwotCi0gICAgbGluZS5sZW4gPSBzaXplb2YoIlBBU1MgIikgKyBzLT5wYXNzd2QubGVuIC0gMSArIDI7Ci0gICAgbGluZS5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBsaW5lLmxlbik7Ci0gICAgaWYgKGxpbmUuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG5neF9pbWFwX3Byb3h5X2Nsb3NlX3Nlc3Npb24ocyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwID0gbmd4X2NweW1lbShsaW5lLmRhdGEsICJQQVNTICIsIHNpemVvZigiUEFTUyAiKSAtIDEpOwotICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHMtPnBhc3N3ZC5kYXRhLCBzLT5wYXNzd2QubGVuKTsKLSAgICAqcCsrID0gQ1I7ICpwID0gTEY7Ci0KICAgICBpZiAobmd4X3NlbmQoYywgbGluZS5kYXRhLCBsaW5lLmxlbikgPCAoc3NpemVfdCkgbGluZS5sZW4pIHsKICAgICAgICAgLyoKICAgICAgICAgICogd2UgdHJlYXQgdGhlIGluY29tcGxldGUgc2VuZGluZyBhcyBOR1hfRVJST1IKICAgICAgICAgICogYmVjYXVzZSBpdCBpcyB2ZXJ5IHN0cmFuZ2UgaGVyZQogICAgICAgICAgKi8KLSAgICAgICAgbmd4X2ltYXBfY2xvc2VfY29ubmVjdGlvbihjKTsKKyAgICAgICAgbmd4X2ltYXBfcHJveHlfaW50ZXJuYWxfc2VydmVyX2Vycm9yKHMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgcy0+cHJveHktPmJ1ZmZlci0+cG9zID0gcy0+cHJveHktPmJ1ZmZlci0+c3RhcnQ7CiAgICAgcy0+cHJveHktPmJ1ZmZlci0+bGFzdCA9IHMtPnByb3h5LT5idWZmZXItPnN0YXJ0OwogCi0gICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7Ci0gICAgcy0+Y29ubmVjdGlvbi0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOwotICAgIHJldi0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7Ci0gICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOworICAgIGlmIChzLT5pbWFwX3N0YXRlID09IG5neF9wb3AzX3Bhc3N3ZCkgeworICAgICAgICBzLT5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2ltYXBfcHJveHlfaGFuZGxlcjsKKyAgICAgICAgcy0+Y29ubmVjdGlvbi0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOworICAgICAgICByZXYtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOworICAgICAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7CisgICAgfQogfQogCiAKQEAgLTIyMSw3ICszNzYsNyBAQAogCiAKIHN0YXRpYyBuZ3hfaW50X3QKLW5neF9pbWFwX3Byb3h5X3JlYWRfcmVzcG9uc2Uobmd4X2ltYXBfc2Vzc2lvbl90ICpzKQorbmd4X2ltYXBfcHJveHlfcmVhZF9yZXNwb25zZShuZ3hfaW1hcF9zZXNzaW9uX3QgKnMsIG5neF91aW50X3Qgd2hhdCkKIHsKICAgICB1X2NoYXIgICAgICpwOwogICAgIHNzaXplX3QgICAgIG47CkBAIC0yNTksMTcgKzQxNCwzMSBAQAogCiAgICAgcCA9IGItPnBvczsKIAotICAgIGlmIChwWzBdID09ICcrJyAmJiBwWzFdID09ICdPJyAmJiBwWzJdID09ICdLJykgewotICAgICAgICByZXR1cm4gTkdYX09LOwotICAgIH0KKyAgICBpZiAocy0+cHJvdG9jb2wgPT0gTkdYX0lNQVBfUE9QM19QUk9UT0NPTCkgeworICAgICAgICBpZiAocFswXSA9PSAnKycgJiYgcFsxXSA9PSAnTycgJiYgcFsyXSA9PSAnSycpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KIAotICAgIGlmIChwWzBdID09ICctJyAmJiBwWzFdID09ICdFJyAmJiBwWzJdID09ICdSJyAmJiBwWzNdID09ICdSJykgewotICAgICAgICByZXR1cm4gTkdYX0lNQVBfUFJPWFlfRVJST1I7CisgICAgICAgIGlmIChwWzBdID09ICctJyAmJiBwWzFdID09ICdFJyAmJiBwWzJdID09ICdSJyAmJiBwWzNdID09ICdSJykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9JTUFQX1BST1hZX0VSUk9SOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAod2hhdCA9PSBOR1hfSU1BUF9XQUlUX09LKSB7CisgICAgICAgICAgICBpZiAocFswXSA9PSAnKicgJiYgcFsxXSA9PSAnICcgJiYgcFsyXSA9PSAnTycgJiYgcFszXSA9PSAnSycpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocFswXSA9PSAnKycgJiYgcFsxXSA9PSAnICcgJiYgcFsyXSA9PSAnTycgJiYgcFszXSA9PSAnSycpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgKihiLT5sYXN0IC0gMikgPSAnXDAnOwogICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHMtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBzZW50IGludmFsaWQgZ3JlZXRpbmcgbGluZTogXCIlc1wiIiwgcCk7CisgICAgICAgICAgICAgICAgICAidXBzdHJlYW0gc2VudCBpbnZhbGlkIHJlc3BvbnNlOiBcIiVzXCIiLCBwKTsKIAogICAgIHJldHVybiBOR1hfSU1BUF9QUk9YWV9JTlZBTElEOwogfQpAQCAtMzk3LDYgKzU2NiwyMSBAQAogCiAKIHN0YXRpYyB2b2lkCituZ3hfaW1hcF9wcm94eV9pbnRlcm5hbF9zZXJ2ZXJfZXJyb3Iobmd4X2ltYXBfc2Vzc2lvbl90ICpzKQoreworICAgIGlmIChzLT5wcm94eS0+dXBzdHJlYW0uY29ubmVjdGlvbikgeworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0lNQVAsIHMtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImNsb3NlIGltYXAgcHJveHkgY29ubmVjdGlvbjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm94eS0+dXBzdHJlYW0uY29ubmVjdGlvbi0+ZmQpOworCisgICAgICAgIG5neF9jbG9zZV9jb25uZWN0aW9uKHMtPnByb3h5LT51cHN0cmVhbS5jb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBuZ3hfaW1hcF9zZXNzaW9uX2ludGVybmFsX3NlcnZlcl9lcnJvcihzKTsKK30KKworCitzdGF0aWMgdm9pZAogbmd4X2ltYXBfcHJveHlfY2xvc2Vfc2Vzc2lvbihuZ3hfaW1hcF9zZXNzaW9uX3QgKnMpCiB7CiAgICAgaWYgKHMtPnByb3h5LT51cHN0cmVhbS5jb25uZWN0aW9uKSB7CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfbGludXhfY29uZmlnLmggYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfY29uZmlnLmgKaW5kZXggNWJhZDY0NS4uN2JkMjYyYSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oCisrKyBiL3NyYy9vcy91bml4L25neF9saW51eF9jb25maWcuaApAQCAtODgsNiArODgsMTEgQEAKICNlbmRpZgogCiAKKyNpZm5kZWYgTkdYX0hBVkVfR05VX0NSWVBUX1IKKyNkZWZpbmUgTkdYX0hBVkVfR05VX0NSWVBUX1IgICAgICAgICAxCisjZW5kaWYKKworCiAjaWZuZGVmIE5HWF9IQVZFX0lOSEVSSVRFRF9OT05CTE9DSwogI2RlZmluZSBOR1hfSEFWRV9JTkhFUklURURfTk9OQkxPQ0sgIDAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3VzZXIuYyBiL3NyYy9vcy91bml4L25neF91c2VyLmMKaW5kZXggMjJlYWZkMi4uY2JiMDhhOCAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3VzZXIuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfdXNlci5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpZiAoTkdYX0NSWVBUKQogCi0jaWYgKE5HWF9MSU5VWCkKKyNpZiAoTkdYX0hBVkVfR05VX0NSWVBUX1IpCiAKIG5neF9pbnRfdAogbmd4X2NyeXB0KG5neF9wb29sX3QgKnBvb2wsIHVfY2hhciAqa2V5LCB1X2NoYXIgKnNhbHQsIHVfY2hhciAqKmVuY3J5cHRlZCkKQEAgLTMzLDYgKzMzLDggQEAKICAgICBuZ3hfc2V0X2Vycm5vKDApOwogCiAgICAgY2QuaW5pdGlhbGl6ZWQgPSAwOworICAgIC8qIHdvcmsgYXJvdW5kIHRoZSBnbGliYy0yLjIuNSBidWcgKi8KKyAgICBjZC5jdXJyZW50X3NhbHRiaXRzID0gMDsKIAogICAgIHZhbHVlID0gY3J5cHRfcigoY2hhciAqKSBrZXksIChjaGFyICopIHNhbHQsICZjZCk7CiAK