ZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCA5ZmU5ZmRkLi5jNTcyYzg4IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0yNCw3ICsyNCw3IEBACiBQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUgID49IDAuMy45KQogUEtHX0NIRUNLX01PRFVMRVMoTElCT1NNT1ZUWSwgbGlib3Ntb3Z0eSkKIFBLR19DSEVDS19NT0RVTEVTKExJQk9TTU9HU00sIGxpYm9zbW9nc20gPj0gMC4zLjMpCi1QS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PR0IsIGxpYm9zbW9nYiA+PSAwLjUuMikKK1BLR19DSEVDS19NT0RVTEVTKExJQk9TTU9HQiwgbGlib3Ntb2diID49IDAuNS4xLjQpCiAKIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgc3lzbW9jb20tYnRzIGhhcmR3YXJlIHN1cHBvcnRdKQogQUNfQVJHX0VOQUJMRShzeXNtb2NvbS1idHMsCmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUuYW0gYi9zcmMvTWFrZWZpbGUuYW0KaW5kZXggNzhjMDFlMS4uY2E1ODZmZCAxMDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlLmFtCisrKyBiL3NyYy9NYWtlZmlsZS5hbQpAQCAtMzIsMTQgKzMyLDE1IEBACiAJZ3Byc19ybGNtYWNfZGF0YS5jcHAgXAogCWdwcnNfcmxjbWFjX3NjaGVkLmNwcCBcCiAJZ3NtX3RpbWVyLmNwcCBcCi0JYml0dmVjdG9yLmNwcAorCWJpdHZlY3Rvci5jcHAgXAorCXBjdV9sMV9pZi5jcHAKIAogaWYgRU5BQkxFX1NZU01PQlRTCiBsaWJncHJzX2xhX1NPVVJDRVMgKz0gXAotCXN5c21vX2wxX2lmLmNwcAorCXN5c21vX3NvY2suY3BwCiBlbHNlCiBsaWJncHJzX2xhX1NPVVJDRVMgKz0gXAotCXBjdV9sMV9pZi5jcHAKKwlvcGVuYnRzX3NvY2suY3BwCiBlbmRpZgogCiBub2luc3RfUFJPR1JBTVMgPSBcCkBAIC01Miw2ICs1Myw3IEBACiAJZ3NtX3JsY21hYy5oIFwKIAlncHJzX2Jzc2dwX3BjdS5oIFwKIAlncHJzX3JsY21hYy5oIFwKKwlwY3VpZl9wcm90by5oIFwKIAlwY3VfbDFfaWYuaCBcCiAJZ3NtX3RpbWVyLmggXAogCWJpdHZlY3Rvci5oCmRpZmYgLS1naXQgYS9zcmMvZ3Byc19ic3NncF9wY3UuY3BwIGIvc3JjL2dwcnNfYnNzZ3BfcGN1LmNwcAppbmRleCA3MzNkNGUyLi5mOWE0MjFhIDEwMDY0NAotLS0gYS9zcmMvZ3Byc19ic3NncF9wY3UuY3BwCisrKyBiL3NyYy9ncHJzX2Jzc2dwX3BjdS5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKIGludCBncHJzX2Jzc2dwX3BjdV9yeF9kbF91ZChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCiB7CiAJc3RydWN0IGJzc2dwX3VkX2hkciAqYnVkaDsKKwogCWludCB0Zmk7CiAJdWludDMyX3QgdGxsaTsKIAlpbnQgaSwgajsKQEAgLTQxLDYgKzQyLDEwIEBACiAJYnVkaCA9IChzdHJ1Y3QgYnNzZ3BfdWRfaGRyICopbXNnYl9ic3NncGgobXNnKTsKIAl0bGxpID0gbnRvaGwoYnVkaC0+dGxsaSk7CiAKKwlpZiAoIXRiZikKKwl7CisJCXJldHVybiAtMTsKKwl9CiAJLyogTExDX1BEVSBpcyBtYW5kYXRvcnkgSUUgKi8KIAlpZiAoIVRMVlBfUFJFU0VOVCh0cCwgQlNTR1BfSUVfTExDX1BEVSkpCiAJewpAQCAtMTI3LDYgKzEzMiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKwogLyogUmVjZWl2ZSBhIEJTU0dQIFBEVSBmcm9tIGEgQlNTIG9uIGEgUFRQIEJWQ0kgKi8KIGludCBncHJzX2Jzc2dwX3BjdV9yeF9wdHAoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHRsdl9wYXJzZWQgKnRwLCBzdHJ1Y3QgYnNzZ3BfYnZjX2N0eCAqYmN0eCkKIHsKZGlmZiAtLWdpdCBhL3NyYy9ncHJzX3JsY21hYy5jcHAgYi9zcmMvZ3Byc19ybGNtYWMuY3BwCmluZGV4IDdkMjhkZTEuLjlkMjYwMWMgMTAwNjQ0Ci0tLSBhL3NyYy9ncHJzX3JsY21hYy5jcHAKKysrIGIvc3JjL2dwcnNfcmxjbWFjLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGdwcnNfYnNzZ3BfcGN1Lmg+CiAjaW5jbHVkZSA8cGN1X2wxX2lmLmg+CiAjaW5jbHVkZSA8Z3Byc19ybGNtYWMuaD4KLSNpbmNsdWRlIDxnc21MMXByaW0uaD4KIAogTExJU1RfSEVBRChncHJzX3JsY21hY190YmZzKTsKIHZvaWQgKnJsY21hY190YWxsX2N0eDsKQEAgLTI0Nyw3ICsyNDYsNyBAQAogCiAJc3dpdGNoICh0YmYtPmZUKSB7CiAJY2FzZSAwOgotaGllciBhbGxlcyD8YmVyZGVua2VuCitoaWVyIGFsbGVzIGJlcmRlbmtlbgogCQkvLyBUaGlzIGlzIHRpbWVyIGZvciBkZWxheSBSTEMvTUFDIGRhdGEgc2VuZGluZyBhZnRlciBEb3dubGluayBJbW1lZGlhdGUgQXNzaWdubWVudCBvbiBDQ0NILgogCQlncHJzX3JsY21hY19zZWdtZW50X2xsY19wZHUodGJmKTsKIAkJTE9HUChEUkxDTUFDLCBMT0dMX05PVElDRSwgIlRCRjogW0RPV05MSU5LXSBFTkQgVEZJOiAldSBUTExJOiAweCUwOHggXG4iLCB0YmYtPnRmaSwgdGJmLT50bGxpKTsKQEAgLTQ4NSw2NiArNDg0LDc5IEBACiAvLwliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBNZWFzdXJlbWVudCBNYXBwaW5nIHN0cnVjdCBub3QgcHJlc2VudAogfQogCisKIC8qIGdlbmVyYXRlIGRvd25saW5rIGFzc2lnbm1lbnQgKi8KLXZvaWQgd3JpdGVfcGFja2V0X2Rvd25saW5rX2Fzc2lnbm1lbnQoYml0dmVjICogZGVzdCwgdWludDhfdCBvbGRfdGZpLAordm9pZCB3cml0ZV9wYWNrZXRfZG93bmxpbmtfYXNzaWdubWVudChSbGNNYWNEb3dubGlua190ICogYmxvY2ssIHVpbnQ4X3Qgb2xkX3RmaSwKIAl1aW50OF90IG9sZF9kb3dubGluaywgdWludDhfdCBuZXdfdGZpLCB1aW50MTZfdCBhcmZjbiwKIAl1aW50OF90IHRuLCB1aW50OF90IHRhLCB1aW50OF90IHRzYywgdWludDhfdCBwb2xsKQogewotCS8vIFRPRE8gV2Ugc2hvdWxkIHVzZSBvdXIgaW1wbGVtZW50YXRpb24gb2YgZW5jb2RlIFJMQy9NQUMgQ29udHJvbCBtZXNzYWdlcy4KLQl1bnNpZ25lZCB3cCA9IDA7CisJLy8gUGFja2V0IGRvd25saW5rIGFzc2lnbm1lbnQgVFMgNDQuMDYwIDExLjIuNworCiAJaW50IGk7Ci0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwyKTsgIC8vIFBheWxvYWQgVHlwZQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7ICAvLyBVcGxpbmsgYmxvY2sgd2l0aCBURE1BIGZyYW1lbnVtYmVyIChGTisxMykKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AscG9sbCwxKTsgIC8vIFN1cHBsL1BvbGxpbmcgQml0Ci0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwzKTsgIC8vIFVwbGluayBzdGF0ZSBmbGFnCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4Miw2KTsgIC8vIE1FU1NBR0UgVFlQRQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7ICAvLyBQYWdlIE1vZGUKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIHN3aXRjaCBQRVJTSVNUX0xFVkVMOiBvZmYKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBzd2l0Y2ggVEZJIDogb24KLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3Asb2xkX2Rvd25saW5rLDEpOyAvLyAwPVVQTElOSyBURkksIDE9REwgVEZJCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLG9sZF90ZmksNSk7IC8vIFRGSQorCWJsb2NrLT5QQVlMT0FEX1RZUEUgPSAweDE7ICAvLyBSTEMvTUFDIGNvbnRyb2wgYmxvY2sgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvcHRpb25hbCBvY3RldHMgb2YgdGhlIFJMQy9NQUMgY29udHJvbCBoZWFkZXIKKwlibG9jay0+UlJCUCAgICAgICAgID0gMHgwOyAgLy8gTisxMworCWJsb2NrLT5TUCAgICAgICAgICAgPSBwb2xsOyAvLyBSUkJQIGZpZWxkIGlzIHZhbGlkCisJYmxvY2stPlVTRiAgICAgICAgICA9IDB4MDsgIC8vIFVwbGluayBzdGF0ZSBmbGFnCiAKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBNZXNzYWdlIGVzY2FwZQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMik7IC8vIE1lZGl1bSBBY2Nlc3MgTWV0aG9kOiBEeW5hbWljIEFsbG9jYXRpb24KLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOyAvLyBSTEMgYWNrbm93bGVkZ2VkIG1vZGUKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5NRVNTQUdFX1RZUEUgPSAweDI7ICAvLyBQYWNrZXQgRG93bmxpbmsgQXNzaWdubWVudAorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LlBBR0VfTU9ERSAgICA9IDB4MDsgIC8vIE5vcm1hbCBQYWdpbmcKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxvbGRfZG93bmxpbmssMSk7IC8vIHRoZSBuZXR3b3JrIGVzdGFibGlzaGVzIG5vIG5ldyBkb3dubGluayBUQkYgZm9yIHRoZSBtb2JpbGUgc3RhdGlvbgotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDgwID4+IHRuLDgpOyAvLyB0aW1lc2xvdChzKQorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LkV4aXN0X1BFUlNJU1RFTkNFX0xFVkVMICAgICAgPSAweDA7ICAgICAgICAgIC8vIFBFUlNJU1RFTkNFX0xFVkVMOiBvZmYKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7IC8vIHN3aXRjaCBUSU1JTkdfQURWQU5DRV9WQUxVRSA9IG9uCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRhLDYpOyAvLyBUSU1JTkdfQURWQU5DRV9WQUxVRQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIHN3aXRjaCBUSU1JTkdfQURWQU5DRV9JTkRFWCA9IG9mZgorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LklELlVuaW9uVHlwZSAgICAgICAgICAgICAgICAgPSAweDA7ICAgICAgICAgIC8vIFRGSSA9IG9uCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuSUQudS5HbG9iYWxfVEZJLlVuaW9uVHlwZSAgICA9IG9sZF9kb3dubGluazsgLy8gMD1VUExJTksgVEZJLCAxPURMIFRGSQorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LklELnUuR2xvYmFsX1RGSS51LlVQTElOS19URkkgPSBvbGRfdGZpOyAgICAgIC8vIFRGSQogCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gc3dpdGNoIFBPV0VSIENPTlRST0wgPSBvZmYKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAvLyBGcmVxdWVuY3kgUGFyYW1ldGVycyBpbmZvcm1hdGlvbiBlbGVtZW50cyA9IHByZXNlbnQKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5NQUNfTU9ERSAgICAgICAgICAgID0gMHgwOyAgICAgICAgICAvLyBEeW5hbWljIEFsbG9jYXRpb24KKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5STENfTU9ERSAgICAgICAgICAgID0gMHgwOyAgICAgICAgICAvLyBSTEMgYWNrbm93bGVkZ2VkIG1vZGUKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5DT05UUk9MX0FDSyAgICAgICAgID0gb2xkX2Rvd25saW5rOyAvLyBOVyBlc3RhYmxpc2hlcyBubyBuZXcgREwgVEJGIGZvciB0aGUgTVMgd2l0aCBydW5uaW5nIHRpbWVyIFQzMTkyCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuVElNRVNMT1RfQUxMT0NBVElPTiA9IDB4ODAgPj4gdG47ICAgLy8gdGltZXNsb3QocykKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0c2MsMyk7IC8vIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKFRTQykgPSAyCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgLy8gQVJGQ04gPSBwcmVzZW50Ci0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLGFyZmNuLDEwKTsgLy8gQVJGQ04KKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5QYWNrZXRfVGltaW5nX0FkdmFuY2UuRXhpc3RfVElNSU5HX0FEVkFOQ0VfVkFMVUUgPSAweDE7IC8vIFRJTUlOR19BRFZBTkNFX1ZBTFVFID0gb24KKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5QYWNrZXRfVGltaW5nX0FkdmFuY2UuVElNSU5HX0FEVkFOQ0VfVkFMVUUgICAgICAgPSB0YTsgIC8vIFRJTUlOR19BRFZBTkNFX1ZBTFVFCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuUGFja2V0X1RpbWluZ19BZHZhbmNlLkV4aXN0X0luZGV4QW5kdGltZVNsb3QgICAgID0gMHgwOyAvLyBUSU1JTkdfQURWQU5DRV9JTkRFWCA9IG9mZgogCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgLy8gc3dpdGNoIFRGSSAgIDogb24KLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsbmV3X3RmaSw1KTsvLyBURkkKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5FeGlzdF9QMF9hbmRfQlRTX1BXUl9DVFJMX01PREUgPSAweDA7ICAgLy8gUE9XRVIgQ09OVFJPTCA9IG9mZgogCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgLy8gUG93ZXIgQ29udHJvbCBQYXJhbWV0ZXJzIElFID0gcHJlc2VudAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsNCk7IC8vIEFMUEhBIHBvd2VyIGNvbnRyb2wgcGFyYW1ldGVyCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuRXhpc3RfRnJlcXVlbmN5X1BhcmFtZXRlcnMgICAgID0gMHgxOyAgIC8vIEZyZXF1ZW5jeSBQYXJhbWV0ZXJzID0gb24KKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5GcmVxdWVuY3lfUGFyYW1ldGVycy5UU0MgICAgICAgPSB0c2M7ICAgLy8gVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSAoVFNDKQorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LkZyZXF1ZW5jeV9QYXJhbWV0ZXJzLlVuaW9uVHlwZSA9IDB4MDsgICAvLyBBUkZDTiA9IG9uCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuRnJlcXVlbmN5X1BhcmFtZXRlcnMudS5BUkZDTiAgID0gYXJmY247IC8vIEFSRkNOCisKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5FeGlzdF9ET1dOTElOS19URklfQVNTSUdOTUVOVCAgPSAweDE7ICAgICAvLyBET1dOTElOSyBURkkgQVNTSUdOTUVOVCA9IG9uCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuRE9XTkxJTktfVEZJX0FTU0lHTk1FTlQgICAgICAgID0gbmV3X3RmaTsgLy8gVEZJCisKKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5FeGlzdF9Qb3dlcl9Db250cm9sX1BhcmFtZXRlcnMgPSAweDE7ICAgLy8gUG93ZXIgQ29udHJvbCBQYXJhbWV0ZXJzID0gb24KKwlibG9jay0+dS5QYWNrZXRfRG93bmxpbmtfQXNzaWdubWVudC5Qb3dlcl9Db250cm9sX1BhcmFtZXRlcnMuQUxQSEEgPSAweDA7ICAgLy8gQUxQSEEKKwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwodG4gPT0gaSksMSk7IC8vIHN3aXRjaCBHQU1NQV9UTltpXSA9IG9uIG9yIG9mZgotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsNSk7IC8vIEdBTU1BX1ROW3RuXQorCXsKKwkJaWYgKHRuID09IGkpCisJCXsKKwkJCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LlBvd2VyX0NvbnRyb2xfUGFyYW1ldGVycy5TbG90W2ldLkV4aXN0ICAgID0gMHgxOyAvLyBTbG90W2ldID0gb24KKwkJCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LlBvd2VyX0NvbnRyb2xfUGFyYW1ldGVycy5TbG90W2ldLkdBTU1BX1ROID0gMHgwOyAvLyBHQU1NQV9UTgorCQl9CisJCWVsc2UKKwkJeworCQkJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuUG93ZXJfQ29udHJvbF9QYXJhbWV0ZXJzLlNsb3RbaV0uRXhpc3QgICAgPSAweDA7IC8vIFNsb3RbaV0gPSBvZmYKKwkJfQorCX0KIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7IC8vIFRCRiBTdGFydGluZyBUSU1FIElFIG5vdCBwcmVzZW50Ci0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwxKTsgLy8gTWVhc3VyZW1lbnQgTWFwcGluZyBzdHJ1Y3Qgbm90IHByZXNlbnQKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDEpOworCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LkV4aXN0X1RCRl9TdGFydGluZ19UaW1lICAgPSAweDA7IC8vIFRCRiBTdGFydGluZyBUSU1FID0gb2ZmCisJYmxvY2stPnUuUGFja2V0X0Rvd25saW5rX0Fzc2lnbm1lbnQuRXhpc3RfTWVhc3VyZW1lbnRfTWFwcGluZyA9IDB4MDsgLy8gTWVhc3VyZW1lbnRfTWFwcGluZyA9IG9mZgorCWJsb2NrLT51LlBhY2tldF9Eb3dubGlua19Bc3NpZ25tZW50LkV4aXN0X0FkZGl0aW9uc1I5OSAgICAgICAgPSAweDA7IC8vIEFkZGl0aW9uc1I5OSA9IG9mZgogfQogCiAvKiBnZW5lcmF0ZSB1cGxpbmsgYWNrICovCi12b2lkIHdyaXRlX3BhY2tldF91cGxpbmtfYWNrKGJpdHZlYyAqIGRlc3QsIHN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZiwKK3ZvaWQgd3JpdGVfcGFja2V0X3VwbGlua19hY2soUmxjTWFjRG93bmxpbmtfdCAqIGJsb2NrLCBzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmYsCiAJdWludDhfdCBmaW5hbCkKIHsKKwkvLyBQYWNrZXQgVXBsaW5rIEFjay9OYWNrICBUUyA0NC4wNjAgMTEuMi4yOAorCiAJY2hhciBzaG93X3Zfbls2NV07CiAKLQkvLyBUT0RPIFdlIHNob3VsZCB1c2Ugb3VyIGltcGxlbWVudGF0aW9uIG9mIGVuY29kZSBSTEMvTUFDIENvbnRyb2wgbWVzc2FnZXMuCi0JdW5zaWduZWQgd3AgPSAwOworCXVpbnQ4X3QgcmJiID0gMDsKIAl1aW50MTZfdCBpLCBiYm47CiAJdWludDE2X3QgbW9kX3Nuc19oYWxmID0gKHRiZi0+c25zID4+IDEpIC0gMTsKIAljaGFyIGJpdDsKQEAgLTU1MiwzMCArNTY0LDE5IEBACiAJTE9HUChEUkxDTUFDVUwsIExPR0xfREVCVUcsICJTZW5kaW5nIEFjay9OYWNrIGZvciBUQkY9JWQgIgogCQkiKGZpbmFsPSVkKVxuIiwgdGJmLT50ZmksIGZpbmFsKTsKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMik7ICAvLyBwYXlsb2FkCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgIC8vIFVwbGluayBibG9jayB3aXRoIFRETUEgZnJhbWVudW1iZXIgKE4rMTMpCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLGZpbmFsLDEpOyAgLy8gU3VwcGwvUG9sbGluZyBCaXQKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDMpOyAgLy8gVXBsaW5rIHN0YXRlIGZsYWcKLQkKLQkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7ICAvLyBSZWR1Y2VkIGJsb2NrIHNlcXVlbmNlIG51bWJlcgotCS8vYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLEJTTis2LDUpOyAgLy8gUmFkaW8gdHJhbnNhY3Rpb24gaWRlbnRpZmllcgotCS8vYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgIC8vIEZpbmFsIHNlZ21lbnQKLQkvL2JpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDEsMSk7ICAvLyBBZGRyZXNzIGNvbnRyb2wKKwlibG9jay0+UEFZTE9BRF9UWVBFID0gMHgxOyAgIC8vIFJMQy9NQUMgY29udHJvbCBibG9jayB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIG9wdGlvbmFsIG9jdGV0cyBvZiB0aGUgUkxDL01BQyBjb250cm9sIGhlYWRlcgorCWJsb2NrLT5SUkJQICAgICAgICAgPSAweDA7ICAgLy8gTisxMworCWJsb2NrLT5TUCAgICAgICAgICAgPSBmaW5hbDsgLy8gUlJCUCBmaWVsZCBpcyB2YWxpZCwgaWYgaXQgaXMgZmluYWwgYWNrCisJYmxvY2stPlVTRiAgICAgICAgICA9IDB4MDsgICAvLyBVcGxpbmsgc3RhdGUgZmxhZwogCi0JLy9iaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAgLy8gUG93ZXIgcmVkdWN0aW9uOiAwCi0JLy9iaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsVEZJLDUpOyAgLy8gVGVtcG9yYXJ5IGZsb3cgaWRlbnRpZmllcgotCS8vYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MSwxKTsgIC8vIERpcmVjdGlvbgorCWJsb2NrLT51LlBhY2tldF9VcGxpbmtfQWNrX05hY2suTUVTU0FHRV9UWVBFID0gMHg5OyAgICAgIC8vIFBhY2tldCBEb3dubGluayBBc3NpZ25tZW50CisJYmxvY2stPnUuUGFja2V0X1VwbGlua19BY2tfTmFjay5QQUdFX01PREUgICAgPSAweDA7ICAgICAgLy8gTm9ybWFsIFBhZ2luZworCWJsb2NrLT51LlBhY2tldF9VcGxpbmtfQWNrX05hY2suVVBMSU5LX1RGSSAgID0gdGJmLT50Zmk7IC8vIFVwbGluayBURkkKIAotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDA5LDYpOyAvLyBNRVNTQUdFIFRZUEUKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOyAgLy8gUGFnZSBNb2RlCi0KLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgwLDIpOwotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCx0YmYtPnRmaSw1KTsgLy8gVXBsaW5rIFRGSQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAsMSk7Ci0JCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4MCwyKTsgIC8vIENTMQotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCxmaW5hbCwxKTsgIC8vIEZJTkFMX0FDS19JTkRJQ0FUSU9OCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRiZi0+ZGlyLnVsLnZfciw3KTsgLy8gU1RBUlRJTkdfU0VRVUVOQ0VfTlVNQkVSCisJYmxvY2stPnUuUGFja2V0X1VwbGlua19BY2tfTmFjay5VbmlvblR5cGUgICAgPSAweDA7ICAgICAgLy8gUFVfQWNrTmFja19HUFJTID0gb24KKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5DSEFOTkVMX0NPRElOR19DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA7ICAgICAgICAgICAgIC8vIENTMQorCWJsb2NrLT51LlBhY2tldF9VcGxpbmtfQWNrX05hY2sudS5QVV9BY2tOYWNrX0dQUlNfU3RydWN0LkFja19OYWNrX0Rlc2NyaXB0aW9uLkZJTkFMX0FDS19JTkRJQ0FUSU9OICAgICA9IGZpbmFsOyAgICAgICAgICAgLy8gRklOQUwgQUNLIElORElDQVRJT04KKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5BY2tfTmFja19EZXNjcmlwdGlvbi5TVEFSVElOR19TRVFVRU5DRV9OVU1CRVIgPSB0YmYtPmRpci51bC52X3I7IC8vIFNUQVJUSU5HX1NFUVVFTkNFX05VTUJFUgogCS8vIFJFQ0VJVkVfQkxPQ0tfQklUTUFQCiAJZm9yIChpID0gMCwgYmJuID0gKHRiZi0+ZGlyLnVsLnZfciAtIDY0KSAmIG1vZF9zbnNfaGFsZjsgaSA8IDY0OwogCSAgICAgaSsrLCBiYm4gPSAoYmJuICsgMSkgJiBtb2Rfc25zX2hhbGYpIHsKQEAgLTU4MywxNSArNTg0LDI5IEBACiAJCWlmIChiaXQgPT0gMCkKIAkJCWJpdCA9ICcgJzsKIAkJc2hvd192X25baV0gPSBiaXQ7Ci0JCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwoYml0ID09ICdSJyksMSk7CisJCWlmIChiaXQgPT0gJ1InKQorCQkJcmJiID0gKHJiYiA8PCAxKXwxOworCQllbHNlCisJCQlyYmIgPSAocmJiIDw8IDEpOworCQlpZigoaSU4KSA9PSA3KQorCQl7CisJCQlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5BY2tfTmFja19EZXNjcmlwdGlvbi5SRUNFSVZFRF9CTE9DS19CSVRNQVBbaS84XSA9IHJiYjsKKwkJCXJiYiA9IDA7CisJCX0KIAl9CiAJc2hvd192X25bNjRdID0gJ1wwJzsKIAlMT0dQKERSTENNQUNVTCwgTE9HTF9ERUJVRywgIi0gVihOKTogXCIlc1wiIFI9UmVjZWl2ZWQgIgogCQkiTj1Ob3QtUmVjZWl2ZWRcbiIsIHNob3dfdl9uKTsKLQliaXR2ZWNfd3JpdGVfZmllbGQoZGVzdCwgd3AsMHgxLDEpOyAgLy8gQ09OVEVOVElPTl9SRVNPTFVUSU9OX1RMTEkgPSBwcmVzZW50Ci0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLHRiZi0+dGxsaSw4KjQpOwotCWJpdHZlY193cml0ZV9maWVsZChkZXN0LCB3cCwweDAwLDQpOyAvL3NwYXJlCi0JYml0dmVjX3dyaXRlX2ZpZWxkKGRlc3QsIHdwLDB4NSw0KTsgLy8wMTAxCisKKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5VbmlvblR5cGUgICAgICAgICAgICAgID0gMHgwOyAvLyBGaXhlZCBBbGxvY2F0aW9uIER1bW15ID0gb24KKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC51LkZpeGVkQWxsb2NhdGlvbkR1bW15ID0gMHgwOyAvLyBGaXhlZCBBbGxvY2F0aW9uIER1bW15CisJYmxvY2stPnUuUGFja2V0X1VwbGlua19BY2tfTmFjay51LlBVX0Fja05hY2tfR1BSU19TdHJ1Y3QuRXhpc3RfQWRkaXRpb25zUjk5ICAgICA9IDB4MDsgLy8gQWRkaXRpb25zUjk5ID0gb2ZmCisKKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5Db21tb25fVXBsaW5rX0Fja19OYWNrX0RhdGEuRXhpc3RfQ09OVEVOVElPTl9SRVNPTFVUSU9OX1RMTEkgPSAweDE7CisJYmxvY2stPnUuUGFja2V0X1VwbGlua19BY2tfTmFjay51LlBVX0Fja05hY2tfR1BSU19TdHJ1Y3QuQ29tbW9uX1VwbGlua19BY2tfTmFja19EYXRhLkNPTlRFTlRJT05fUkVTT0xVVElPTl9UTExJICAgICAgID0gdGJmLT50bGxpOworCWJsb2NrLT51LlBhY2tldF9VcGxpbmtfQWNrX05hY2sudS5QVV9BY2tOYWNrX0dQUlNfU3RydWN0LkNvbW1vbl9VcGxpbmtfQWNrX05hY2tfRGF0YS5FeGlzdF9QYWNrZXRfVGltaW5nX0FkdmFuY2UgICAgICA9IDB4MDsKKwlibG9jay0+dS5QYWNrZXRfVXBsaW5rX0Fja19OYWNrLnUuUFVfQWNrTmFja19HUFJTX1N0cnVjdC5Db21tb25fVXBsaW5rX0Fja19OYWNrX0RhdGEuRXhpc3RfRXh0ZW5zaW9uX0JpdHMgICAgICAgICAgICAgPSAweDA7CisJYmxvY2stPnUuUGFja2V0X1VwbGlua19BY2tfTmFjay51LlBVX0Fja05hY2tfR1BSU19TdHJ1Y3QuQ29tbW9uX1VwbGlua19BY2tfTmFja19EYXRhLkV4aXN0X1Bvd2VyX0NvbnRyb2xfUGFyYW1ldGVycyAgID0gMHgwOwogfQogCiAvKiBTZW5kIFVwbGluayB1bml0LWRhdGEgdG8gU0dTTi4gKi8KQEAgLTYxMyw0ICs2MjgsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9ncHJzX3JsY21hYy5oIGIvc3JjL2dwcnNfcmxjbWFjLmgKaW5kZXggYWJiOTk4MC4uNjM1YTZiMSAxMDA2NDQKLS0tIGEvc3JjL2dwcnNfcmxjbWFjLmgKKysrIGIvc3JjL2dwcnNfcmxjbWFjLmgKQEAgLTIyOCwxMSArMjI4LDExIEBACiAgICAgICAgIHVpbnQ4X3QgdXNmLCB1aW50MTZfdCBhcmZjbiwgdWludDhfdCB0biwgdWludDhfdCB0YSwgdWludDhfdCB0c2MsCiAgICAgICAgIHVpbnQ4X3QgcG9sbCk7CiAKLXZvaWQgd3JpdGVfcGFja2V0X2Rvd25saW5rX2Fzc2lnbm1lbnQoYml0dmVjICogZGVzdCwgdWludDhfdCBvbGRfdGZpLAordm9pZCB3cml0ZV9wYWNrZXRfZG93bmxpbmtfYXNzaWdubWVudChSbGNNYWNEb3dubGlua190ICogYmxvY2ssIHVpbnQ4X3Qgb2xkX3RmaSwKICAgICAgICAgdWludDhfdCBvbGRfZG93bmxpbmssIHVpbnQ4X3QgbmV3X3RmaSwgdWludDE2X3QgYXJmY24sCiAgICAgICAgIHVpbnQ4X3QgdG4sIHVpbnQ4X3QgdGEsIHVpbnQ4X3QgdHNjLCB1aW50OF90IHBvbGwpOwogCi12b2lkIHdyaXRlX3BhY2tldF91cGxpbmtfYWNrKGJpdHZlYyAqIGRlc3QsIHN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZiwKK3ZvaWQgd3JpdGVfcGFja2V0X3VwbGlua19hY2soUmxjTWFjRG93bmxpbmtfdCAqIGJsb2NrLCBzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmYsCiAgICAgICAgIHVpbnQ4X3QgZmluYWwpOwogCiBpbnQgZ3Byc19ybGNtYWNfdHhfdWxfdWQoZ3Byc19ybGNtYWNfdGJmICp0YmYpOwpkaWZmIC0tZ2l0IGEvc3JjL2dwcnNfcmxjbWFjX2RhdGEuY3BwIGIvc3JjL2dwcnNfcmxjbWFjX2RhdGEuY3BwCmluZGV4IGE4N2ZlZjEuLjdiZWNhMzggMTAwNjQ0Ci0tLSBhL3NyYy9ncHJzX3JsY21hY19kYXRhLmNwcAorKysgYi9zcmMvZ3Byc19ybGNtYWNfZGF0YS5jcHAKQEAgLTU0MCw5ICs1NDAsMTIgQEAKIAl9CiAJYml0dmVjX3VuaGV4KGFja192ZWMsCiAJCSIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiIik7Ci0Jd3JpdGVfcGFja2V0X3VwbGlua19hY2soYWNrX3ZlYywgIHRiZiwgZmluYWwpOworCVJsY01hY0Rvd25saW5rX3QgKiBtYWNfY29udHJvbF9ibG9jayA9IChSbGNNYWNEb3dubGlua190ICopbWFsbG9jKHNpemVvZihSbGNNYWNEb3dubGlua190KSk7CisJd3JpdGVfcGFja2V0X3VwbGlua19hY2sobWFjX2NvbnRyb2xfYmxvY2ssIHRiZiwgZmluYWwpOworCWVuY29kZV9nc21fcmxjbWFjX2Rvd25saW5rKGFja192ZWMsIG1hY19jb250cm9sX2Jsb2NrKTsKIAliaXR2ZWNfcGFjayhhY2tfdmVjLCBtc2diX3B1dChtc2csIDIzKSk7CiAJYml0dmVjX2ZyZWUoYWNrX3ZlYyk7CisJZnJlZShtYWNfY29udHJvbF9ibG9jayk7CiAKIAlpZiAoZmluYWwpIHsKIAkJdGJmLT5wb2xsX3N0YXRlID0gR1BSU19STENNQUNfUE9MTF9TQ0hFRDsKQEAgLTEzMTQsMTcgKzEzMTcsMTggQEAKIAliaXR2ZWNfdW5oZXgoYXNzX3ZlYywKIAkJIjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIyYjJiMmIiKTsKIAlMT0dQKERSTENNQUMsIExPR0xfSU5GTywgIlRCRjogU1RBUlQgVEZJOiAldSBUTExJOiAweCUwOHggUGFja2V0IERvd25saW5rIEFzc2lnbm1lbnQgKFBBQ0NIKVxuIiwgbmV3X3RiZi0+dGZpLCBuZXdfdGJmLT50bGxpKTsKLQl3cml0ZV9wYWNrZXRfZG93bmxpbmtfYXNzaWdubWVudChhc3NfdmVjLCB0YmYtPnRmaSwKKwlSbGNNYWNEb3dubGlua190ICogbWFjX2NvbnRyb2xfYmxvY2sgPSAoUmxjTWFjRG93bmxpbmtfdCAqKW1hbGxvYyhzaXplb2YoUmxjTWFjRG93bmxpbmtfdCkpOworCXdyaXRlX3BhY2tldF9kb3dubGlua19hc3NpZ25tZW50KG1hY19jb250cm9sX2Jsb2NrLCB0YmYtPnRmaSwKIAkJKHRiZi0+ZGlyZWN0aW9uID09IEdQUlNfUkxDTUFDX0RMX1RCRiksIG5ld190YmYtPnRmaSwKIAkJbmV3X3RiZi0+YXJmY24sIG5ld190YmYtPnRzLCBuZXdfdGJmLT50YSwgbmV3X3RiZi0+dHNjLAogCQlQT0xMSU5HX0FTU0lHTk1FTlQpOwotCWJpdHZlY19wYWNrKGFzc192ZWMsIG1zZ2JfcHV0KG1zZywgMjMpKTsKLQlSbGNNYWNEb3dubGlua190ICogbWFjX2NvbnRyb2xfYmxvY2sgPSAoUmxjTWFjRG93bmxpbmtfdCAqKW1hbGxvYyhzaXplb2YoUmxjTWFjRG93bmxpbmtfdCkpOwogCUxPR1AoRFJMQ01BQywgTE9HTF9ERUJVRywgIisrKysrKysrKysrKysrKysrKysrKysrKysgVFggOiBQYWNrZXQgRG93bmxpbmsgQXNzaWdubWVudCArKysrKysrKysrKysrKysrKysrKysrKysrXG4iKTsKLQlkZWNvZGVfZ3NtX3JsY21hY19kb3dubGluayhhc3NfdmVjLCBtYWNfY29udHJvbF9ibG9jayk7CisJZW5jb2RlX2dzbV9ybGNtYWNfZG93bmxpbmsoYXNzX3ZlYywgbWFjX2NvbnRyb2xfYmxvY2spOwogCUxPR1BDKERDU04xLCBMT0dMX05PVElDRSwgIlxuIik7CiAJTE9HUChEUkxDTUFDLCBMT0dMX0RFQlVHLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUWCA6IFBhY2tldCBEb3dubGluayBBc3NpZ25tZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWJpdHZlY19wYWNrKGFzc192ZWMsIG1zZ2JfcHV0KG1zZywgMjMpKTsKIAliaXR2ZWNfZnJlZShhc3NfdmVjKTsKKwlmcmVlKG1hY19jb250cm9sX2Jsb2NrKTsKIAogI2lmIFBPTExJTkdfQVNTSUdOTUVOVCA9PSAxCiAJdGJmLT5wb2xsX3N0YXRlID0gR1BSU19STENNQUNfUE9MTF9TQ0hFRDsKZGlmZiAtLWdpdCBhL3NyYy9nc21MMXByaW0uaCBiL3NyYy9nc21MMXByaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0OGExYS4uMDAwMDAwMAotLS0gYS9zcmMvZ3NtTDFwcmltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoKLSogQ29weXJpZ2h0IDIwMTIgVGhvbWFzIENvb3BlciA8dGFjb29wZXJAdnQuZWR1PgotKgotKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBQdWJsaWMgTGljZW5zZS4KLSogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIG1haW4gZGlyZWN0b3J5IGZvciBkZXRhaWxzLgotKgotKiBUaGlzIHVzZSBvZiB0aGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLgotKiBTZWUgdGhlIExFR0FMIGZpbGUgaW4gdGhlIG1haW4gZGlyZWN0b3J5IGZvciBkZXRhaWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi1HTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotCi0qLwotCi0jaWZuZGVmIEdTTUwxUFJJTV9ICi0jZGVmaW5lIEdTTUwxUFJJTV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotdHlwZWRlZiBlbnVtIEdzbUwxX1N1YkNoX3QgewotR3NtTDFfU3ViQ2hfTkEsCi19IEdzbUwxX1N1YkNoX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9TYXBpX3QgewotR3NtTDFfU2FwaV9GY2NoLAotR3NtTDFfU2FwaV9TY2gsCi1Hc21MMV9TYXBpX1NhY2NoLAotR3NtTDFfU2FwaV9TZGNjaCwKLUdzbUwxX1NhcGlfQmNjaCwKLUdzbUwxX1NhcGlfUGNoLAotR3NtTDFfU2FwaV9BZ2NoLAotR3NtTDFfU2FwaV9DYmNoLAotR3NtTDFfU2FwaV9SYWNoLAotR3NtTDFfU2FwaV9UY2hGLAotR3NtTDFfU2FwaV9GYWNjaEYsCi1Hc21MMV9TYXBpX1RjaEgsCi1Hc21MMV9TYXBpX0ZhY2NoSCwKLUdzbUwxX1NhcGlfTmNoLAotR3NtTDFfU2FwaV9QZHRjaCwKLUdzbUwxX1NhcGlfUGFjY2gsCi1Hc21MMV9TYXBpX1BiY2NoLAotR3NtTDFfU2FwaV9QYWdjaCwKLUdzbUwxX1NhcGlfUHBjaCwKLUdzbUwxX1NhcGlfUG5jaCwKLUdzbUwxX1NhcGlfUHRjY2gsCi1Hc21MMV9TYXBpX1ByYWNoLAotR3NtTDFfU2FwaV9JZGxlLAotR3NtTDFfU2FwaV9OVU0sCi19IEdzbUwxX1NhcGlfdDsKLQotdHlwZWRlZiBlbnVtIEdzbUwxX1N0YXR1c190IHsKLUdzbUwxX1N0YXR1c19TdWNjZXNzLAotR3NtTDFfU3RhdHVzX0dlbmVyaWMsCi1Hc21MMV9TdGF0dXNfTm9NZW1vcnksCi1Hc21MMV9TdGF0dXNfVGltZW91dCwKLUdzbUwxX1N0YXR1c19JbnZhbGlkUGFyYW0sCi1Hc21MMV9TdGF0dXNfQnVzeSwKLUdzbUwxX1N0YXR1c19Ob1Jlc3NvdXJjZSwKLUdzbUwxX1N0YXR1c19VbmluaXRpYWxpemVkLAotR3NtTDFfU3RhdHVzX051bGxJbnRlcmZhY2UsCi1Hc21MMV9TdGF0dXNfTnVsbEZjdG5QdHIsCi1Hc21MMV9TdGF0dXNfQmFkQ3JjLAotR3NtTDFfU3RhdHVzX0JhZFVzZiwKLUdzbUwxX1N0YXR1c19JbnZhbGlkQ1BTLAotR3NtTDFfU3RhdHVzX1VuZXhwZWN0ZWRCdXJzdCwKLUdzbUwxX1N0YXR1c19VbmF2YWlsQ29kZWMsCi1Hc21MMV9TdGF0dXNfQ3JpdGljYWxFcnJvciwKLUdzbUwxX1N0YXR1c19PdmVyaGVhdEVycm9yLAotR3NtTDFfU3RhdHVzX0RldmljZUVycm9yLAotR3NtTDFfU3RhdHVzX0ZhY2NoRXJyb3IsCi1Hc21MMV9TdGF0dXNfQWxyZWFkeURlYWN0aXZhdGVkLAotR3NtTDFfU3RhdHVzX1R4QnVyc3RGaWZvT3ZybiwKLUdzbUwxX1N0YXR1c19UeEJ1cnN0Rmlmb1VuZHIsCi1Hc21MMV9TdGF0dXNfTm90U3luY2hyb25pemVkLAotR3NtTDFfU3RhdHVzX1Vuc3VwcG9ydGVkLAotR1NNTDFfU1RBVFVTX05VTSwKLX0gR3NtTDFfU3RhdHVzX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9QcmltSWRfdCB7Ci1Hc21MMV9QcmltSWRfTXBoSW5pdFJlcSwKLUdzbUwxX1ByaW1JZF9NcGhDbG9zZVJlcSwKLUdzbUwxX1ByaW1JZF9NcGhDb25uZWN0UmVxLAotR3NtTDFfUHJpbUlkX01waERpc2Nvbm5lY3RSZXEsCi1Hc21MMV9QcmltSWRfTXBoQWN0aXZhdGVSZXEsCi1Hc21MMV9QcmltSWRfTXBoRGVhY3RpdmF0ZVJlcSwKLUdzbUwxX1ByaW1JZF9NcGhDb25maWdSZXEsCi1Hc21MMV9QcmltSWRfTXBoTWVhc3VyZVJlcSwKLUdzbUwxX1ByaW1JZF9NcGhJbml0Q25mLAotR3NtTDFfUHJpbUlkX01waENsb3NlQ25mLAotR3NtTDFfUHJpbUlkX01waENvbm5lY3RDbmYsCi1Hc21MMV9QcmltSWRfTXBoRGlzY29ubmVjdENuZiwKLUdzbUwxX1ByaW1JZF9NcGhBY3RpdmF0ZUNuZiwKLUdzbUwxX1ByaW1JZF9NcGhEZWFjdGl2YXRlQ25mLAotR3NtTDFfUHJpbUlkX01waENvbmZpZ0NuZiwKLUdzbUwxX1ByaW1JZF9NcGhNZWFzdXJlQ25mLAotR3NtTDFfUHJpbUlkX01waFRpbWVJbmQsCi1Hc21MMV9QcmltSWRfTXBoU3luY0luZCwKLUdzbUwxX1ByaW1JZF9QaEVtcHR5RnJhbWVSZXEsCi1Hc21MMV9QcmltSWRfUGhEYXRhUmVxLAotR3NtTDFfUHJpbUlkX1BoQ29ubmVjdEluZCwKLUdzbUwxX1ByaW1JZF9QaFJlYWR5VG9TZW5kSW5kLAotR3NtTDFfUHJpbUlkX1BoRGF0YUluZCwKLUdzbUwxX1ByaW1JZF9QaFJhSW5kLAotR3NtTDFfUHJpbUlkX05VTSwKLX0gR3NtTDFfUHJpbUlkX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9EaXJfdCB7Ci1Hc21MMV9EaXJfVHhEb3dubGluaywKLUdzbUwxX0Rpcl9SeFVwbGluaywKLX0gR3NtTDFfRGlyX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9EZXZUeXBlX3QgewotR3NtTDFfRGV2VHlwZV9UeGRSeHUsCi19IEdzbUwxX0RldlR5cGVfdDsKLQotdHlwZWRlZiBlbnVtIEdzbUwxX1RjaFBsVHlwZV90IHsKLUdzbUwxX1RjaFBsVHlwZV9OQSwKLUdzbUwxX1RjaFBsVHlwZV9FZnIsCi1Hc21MMV9UY2hQbFR5cGVfRnIsCi1Hc21MMV9UY2hQbFR5cGVfSHIsCi1Hc21MMV9UY2hQbFR5cGVfQW1yLAotR3NtTDFfVGNoUGxUeXBlX0Ftcl9TaWRCYWQsCi1Hc21MMV9UY2hQbFR5cGVfQW1yX09uc2V0LAotR3NtTDFfVGNoUGxUeXBlX0Ftcl9SYXRzY2NoLAotR3NtTDFfVGNoUGxUeXBlX0Ftcl9TaWRVcGRhdGVJbkgsCi1Hc21MMV9UY2hQbFR5cGVfQW1yX1NpZEZpcnN0UDEsCi1Hc21MMV9UY2hQbFR5cGVfQW1yX1NpZEZpcnN0UDIsCi1Hc21MMV9UY2hQbFR5cGVfQW1yX1NpZEZpcnN0SW5ILAotR3NtTDFfVGNoUGxUeXBlX0Ftcl9SYXRzY2NoTWFya2VyLAotR3NtTDFfVGNoUGxUeXBlX0Ftcl9SYXRzY2NoRGF0YSwKLX0gR3NtTDFfVGNoUGxUeXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9Db25maWdQYXJhbUlkX3QgewotR3NtTDFfQ29uZmlnUGFyYW1JZF9TZXROYlRzYywKLUdzbUwxX0NvbmZpZ1BhcmFtSWRfU2V0VHhQb3dlckxldmVsLAotR3NtTDFfQ29uZmlnUGFyYW1JZF9TZXRMb2dDaFBhcmFtcywKLUdzbUwxX0NvbmZpZ1BhcmFtSWRfU2V0Q2lwaGVyaW5nUGFyYW1zLAotfSBHc21MMV9Db25maWdQYXJhbUlkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX0RldmljZVBhcmFtX3QgewotZW51bSBHc21MMV9EZXZUeXBlX3QgZGV2VHlwZTsKLWludCBmcmVxQmFuZDsKLXVpbnQxNl90IHUxNkFyZmNuOwotdWludDE2X3QgdTE2QmNjaEFyZmNuOwotdWludDhfdCB1OE5iVHNjOwotdWludDhfdCB1OE5jYzsKLWZsb2F0IGZSeFBvd2VyTGV2ZWw7Ci1mbG9hdCBmVHhQb3dlckxldmVsOwotfSBHc21MMV9EZXZpY2VQYXJhbV90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9Nc2dVbml0UGFyYW1fdCB7Ci11aW50OF90IHU4QnVmZmVyWzI1Nl07Ci11aW50OF90IHU4U2l6ZTsKLX0gR3NtTDFfTXNnVW5pdFBhcmFtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX01lYXNQYXJhbV90IHsKLWZsb2F0IGZSc3NpOwotZmxvYXQgZkxpbmtRdWFsaXR5OwotZmxvYXQgZkJlcjsKLWludDE2X3QgaTE2QnVyc3RUaW1pbmc7Ci19IEdzbUwxX01lYXNQYXJhbV90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9Mb2dDaFBhcmFtX3QgewotdW5pb24gewotc3RydWN0IHsKLWVudW0gR3NtTDFfVGNoUGxUeXBlX3QgdGNoUGxUeXBlOwotICAgICAgICAKLWVudW0gewotR3NtTDFfQW1yQ21pUGhhc2VfTkEsCi1Hc21MMV9BbXJDbWlQaGFzZV9PZGQsCi19IGFtckNtaVBoYXNlOwotICAgICAgICAKLWVudW0gewotR3NtTDFfQW1yQ29kZWNNb2RlX1Vuc2V0LAotfSBhbXJJbml0Q29kZWNNb2RlOwotCi1lbnVtIHsKLUdzbUwxX0FtckNvZGVjX1Vuc2V0LAotR3NtTDFfQW1yQ29kZWNfNF83NSwKLUdzbUwxX0FtckNvZGVjXzVfMTUsCi1Hc21MMV9BbXJDb2RlY181XzksCi1Hc21MMV9BbXJDb2RlY182XzcsCi1Hc21MMV9BbXJDb2RlY183XzQsCi1Hc21MMV9BbXJDb2RlY183Xzk1LAotR3NtTDFfQW1yQ29kZWNfMTBfMiwKLUdzbUwxX0FtckNvZGVjXzEyXzIsCi19IGFtckFjdGl2ZUNvZGVjU2V0WzhdOwotfSB0Y2g7Ci0KLXN0cnVjdCB7Ci11aW50OF90IHU4QnNpYzsKLXVpbnQ4X3QgdThOYnJPZkFnY2g7Ci19IHJhY2g7Ci0KLXN0cnVjdCB7Ci11aW50OF90IHU4TXNQb3dlckxldmVsOwotfSBzYWNjaDsKLQotc3RydWN0IHsKLXVpbnQ4X3QgdThOYnJPZkFnY2g7Ci19IGFnY2g7Ci19OwotfSBHc21MMV9Mb2dDaFBhcmFtX3Q7Ci0KLXR5cGVkZWYgZW51bSBHc21MMV9Mb2dDaENvbWJfdCB7Ci1Hc21MMV9Mb2dDaENvbWJfMCwKLUdzbUwxX0xvZ0NoQ29tYl9JLAotR3NtTDFfTG9nQ2hDb21iX0lJLAotR3NtTDFfTG9nQ2hDb21iX0lWLAotR3NtTDFfTG9nQ2hDb21iX1YsCi1Hc21MMV9Mb2dDaENvbWJfVklJLAotR3NtTDFfTG9nQ2hDb21iX1hJSUksCi19IEdzbUwxX0xvZ0NoQ29tYl90OwotCi1lbnVtIHsKLUdzbUwxX0ZyZXFCYW5kXzg1MCwKLUdzbUwxX0ZyZXFCYW5kXzkwMCwKLUdzbUwxX0ZyZXFCYW5kXzE4MDAsCi1Hc21MMV9GcmVxQmFuZF8xOTAwLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoSW5pdFJlcV90IHsKLXN0cnVjdCBHc21MMV9EZXZpY2VQYXJhbV90IGRldmljZVBhcmFtOwotfSBHc21MMV9NcGhJbml0UmVxX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX01waENsb3NlUmVxX3QgewotdWludDMyX3QgaExheWVyMTsKLX0gR3NtTDFfTXBoQ2xvc2VSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoQ29ubmVjdFJlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci11aW50OF90IHU4VG47Ci1lbnVtIEdzbUwxX0xvZ0NoQ29tYl90IGxvZ0NoQ29tYjsKLX0gR3NtTDFfTXBoQ29ubmVjdFJlcV90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9NcGhEaXNjb25uZWN0UmVxX3QgewotdWludDMyX3QgaExheWVyMTsKLX0gR3NtTDFfTXBoRGlzY29ubmVjdFJlcV90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9NcGhBY3RpdmF0ZVJlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci1zdHJ1Y3QgR3NtTDFfTG9nQ2hQYXJhbV90IGxvZ0NoUHJtOwotdWludDhfdCB1OFRuOwotZW51bSBHc21MMV9TdWJDaF90IHN1YkNoOwotZW51bSBHc21MMV9EaXJfdCBkaXI7Ci1lbnVtIEdzbUwxX1NhcGlfdCBzYXBpOwotdWludDMyX3QgaExheWVyMjsKLWZsb2F0IGZCRklMZXZlbDsKLX0gR3NtTDFfTXBoQWN0aXZhdGVSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoRGVhY3RpdmF0ZVJlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci11aW50OF90IHU4VG47Ci1lbnVtIEdzbUwxX1N1YkNoX3Qgc3ViQ2g7Ci1lbnVtIEdzbUwxX0Rpcl90IGRpcjsKLWVudW0gR3NtTDFfU2FwaV90IHNhcGk7Ci19IEdzbUwxX01waERlYWN0aXZhdGVSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfQ29uZmlnUGFyYW1fdCB7Ci1zdHJ1Y3QgewotZW51bSBHc21MMV9TYXBpX3Qgc2FwaTsKLXVpbnQ4X3QgdThUbjsKLWVudW0gR3NtTDFfU3ViQ2hfdCBzdWJDaDsKLWVudW0gR3NtTDFfRGlyX3QgZGlyOwotc3RydWN0IEdzbUwxX0xvZ0NoUGFyYW1fdCBsb2dDaFBhcmFtczsKLX0gc2V0TG9nQ2hQYXJhbXM7Ci19IEdzbUwxX0NvbmZpZ1BhcmFtX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX01waENvbmZpZ1JlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci1lbnVtIEdzbUwxX0NvbmZpZ1BhcmFtSWRfdCBjZmdQYXJhbUlkOwotc3RydWN0IEdzbUwxX0NvbmZpZ1BhcmFtX3QgY2ZnUGFyYW1zOwotfSBHc21MMV9NcGhDb25maWdSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoQ29uZmlnQ25mX3QgewotZW51bSBHc21MMV9TdGF0dXNfdCBzdGF0dXM7Ci1lbnVtIEdzbUwxX0NvbmZpZ1BhcmFtSWRfdCBjZmdQYXJhbUlkOwotc3RydWN0IEdzbUwxX0NvbmZpZ1BhcmFtX3QgY2ZnUGFyYW1zOwotfSBHc21MMV9NcGhDb25maWdDbmZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoTWVhc3VyZVJlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci19IEdzbUwxX01waE1lYXN1cmVSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoSW5pdENuZl90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci1lbnVtIEdzbUwxX1N0YXR1c190IHN0YXR1czsKLX0gR3NtTDFfTXBoSW5pdENuZl90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9NcGhDbG9zZUNuZl90IHsKLWVudW0gR3NtTDFfU3RhdHVzX3Qgc3RhdHVzOwotfSBHc21MMV9NcGhDbG9zZUNuZl90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9NcGhDb25uZWN0Q25mX3QgewotZW51bSBHc21MMV9TdGF0dXNfdCBzdGF0dXM7Ci19IEdzbUwxX01waENvbm5lY3RDbmZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoRGlzY29ubmVjdENuZl90IHsKLWVudW0gR3NtTDFfU3RhdHVzX3Qgc3RhdHVzOwotfSBHc21MMV9NcGhEaXNjb25uZWN0Q25mX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX01waEFjdGl2YXRlQ25mX3QgewotZW51bSBHc21MMV9TdGF0dXNfdCBzdGF0dXM7Ci11aW50OF90IHU4VG47Ci1pbnQgc2FwaTsKLX0gR3NtTDFfTXBoQWN0aXZhdGVDbmZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoRGVhY3RpdmF0ZUNuZl90IHsKLWVudW0gR3NtTDFfU3RhdHVzX3Qgc3RhdHVzOwotdWludDhfdCB1OFRuOwotZW51bSBHc21MMV9TYXBpX3Qgc2FwaTsKLX0gR3NtTDFfTXBoRGVhY3RpdmF0ZUNuZl90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9NcGhNZWFzdXJlQ25mX3QgewotZW51bSBHc21MMV9TdGF0dXNfdCBzdGF0dXM7Ci19IEdzbUwxX01waE1lYXN1cmVDbmZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfTXBoVGltZUluZF90IHsKLXVpbnQzMl90IHUzMkZuOwotfSBHc21MMV9NcGhUaW1lSW5kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX01waFN5bmNJbmRfdCB7Ci19IEdzbUwxX01waFN5bmNJbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfUGhFbXB0eUZyYW1lUmVxX3QgewotdWludDMyX3QgaExheWVyMTsKLXVpbnQ4X3QgdThUbjsKLXVpbnQzMl90IHUzMkZuOwotZW51bSBHc21MMV9TYXBpX3Qgc2FwaTsKLWVudW0gR3NtTDFfU3ViQ2hfdCBzdWJDaDsKLXVpbnQ4X3QgdThCbG9ja05icjsKLX0gR3NtTDFfUGhFbXB0eUZyYW1lUmVxX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX1BoRGF0YVJlcV90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci11aW50OF90IHU4VG47Ci11aW50MzJfdCB1MzJGbjsKLWVudW0gR3NtTDFfU2FwaV90IHNhcGk7Ci1lbnVtIEdzbUwxX1N1YkNoX3Qgc3ViQ2g7Ci11aW50OF90IHU4QmxvY2tOYnI7Ci1zdHJ1Y3QgR3NtTDFfTXNnVW5pdFBhcmFtX3QgbXNnVW5pdFBhcmFtOwotfSBHc21MMV9QaERhdGFSZXFfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfUGhDb25uZWN0SW5kX3QgewotdWludDhfdCB1OFRuOwotdWludDhfdCB1OFRzYzsKLXVpbnQxNl90IHUxNkFyZmNuOwotfSBHc21MMV9QaENvbm5lY3RJbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfUGhSZWFkeVRvU2VuZEluZF90IHsKLXVpbnQzMl90IGhMYXllcjE7Ci11aW50OF90IHU4VG47Ci11aW50MzJfdCB1MzJGbjsKLWVudW0gR3NtTDFfU2FwaV90IHNhcGk7Ci1lbnVtIEdzbUwxX1N1YkNoX3Qgc3ViQ2g7Ci11aW50OF90IHU4QmxvY2tOYnI7Ci11aW50MzJfdCBoTGF5ZXIyOwotfSBHc21MMV9QaFJlYWR5VG9TZW5kSW5kX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IEdzbUwxX1BoRGF0YUluZF90IHsKLXN0cnVjdCBHc21MMV9NZWFzUGFyYW1fdCBtZWFzUGFyYW07Ci1zdHJ1Y3QgR3NtTDFfTXNnVW5pdFBhcmFtX3QgbXNnVW5pdFBhcmFtOwotZW51bSBHc21MMV9TYXBpX3Qgc2FwaTsKLXVpbnQzMl90IGhMYXllcjI7Ci19IEdzbUwxX1BoRGF0YUluZF90OwotCi10eXBlZGVmIHN0cnVjdCBHc21MMV9QaFJhSW5kX3Qgewotc3RydWN0IEdzbUwxX01lYXNQYXJhbV90IG1lYXNQYXJhbTsKLXN0cnVjdCBHc21MMV9Nc2dVbml0UGFyYW1fdCBtc2dVbml0UGFyYW07Ci11aW50MzJfdCB1MzJGbjsKLXVpbnQzMl90IGhMYXllcjI7Ci19IEdzbUwxX1BoUmFJbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgR3NtTDFfUHJpbV90IHsKLXVuaW9uIHsKLXN0cnVjdCBHc21MMV9NcGhJbml0UmVxX3QgbXBoSW5pdFJlcTsKLXN0cnVjdCBHc21MMV9NcGhDbG9zZVJlcV90IG1waENsb3NlUmVxOwotc3RydWN0IEdzbUwxX01waENvbm5lY3RSZXFfdCBtcGhDb25uZWN0UmVxOwotc3RydWN0IEdzbUwxX01waERpc2Nvbm5lY3RSZXFfdCBtcGhEaXNjb25uZWN0UmVxOwotc3RydWN0IEdzbUwxX01waEFjdGl2YXRlUmVxX3QgbXBoQWN0aXZhdGVSZXE7Ci1zdHJ1Y3QgR3NtTDFfTXBoRGVhY3RpdmF0ZVJlcV90IG1waERlYWN0aXZhdGVSZXE7Ci1zdHJ1Y3QgR3NtTDFfTXBoQ29uZmlnUmVxX3QgbXBoQ29uZmlnUmVxOwotc3RydWN0IEdzbUwxX01waE1lYXN1cmVSZXFfdCBtcGhNZWFzdXJlUmVxOwotc3RydWN0IEdzbUwxX01waEluaXRDbmZfdCBtcGhJbml0Q25mOwotc3RydWN0IEdzbUwxX01waENsb3NlQ25mX3QgbXBoQ2xvc2VDbmY7Ci1zdHJ1Y3QgR3NtTDFfTXBoQ29ubmVjdENuZl90IG1waENvbm5lY3RDbmY7Ci1zdHJ1Y3QgR3NtTDFfTXBoRGlzY29ubmVjdENuZl90IG1waERpc2Nvbm5lY3RDbmY7Ci1zdHJ1Y3QgR3NtTDFfTXBoQWN0aXZhdGVDbmZfdCBtcGhBY3RpdmF0ZUNuZjsKLXN0cnVjdCBHc21MMV9NcGhEZWFjdGl2YXRlQ25mX3QgbXBoRGVhY3RpdmF0ZUNuZjsKLXN0cnVjdCBHc21MMV9NcGhDb25maWdDbmZfdCBtcGhDb25maWdDbmY7Ci1zdHJ1Y3QgR3NtTDFfTXBoTWVhc3VyZUNuZl90IG1waE1lYXN1cmVDbmY7Ci1zdHJ1Y3QgR3NtTDFfTXBoVGltZUluZF90IG1waFRpbWVJbmQ7Ci1zdHJ1Y3QgR3NtTDFfTXBoU3luY0luZF90IG1waFN5bmNJbmQ7Ci1zdHJ1Y3QgR3NtTDFfUGhFbXB0eUZyYW1lUmVxX3QgcGhFbXB0eUZyYW1lUmVxOwotc3RydWN0IEdzbUwxX1BoRGF0YVJlcV90IHBoRGF0YVJlcTsKLXN0cnVjdCBHc21MMV9QaENvbm5lY3RJbmRfdCBwaENvbm5lY3RJbmQ7Ci1zdHJ1Y3QgR3NtTDFfUGhSZWFkeVRvU2VuZEluZF90IHBoUmVhZHlUb1NlbmRJbmQ7Ci1zdHJ1Y3QgR3NtTDFfUGhEYXRhSW5kX3QgcGhEYXRhSW5kOwotc3RydWN0IEdzbUwxX1BoUmFJbmRfdCBwaFJhSW5kOwotfSB1OwotCi1lbnVtIEdzbUwxX1ByaW1JZF90IGlkOwotfSBHc21MMV9QcmltX3Q7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29wZW5idHNfc29jay5jcHAgYi9zcmMvb3BlbmJ0c19zb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY3YWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29wZW5idHNfc29jay5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8qIG9wZW5idHNfc29jay5jcHAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSXZhbiBLbHl1Y2huaWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdwcnNfcmxjbWFjLmg+CisjaW5jbHVkZSA8Z3Byc19ic3NncF9wY3UuaD4KKyNpbmNsdWRlIDxwY3VfbDFfaWYuaD4KKyNpbmNsdWRlIDxncHJzX2RlYnVnLmg+CisjaW5jbHVkZSA8Yml0dmVjdG9yLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8b3Ntb2NvbS9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb20vY29yZS93cml0ZV9xdWV1ZS5oPgorI2luY2x1ZGUgPG9zbW9jb20vY29yZS9zb2NrZXQuaD4KKyNpbmNsdWRlIDxvc21vY29tL2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29tL2dzbS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxwY3VpZl9wcm90by5oPgorfQorCitzdHJ1Y3QgZmVtdG9sMV9oZGwgeworCXN0cnVjdCBnc21fdGltZSBnc21fdGltZTsKKwl1aW50MzJfdCBoTGF5ZXIxOwkJCS8qIGhhbmRsZSB0byB0aGUgTDEgaW5zdGFuY2UgaW4gdGhlIERTUCAqLworCXVpbnQzMl90IGRzcF90cmFjZV9mOworCXVpbnQxNl90IGNsa19jYWw7CisJc3RydWN0IGxsaXN0X2hlYWQgd2xjX2xpc3Q7CisKKwl2b2lkICpwcml2OwkJCS8qIHVzZXIgcmVmZXJlbmNlICovCisKKwlzdHJ1Y3Qgb3Ntb190aW1lcl9saXN0IGFsaXZlX3RpbWVyOworCXVuc2lnbmVkIGludCBhbGl2ZV9wcmltX2NudDsKKworCXN0cnVjdCBvc21vX2ZkIHJlYWRfb2ZkOwkvKiBvc21vIGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3Qgb3Ntb193cXVldWUgd3JpdGVfcTsKKworCXN0cnVjdCB7CisJCXVpbnQxNl90IGFyZmNuOworCQl1aW50OF90IHRuOworCQl1aW50OF90IHRzYzsKKwkJdWludDE2X3QgdGE7CisJfSBjaGFubmVsX2luZm87CisKK307CisKK3N0cnVjdCBsMWZ3ZF9oZGwgeworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHJlbW90ZV9zYTsKKwlzb2NrbGVuX3QgcmVtb3RlX3NhX2xlbjsKKworCXN0cnVjdCBvc21vX3dxdWV1ZSB1ZHBfd3E7CisKKwlzdHJ1Y3QgZmVtdG9sMV9oZGwgKmZsMWg7Cit9OworCitzdHJ1Y3QgbDFmd2RfaGRsICpsMWZoID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IGwxZndkX2hkbCk7CisKKy8vIFRPRE86IFdlIHNob3VsZCBtb3ZlIHRoaXMgcGFyYW1ldGVycyB0byBjb25maWcgZmlsZS4KKyNkZWZpbmUgUENVX0wxX0lGX1BPUlQgNTk0NAorCisvKiBPcGVuQlRTIHNvY2tldCBmdW5jdGlvbnMgKi8KKworaW50IHBjdV9zb2NrX3NlbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlvc21vX3dxdWV1ZV9lbnF1ZXVlKCZsMWZoLT51ZHBfd3EsIG1zZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGRhdGEgaGFzIGFycml2ZWQgb24gdGhlIHVkcCBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgdWRwX3JlYWRfY2Ioc3RydWN0IG9zbW9fZmQgKm9mZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSgyMDQ4LCAxMjgsICJ1ZHBfcngiKTsKKwlzdHJ1Y3QgbDFmd2RfaGRsICpsMWZoID0gKGwxZndkX2hkbCAqKW9mZC0+ZGF0YTsKKwlzdHJ1Y3QgZmVtdG9sMV9oZGwgKmZsMWggPSBsMWZoLT5mbDFoOworCWludCByYzsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zZy0+bDFoID0gbXNnLT5kYXRhOworCisJbDFmaC0+cmVtb3RlX3NhX2xlbiA9IHNpemVvZihsMWZoLT5yZW1vdGVfc2EpOworCXJjID0gcmVjdmZyb20ob2ZkLT5mZCwgbXNnLT5sMWgsIG1zZ2JfdGFpbHJvb20obXNnKSwgMCwKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmwxZmgtPnJlbW90ZV9zYSwgJmwxZmgtPnJlbW90ZV9zYV9sZW4pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJyZWFkIGZyb20gdWRwIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmIChyYyA9PSAwKSB7CisJCXBlcnJvcigibGVuPTAgcmVhZCBmcm9tIHVkcCIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJjOworCX0KKwltc2diX3B1dChtc2csIHJjKTsKKworCXN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbSA9IChnc21fcGN1X2lmICopKG1zZy0+bDFoKTsKKwlyYyA9IHBjdV9yeChwY3VfcHJpbS0+bXNnX3R5cGUsIHBjdV9wcmltKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGNhbGxiYWNrIHdoZW4gd2UgY2FuIHdyaXRlIHRvIHRoZSBVRFAgc29ja2V0ICovCitzdGF0aWMgaW50IHVkcF93cml0ZV9jYihzdHJ1Y3Qgb3Ntb19mZCAqb2ZkLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWludCByYzsKKwlzdHJ1Y3QgbDFmd2RfaGRsICpsMWZoID0gKGwxZndkX2hkbCAqKW9mZC0+ZGF0YTsKKworCS8vTE9HUChEUENVLCBMT0dMX0VSUk9SLCAiVURQOiBXcml0aW5nICV1IGJ5dGVzIGZvciBNUV9MMV9XUklURSBxdWV1ZVxuIiwgbXNnYl9sZW5ndGgobXNnKSk7CisKKwlyYyA9IHNlbmR0byhvZmQtPmZkLCBtc2diX2RhdGEobXNnKSwgbXNnYl9sZW5ndGgobXNnKSwgMCwKKwkJCShjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbDFmaC0+cmVtb3RlX3NhLCBsMWZoLT5yZW1vdGVfc2FfbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRFBDVSwgTE9HTF9FUlJPUiwgImVycm9yIHdyaXRpbmcgdG8gTDEgbXNnX3F1ZXVlOiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKHJjIDwgKGludCltc2diX2xlbmd0aChtc2cpKSB7CisJCUxPR1AoRFBDVSwgTE9HTF9FUlJPUiwgInNob3J0IHdyaXRlIHRvIEwxIG1zZ19xdWV1ZTogIgorCQkJIiV1IDwgJXVcbiIsIHJjLCBtc2diX2xlbmd0aChtc2cpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwY3VfbDFpZl9vcGVuKCkKK3sKKwlzdHJ1Y3QgZmVtdG9sMV9oZGwgKmZsMWg7CisJaW50IHJjOworCisJLyogYWxsb2NhdGUgbmV3IGZlbXRvbDFfaGFuZGxlICovCisJZmwxaCA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBmZW10b2wxX2hkbCk7CisJSU5JVF9MTElTVF9IRUFEKCZmbDFoLT53bGNfbGlzdCk7CisKKwlsMWZoLT5mbDFoID0gZmwxaDsKKwlmbDFoLT5wcml2ID0gbDFmaDsKKworCXN0cnVjdCBvc21vX3dxdWV1ZSAqIHF1ZXVlID0gJigobDFmaC0+ZmwxaCktPndyaXRlX3EpOworCW9zbW9fd3F1ZXVlX2luaXQocXVldWUsIDEwKTsKKwlxdWV1ZS0+YmZkLndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisJcXVldWUtPmJmZC5kYXRhID0gbDFmaDsKKwlxdWV1ZS0+YmZkLnByaXZfbnIgPSAwOworCisJLyogT3BlbiBVRFAgKi8KKwlzdHJ1Y3Qgb3Ntb193cXVldWUgKndxID0gJmwxZmgtPnVkcF93cTsKKworCW9zbW9fd3F1ZXVlX2luaXQod3EsIDEwKTsKKwl3cS0+d3JpdGVfY2IgPSB1ZHBfd3JpdGVfY2I7CisJd3EtPnJlYWRfY2IgPSB1ZHBfcmVhZF9jYjsKKwl3cS0+YmZkLndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisJd3EtPmJmZC5kYXRhID0gbDFmaDsKKwl3cS0+YmZkLnByaXZfbnIgPSAwOworCXJjID0gb3Ntb19zb2NrX2luaXRfb2ZkKCZ3cS0+YmZkLCBBRl9VTlNQRUMsIFNPQ0tfREdSQU0sCisJCQkJSVBQUk9UT19VRFAsIE5VTEwsIFBDVV9MMV9JRl9QT1JULAorCQkJCU9TTU9fU09DS19GX0JJTkQpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJzb2NrX2luaXQiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwY3VfbDFpZl9jbG9zZSh2b2lkKQoreworCWdwcnNfYnNzZ3BfZGVzdHJveSgpOworCisJLyogRklYTUU6IGNsZWFudXAgbDFpZiAqLworCXRhbGxvY19mcmVlKGwxZmgtPmZsMWgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3BjdV9sMV9pZi5jcHAgYi9zcmMvcGN1X2wxX2lmLmNwcAppbmRleCA4NjVhOTExLi5mZDhiM2MzIDEwMDY0NAotLS0gYS9zcmMvcGN1X2wxX2lmLmNwcAorKysgYi9zcmMvcGN1X2wxX2lmLmNwcApAQCAtMSw2ICsxLDYgQEAKIC8qIHBjdV9sMV9pZi5jcHAKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSXZhbiBLbHl1Y2huaWtvdgorICogQ29weXJpZ2h0IChDKSAyMDEyIEFuZHJlYXMgRXZlcnNiZXJnIDxqb2xseUBldmVyc2JlcmcuZXU+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTE3LDYyICsxNywyNSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxncHJzX3JsY21hYy5oPgotI2luY2x1ZGUgPGdwcnNfYnNzZ3BfcGN1Lmg+Ci0jaW5jbHVkZSA8cGN1X2wxX2lmLmg+Ci0jaW5jbHVkZSA8Z3Byc19kZWJ1Zy5oPgotI2luY2x1ZGUgPGJpdHZlY3Rvci5oPgotI2luY2x1ZGUgPGdzbUwxcHJpbS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSA8b3Ntb2NvbS9jb3JlL3RhbGxvYy5oPgotI2luY2x1ZGUgPG9zbW9jb20vY29yZS93cml0ZV9xdWV1ZS5oPgotI2luY2x1ZGUgPG9zbW9jb20vY29yZS9zb2NrZXQuaD4KLSNpbmNsdWRlIDxvc21vY29tL2NvcmUvdGltZXIuaD4KLSNpbmNsdWRlIDxvc21vY29tL2dzbS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29tL2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvbS9jb3JlL21zZ2IuaD4KIH0KIAotI2RlZmluZSBNQVhfVURQX0xFTkdUSCAxNTAwCi0KLSNkZWZpbmUgbXNnYl9sMXByaW0obXNnKQkoKEdzbUwxX1ByaW1fdCAqKShtc2cpLT5sMWgpCi0KLXN0cnVjdCBmZW10b2wxX2hkbCB7Ci0Jc3RydWN0IGdzbV90aW1lIGdzbV90aW1lOwotCXVpbnQzMl90IGhMYXllcjE7CQkJLyogaGFuZGxlIHRvIHRoZSBMMSBpbnN0YW5jZSBpbiB0aGUgRFNQICovCi0JdWludDMyX3QgZHNwX3RyYWNlX2Y7Ci0JdWludDE2X3QgY2xrX2NhbDsKLQlzdHJ1Y3QgbGxpc3RfaGVhZCB3bGNfbGlzdDsKLQotCXZvaWQgKnByaXY7CQkJLyogdXNlciByZWZlcmVuY2UgKi8KLQotCXN0cnVjdCBvc21vX3RpbWVyX2xpc3QgYWxpdmVfdGltZXI7Ci0JdW5zaWduZWQgaW50IGFsaXZlX3ByaW1fY250OwotCi0Jc3RydWN0IG9zbW9fZmQgcmVhZF9vZmQ7CS8qIG9zbW8gZmlsZSBkZXNjcmlwdG9ycyAqLwotCXN0cnVjdCBvc21vX3dxdWV1ZSB3cml0ZV9xOwotCi0Jc3RydWN0IHsKLQkJdWludDE2X3QgYXJmY247Ci0JCXVpbnQ4X3QgdG47Ci0JCXVpbnQ4X3QgdHNjOwotCQl1aW50MTZfdCB0YTsKLQl9IGNoYW5uZWxfaW5mbzsKLQotfTsKLQotc3RydWN0IGwxZndkX2hkbCB7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcmVtb3RlX3NhOwotCXNvY2tsZW5fdCByZW1vdGVfc2FfbGVuOwotCi0Jc3RydWN0IG9zbW9fd3F1ZXVlIHVkcF93cTsKLQotCXN0cnVjdCBmZW10b2wxX2hkbCAqZmwxaDsKLX07Ci0KLXN0cnVjdCBsMWZ3ZF9oZGwgKmwxZmggPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgbDFmd2RfaGRsKTsKKyNpbmNsdWRlIDxncHJzX3JsY21hYy5oPgorI2luY2x1ZGUgPHBjdV9sMV9pZi5oPgorI2luY2x1ZGUgPGdwcnNfZGVidWcuaD4KKyNpbmNsdWRlIDxncHJzX2Jzc2dwX3BjdS5oPgorI2luY2x1ZGUgPHBjdWlmX3Byb3RvLmg+CiAKIC8vIFZhcmlhYmxlIGZvciBzdG9yYWdlIGN1cnJlbnQgRk4uCiBpbnQgZnJhbWVfbnVtYmVyOwpAQCAtODcsMjc3ICs1MCwzOTggQEAKIAlmcmFtZV9udW1iZXIgPSBmbjsKIH0KIAotc3RydWN0IG1zZ2IgKmwxcF9tc2diX2FsbG9jKHZvaWQpCi17Ci0Jc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKEdzbUwxX1ByaW1fdCksICJsMV9wcmltIik7CisvKgorICogUENVIG1lc3NhZ2VzCisgKi8KIAotCWlmIChtc2cpCi0JCW1zZy0+bDFoID0gbXNnYl9wdXQobXNnLCBzaXplb2YoR3NtTDFfUHJpbV90KSk7CitzdHJ1Y3QgbXNnYiAqcGN1X21zZ2JfYWxsb2ModWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBidHNfbnIpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgZ3NtX3BjdV9pZiAqcGN1X3ByaW07CisKKwltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX3BjdV9pZiksICJwY3Vfc29ja190eCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gTlVMTDsKKwltc2diX3B1dChtc2csIHNpemVvZihzdHJ1Y3QgZ3NtX3BjdV9pZikpOworCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+ZGF0YTsKKwlwY3VfcHJpbS0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlwY3VfcHJpbS0+YnRzX25yID0gYnRzX25yOwogCiAJcmV0dXJuIG1zZzsKIH0KIAotLy8gU2VuZCBSTEMvTUFDIGJsb2NrIHRvIE9wZW5CVFMuCi12b2lkIHBjdV9sMWlmX3R4X3BkdGNoKG1zZ2IgKm1zZywgdWludDhfdCB0cngsIHVpbnQ4X3QgdHMsIHVpbnQxNl90IGFyZmNuLAotICAgICAgICB1aW50MzJfdCBmbiwgdWludDhfdCBibG9ja19ucikKK3N0YXRpYyBpbnQgcGN1X3R4X2FjdF9yZXEodWludDhfdCB0cngsIHVpbnQ4X3QgdHMsIHVpbnQ4X3QgYWN0aXZhdGUpCiB7Ci0Jc3RydWN0IG1zZ2IgKm5tc2cgPSBsMXBfbXNnYl9hbGxvYygpOwotCUdzbUwxX1ByaW1fdCAqcHJpbSA9IG1zZ2JfbDFwcmltKG5tc2cpOwotCQotCXByaW0tPmlkID0gR3NtTDFfUHJpbUlkX1BoRGF0YVJlcTsKLQlwcmltLT51LnBoRGF0YVJlcS5zYXBpID0gR3NtTDFfU2FwaV9QZHRjaDsKLQltZW1jcHkocHJpbS0+dS5waERhdGFSZXEubXNnVW5pdFBhcmFtLnU4QnVmZmVyLCBtc2ctPmRhdGEsIG1zZy0+bGVuKTsKLQlwcmltLT51LnBoRGF0YVJlcS5tc2dVbml0UGFyYW0udThTaXplID0gbXNnLT5sZW47Ci0Jb3Ntb193cXVldWVfZW5xdWV1ZSgmbDFmaC0+dWRwX3dxLCBubXNnKTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbTsKKwlzdHJ1Y3QgZ3NtX3BjdV9pZl9hY3RfcmVxICphY3RfcmVxOworCisJTE9HUChETDFJRiwgTE9HTF9JTkZPLCAiU2VuZGluZyAlcyByZXF1ZXN0OiB0cng9JWQgdHM9JWRcbiIsCisJCShhY3RpdmF0ZSkgPyAiYWN0aXZhdGUiIDogImRlYWN0aXZhdGUiLCB0cngsIHRzKTsKKworCW1zZyA9IHBjdV9tc2diX2FsbG9jKFBDVV9JRl9NU0dfQUNUX1JFUSwgMCk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+ZGF0YTsKKwlhY3RfcmVxID0gJnBjdV9wcmltLT51LmFjdF9yZXE7CisJYWN0X3JlcS0+YWN0aXZhdGUgPSBhY3RpdmF0ZTsKKwlhY3RfcmVxLT50cnhfbnIgPSB0cng7CisJYWN0X3JlcS0+dHNfbnIgPSB0czsKKworCXJldHVybiBwY3Vfc29ja19zZW5kKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgcGN1X3R4X2RhdGFfcmVxKHVpbnQ4X3QgdHJ4LCB1aW50OF90IHRzLCB1aW50OF90IHNhcGksCisJdWludDE2X3QgYXJmY24sIHVpbnQzMl90IGZuLCB1aW50OF90IGJsb2NrX25yLCB1aW50OF90ICpkYXRhLAorCXVpbnQ4X3QgbGVuKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGdzbV9wY3VfaWYgKnBjdV9wcmltOworCXN0cnVjdCBnc21fcGN1X2lmX2RhdGEgKmRhdGFfcmVxOworCisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIlNlbmRpbmcgZGF0YSByZXF1ZXN0OiB0cng9JWQgdHM9JWQgc2FwaT0lZCAiCisJCSJhcmZjbj0lZCBmbj0lZCBibG9jaz0lZCBkYXRhPSVzXG4iLCB0cngsIHRzLCBzYXBpLCBhcmZjbiwgZm4sCisJCWJsb2NrX25yLCBvc21vX2hleGR1bXAoZGF0YSwgbGVuKSk7CisKKwltc2cgPSBwY3VfbXNnYl9hbGxvYyhQQ1VfSUZfTVNHX0RBVEFfUkVRLCAwKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJcGN1X3ByaW0gPSAoc3RydWN0IGdzbV9wY3VfaWYgKikgbXNnLT5kYXRhOworCWRhdGFfcmVxID0gJnBjdV9wcmltLT51LmRhdGFfcmVxOworCisJZGF0YV9yZXEtPnNhcGkgPSBzYXBpOworCWRhdGFfcmVxLT5mbiA9IGZuOworCWRhdGFfcmVxLT5hcmZjbiA9IGFyZmNuOworCWRhdGFfcmVxLT50cnhfbnIgPSB0cng7CisJZGF0YV9yZXEtPnRzX25yID0gdHM7CisJZGF0YV9yZXEtPmJsb2NrX25yID0gYmxvY2tfbnI7CisJbWVtY3B5KGRhdGFfcmVxLT5kYXRhLCBkYXRhLCBsZW4pOworCWRhdGFfcmVxLT5sZW4gPSBsZW47CisKKwlyZXR1cm4gcGN1X3NvY2tfc2VuZChtc2cpOworfQorCit2b2lkIHBjdV9sMWlmX3R4X3BkdGNoKG1zZ2IgKm1zZywgdWludDhfdCB0cngsIHVpbnQ4X3QgdHMsIHVpbnQxNl90IGFyZmNuLAorCXVpbnQzMl90IGZuLCB1aW50OF90IGJsb2NrX25yKQoreworCXBjdV90eF9kYXRhX3JlcSh0cngsIHRzLCBQQ1VfSUZfU0FQSV9QRFRDSCwgYXJmY24sIGZuLCBibG9ja19uciwKKwkJbXNnLT5kYXRhLCBtc2ctPmxlbik7CisJbXNnYl9mcmVlKG1zZyk7Cit9CisKK3ZvaWQgcGN1X2wxaWZfdHhfcHRjY2gobXNnYiAqbXNnLCB1aW50OF90IHRyeCwgdWludDhfdCB0cywgdWludDE2X3QgYXJmY24sCisJdWludDMyX3QgZm4sIHVpbnQ4X3QgYmxvY2tfbnIpCit7CisJcGN1X3R4X2RhdGFfcmVxKHRyeCwgdHMsIFBDVV9JRl9TQVBJX1BUQ0NILCBhcmZjbiwgZm4sIGJsb2NrX25yLAorCQltc2ctPmRhdGEsIG1zZy0+bGVuKTsKIAltc2diX2ZyZWUobXNnKTsKIH0KIAogdm9pZCBwY3VfbDFpZl90eF9hZ2NoKGJpdHZlYyAqIGJsb2NrLCBpbnQgcGxlbikKIHsKLQlzdHJ1Y3QgbXNnYiAqbXNnID0gbDFwX21zZ2JfYWxsb2MoKTsKLQlHc21MMV9QcmltX3QgKnByaW0gPSBtc2diX2wxcHJpbShtc2cpOworCXVpbnQ4X3QgZGF0YVsyM107IC8qIHByZWZpeCBQTEVOICovCiAJCi0JcHJpbS0+aWQgPSBHc21MMV9QcmltSWRfUGhEYXRhUmVxOwotCXByaW0tPnUucGhEYXRhUmVxLnNhcGkgPSBHc21MMV9TYXBpX0FnY2g7Ci0JYml0dmVjX3BhY2soYmxvY2ssIHByaW0tPnUucGhEYXRhUmVxLm1zZ1VuaXRQYXJhbS51OEJ1ZmZlcik7Ci0JcHJpbS0+dS5waERhdGFSZXEubXNnVW5pdFBhcmFtLnU4U2l6ZSA9IDIyOwotCW9zbW9fd3F1ZXVlX2VucXVldWUoJmwxZmgtPnVkcF93cSwgbXNnKTsKKwkvKiBGSVhNRTogd2h5IGRvZXMgT3BlbkJUUyBoYXMgbm8gUExFTiBhbmQgbm8gZmlsbCBpbiBtZXNzYWdlPyAqLworCWJpdHZlY19wYWNrKGJsb2NrLCBkYXRhICsgMSk7CisJZGF0YVswXSA9IChwbGVuIDw8IDIpIHwgMHgwMTsKKwlwY3VfdHhfZGF0YV9yZXEoMCwgMCwgUENVX0lGX1NBUElfQUdDSCwgMCwgMCwgMCwgZGF0YSwgMjMpOwogfQogCiB2b2lkIHBjdV9sMWlmX3R4X3BjaChiaXR2ZWMgKiBibG9jaywgaW50IHBsZW4sIGNoYXIgKmltc2kpCiB7Ci0Jc3RydWN0IG1zZ2IgKm1zZyA9IGwxcF9tc2diX2FsbG9jKCk7Ci0JR3NtTDFfUHJpbV90ICpwcmltID0gbXNnYl9sMXByaW0obXNnKTsKLQkKLQlwcmltLT5pZCA9IEdzbUwxX1ByaW1JZF9QaERhdGFSZXE7Ci0JcHJpbS0+dS5waERhdGFSZXEuc2FwaSA9IEdzbUwxX1NhcGlfUGNoOwotCWJpdHZlY19wYWNrKGJsb2NrLCBwcmltLT51LnBoRGF0YVJlcS5tc2dVbml0UGFyYW0udThCdWZmZXIpOwotCXByaW0tPnUucGhEYXRhUmVxLm1zZ1VuaXRQYXJhbS51OFNpemUgPSAyMjsKLQlvc21vX3dxdWV1ZV9lbnF1ZXVlKCZsMWZoLT51ZHBfd3EsIG1zZyk7CisJdWludDhfdCBkYXRhWzIzKzNdOyAvKiBwcmVmaXggUExFTiAqLworCisJLyogcGFnaW5nIGdyb3VwICovCisJaWYgKCFpbXNpIHx8IHN0cmxlbihpbXNpKSA8IDMpCisJCXJldHVybjsKKwlpbXNpICs9IHN0cmxlbihpbXNpKSAtIDM7CisJZGF0YVswXSA9IGltc2lbMF07CisJZGF0YVsxXSA9IGltc2lbMV07CisJZGF0YVsyXSA9IGltc2lbMl07CisKKwliaXR2ZWNfcGFjayhibG9jaywgZGF0YSArIDMrMSk7CisJZGF0YVszXSA9IChwbGVuIDw8IDIpIHwgMHgwMTsKKwlwY3VfdHhfZGF0YV9yZXEoMCwgMCwgUENVX0lGX1NBUElfUENILCAwLCAwLCAwLCBkYXRhLCAyMyszKTsKIH0KIAotaW50IHBjdV9sMWlmX3J4X3BkY2goR3NtTDFfUGhEYXRhSW5kX3QgKmRhdGFfaW5kKQorc3RhdGljIHZvaWQgcGN1X2wxaWZfdHhfYmNjaCh1aW50OF90ICpkYXRhLCBpbnQgbGVuKQogewotCWdwcnNfcmxjbWFjX3Jjdl9ibG9jayhkYXRhX2luZC0+bXNnVW5pdFBhcmFtLnU4QnVmZmVyLAotCQlkYXRhX2luZC0+bXNnVW5pdFBhcmFtLnU4U2l6ZSwgZGF0YV9pbmQtPnUzMkZuKTsKLQotCXJldHVybiAwOworCXBjdV90eF9kYXRhX3JlcSgwLCAwLCBQQ1VfSUZfU0FQSV9CQ0NILCAwLCAwLCAwLCBkYXRhLCBsZW4pOwogfQogCi1zdGF0aWMgaW50IGhhbmRsZV9waF9jb25uZWN0X2luZChzdHJ1Y3QgZmVtdG9sMV9oZGwgKmZsMSwgR3NtTDFfUGhDb25uZWN0SW5kX3QgKmNvbm5lY3RfaW5kKQorc3RhdGljIGludCBwY3VfcnhfZGF0YV9pbmQoc3RydWN0IGdzbV9wY3VfaWZfZGF0YSAqZGF0YV9pbmQpCit7CisJaW50IHJjID0gMDsKKworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICJEYXRhIGluZGljYXRpb24gcmVjZWl2ZWQ6IHNhcGk9JWQgYXJmY249JWQgIgorCQkiYmxvY2s9JWQgZGF0YT0lc1xuIiwgZGF0YV9pbmQtPnNhcGksCisJCWRhdGFfaW5kLT5hcmZjbiwgZGF0YV9pbmQtPmJsb2NrX25yLAorCQlvc21vX2hleGR1bXAoZGF0YV9pbmQtPmRhdGEsIGRhdGFfaW5kLT5sZW4pKTsKKworCXN3aXRjaCAoZGF0YV9pbmQtPnNhcGkpIHsKKwljYXNlIFBDVV9JRl9TQVBJX1BEVENIOgorCQlyYyA9IGdwcnNfcmxjbWFjX3Jjdl9ibG9jayhkYXRhX2luZC0+ZGF0YSwgZGF0YV9pbmQtPmxlbiwKKwkJCWRhdGFfaW5kLT5mbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREwxSUYsIExPR0xfRVJST1IsICJSZWNlaXZlZCBQQ1UgZGF0YSBpbmRpY2F0aW9uIHdpdGggIgorCQkJInVuc3VwcG9ydGVkIHNhcGkgJWRcbiIsIGRhdGFfaW5kLT5zYXBpKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwY3VfcnhfcnRzX3JlcShzdHJ1Y3QgZ3NtX3BjdV9pZl9ydHNfcmVxICpydHNfcmVxKQoreworCWludCByYyA9IDA7CisKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiUlRTIHJlcXVlc3QgcmVjZWl2ZWQ6IHRyeD0lZCB0cz0lZCBzYXBpPSVkICIKKwkJImFyZmNuPSVkIGZuPSVkIGJsb2NrPSVkXG4iLCBydHNfcmVxLT50cnhfbnIsIHJ0c19yZXEtPnRzX25yLAorCQlydHNfcmVxLT5zYXBpLCBydHNfcmVxLT5hcmZjbiwgcnRzX3JlcS0+Zm4sIHJ0c19yZXEtPmJsb2NrX25yKTsKKworCXN3aXRjaCAocnRzX3JlcS0+c2FwaSkgeworCWNhc2UgUENVX0lGX1NBUElfUERUQ0g6CisJCWdwcnNfcmxjbWFjX3Jjdl9ydHNfYmxvY2socnRzX3JlcS0+dHJ4X25yLCBydHNfcmVxLT50c19uciwKKwkJCXJ0c19yZXEtPmFyZmNuLCBydHNfcmVxLT5mbiwgcnRzX3JlcS0+YmxvY2tfbnIpOworCQlicmVhazsKKwljYXNlIFBDVV9JRl9TQVBJX1BUQ0NIOgorCQkvKiBGSVhNRSAqLworCQl7CisJCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYygyMywgImwxX3ByaW0iKTsKKwkJCW1lbXNldChtc2diX3B1dChtc2csIDIzKSwgMHgyYiwgMjMpOworCQkJcGN1X2wxaWZfdHhfcHRjY2gobXNnLCBydHNfcmVxLT50cnhfbnIsIHJ0c19yZXEtPnRzX25yLAorCQkJCXJ0c19yZXEtPmFyZmNuLCBydHNfcmVxLT5mbiwgcnRzX3JlcS0+YmxvY2tfbnIpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoREwxSUYsIExPR0xfRVJST1IsICJSZWNlaXZlZCBQQ1UgUlRTIHJlcXVlc3Qgd2l0aCAiCisJCQkidW5zdXBwb3J0ZWQgc2FwaSAlZFxuIiwgcnRzX3JlcS0+c2FwaSk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGN1X3J4X3JhY2hfaW5kKHN0cnVjdCBnc21fcGN1X2lmX3JhY2hfaW5kICpyYWNoX2luZCkKK3sKKwlpbnQgcmMgPSAwOworCisJTE9HUChETDFJRiwgTE9HTF9JTkZPLCAiUkFDSCByZXF1ZXN0IHJlY2VpdmVkOiBzYXBpPSVkICIKKwkJInF0YT0lZCwgcmE9JWQsIGZuPSVkXG4iLCByYWNoX2luZC0+c2FwaSwgcmFjaF9pbmQtPnF0YSwKKwkJcmFjaF9pbmQtPnJhLCByYWNoX2luZC0+Zm4pOworCisJc3dpdGNoIChyYWNoX2luZC0+c2FwaSkgeworCWNhc2UgUENVX0lGX1NBUElfUkFDSDoKKwkJcmMgPSBncHJzX3JsY21hY19yY3ZfcmFjaChyYWNoX2luZC0+cmEsIHJhY2hfaW5kLT5mbiwKKwkJCXJhY2hfaW5kLT5xdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiUmVjZWl2ZWQgUENVIHJhY2ggcmVxdWVzdCB3aXRoICIKKwkJCSJ1bnN1cHBvcnRlZCBzYXBpICVkXG4iLCByYWNoX2luZC0+c2FwaSk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGN1X3J4X2luZm9faW5kKHN0cnVjdCBnc21fcGN1X2lmX2luZm9faW5kICppbmZvX2luZCkKIHsKIAlzdHJ1Y3QgZ3Byc19ybGNtYWNfYnRzICpidHMgPSBncHJzX3JsY21hY19idHM7CisJaW50IHJjID0gMDsKKwlpbnQgdHJ4LCB0cywgdGZpOworCXN0cnVjdCBncHJzX3JsY21hY190YmYgKnRiZjsKKwlpbnQgaTsKIAotCWJ0cy0+dHJ4WzBdLmFyZmNuID0gY29ubmVjdF9pbmQtPnUxNkFyZmNuOwotCWJ0cy0+dHJ4WzBdLnBkY2hbY29ubmVjdF9pbmQtPnU4VG5dLmVuYWJsZSA9IDE7Ci0JYnRzLT50cnhbMF0ucGRjaFtjb25uZWN0X2luZC0+dThUbl0udHNjID0gY29ubmVjdF9pbmQtPnU4VHNjOwotCShsMWZoLT5mbDFoKS0+Y2hhbm5lbF9pbmZvLmFyZmNuID0gY29ubmVjdF9pbmQtPnUxNkFyZmNuOwotCShsMWZoLT5mbDFoKS0+Y2hhbm5lbF9pbmZvLnRuID0gY29ubmVjdF9pbmQtPnU4VG47Ci0JKGwxZmgtPmZsMWgpLT5jaGFubmVsX2luZm8udHNjID0gY29ubmVjdF9pbmQtPnU4VHNjOwotCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiUlg6IFsgUENVIDwtIEJUUyBdIFBoQ29ubmVjdEluZDogQVJGQ046ICV1IFROOiAldSBUU0M6ICV1IFxuIiwKLQkgICAgICAgIGNvbm5lY3RfaW5kLT51MTZBcmZjbiwgKHVuc2lnbmVkKWNvbm5lY3RfaW5kLT51OFRuLCAodW5zaWduZWQpY29ubmVjdF9pbmQtPnU4VHNjKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiSW5mbyBpbmRpY2F0aW9uIHJlY2VpdmVkOlxuIik7CisKKwlpZiAoIShpbmZvX2luZC0+ZmxhZ3MgJiBQQ1VfSUZfRkxBR19BQ1RJVkUpKSB7CisJCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiQlRTIG5vdCBhdmFpbGFibGVcbiIpOworYnNzZ3BfZmFpbGVkOgorCQkvKiBmcmVlIGFsbCBUQkYgKi8KKwkJZm9yICh0cnggPSAwOyB0cnggPCA4OyB0cngrKykgeworCQkJYnRzLT50cnhbdHJ4XS5hcmZjbiA9IGluZm9faW5kLT50cnhbdHJ4XS5hcmZjbjsKKwkJCWZvciAodHMgPSAwOyB0cyA8IDg7IHRzKyspIHsKKwkJCQlmb3IgKHRmaSA9IDA7IHRmaSA8IDMyOyB0ZmkrKykgeworCQkJCQl0YmYgPSBidHMtPnRyeFt0cnhdLnBkY2hbdHNdLnRiZlt0ZmldOworCQkJCQlpZiAodGJmKQorCQkJCQkJdGJmX2ZyZWUodGJmKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZ3Byc19ic3NncF9kZXN0cm95KCk7CisJCXJldHVybiAwOworCX0KKwlMT0dQKERMMUlGLCBMT0dMX0lORk8sICJCVFMgYXZhaWxhYmxlXG4iKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIG1jYz0lZFxuIiwgaW5mb19pbmQtPm1jYyk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBtbmM9JWRcbiIsIGluZm9faW5kLT5tbmMpOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgbGFjPSVkXG4iLCBpbmZvX2luZC0+bGFjKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJhYz0lZFxuIiwgaW5mb19pbmQtPnJhYyk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBjZWxsX2lkPSVkXG4iLCBpbmZvX2luZC0+Y2VsbF9pZCk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc2VpPSVkXG4iLCBpbmZvX2luZC0+bnNlaSk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc2VfdGltZXI9JWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCWluZm9faW5kLT5uc2VfdGltZXJbMF0sIGluZm9faW5kLT5uc2VfdGltZXJbMV0sCisJCWluZm9faW5kLT5uc2VfdGltZXJbMl0sIGluZm9faW5kLT5uc2VfdGltZXJbM10sCisJCWluZm9faW5kLT5uc2VfdGltZXJbNF0sIGluZm9faW5kLT5uc2VfdGltZXJbNV0sCisJCWluZm9faW5kLT5uc2VfdGltZXJbNl0pOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgY2VsbF90aW1lcj0lZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAiCisJCSIlZFxuIiwKKwkJaW5mb19pbmQtPmNlbGxfdGltZXJbMF0sIGluZm9faW5kLT5jZWxsX3RpbWVyWzFdLAorCQlpbmZvX2luZC0+Y2VsbF90aW1lclsyXSwgaW5mb19pbmQtPmNlbGxfdGltZXJbM10sCisJCWluZm9faW5kLT5jZWxsX3RpbWVyWzRdLCBpbmZvX2luZC0+Y2VsbF90aW1lcls1XSwKKwkJaW5mb19pbmQtPmNlbGxfdGltZXJbNl0sIGluZm9faW5kLT5jZWxsX3RpbWVyWzddLAorCQlpbmZvX2luZC0+Y2VsbF90aW1lcls4XSwgaW5mb19pbmQtPmNlbGxfdGltZXJbOV0sCisJCWluZm9faW5kLT5jZWxsX3RpbWVyWzEwXSk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiByZXBlYXRfdGltZT0lZFxuIiwgaW5mb19pbmQtPnJlcGVhdF90aW1lKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJlcGVhdF9jb3VudD0lZFxuIiwgaW5mb19pbmQtPnJlcGVhdF9jb3VudCk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBidmNpPSVkXG4iLCBpbmZvX2luZC0+YnZjaSk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiB0MzE0Mj0lZFxuIiwgaW5mb19pbmQtPnQzMTQyKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHQzMTY5PSVkXG4iLCBpbmZvX2luZC0+dDMxNjkpOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgdDMxOTE9JWRcbiIsIGluZm9faW5kLT50MzE5MSk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiB0MzE5Mz0lZCAobXMpXG4iLCBpbmZvX2luZC0+dDMxOTNfMTBtcyAqIDEwKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHQzMTk1PSVkXG4iLCBpbmZvX2luZC0+dDMxOTUpOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgbjMxMDE9JWRcbiIsIGluZm9faW5kLT5uMzEwMSk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuMzEwMz0lZFxuIiwgaW5mb19pbmQtPm4zMTAzKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIG4zMTA1PSVkXG4iLCBpbmZvX2luZC0+bjMxMDUpOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgY3ZfY291bnRkb3duPSVkXG4iLCBpbmZvX2luZC0+Y3ZfY291bnRkb3duKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIGRsX3RiZl9leHQ9JWRcbiIsIGluZm9faW5kLT5kbF90YmZfZXh0KTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHVsX3RiZl9leHQ9JWRcbiIsIGluZm9faW5kLT51bF90YmZfZXh0KTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICgoaW5mb19pbmQtPmZsYWdzICYgKFBDVV9JRl9GTEFHX0NTMSA8PCBpKSkpCisJCQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIFVzZSBDUyVkXG4iLCBpKzEpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7CisJCWlmICgoaW5mb19pbmQtPmZsYWdzICYgKFBDVV9JRl9GTEFHX01DUzEgPDwgaSkpKQorCQkJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBVc2UgTUNTJWRcbiIsIGkrMSk7CisJfQorCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgaW5pdGlhbF9jcz0lZFxuIiwgaW5mb19pbmQtPmluaXRpYWxfY3MpOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgaW5pdGlhbF9tY3M9JWRcbiIsIGluZm9faW5kLT5pbml0aWFsX21jcyk7CisJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc3ZjaT0lZFxuIiwgaW5mb19pbmQtPm5zdmNpWzBdKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIGxvY2FsX3BvcnQ9JWRcbiIsIGluZm9faW5kLT5sb2NhbF9wb3J0WzBdKTsKKwlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJlbW90ZV9wb3J0PSVkXG4iLCBpbmZvX2luZC0+cmVtb3RlX3BvcnRbMF0pOworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgcmVtb3RlX2lwPSVkXG4iLCBpbmZvX2luZC0+cmVtb3RlX2lwWzBdKTsKKworCXJjID0gZ3Byc19ic3NncF9jcmVhdGUoaW5mb19pbmQtPnJlbW90ZV9pcFswXSwgaW5mb19pbmQtPnJlbW90ZV9wb3J0WzBdLAorCQlpbmZvX2luZC0+bnNlaSwgaW5mb19pbmQtPm5zdmNpWzBdLCBpbmZvX2luZC0+YnZjaSwKKwkJaW5mb19pbmQtPm1jYywgaW5mb19pbmQtPm1uYywgaW5mb19pbmQtPmxhYywgaW5mb19pbmQtPnJhYywKKwkJaW5mb19pbmQtPmNlbGxfaWQpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETDFJRiwgTE9HTF9OT1RJQ0UsICJTR1NOIG5vdCBhdmFpbGFibGVcbiIpOworCQlnb3RvIGJzc2dwX2ZhaWxlZDsKKwl9CisKKwlidHMtPmNzMSA9ICEhKGluZm9faW5kLT5mbGFncyAmIFBDVV9JRl9GTEFHX0NTMSk7CisJYnRzLT5jczIgPSAhIShpbmZvX2luZC0+ZmxhZ3MgJiBQQ1VfSUZfRkxBR19DUzIpOworCWJ0cy0+Y3MzID0gISEoaW5mb19pbmQtPmZsYWdzICYgUENVX0lGX0ZMQUdfQ1MzKTsKKwlidHMtPmNzNCA9ICEhKGluZm9faW5kLT5mbGFncyAmIFBDVV9JRl9GTEFHX0NTNCk7CisJaWYgKCFidHMtPmNzMSAmJiAhYnRzLT5jczIgJiYgIWJ0cy0+Y3MzICYmICFidHMtPmNzNCkKKwkJYnRzLT5jczEgPSAxOworCWlmIChpbmZvX2luZC0+dDMxNDIpIHsgLyogaWYgdGltZXIgdmFsdWVzIGFyZSBzZXQgKi8KKwkJYnRzLT50MzE0MiA9IGluZm9faW5kLT50MzE0MjsKKwkJYnRzLT50MzE2OSA9IGluZm9faW5kLT50MzE2OTsKKwkJYnRzLT50MzE5MSA9IGluZm9faW5kLT50MzE5MTsKKwkJYnRzLT50MzE5M19tc2VjID0gaW5mb19pbmQtPnQzMTkzXzEwbXMgKiAxMDsKKwkJYnRzLT50MzE5NSA9IGluZm9faW5kLT50MzE5NTsKKwkJYnRzLT5uMzEwMSA9IGluZm9faW5kLT5uMzEwMTsKKwkJYnRzLT5uMzEwMyA9IGluZm9faW5kLT5uMzEwMzsKKwkJYnRzLT5uMzEwNSA9IGluZm9faW5kLT5uMzEwNTsKKwl9CisJaWYgKGluZm9faW5kLT5pbml0aWFsX2NzIDwgMSB8fCBpbmZvX2luZC0+aW5pdGlhbF9jcyA+IDQpCisJCWJ0cy0+aW5pdGlhbF9jcyA9IDE7CisJZWxzZQorCQlidHMtPmluaXRpYWxfY3MgPSBpbmZvX2luZC0+aW5pdGlhbF9jczsKKworCWZvciAodHJ4ID0gMDsgdHJ4IDwgODsgdHJ4KyspIHsKKwkJYnRzLT50cnhbdHJ4XS5hcmZjbiA9IGluZm9faW5kLT50cnhbdHJ4XS5hcmZjbjsKKwkJZm9yICh0cyA9IDA7IHRzIDwgODsgdHMrKykgeworCQkJaWYgKChpbmZvX2luZC0+dHJ4W3RyeF0ucGRjaF9tYXNrICYgKDEgPDwgdHMpKSkgeworCQkJCS8qIEZJWE1FOiBhY3RpdmF0ZSBkeW5hbWljYWxseSBhdCBSTENNQUMgKi8KKwkJCQlpZiAoIWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlKQorCQkJCQlwY3VfdHhfYWN0X3JlcSh0cngsIHRzLCAxKTsKKwkJCQlidHMtPnRyeFt0cnhdLnBkY2hbdHNdLmVuYWJsZSA9IDE7CisJCQkJYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50c2MgPQorCQkJCQlpbmZvX2luZC0+dHJ4W3RyeF0udHNjW3RzXTsKKwkJCQlMT0dQKERMMUlGLCBMT0dMX0lORk8sICJQRENIOiB0cng9JWQgdHM9JWRcbiIsCisJCQkJCXRyeCwgdHMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS5lbmFibGUpCisJCQkJCXBjdV90eF9hY3RfcmVxKHRyeCwgdHMsIDApOworCQkJCWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlID0gMDsKKwkJCQkvKiBraWNrIGFsbCB0YmYgIEZJWE1FOiBtdWx0aXNsb3QgICovCisJCQkJZm9yICh0ZmkgPSAwOyB0ZmkgPCAzMjsgdGZpKyspIHsKKwkJCQkJdGJmID0gYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50YmZbdGZpXTsKKwkJCQkJaWYgKHRiZikKKwkJCQkJCXRiZl9mcmVlKHRiZik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBjdV9yeF90aW1lX2luZChzdHJ1Y3QgZ3NtX3BjdV9pZl90aW1lX2luZCAqdGltZV9pbmQpCit7CisJc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOworCWludCB0cngsIHRzLCB0Zmk7CisJc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOworCXVpbnQzMl90IGVsYXBzZWQ7CisJdWludDhfdCBmbjEzID0gdGltZV9pbmQtPmZuICUgMTM7CisKKwkvKiBvbWl0IGZyYW1lIG51bWJlcnMgbm90IHN0YXJ0aW5nIGF0IGEgTUFDIGJsb2NrICovCisJaWYgKGZuMTMgIT0gMCAmJiBmbjEzICE9IDQgJiYgZm4xMyAhPSA4KQorCQlyZXR1cm4gMDsKKworCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICJUaW1lIGluZGljYXRpb24gcmVjZWl2ZWQ6ICVkXG4iLAorCQl0aW1lX2luZC0+Zm4gJSA1Mik7CisKKwlzZXRfY3VycmVudF9mbih0aW1lX2luZC0+Zm4pOworCisJLyogY2hlY2sgZm9yIHBvbGwgdGltZW91dCAqLworCWZvciAodHJ4ID0gMDsgdHJ4IDwgODsgdHJ4KyspIHsKKwkJZm9yICh0cyA9IDA7IHRzIDwgODsgdHMrKykgeworCQkJZm9yICh0ZmkgPSAwOyB0ZmkgPCAzMjsgdGZpKyspIHsKKwkJCQl0YmYgPSBidHMtPnRyeFt0cnhdLnBkY2hbdHNdLnRiZlt0ZmldOworCQkJCWlmICghdGJmKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAodGJmLT5wb2xsX3N0YXRlICE9IEdQUlNfUkxDTUFDX1BPTExfU0NIRUQpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsYXBzZWQgPSAoZnJhbWVfbnVtYmVyIC0gdGJmLT5wb2xsX2ZuKQorCQkJCQkJCSUgMjcxNTY0ODsKKwkJCQlpZiAoZWxhcHNlZCA+PSAyMCAmJiBlbGFwc2VkIDwgMjAwKQorCQkJCQlncHJzX3JsY21hY19wb2xsX3RpbWVvdXQodGJmKTsKKwkJCX0KKwkJfQorCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhhbmRsZV9waF9yZWFkeXRvc2VuZF9pbmQoc3RydWN0IGZlbXRvbDFfaGRsICpmbDEsIEdzbUwxX1BoUmVhZHlUb1NlbmRJbmRfdCAqcmVhZHl0b3NlbmRfaW5kKQotewotCWdwcnNfcmxjbWFjX3Jjdl9ydHNfYmxvY2soMCwwLCAobDFmaC0+ZmwxaCktPmNoYW5uZWxfaW5mby5hcmZjbiwgcmVhZHl0b3NlbmRfaW5kLT51MzJGbiwgMCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX3BoX2RhdGFfaW5kKHN0cnVjdCBmZW10b2wxX2hkbCAqZmwxLCBHc21MMV9QaERhdGFJbmRfdCAqZGF0YV9pbmQpCitpbnQgcGN1X3J4KHVpbnQ4X3QgbXNnX3R5cGUsIHN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbSkKIHsKIAlpbnQgcmMgPSAwOwotCXN3aXRjaCAoZGF0YV9pbmQtPnNhcGkpIHsKLQljYXNlIEdzbUwxX1NhcGlfUmFjaDoKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIFBDVV9JRl9NU0dfREFUQV9JTkQ6CisJCXJjID0gcGN1X3J4X2RhdGFfaW5kKCZwY3VfcHJpbS0+dS5kYXRhX2luZCk7CiAJCWJyZWFrOwotCWNhc2UgR3NtTDFfU2FwaV9QZHRjaDoKLQljYXNlIEdzbUwxX1NhcGlfUGFjY2g6Ci0JCXBjdV9sMWlmX3J4X3BkY2goZGF0YV9pbmQpOworCWNhc2UgUENVX0lGX01TR19SVFNfUkVROgorCQlyYyA9IHBjdV9yeF9ydHNfcmVxKCZwY3VfcHJpbS0+dS5ydHNfcmVxKTsKIAkJYnJlYWs7Ci0JY2FzZSBHc21MMV9TYXBpX1BiY2NoOgotCWNhc2UgR3NtTDFfU2FwaV9QYWdjaDoKLQljYXNlIEdzbUwxX1NhcGlfUHBjaDoKLQljYXNlIEdzbUwxX1NhcGlfUG5jaDoKLQljYXNlIEdzbUwxX1NhcGlfUHRjY2g6Ci0JY2FzZSBHc21MMV9TYXBpX1ByYWNoOgorCWNhc2UgUENVX0lGX01TR19SQUNIX0lORDoKKwkJcmMgPSBwY3VfcnhfcmFjaF9pbmQoJnBjdV9wcmltLT51LnJhY2hfaW5kKTsKKwkJYnJlYWs7CisJY2FzZSBQQ1VfSUZfTVNHX0lORk9fSU5EOgorCQlyYyA9IHBjdV9yeF9pbmZvX2luZCgmcGN1X3ByaW0tPnUuaW5mb19pbmQpOworCQlicmVhazsKKwljYXNlIFBDVV9JRl9NU0dfVElNRV9JTkQ6CisJCXJjID0gcGN1X3J4X3RpbWVfaW5kKCZwY3VfcHJpbS0+dS50aW1lX2luZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiUnggUEgtREFUQS5pbmQgZm9yIHVua25vd24gTDEgU0FQSSAldSBcbiIsIGRhdGFfaW5kLT5zYXBpKTsKLQkJYnJlYWs7CisJCUxPR1AoREwxSUYsIExPR0xfRVJST1IsICJSZWNlaXZlZCB1bmtud29uIFBDVSBtc2cgdHlwZSAlZFxuIiwKKwkJCW1zZ190eXBlKTsKKwkJcmMgPSAtRUlOVkFMOwogCX0KIAogCXJldHVybiByYzsKIH0KLQotc3RhdGljIGludCBoYW5kbGVfcGhfcmFfaW5kKHN0cnVjdCBmZW10b2wxX2hkbCAqZmwxLCBHc21MMV9QaFJhSW5kX3QgKnJhX2luZCkKLXsKLQlpbnQgcmMgPSAwOwotCShsMWZoLT5mbDFoKS0+Y2hhbm5lbF9pbmZvLnRhID0gcmFfaW5kLT5tZWFzUGFyYW0uaTE2QnVyc3RUaW1pbmc7Ci0JcmMgPSBncHJzX3JsY21hY19yY3ZfcmFjaChyYV9pbmQtPm1zZ1VuaXRQYXJhbS51OEJ1ZmZlclswXSwgcmFfaW5kLT51MzJGbiwgcmFfaW5kLT5tZWFzUGFyYW0uaTE2QnVyc3RUaW1pbmcpOwotCXJldHVybiByYzsKLX0KLQotLyogaGFuZGxlIGFueSByYW5kb20gaW5kaWNhdGlvbiBmcm9tIHRoZSBMMSAqLwotaW50IHBjdV9sMWlmX2hhbmRsZV9sMXByaW0oc3RydWN0IGZlbXRvbDFfaGRsICpmbDEsIHN0cnVjdCBtc2diICptc2cpCi17Ci0JR3NtTDFfUHJpbV90ICpsMXAgPSBtc2diX2wxcHJpbShtc2cpOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGwxcC0+aWQpIHsKLQljYXNlIEdzbUwxX1ByaW1JZF9QaENvbm5lY3RJbmQ6Ci0JCXJjID0gaGFuZGxlX3BoX2Nvbm5lY3RfaW5kKGZsMSwgJmwxcC0+dS5waENvbm5lY3RJbmQpOwotCQlicmVhazsKLQljYXNlIEdzbUwxX1ByaW1JZF9QaFJlYWR5VG9TZW5kSW5kOgotCQlyYyA9IGhhbmRsZV9waF9yZWFkeXRvc2VuZF9pbmQoZmwxLCAmbDFwLT51LnBoUmVhZHlUb1NlbmRJbmQpOwotCQlicmVhazsKLQljYXNlIEdzbUwxX1ByaW1JZF9QaERhdGFJbmQ6Ci0JCXJjID0gaGFuZGxlX3BoX2RhdGFfaW5kKGZsMSwgJmwxcC0+dS5waERhdGFJbmQpOwotCQlicmVhazsKLQljYXNlIEdzbUwxX1ByaW1JZF9QaFJhSW5kOgotCQlyYyA9IGhhbmRsZV9waF9yYV9pbmQoZmwxLCAmbDFwLT51LnBoUmFJbmQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkvKiBTcGVjaWFsIHJldHVybiB2YWx1ZSAnMScgbWVhbnM6IGRvIG5vdCBmcmVlICovCi0JaWYgKHJjICE9IDEpCi0JCW1zZ2JfZnJlZShtc2cpOwotCi0JcmV0dXJuIHJjOwotfQotCi1QQ1Ugd2lsbCBjdXJyZW50bHkgbm90IHdvcmsgd2l0aG91dCBnZXR0aW5nIGEgR1NNIHRpbWUgb3IgQkZJIGluZGlkaWNhdGlvbi4KLUluIG9yZGVyIHRvIGZpeCB0aGlzLCBpIHdpbGwgZGlzY3VzcyB0aGlzIG9uIHRoZSBtYWlsaW5nIGxpc3QuCi1BbmRyZWFzCi0KLS8qIE9wZW5CVFMgc29ja2V0IGZ1bmN0aW9ucyAqLwotCi0vLyBUT0RPOiBXZSBzaG91bGQgbW92ZSB0aGlzIHBhcmFtZXRlcnMgdG8gY29uZmlnIGZpbGUuCi0jZGVmaW5lIFBDVV9MMV9JRl9QT1JUIDU5NDQKLQotLyogZGF0YSBoYXMgYXJyaXZlZCBvbiB0aGUgdWRwIHNvY2tldCAqLwotc3RhdGljIGludCB1ZHBfcmVhZF9jYihzdHJ1Y3Qgb3Ntb19mZCAqb2ZkKQotewotCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKDIwNDgsIDEyOCwgInVkcF9yeCIpOwotCXN0cnVjdCBsMWZ3ZF9oZGwgKmwxZmggPSAobDFmd2RfaGRsICopb2ZkLT5kYXRhOwotCXN0cnVjdCBmZW10b2wxX2hkbCAqZmwxaCA9IGwxZmgtPmZsMWg7Ci0JaW50IHJjOwotCi0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXNnLT5sMWggPSBtc2ctPmRhdGE7Ci0KLQlsMWZoLT5yZW1vdGVfc2FfbGVuID0gc2l6ZW9mKGwxZmgtPnJlbW90ZV9zYSk7Ci0JcmMgPSByZWN2ZnJvbShvZmQtPmZkLCBtc2ctPmwxaCwgbXNnYl90YWlscm9vbShtc2cpLCAwLAotCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmbDFmaC0+cmVtb3RlX3NhLCAmbDFmaC0+cmVtb3RlX3NhX2xlbik7Ci0JaWYgKHJjIDwgMCkgewotCQlwZXJyb3IoInJlYWQgZnJvbSB1ZHAiKTsKLQkJbXNnYl9mcmVlKG1zZyk7Ci0JCXJldHVybiByYzsKLQl9IGVsc2UgaWYgKHJjID09IDApIHsKLQkJcGVycm9yKCJsZW49MCByZWFkIGZyb20gdWRwIik7Ci0JCW1zZ2JfZnJlZShtc2cpOwotCQlyZXR1cm4gcmM7Ci0JfQotCW1zZ2JfcHV0KG1zZywgcmMpOwotCi0JcmMgPSBwY3VfbDFpZl9oYW5kbGVfbDFwcmltKGZsMWgsIG1zZyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBjYWxsYmFjayB3aGVuIHdlIGNhbiB3cml0ZSB0byB0aGUgVURQIHNvY2tldCAqLwotc3RhdGljIGludCB1ZHBfd3JpdGVfY2Ioc3RydWN0IG9zbW9fZmQgKm9mZCwgc3RydWN0IG1zZ2IgKm1zZykKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGwxZndkX2hkbCAqbDFmaCA9IChsMWZ3ZF9oZGwgKilvZmQtPmRhdGE7Ci0KLQkvL0RFQlVHUChER1BSUywgIlVEUDogV3JpdGluZyAldSBieXRlcyBmb3IgTVFfTDFfV1JJVEUgcXVldWVcbiIsIG1zZ2JfbDFsZW4obXNnKSk7Ci0KLQlyYyA9IHNlbmR0byhvZmQtPmZkLCBtc2ctPmwxaCwgbXNnYl9sMWxlbihtc2cpLCAwLAotCQkJKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZsMWZoLT5yZW1vdGVfc2EsIGwxZmgtPnJlbW90ZV9zYV9sZW4pOwotCWlmIChyYyA8IDApIHsKLQkJTE9HUChEUENVLCBMT0dMX0VSUk9SLCAiZXJyb3Igd3JpdGluZyB0byBMMSBtc2dfcXVldWU6ICVzXG4iLAotCQkJc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIHJjOwotCX0gZWxzZSBpZiAocmMgPCAoaW50KW1zZ2JfbDFsZW4obXNnKSkgewotCQlMT0dQKERQQ1UsIExPR0xfRVJST1IsICJzaG9ydCB3cml0ZSB0byBMMSBtc2dfcXVldWU6ICIKLQkJCSIldSA8ICV1XG4iLCByYywgbXNnYl9sMWxlbihtc2cpKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8vIFRPRE86IFdlIHNob3VsZCBtb3ZlIHRoaXMgcGFyYW1ldGVycyB0byBjb25maWcgZmlsZS4KLSNkZWZpbmUgU0dTTl9JUCAxMjcuMC4wLjEKLSNkZWZpbmUgU0dTTl9QT1JUIDIzMDAwCi0jZGVmaW5lIE5TRUkgMwotI2RlZmluZSBOU1ZDSSA0Ci0KLSNkZWZpbmUgQlZDSSA3Ci0KLSNkZWZpbmUgQ0VMTF9JRCAwCi0jZGVmaW5lIE1OQyAyCi0jZGVmaW5lIE1DQyAyNjIKLSNkZWZpbmUgUENVX0xBQyAxCi0jZGVmaW5lIFBDVV9SQUMgMAotCi1pbnQgcGN1X2wxaWZfb3BlbigpCi17Ci0JLy9zdHJ1Y3QgbDFmd2RfaGRsICpsMWZoOwotCXN0cnVjdCBmZW10b2wxX2hkbCAqZmwxaDsKLQlpbnQgcmM7Ci0KLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gZGVzdDsKLQlkZXN0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWRlc3Quc2luX3BvcnQgPSBodG9ucyhTR1NOX1BPUlQpOwotCWluZXRfYXRvbihTR1NOX0lQLCAmZGVzdC5zaW5fYWRkcik7Ci0KLQlyYyA9IGdwcnNfYnNzZ3BfY3JlYXRlKG50b2hsKGRlc3Quc2luX2FkZHIuc19hZGRyKSwgU0dTTl9QT1JULCBOU0VJLCBOU1ZDSSwgQlZDSSwgTUNDLCBNTkMsIFBDVV9MQUMsIFBDVV9SQUMsIENFTExfSUQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCS8qIGFsbG9jYXRlIG5ldyBmZW10b2wxX2hhbmRsZSAqLwotCWZsMWggPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgZmVtdG9sMV9oZGwpOwotCUlOSVRfTExJU1RfSEVBRCgmZmwxaC0+d2xjX2xpc3QpOwotCi0JbDFmaC0+ZmwxaCA9IGZsMWg7Ci0JZmwxaC0+cHJpdiA9IGwxZmg7Ci0KLQlzdHJ1Y3Qgb3Ntb193cXVldWUgKiBxdWV1ZSA9ICYoKGwxZmgtPmZsMWgpLT53cml0ZV9xKTsKLQlvc21vX3dxdWV1ZV9pbml0KHF1ZXVlLCAxMCk7Ci0JcXVldWUtPmJmZC53aGVuIHw9IEJTQ19GRF9SRUFEOwotCXF1ZXVlLT5iZmQuZGF0YSA9IGwxZmg7Ci0JcXVldWUtPmJmZC5wcml2X25yID0gMDsKLQotCS8qIE9wZW4gVURQICovCi0Jc3RydWN0IG9zbW9fd3F1ZXVlICp3cSA9ICZsMWZoLT51ZHBfd3E7Ci0KLQlvc21vX3dxdWV1ZV9pbml0KHdxLCAxMCk7Ci0Jd3EtPndyaXRlX2NiID0gdWRwX3dyaXRlX2NiOwotCXdxLT5yZWFkX2NiID0gdWRwX3JlYWRfY2I7Ci0Jd3EtPmJmZC53aGVuIHw9IEJTQ19GRF9SRUFEOwotCXdxLT5iZmQuZGF0YSA9IGwxZmg7Ci0Jd3EtPmJmZC5wcml2X25yID0gMDsKLQlyYyA9IG9zbW9fc29ja19pbml0X29mZCgmd3EtPmJmZCwgQUZfVU5TUEVDLCBTT0NLX0RHUkFNLAotCQkJCUlQUFJPVE9fVURQLCBOVUxMLCBQQ1VfTDFfSUZfUE9SVCwKLQkJCQlPU01PX1NPQ0tfRl9CSU5EKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXBlcnJvcigic29ja19pbml0Iik7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcGN1X2wxaWZfY2xvc2Uodm9pZCkKLXsKLQlncHJzX2Jzc2dwX2Rlc3Ryb3koKTsKLQotCS8qIEZJWE1FOiBjbGVhbnVwIGwxaWYgKi8KLQl0YWxsb2NfZnJlZShmbDFoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9wY3VfbDFfaWYuaCBiL3NyYy9wY3VfbDFfaWYuaAppbmRleCAyYWFjNTUzLi5mM2FjNTk3IDEwMDY0NAotLS0gYS9zcmMvcGN1X2wxX2lmLmgKKysrIGIvc3JjL3BjdV9sMV9pZi5oCkBAIC0zNiw5ICszNiwxMiBAQAogdm9pZCBwY3VfbDFpZl90eF9wdGNjaChtc2diICptc2csIHVpbnQ4X3QgdHJ4LCB1aW50OF90IHRzLCB1aW50MTZfdCBhcmZjbiwgCiAgICAgICAgIHVpbnQzMl90IGZuLCB1aW50OF90IGJsb2NrX25yKTsKIHZvaWQgcGN1X2wxaWZfdHhfYWdjaChiaXR2ZWMgKiBibG9jaywgaW50IGxlbik7CisKIHZvaWQgcGN1X2wxaWZfdHhfcGNoKGJpdHZlYyAqIGJsb2NrLCBpbnQgcGxlbiwgY2hhciAqaW1zaSk7CiAKIGludCBwY3VfbDFpZl9vcGVuKHZvaWQpOwogdm9pZCBwY3VfbDFpZl9jbG9zZSh2b2lkKTsKIAoraW50IHBjdV9yeCh1aW50OF90IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX3BjdV9pZiAqcGN1X3ByaW0pOworaW50IHBjdV9zb2NrX3NlbmQoc3RydWN0IG1zZ2IgKm1zZyk7CiAjZW5kaWYgLy8gUENVX0wxX0lGX0gKZGlmZiAtLWdpdCBhL3NyYy9wY3VfbWFpbi5jcHAgYi9zcmMvcGN1X21haW4uY3BwCmluZGV4IGVhNTA3ZTUuLjZjMzBjMWUgMTAwNjQ0Ci0tLSBhL3NyYy9wY3VfbWFpbi5jcHAKKysrIGIvc3JjL3BjdV9tYWluLmNwcApAQCAtMTA1LDggKzEwNSw4IEBACiAJCQkidG9nZXRoZXIuXG4iKTsKIAkJZXhpdCgwKTsKIAl9Ci0KIAlyYyA9IHBjdV9sMWlmX29wZW4oKTsKKwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIApAQCAtMTI0LDQgKzEyNCwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL3BjdWlmX3Byb3RvLmggYi9zcmMvcGN1aWZfcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA5Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BjdWlmX3Byb3RvLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgX1BDVUlGX1BST1RPX0gKKyNkZWZpbmUgX1BDVUlGX1BST1RPX0gKKworLyogbXNnX3R5cGUgKi8KKyNkZWZpbmUgUENVX0lGX01TR19EQVRBX1JFUQkweDAwCS8qIHNlbmQgZGF0YSB0byBnaXZlbiBjaGFubmVsICovCisjZGVmaW5lIFBDVV9JRl9NU0dfREFUQV9JTkQJMHgwMgkvKiByZWNlaXZlIGRhdGEgZnJvbSBnaXZlbiBjaGFubmVsICovCQorI2RlZmluZSBQQ1VfSUZfTVNHX1JUU19SRVEJMHgxMAkvKiByZWFkeSB0byBzZW5kIGRhdGEgdG8gZ2l2ZW4gY2hhbi4gKi8KKyNkZWZpbmUgUENVX0lGX01TR19SQUNIX0lORAkweDIyCS8qIHJlY2VpdmUgcmFjaCAqLworI2RlZmluZSBQQ1VfSUZfTVNHX0lORk9fSU5ECTB4MzIJLyogcmV0cmlldmUgQlRTIGluZm8gKi8KKyNkZWZpbmUgUENVX0lGX01TR19BQ1RfUkVRCTB4NDAJLyogYWN0aXZhdGUvZGVhY3RpdmF0ZSBQRENIICovCisjZGVmaW5lIFBDVV9JRl9NU0dfVElNRV9JTkQJMHg1MgkvKiBnc20gdGltZSBpbmRpY2F0aW9uICovCisKKy8qIHNhcGkgKi8KKyNkZWZpbmUgUENVX0lGX1NBUElfUkFDSAkweDAxCS8qIGNoYW5uZWwgcmVxdWVzdCBvbiBDQ0NIICovCisjZGVmaW5lIFBDVV9JRl9TQVBJX0FHQ0gJMHgwMgkvKiBhc3NpZ25tZW50IG9uIENDQ0ggKi8KKyNkZWZpbmUgUENVX0lGX1NBUElfUENICQkweDAzCS8qIHBhZ2luZyByZXF1ZXN0IG9uIENDQ0ggKi8KKyNkZWZpbmUgUENVX0lGX1NBUElfQkNDSAkweDA0CS8qIFNJIG9uIEJDQ0ggKi8KKyNkZWZpbmUgUENVX0lGX1NBUElfUERUQ0gJMHgwNQkvKiBwYWNrZXQgZGF0YS9jb250cm9sL2NjY2ggYmxvY2sgKi8KKyNkZWZpbmUgUENVX0lGX1NBUElfUFJBQ0gJMHgwNgkvKiBwYWNrZXQgcmFuZG9tIGFjY2VzcyBjaGFubmVsICovCisjZGVmaW5lIFBDVV9JRl9TQVBJX1BUQ0NICTB4MDcJLyogcGFja2V0IFRBIGNvbnRyb2wgY2hhbm5lbCAqLworCisvKiBmbGFncyAqLworI2RlZmluZSBQQ1VfSUZfRkxBR19BQ1RJVkUJKDEgPDwgMCkvKiBCVFMgaXMgYWN0aXZlICovCisjZGVmaW5lIFBDVV9JRl9GTEFHX1NZU01PCSgxIDw8IDEpLyogYWNjZXNzIFBEQ0ggb2Ygc3lzbW9CVFMgZGlyZWN0bHkgKi8KKyNkZWZpbmUgUENVX0lGX0ZMQUdfQ1MxCQkoMSA8PCAxNikKKyNkZWZpbmUgUENVX0lGX0ZMQUdfQ1MyCQkoMSA8PCAxNykKKyNkZWZpbmUgUENVX0lGX0ZMQUdfQ1MzCQkoMSA8PCAxOCkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfQ1M0CQkoMSA8PCAxOSkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTMQkoMSA8PCAyMCkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTMgkoMSA8PCAyMSkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTMwkoMSA8PCAyMikKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTNAkoMSA8PCAyMykKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTNQkoMSA8PCAyNCkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTNgkoMSA8PCAyNSkKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTNwkoMSA8PCAyNikKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTOAkoMSA8PCAyNykKKyNkZWZpbmUgUENVX0lGX0ZMQUdfTUNTOQkoMSA8PCAyOCkKKworc3RydWN0IGdzbV9wY3VfaWZfZGF0YSB7CisJdWludDhfdAkJc2FwaTsKKwl1aW50OF90CQlsZW47CisJdWludDhfdAkJZGF0YVsxNjJdOworCXVpbnQzMl90CWZuOworCXVpbnQxNl90CWFyZmNuOworCXVpbnQ4X3QJCXRyeF9ucjsKKwl1aW50OF90CQl0c19ucjsKKwl1aW50OF90CQlibG9ja19ucjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3NtX3BjdV9pZl9ydHNfcmVxIHsKKwl1aW50OF90CQlzYXBpOworCXVpbnQ4X3QJCXNwYXJlWzNdOworCXVpbnQzMl90CWZuOworCXVpbnQxNl90CWFyZmNuOworCXVpbnQ4X3QJCXRyeF9ucjsKKwl1aW50OF90CQl0c19ucjsKKwl1aW50OF90CQlibG9ja19ucjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3NtX3BjdV9pZl9yYWNoX2luZCB7CisJdWludDhfdAkJc2FwaTsKKwl1aW50OF90CQlyYTsKKwlpbnQxNl90CQlxdGE7CisJdWludDMyX3QJZm47CisJdWludDE2X3QJYXJmY247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGdzbV9wY3VfaWZfaW5mb190cnggeworCXVpbnQxNl90CWFyZmNuOworCXVpbnQ4X3QJCXBkY2hfbWFzazsJCS8qIFBEQ0ggY2hhbm5lbHMgcGVyIFRTICovCisJdWludDhfdAkJc3BhcmU7CisJdWludDhfdAkJdHNjWzhdOwkJCS8qIFRTQyBwZXIgY2hhbm5lbCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBnc21fcGN1X2lmX2luZm9faW5kIHsKKwl1aW50MzJfdAlmbGFnczsKKwlzdHJ1Y3QgZ3NtX3BjdV9pZl9pbmZvX3RyeCB0cnhbOF07CS8qIFRSWCBpbmZvcyBwZXIgQlRTICovCisJLyogUkFJICovCisJdWludDE2X3QJbWNjLCBtbmMsIGxhYywgcmFjOworCS8qIE5TRSAqLworCXVpbnQxNl90CW5zZWk7CisJdWludDhfdAkJbnNlX3RpbWVyWzddOworCXVpbnQ4X3QJCWNlbGxfdGltZXJbMTFdOworCS8qIGNlbGwgICovCisJdWludDE2X3QJY2VsbF9pZDsKKwl1aW50MTZfdAlyZXBlYXRfdGltZTsKKwl1aW50OF90CQlyZXBlYXRfY291bnQ7CisJdWludDE2X3QJYnZjaTsKKwl1aW50OF90CQl0MzE0MjsKKwl1aW50OF90CQl0MzE2OTsKKwl1aW50OF90CQl0MzE5MTsKKwl1aW50OF90CQl0MzE5M18xMG1zOworCXVpbnQ4X3QJCXQzMTk1OworCXVpbnQ4X3QJCW4zMTAxOworCXVpbnQ4X3QJCW4zMTAzOworCXVpbnQ4X3QJCW4zMTA1OworCXVpbnQ4X3QJCWN2X2NvdW50ZG93bjsKKwl1aW50MTZfdAlkbF90YmZfZXh0OworCXVpbnQxNl90CXVsX3RiZl9leHQ7CisJdWludDhfdAkJaW5pdGlhbF9jczsKKwl1aW50OF90CQlpbml0aWFsX21jczsKKwkvKiBOU1ZDICovCisJdWludDE2X3QJbnN2Y2lbMl07CisJdWludDE2X3QJbG9jYWxfcG9ydFsyXTsKKwl1aW50MTZfdAlyZW1vdGVfcG9ydFsyXTsKKwl1aW50MzJfdAlyZW1vdGVfaXBbMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGdzbV9wY3VfaWZfYWN0X3JlcSB7CisJdWludDhfdAkJYWN0aXZhdGU7CisJdWludDhfdAkJdHJ4X25yOworCXVpbnQ4X3QJCXRzX25yOworCXVpbnQ4X3QJCXNwYXJlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBnc21fcGN1X2lmX3RpbWVfaW5kIHsKKwl1aW50MzJfdAlmbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgZ3NtX3BjdV9pZiB7CisJLyogY29udGV4dCBiYXNlZCBpbmZvcm1hdGlvbiAqLworCXVpbnQ4X3QJCW1zZ190eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwl1aW50OF90CQlidHNfbnI7CQkvKiBidHMgbnVtYmVyICovCisJdWludDhfdAkJc3BhcmVbMl07CisKKwl1bmlvbiB7CisJCXN0cnVjdCBnc21fcGN1X2lmX2RhdGEJCWRhdGFfcmVxOworCQlzdHJ1Y3QgZ3NtX3BjdV9pZl9kYXRhCQlkYXRhX2luZDsKKwkJc3RydWN0IGdzbV9wY3VfaWZfcnRzX3JlcQlydHNfcmVxOworCQlzdHJ1Y3QgZ3NtX3BjdV9pZl9yYWNoX2luZAlyYWNoX2luZDsKKwkJc3RydWN0IGdzbV9wY3VfaWZfaW5mb19pbmQJaW5mb19pbmQ7CisJCXN0cnVjdCBnc21fcGN1X2lmX2FjdF9yZXEJYWN0X3JlcTsKKwkJc3RydWN0IGdzbV9wY3VfaWZfdGltZV9pbmQJdGltZV9pbmQ7CisJfSB1OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNlbmRpZiAvKiBfUENVSUZfUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3N5c21vX2wxX2lmLmNwcCBiL3NyYy9zeXNtb19sMV9pZi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjI4ZDIuLjAwMDAwMDAKLS0tIGEvc3JjL3N5c21vX2wxX2lmLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxNiArMCwwIEBACi0vKiBzeXNtb19sMV9pZi5jcHAKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgQW5kcmVhcyBFdmVyc2JlcmcgPGpvbGx5QGV2ZXJzYmVyZy5ldT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgPG9zbW9jb20vY29yZS90YWxsb2MuaD4KLSNpbmNsdWRlIDxvc21vY29tL2NvcmUvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8b3Ntb2NvbS9jb3JlL21zZ2IuaD4KLX0KLQotI2luY2x1ZGUgPGdwcnNfcmxjbWFjLmg+Ci0jaW5jbHVkZSA8cGN1X2wxX2lmLmg+Ci0jaW5jbHVkZSA8Z3Byc19kZWJ1Zy5oPgotI2luY2x1ZGUgPGdwcnNfYnNzZ3BfcGN1Lmg+Ci0jaW5jbHVkZSAiLi4vLi4vb3Ntby1idHMvaW5jbHVkZS9vc21vLWJ0cy9wY3VpZl9wcm90by5oIgotCi1zdGF0aWMgaW50IHBjdV9zb2NrX3NlbmQoc3RydWN0IG1zZ2IgKm1zZyk7Ci1zdGF0aWMgdm9pZCBwY3Vfc29ja190aW1lb3V0KHZvaWQgKl9wcml2KTsKLQotLy8gVmFyaWFibGUgZm9yIHN0b3JhZ2UgY3VycmVudCBGTi4KLWludCBmcmFtZV9udW1iZXI7Ci0KLWludCBnZXRfY3VycmVudF9mbigpCi17Ci0JcmV0dXJuIGZyYW1lX251bWJlcjsKLX0KLQotdm9pZCBzZXRfY3VycmVudF9mbihpbnQgZm4pCi17Ci0JZnJhbWVfbnVtYmVyID0gZm47Ci19Ci0KLS8qCi0gKiBQQ1UgbWVzc2FnZXMKLSAqLwotCi1zdHJ1Y3QgbXNnYiAqcGN1X21zZ2JfYWxsb2ModWludDhfdCBtc2dfdHlwZSwgdWludDhfdCBidHNfbnIpCi17Ci0Jc3RydWN0IG1zZ2IgKm1zZzsKLQlzdHJ1Y3QgZ3NtX3BjdV9pZiAqcGN1X3ByaW07Ci0KLQltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX3BjdV9pZiksICJwY3Vfc29ja190eCIpOwotCWlmICghbXNnKQotCQlyZXR1cm4gTlVMTDsKLQltc2diX3B1dChtc2csIHNpemVvZihzdHJ1Y3QgZ3NtX3BjdV9pZikpOwotCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+ZGF0YTsKLQlwY3VfcHJpbS0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKLQlwY3VfcHJpbS0+YnRzX25yID0gYnRzX25yOwotCi0JcmV0dXJuIG1zZzsKLX0KLQotc3RhdGljIGludCBwY3VfdHhfYWN0X3JlcSh1aW50OF90IHRyeCwgdWludDhfdCB0cywgdWludDhfdCBhY3RpdmF0ZSkKLXsKLQlzdHJ1Y3QgbXNnYiAqbXNnOwotCXN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbTsKLQlzdHJ1Y3QgZ3NtX3BjdV9pZl9hY3RfcmVxICphY3RfcmVxOwotCi0JTE9HUChETDFJRiwgTE9HTF9JTkZPLCAiU2VuZGluZyAlcyByZXF1ZXN0OiB0cng9JWQgdHM9JWRcbiIsCi0JCShhY3RpdmF0ZSkgPyAiYWN0aXZhdGUiIDogImRlYWN0aXZhdGUiLCB0cngsIHRzKTsKLQotCW1zZyA9IHBjdV9tc2diX2FsbG9jKFBDVV9JRl9NU0dfQUNUX1JFUSwgMCk7Ci0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOwotCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+ZGF0YTsKLQlhY3RfcmVxID0gJnBjdV9wcmltLT51LmFjdF9yZXE7Ci0JYWN0X3JlcS0+YWN0aXZhdGUgPSBhY3RpdmF0ZTsKLQlhY3RfcmVxLT50cnhfbnIgPSB0cng7Ci0JYWN0X3JlcS0+dHNfbnIgPSB0czsKLQotCXJldHVybiBwY3Vfc29ja19zZW5kKG1zZyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGN1X3R4X2RhdGFfcmVxKHVpbnQ4X3QgdHJ4LCB1aW50OF90IHRzLCB1aW50OF90IHNhcGksCi0JdWludDE2X3QgYXJmY24sIHVpbnQzMl90IGZuLCB1aW50OF90IGJsb2NrX25yLCB1aW50OF90ICpkYXRhLAotCXVpbnQ4X3QgbGVuKQotewotCXN0cnVjdCBtc2diICptc2c7Ci0Jc3RydWN0IGdzbV9wY3VfaWYgKnBjdV9wcmltOwotCXN0cnVjdCBnc21fcGN1X2lmX2RhdGEgKmRhdGFfcmVxOwotCi0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIlNlbmRpbmcgZGF0YSByZXF1ZXN0OiB0cng9JWQgdHM9JWQgc2FwaT0lZCAiCi0JCSJhcmZjbj0lZCBmbj0lZCBibG9jaz0lZCBkYXRhPSVzXG4iLCB0cngsIHRzLCBzYXBpLCBhcmZjbiwgZm4sCi0JCWJsb2NrX25yLCBvc21vX2hleGR1bXAoZGF0YSwgbGVuKSk7Ci0KLQltc2cgPSBwY3VfbXNnYl9hbGxvYyhQQ1VfSUZfTVNHX0RBVEFfUkVRLCAwKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcGN1X3ByaW0gPSAoc3RydWN0IGdzbV9wY3VfaWYgKikgbXNnLT5kYXRhOwotCWRhdGFfcmVxID0gJnBjdV9wcmltLT51LmRhdGFfcmVxOwotCi0JZGF0YV9yZXEtPnNhcGkgPSBzYXBpOwotCWRhdGFfcmVxLT5mbiA9IGZuOwotCWRhdGFfcmVxLT5hcmZjbiA9IGFyZmNuOwotCWRhdGFfcmVxLT50cnhfbnIgPSB0cng7Ci0JZGF0YV9yZXEtPnRzX25yID0gdHM7Ci0JZGF0YV9yZXEtPmJsb2NrX25yID0gYmxvY2tfbnI7Ci0JbWVtY3B5KGRhdGFfcmVxLT5kYXRhLCBkYXRhLCBsZW4pOwotCWRhdGFfcmVxLT5sZW4gPSBsZW47Ci0KLQlyZXR1cm4gcGN1X3NvY2tfc2VuZChtc2cpOwotfQotCi12b2lkIHBjdV9sMWlmX3R4X3BkdGNoKG1zZ2IgKm1zZywgdWludDhfdCB0cngsIHVpbnQ4X3QgdHMsIHVpbnQxNl90IGFyZmNuLAotCXVpbnQzMl90IGZuLCB1aW50OF90IGJsb2NrX25yKQotewotCXBjdV90eF9kYXRhX3JlcSh0cngsIHRzLCBQQ1VfSUZfU0FQSV9QRFRDSCwgYXJmY24sIGZuLCBibG9ja19uciwKLQkJbXNnLT5kYXRhLCBtc2ctPmxlbik7Ci0JbXNnYl9mcmVlKG1zZyk7Ci19Ci0KLXZvaWQgcGN1X2wxaWZfdHhfcHRjY2gobXNnYiAqbXNnLCB1aW50OF90IHRyeCwgdWludDhfdCB0cywgdWludDE2X3QgYXJmY24sCi0JdWludDMyX3QgZm4sIHVpbnQ4X3QgYmxvY2tfbnIpCi17Ci0JcGN1X3R4X2RhdGFfcmVxKHRyeCwgdHMsIFBDVV9JRl9TQVBJX1BUQ0NILCBhcmZjbiwgZm4sIGJsb2NrX25yLAotCQltc2ctPmRhdGEsIG1zZy0+bGVuKTsKLQltc2diX2ZyZWUobXNnKTsKLX0KLQotdm9pZCBwY3VfbDFpZl90eF9hZ2NoKGJpdHZlYyAqIGJsb2NrLCBpbnQgcGxlbikKLXsKLQl1aW50OF90IGRhdGFbMjNdOyAvKiBwcmVmaXggUExFTiAqLwotCQotCS8qIEZJWE1FOiB3aHkgZG9lcyBPcGVuQlRTIGhhcyBubyBQTEVOIGFuZCBubyBmaWxsIGluIG1lc3NhZ2U/ICovCi0JYml0dmVjX3BhY2soYmxvY2ssIGRhdGEgKyAxKTsKLQlkYXRhWzBdID0gKHBsZW4gPDwgMikgfCAweDAxOwotCXBjdV90eF9kYXRhX3JlcSgwLCAwLCBQQ1VfSUZfU0FQSV9BR0NILCAwLCAwLCAwLCBkYXRhLCAyMyk7Ci19Ci0KLXZvaWQgcGN1X2wxaWZfdHhfcGNoKGJpdHZlYyAqIGJsb2NrLCBpbnQgcGxlbiwgY2hhciAqaW1zaSkKLXsKLQl1aW50OF90IGRhdGFbMjMrM107IC8qIHByZWZpeCBQTEVOICovCi0KLQkvKiBwYWdpbmcgZ3JvdXAgKi8KLQlpZiAoIWltc2kgfHwgc3RybGVuKGltc2kpIDwgMykKLQkJcmV0dXJuOwotCWltc2kgKz0gc3RybGVuKGltc2kpIC0gMzsKLQlkYXRhWzBdID0gaW1zaVswXTsKLQlkYXRhWzFdID0gaW1zaVsxXTsKLQlkYXRhWzJdID0gaW1zaVsyXTsKLQotCWJpdHZlY19wYWNrKGJsb2NrLCBkYXRhICsgMysxKTsKLQlkYXRhWzNdID0gKHBsZW4gPDwgMikgfCAweDAxOwotCXBjdV90eF9kYXRhX3JlcSgwLCAwLCBQQ1VfSUZfU0FQSV9QQ0gsIDAsIDAsIDAsIGRhdGEsIDIzKzMpOwotfQotCi1zdGF0aWMgdm9pZCBwY3VfbDFpZl90eF9iY2NoKHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pCi17Ci0JcGN1X3R4X2RhdGFfcmVxKDAsIDAsIFBDVV9JRl9TQVBJX0JDQ0gsIDAsIDAsIDAsIGRhdGEsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQgcGN1X3J4X2RhdGFfaW5kKHN0cnVjdCBnc21fcGN1X2lmX2RhdGEgKmRhdGFfaW5kKQotewotCWludCByYyA9IDA7Ci0KLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiRGF0YSBpbmRpY2F0aW9uIHJlY2VpdmVkOiBzYXBpPSVkIGFyZmNuPSVkICIKLQkJImJsb2NrPSVkIGRhdGE9JXNcbiIsIGRhdGFfaW5kLT5zYXBpLAotCQlkYXRhX2luZC0+YXJmY24sIGRhdGFfaW5kLT5ibG9ja19uciwKLQkJb3Ntb19oZXhkdW1wKGRhdGFfaW5kLT5kYXRhLCBkYXRhX2luZC0+bGVuKSk7Ci0KLQlzd2l0Y2ggKGRhdGFfaW5kLT5zYXBpKSB7Ci0JY2FzZSBQQ1VfSUZfU0FQSV9QRFRDSDoKLQkJcmMgPSBncHJzX3JsY21hY19yY3ZfYmxvY2soZGF0YV9pbmQtPmRhdGEsIGRhdGFfaW5kLT5sZW4sCi0JCQlkYXRhX2luZC0+Zm4pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiUmVjZWl2ZWQgUENVIGRhdGEgaW5kaWNhdGlvbiB3aXRoICIKLQkJCSJ1bnN1cHBvcnRlZCBzYXBpICVkXG4iLCBkYXRhX2luZC0+c2FwaSk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcGN1X3J4X3J0c19yZXEoc3RydWN0IGdzbV9wY3VfaWZfcnRzX3JlcSAqcnRzX3JlcSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIlJUUyByZXF1ZXN0IHJlY2VpdmVkOiB0cng9JWQgdHM9JWQgc2FwaT0lZCAiCi0JCSJhcmZjbj0lZCBmbj0lZCBibG9jaz0lZFxuIiwgcnRzX3JlcS0+dHJ4X25yLCBydHNfcmVxLT50c19uciwKLQkJcnRzX3JlcS0+c2FwaSwgcnRzX3JlcS0+YXJmY24sIHJ0c19yZXEtPmZuLCBydHNfcmVxLT5ibG9ja19ucik7Ci0KLQlzd2l0Y2ggKHJ0c19yZXEtPnNhcGkpIHsKLQljYXNlIFBDVV9JRl9TQVBJX1BEVENIOgotCQlncHJzX3JsY21hY19yY3ZfcnRzX2Jsb2NrKHJ0c19yZXEtPnRyeF9uciwgcnRzX3JlcS0+dHNfbnIsCi0JCQlydHNfcmVxLT5hcmZjbiwgcnRzX3JlcS0+Zm4sIHJ0c19yZXEtPmJsb2NrX25yKTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ1VfSUZfU0FQSV9QVENDSDoKLQkJLyogRklYTUUgKi8KLQkJewotCQkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoMjMsICJsMV9wcmltIik7Ci0JCQltZW1zZXQobXNnYl9wdXQobXNnLCAyMyksIDB4MmIsIDIzKTsKLQkJCXBjdV9sMWlmX3R4X3B0Y2NoKG1zZywgcnRzX3JlcS0+dHJ4X25yLCBydHNfcmVxLT50c19uciwKLQkJCQlydHNfcmVxLT5hcmZjbiwgcnRzX3JlcS0+Zm4sIHJ0c19yZXEtPmJsb2NrX25yKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiUmVjZWl2ZWQgUENVIFJUUyByZXF1ZXN0IHdpdGggIgotCQkJInVuc3VwcG9ydGVkIHNhcGkgJWRcbiIsIHJ0c19yZXEtPnNhcGkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHBjdV9yeF9yYWNoX2luZChzdHJ1Y3QgZ3NtX3BjdV9pZl9yYWNoX2luZCAqcmFjaF9pbmQpCi17Ci0JaW50IHJjID0gMDsKLQotCUxPR1AoREwxSUYsIExPR0xfSU5GTywgIlJBQ0ggcmVxdWVzdCByZWNlaXZlZDogc2FwaT0lZCAiCi0JCSJxdGE9JWQsIHJhPSVkLCBmbj0lZFxuIiwgcmFjaF9pbmQtPnNhcGksIHJhY2hfaW5kLT5xdGEsCi0JCXJhY2hfaW5kLT5yYSwgcmFjaF9pbmQtPmZuKTsKLQotCXN3aXRjaCAocmFjaF9pbmQtPnNhcGkpIHsKLQljYXNlIFBDVV9JRl9TQVBJX1JBQ0g6Ci0JCXJjID0gZ3Byc19ybGNtYWNfcmN2X3JhY2gocmFjaF9pbmQtPnJhLCByYWNoX2luZC0+Zm4sCi0JCQlyYWNoX2luZC0+cXRhKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIlJlY2VpdmVkIFBDVSByYWNoIHJlcXVlc3Qgd2l0aCAiCi0JCQkidW5zdXBwb3J0ZWQgc2FwaSAlZFxuIiwgcmFjaF9pbmQtPnNhcGkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHBjdV9yeF9pbmZvX2luZChzdHJ1Y3QgZ3NtX3BjdV9pZl9pbmZvX2luZCAqaW5mb19pbmQpCi17Ci0Jc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOwotCWludCByYyA9IDA7Ci0JaW50IHRyeCwgdHMsIHRmaTsKLQlzdHJ1Y3QgZ3Byc19ybGNtYWNfdGJmICp0YmY7Ci0JaW50IGk7Ci0KLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiSW5mbyBpbmRpY2F0aW9uIHJlY2VpdmVkOlxuIik7Ci0KLQlpZiAoIShpbmZvX2luZC0+ZmxhZ3MgJiBQQ1VfSUZfRkxBR19BQ1RJVkUpKSB7Ci0JCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiQlRTIG5vdCBhdmFpbGFibGVcbiIpOwotYnNzZ3BfZmFpbGVkOgotCQkvKiBmcmVlIGFsbCBUQkYgKi8KLQkJZm9yICh0cnggPSAwOyB0cnggPCA4OyB0cngrKykgewotCQkJYnRzLT50cnhbdHJ4XS5hcmZjbiA9IGluZm9faW5kLT50cnhbdHJ4XS5hcmZjbjsKLQkJCWZvciAodHMgPSAwOyB0cyA8IDg7IHRzKyspIHsKLQkJCQlmb3IgKHRmaSA9IDA7IHRmaSA8IDMyOyB0ZmkrKykgewotCQkJCQl0YmYgPSBidHMtPnRyeFt0cnhdLnBkY2hbdHNdLnRiZlt0ZmldOwotCQkJCQlpZiAodGJmKQotCQkJCQkJdGJmX2ZyZWUodGJmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ3Byc19ic3NncF9kZXN0cm95KCk7Ci0JCXJldHVybiAwOwotCX0KLQlMT0dQKERMMUlGLCBMT0dMX0lORk8sICJCVFMgYXZhaWxhYmxlXG4iKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIG1jYz0lZFxuIiwgaW5mb19pbmQtPm1jYyk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBtbmM9JWRcbiIsIGluZm9faW5kLT5tbmMpOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgbGFjPSVkXG4iLCBpbmZvX2luZC0+bGFjKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJhYz0lZFxuIiwgaW5mb19pbmQtPnJhYyk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBjZWxsX2lkPSVkXG4iLCBpbmZvX2luZC0+Y2VsbF9pZCk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc2VpPSVkXG4iLCBpbmZvX2luZC0+bnNlaSk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc2VfdGltZXI9JWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCi0JCWluZm9faW5kLT5uc2VfdGltZXJbMF0sIGluZm9faW5kLT5uc2VfdGltZXJbMV0sCi0JCWluZm9faW5kLT5uc2VfdGltZXJbMl0sIGluZm9faW5kLT5uc2VfdGltZXJbM10sCi0JCWluZm9faW5kLT5uc2VfdGltZXJbNF0sIGluZm9faW5kLT5uc2VfdGltZXJbNV0sCi0JCWluZm9faW5kLT5uc2VfdGltZXJbNl0pOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgY2VsbF90aW1lcj0lZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAiCi0JCSIlZFxuIiwKLQkJaW5mb19pbmQtPmNlbGxfdGltZXJbMF0sIGluZm9faW5kLT5jZWxsX3RpbWVyWzFdLAotCQlpbmZvX2luZC0+Y2VsbF90aW1lclsyXSwgaW5mb19pbmQtPmNlbGxfdGltZXJbM10sCi0JCWluZm9faW5kLT5jZWxsX3RpbWVyWzRdLCBpbmZvX2luZC0+Y2VsbF90aW1lcls1XSwKLQkJaW5mb19pbmQtPmNlbGxfdGltZXJbNl0sIGluZm9faW5kLT5jZWxsX3RpbWVyWzddLAotCQlpbmZvX2luZC0+Y2VsbF90aW1lcls4XSwgaW5mb19pbmQtPmNlbGxfdGltZXJbOV0sCi0JCWluZm9faW5kLT5jZWxsX3RpbWVyWzEwXSk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiByZXBlYXRfdGltZT0lZFxuIiwgaW5mb19pbmQtPnJlcGVhdF90aW1lKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJlcGVhdF9jb3VudD0lZFxuIiwgaW5mb19pbmQtPnJlcGVhdF9jb3VudCk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBidmNpPSVkXG4iLCBpbmZvX2luZC0+YnZjaSk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiB0MzE0Mj0lZFxuIiwgaW5mb19pbmQtPnQzMTQyKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHQzMTY5PSVkXG4iLCBpbmZvX2luZC0+dDMxNjkpOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgdDMxOTE9JWRcbiIsIGluZm9faW5kLT50MzE5MSk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiB0MzE5Mz0lZCAobXMpXG4iLCBpbmZvX2luZC0+dDMxOTNfMTBtcyAqIDEwKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHQzMTk1PSVkXG4iLCBpbmZvX2luZC0+dDMxOTUpOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgbjMxMDE9JWRcbiIsIGluZm9faW5kLT5uMzEwMSk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuMzEwMz0lZFxuIiwgaW5mb19pbmQtPm4zMTAzKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIG4zMTA1PSVkXG4iLCBpbmZvX2luZC0+bjMxMDUpOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgY3ZfY291bnRkb3duPSVkXG4iLCBpbmZvX2luZC0+Y3ZfY291bnRkb3duKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIGRsX3RiZl9leHQ9JWRcbiIsIGluZm9faW5kLT5kbF90YmZfZXh0KTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHVsX3RiZl9leHQ9JWRcbiIsIGluZm9faW5kLT51bF90YmZfZXh0KTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICgoaW5mb19pbmQtPmZsYWdzICYgKFBDVV9JRl9GTEFHX0NTMSA8PCBpKSkpCi0JCQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIFVzZSBDUyVkXG4iLCBpKzEpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0JCWlmICgoaW5mb19pbmQtPmZsYWdzICYgKFBDVV9JRl9GTEFHX01DUzEgPDwgaSkpKQotCQkJTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBVc2UgTUNTJWRcbiIsIGkrMSk7Ci0JfQotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgaW5pdGlhbF9jcz0lZFxuIiwgaW5mb19pbmQtPmluaXRpYWxfY3MpOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgaW5pdGlhbF9tY3M9JWRcbiIsIGluZm9faW5kLT5pbml0aWFsX21jcyk7Ci0JTE9HUChETDFJRiwgTE9HTF9ERUJVRywgIiBuc3ZjaT0lZFxuIiwgaW5mb19pbmQtPm5zdmNpWzBdKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIGxvY2FsX3BvcnQ9JWRcbiIsIGluZm9faW5kLT5sb2NhbF9wb3J0WzBdKTsKLQlMT0dQKERMMUlGLCBMT0dMX0RFQlVHLCAiIHJlbW90ZV9wb3J0PSVkXG4iLCBpbmZvX2luZC0+cmVtb3RlX3BvcnRbMF0pOwotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICIgcmVtb3RlX2lwPSVkXG4iLCBpbmZvX2luZC0+cmVtb3RlX2lwWzBdKTsKLQotCXJjID0gZ3Byc19ic3NncF9jcmVhdGUoaW5mb19pbmQtPnJlbW90ZV9pcFswXSwgaW5mb19pbmQtPnJlbW90ZV9wb3J0WzBdLAotCQlpbmZvX2luZC0+bnNlaSwgaW5mb19pbmQtPm5zdmNpWzBdLCBpbmZvX2luZC0+YnZjaSwKLQkJaW5mb19pbmQtPm1jYywgaW5mb19pbmQtPm1uYywgaW5mb19pbmQtPmxhYywgaW5mb19pbmQtPnJhYywKLQkJaW5mb19pbmQtPmNlbGxfaWQpOwotCWlmIChyYyA8IDApIHsKLQkJTE9HUChETDFJRiwgTE9HTF9OT1RJQ0UsICJTR1NOIG5vdCBhdmFpbGFibGVcbiIpOwotCQlnb3RvIGJzc2dwX2ZhaWxlZDsKLQl9Ci0KLQlidHMtPmNzMSA9ICEhKGluZm9faW5kLT5mbGFncyAmIFBDVV9JRl9GTEFHX0NTMSk7Ci0JYnRzLT5jczIgPSAhIShpbmZvX2luZC0+ZmxhZ3MgJiBQQ1VfSUZfRkxBR19DUzIpOwotCWJ0cy0+Y3MzID0gISEoaW5mb19pbmQtPmZsYWdzICYgUENVX0lGX0ZMQUdfQ1MzKTsKLQlidHMtPmNzNCA9ICEhKGluZm9faW5kLT5mbGFncyAmIFBDVV9JRl9GTEFHX0NTNCk7Ci0JaWYgKCFidHMtPmNzMSAmJiAhYnRzLT5jczIgJiYgIWJ0cy0+Y3MzICYmICFidHMtPmNzNCkKLQkJYnRzLT5jczEgPSAxOwotCWlmIChpbmZvX2luZC0+dDMxNDIpIHsgLyogaWYgdGltZXIgdmFsdWVzIGFyZSBzZXQgKi8KLQkJYnRzLT50MzE0MiA9IGluZm9faW5kLT50MzE0MjsKLQkJYnRzLT50MzE2OSA9IGluZm9faW5kLT50MzE2OTsKLQkJYnRzLT50MzE5MSA9IGluZm9faW5kLT50MzE5MTsKLQkJYnRzLT50MzE5M19tc2VjID0gaW5mb19pbmQtPnQzMTkzXzEwbXMgKiAxMDsKLQkJYnRzLT50MzE5NSA9IGluZm9faW5kLT50MzE5NTsKLQkJYnRzLT5uMzEwMSA9IGluZm9faW5kLT5uMzEwMTsKLQkJYnRzLT5uMzEwMyA9IGluZm9faW5kLT5uMzEwMzsKLQkJYnRzLT5uMzEwNSA9IGluZm9faW5kLT5uMzEwNTsKLQl9Ci0JaWYgKGluZm9faW5kLT5pbml0aWFsX2NzIDwgMSB8fCBpbmZvX2luZC0+aW5pdGlhbF9jcyA+IDQpCi0JCWJ0cy0+aW5pdGlhbF9jcyA9IDE7Ci0JZWxzZQotCQlidHMtPmluaXRpYWxfY3MgPSBpbmZvX2luZC0+aW5pdGlhbF9jczsKLQotCWZvciAodHJ4ID0gMDsgdHJ4IDwgODsgdHJ4KyspIHsKLQkJYnRzLT50cnhbdHJ4XS5hcmZjbiA9IGluZm9faW5kLT50cnhbdHJ4XS5hcmZjbjsKLQkJZm9yICh0cyA9IDA7IHRzIDwgODsgdHMrKykgewotCQkJaWYgKChpbmZvX2luZC0+dHJ4W3RyeF0ucGRjaF9tYXNrICYgKDEgPDwgdHMpKSkgewotCQkJCS8qIEZJWE1FOiBhY3RpdmF0ZSBkeW5hbWljYWxseSBhdCBSTENNQUMgKi8KLQkJCQlpZiAoIWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlKQotCQkJCQlwY3VfdHhfYWN0X3JlcSh0cngsIHRzLCAxKTsKLQkJCQlidHMtPnRyeFt0cnhdLnBkY2hbdHNdLmVuYWJsZSA9IDE7Ci0JCQkJYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50c2MgPQotCQkJCQlpbmZvX2luZC0+dHJ4W3RyeF0udHNjW3RzXTsKLQkJCQlMT0dQKERMMUlGLCBMT0dMX0lORk8sICJQRENIOiB0cng9JWQgdHM9JWRcbiIsCi0JCQkJCXRyeCwgdHMpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS5lbmFibGUpCi0JCQkJCXBjdV90eF9hY3RfcmVxKHRyeCwgdHMsIDApOwotCQkJCWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlID0gMDsKLQkJCQkvKiBraWNrIGFsbCB0YmYgIEZJWE1FOiBtdWx0aXNsb3QgICovCi0JCQkJZm9yICh0ZmkgPSAwOyB0ZmkgPCAzMjsgdGZpKyspIHsKLQkJCQkJdGJmID0gYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50YmZbdGZpXTsKLQkJCQkJaWYgKHRiZikKLQkJCQkJCXRiZl9mcmVlKHRiZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHBjdV9yeF90aW1lX2luZChzdHJ1Y3QgZ3NtX3BjdV9pZl90aW1lX2luZCAqdGltZV9pbmQpCi17Ci0Jc3RydWN0IGdwcnNfcmxjbWFjX2J0cyAqYnRzID0gZ3Byc19ybGNtYWNfYnRzOwotCWludCB0cngsIHRzLCB0Zmk7Ci0Jc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOwotCXVpbnQzMl90IGVsYXBzZWQ7Ci0JdWludDhfdCBmbjEzID0gdGltZV9pbmQtPmZuICUgMTM7Ci0KLQkvKiBvbWl0IGZyYW1lIG51bWJlcnMgbm90IHN0YXJ0aW5nIGF0IGEgTUFDIGJsb2NrICovCi0JaWYgKGZuMTMgIT0gMCAmJiBmbjEzICE9IDQgJiYgZm4xMyAhPSA4KQotCQlyZXR1cm4gMDsKLQotCUxPR1AoREwxSUYsIExPR0xfREVCVUcsICJUaW1lIGluZGljYXRpb24gcmVjZWl2ZWQ6ICVkXG4iLAotCQl0aW1lX2luZC0+Zm4gJSA1Mik7Ci0KLQlzZXRfY3VycmVudF9mbih0aW1lX2luZC0+Zm4pOwotCi0JLyogY2hlY2sgZm9yIHBvbGwgdGltZW91dCAqLwotCWZvciAodHJ4ID0gMDsgdHJ4IDwgODsgdHJ4KyspIHsKLQkJZm9yICh0cyA9IDA7IHRzIDwgODsgdHMrKykgewotCQkJZm9yICh0ZmkgPSAwOyB0ZmkgPCAzMjsgdGZpKyspIHsKLQkJCQl0YmYgPSBidHMtPnRyeFt0cnhdLnBkY2hbdHNdLnRiZlt0ZmldOwotCQkJCWlmICghdGJmKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAodGJmLT5wb2xsX3N0YXRlICE9IEdQUlNfUkxDTUFDX1BPTExfU0NIRUQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsYXBzZWQgPSAoZnJhbWVfbnVtYmVyIC0gdGJmLT5wb2xsX2ZuKQotCQkJCQkJCSUgMjcxNTY0ODsKLQkJCQlpZiAoZWxhcHNlZCA+PSAyMCAmJiBlbGFwc2VkIDwgMjAwKQotCQkJCQlncHJzX3JsY21hY19wb2xsX3RpbWVvdXQodGJmKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBjdV9yeCh1aW50OF90IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX3BjdV9pZiAqcGN1X3ByaW0pCi17Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAobXNnX3R5cGUpIHsKLQljYXNlIFBDVV9JRl9NU0dfREFUQV9JTkQ6Ci0JCXJjID0gcGN1X3J4X2RhdGFfaW5kKCZwY3VfcHJpbS0+dS5kYXRhX2luZCk7Ci0JCWJyZWFrOwotCWNhc2UgUENVX0lGX01TR19SVFNfUkVROgotCQlyYyA9IHBjdV9yeF9ydHNfcmVxKCZwY3VfcHJpbS0+dS5ydHNfcmVxKTsKLQkJYnJlYWs7Ci0JY2FzZSBQQ1VfSUZfTVNHX1JBQ0hfSU5EOgotCQlyYyA9IHBjdV9yeF9yYWNoX2luZCgmcGN1X3ByaW0tPnUucmFjaF9pbmQpOwotCQlicmVhazsKLQljYXNlIFBDVV9JRl9NU0dfSU5GT19JTkQ6Ci0JCXJjID0gcGN1X3J4X2luZm9faW5kKCZwY3VfcHJpbS0+dS5pbmZvX2luZCk7Ci0JCWJyZWFrOwotCWNhc2UgUENVX0lGX01TR19USU1FX0lORDoKLQkJcmMgPSBwY3VfcnhfdGltZV9pbmQoJnBjdV9wcmltLT51LnRpbWVfaW5kKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIlJlY2VpdmVkIHVua253b24gUENVIG1zZyB0eXBlICVkXG4iLAotCQkJbXNnX3R5cGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogU1lTTU8tUENVIHNvY2tldCBmdW5jdGlvbnMKLSAqLwotCi1zdHJ1Y3QgcGN1X3NvY2tfc3RhdGUgewotCXN0cnVjdCBvc21vX2ZkIGNvbm5fYmZkOwkvKiBmZCBmb3IgY29ubmVjdGlvbiB0byBsY3IgKi8KLQlzdHJ1Y3Qgb3Ntb190aW1lcl9saXN0IHRpbWVyOwkvKiBzb2NrZXQgY29ubmVjdCByZXRyeSB0aW1lciAqLwotCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CS8qIHF1ZXVlIGZvciBzZW5kaW5nIG1lc3NhZ2VzICovCi19ICpwY3Vfc29ja19zdGF0ZSA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgcGN1X3NvY2tfc2VuZChzdHJ1Y3QgbXNnYiAqbXNnKQotewotCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSBwY3Vfc29ja19zdGF0ZTsKLQlzdHJ1Y3Qgb3Ntb19mZCAqY29ubl9iZmQ7Ci0KLQlpZiAoIXN0YXRlKSB7Ci0JCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiUENVIHNvY2tldCBub3QgY3JlYXRlZCwgZHJvcHBpbmcgIgotCQkJIm1lc3NhZ2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY29ubl9iZmQgPSAmc3RhdGUtPmNvbm5fYmZkOwotCWlmIChjb25uX2JmZC0+ZmQgPD0gMCkgewotCQlMT0dQKERMMUlGLCBMT0dMX05PVElDRSwgIlBDVSBzb2NrZXQgbm90IGNvbm5lY3RlZCwgZHJvcHBpbmcgIgotCQkJIm1lc3NhZ2VcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JbXNnYl9lbnF1ZXVlKCZzdGF0ZS0+dXBxdWV1ZSwgbXNnKTsKLQljb25uX2JmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGN1X3NvY2tfY2xvc2Uoc3RydWN0IHBjdV9zb2NrX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3Qgb3Ntb19mZCAqYmZkID0gJnN0YXRlLT5jb25uX2JmZDsKLQlzdHJ1Y3QgZ3Byc19ybGNtYWNfYnRzICpidHMgPSBncHJzX3JsY21hY19idHM7Ci0Jc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOwotCXVpbnQ4X3QgdHJ4LCB0cywgdGZpOwotCi0JTE9HUChETDFJRiwgTE9HTF9OT1RJQ0UsICJQQ1Ugc29ja2V0IGhhcyBMT1NUIGNvbm5lY3Rpb25cbiIpOwotCi0JY2xvc2UoYmZkLT5mZCk7Ci0JYmZkLT5mZCA9IC0xOwotCW9zbW9fZmRfdW5yZWdpc3RlcihiZmQpOwotCi0JLyogZmx1c2ggdGhlIHF1ZXVlICovCi0Jd2hpbGUgKCFsbGlzdF9lbXB0eSgmc3RhdGUtPnVwcXVldWUpKSB7Ci0JCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2RlcXVldWUoJnN0YXRlLT51cHF1ZXVlKTsKLQkJbXNnYl9mcmVlKG1zZyk7Ci0JfQotCi0JLyogZGlzYWJsZSBhbGwgc2xvdHMsIGtpY2sgYWxsIFRCRnMgKi8KLQlmb3IgKHRyeCA9IDA7IHRyeCA8IDg7IHRyeCsrKSB7Ci0JCWZvciAodHMgPSAwOyB0cyA8IDg7IHRzKyspIHsKLQkJCWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlID0gMDsKLQkJCWZvciAodGZpID0gMDsgdGZpIDwgMzI7IHRmaSsrKSB7Ci0JCQkJdGJmID0gYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50YmZbdGZpXTsKLQkJCQlpZiAodGJmKQotCQkJCQl0YmZfZnJlZSh0YmYpOwotCQkJfQotCQl9Ci0JfQotCi0JZ3Byc19ic3NncF9kZXN0cm95KCk7Ci0KLQlzdGF0ZS0+dGltZXIuY2IgPSBwY3Vfc29ja190aW1lb3V0OwotCW9zbW9fdGltZXJfc2NoZWR1bGUoJnN0YXRlLT50aW1lciwgNSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGN1X3NvY2tfcmVhZChzdHJ1Y3Qgb3Ntb19mZCAqYmZkKQotewotCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdV9zb2NrX3N0YXRlICopYmZkLT5kYXRhOwotCXN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbTsKLQlzdHJ1Y3QgbXNnYiAqbXNnOwotCWludCByYzsKLQotCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKCpwY3VfcHJpbSksICJwY3Vfc29ja19yeCIpOwotCWlmICghbXNnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+dGFpbDsKLQotCXJjID0gcmVjdihiZmQtPmZkLCBtc2ctPnRhaWwsIG1zZ2JfdGFpbHJvb20obXNnKSwgMCk7Ci0JaWYgKHJjID09IDApCi0JCWdvdG8gY2xvc2U7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFQUdBSU4pCi0JCQlyZXR1cm4gMDsKLQkJZ290byBjbG9zZTsKLQl9Ci0KLQlyYyA9IHBjdV9yeChwY3VfcHJpbS0+bXNnX3R5cGUsIHBjdV9wcmltKTsKLQotCS8qIGFzIHdlIGFsd2F5cyBzeW5jaHJvbm91c2x5IHByb2Nlc3MgdGhlIG1lc3NhZ2UgaW4gcGN1X3J4KCkgYW5kCi0JICogaXRzIGNhbGxiYWNrcywgd2UgY2FuIGZyZWUgdGhlIG1lc3NhZ2UgaGVyZS4gKi8KLQltc2diX2ZyZWUobXNnKTsKLQotCXJldHVybiByYzsKLQotY2xvc2U6Ci0JbXNnYl9mcmVlKG1zZyk7Ci0JcGN1X3NvY2tfY2xvc2Uoc3RhdGUpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBwY3Vfc29ja193cml0ZShzdHJ1Y3Qgb3Ntb19mZCAqYmZkKQotewotCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdV9zb2NrX3N0YXRlICopYmZkLT5kYXRhOwotCWludCByYzsKLQotCXdoaWxlICghbGxpc3RfZW1wdHkoJnN0YXRlLT51cHF1ZXVlKSkgewotCQlzdHJ1Y3QgbXNnYiAqbXNnLCAqbXNnMjsKLQkJc3RydWN0IGdzbV9wY3VfaWYgKnBjdV9wcmltOwotCi0JCS8qIHBlZWsgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgKi8KLQkJbXNnID0gbGxpc3RfZW50cnkoc3RhdGUtPnVwcXVldWUubmV4dCwgc3RydWN0IG1zZ2IsIGxpc3QpOwotCQlwY3VfcHJpbSA9IChzdHJ1Y3QgZ3NtX3BjdV9pZiAqKW1zZy0+ZGF0YTsKLQotCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKLQotCQkvKiBidWcgaHVudGVyIDgtKTogbWF5YmUgc29tZW9uZSBmb3Jnb3QgbXNnYl9wdXQoLi4uKSA/ICovCi0JCWlmICghbXNnYl9sZW5ndGgobXNnKSkgewotCQkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIm1lc3NhZ2UgdHlwZSAoJWQpIHdpdGggWkVSTyAiCi0JCQkJImJ5dGVzIVxuIiwgcGN1X3ByaW0tPm1zZ190eXBlKTsKLQkJCWdvdG8gZG9udHNlbmQ7Ci0JCX0KLQotCQkvKiB0cnkgdG8gc2VuZCBpdCBvdmVyIHRoZSBzb2NrZXQgKi8KLQkJcmMgPSB3cml0ZShiZmQtPmZkLCBtc2diX2RhdGEobXNnKSwgbXNnYl9sZW5ndGgobXNnKSk7Ci0JCWlmIChyYyA9PSAwKQotCQkJZ290byBjbG9zZTsKLQkJaWYgKHJjIDwgMCkgewotCQkJaWYgKGVycm5vID09IEVBR0FJTikgewotCQkJCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIGNsb3NlOwotCQl9Ci0KLWRvbnRzZW5kOgotCQkvKiBfYWZ0ZXJfIHdlIHNlbmQgaXQsIHdlIGNhbiBkZXVldWUgKi8KLQkJbXNnMiA9IG1zZ2JfZGVxdWV1ZSgmc3RhdGUtPnVwcXVldWUpOwotCQlhc3NlcnQobXNnID09IG1zZzIpOwotCQltc2diX2ZyZWUobXNnKTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWNsb3NlOgotCXBjdV9zb2NrX2Nsb3NlKHN0YXRlKTsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBwY3Vfc29ja19jYihzdHJ1Y3Qgb3Ntb19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQotCQlyYyA9IHBjdV9zb2NrX3JlYWQoYmZkKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpCi0JCXJjID0gcGN1X3NvY2tfd3JpdGUoYmZkKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IHBjdV9sMWlmX29wZW4odm9pZCkKLXsKLQlzdHJ1Y3QgcGN1X3NvY2tfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBvc21vX2ZkICpiZmQ7Ci0Jc3RydWN0IHNvY2thZGRyX3VuIGxvY2FsOwotCXVuc2lnbmVkIGludCBuYW1lbGVuOwotCWludCByYzsKLQotCXN0YXRlID0gcGN1X3NvY2tfc3RhdGU7Ci0JaWYgKCFzdGF0ZSkgewotCQlzdGF0ZSA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBwY3Vfc29ja19zdGF0ZSk7Ci0JCWlmICghc3RhdGUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJSU5JVF9MTElTVF9IRUFEKCZzdGF0ZS0+dXBxdWV1ZSk7Ci0JfQotCi0JYmZkID0gJnN0YXRlLT5jb25uX2JmZDsKLQotCWJmZC0+ZmQgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TRVFQQUNLRVQsIDApOwotCWlmIChiZmQtPmZkIDwgMCkgewotCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBQQ1UtU1lTTU8gc29ja2V0LlxuIik7Ci0JCXRhbGxvY19mcmVlKHN0YXRlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWxvY2FsLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotCXN0cm5jcHkobG9jYWwuc3VuX3BhdGgsICIvdG1wL3BjdV9idHMiLCBzaXplb2YobG9jYWwuc3VuX3BhdGgpKTsKLQlsb2NhbC5zdW5fcGF0aFtzaXplb2YobG9jYWwuc3VuX3BhdGgpIC0gMV0gPSAnXDAnOwotCi0JLyogd2UgdXNlIHRoZSBzYW1lIG1hZ2ljIHRoYXQgWDExIHVzZXMgaW4gWHRyYW5zc29jay5jIGZvcgotCSAqIGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgbGVuZ3RoIG9mIHRoZSBzb2NrYWRkciAqLwotI2lmIGRlZmluZWQoQlNENDRTT0NLRVRTKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKLQlsb2NhbC5zdW5fbGVuID0gc3RybGVuKGxvY2FsLnN1bl9wYXRoKTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQlNENDRTT0NLRVRTKSB8fCBkZWZpbmVkKFNVTl9MRU4pCi0JbmFtZWxlbiA9IFNVTl9MRU4oJmxvY2FsKTsKLSNlbHNlCi0JbmFtZWxlbiA9IHN0cmxlbihsb2NhbC5zdW5fcGF0aCkgKwotCQkgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOwotI2VuZGlmCi0JcmMgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxvY2FsLCBuYW1lbGVuKTsKLQlpZiAocmMgIT0gMCkgewotCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIENvbm5lY3QgdGhlIFBDVS1TWVNNTyAiCi0JCQkic29ja2V0LCBkZWxheWluZy4uLiAnJXMnXG4iLCBsb2NhbC5zdW5fcGF0aCk7Ci0JCWNsb3NlKGJmZC0+ZmQpOwotCQliZmQtPmZkID0gLTE7Ci0JCXN0YXRlLT50aW1lci5jYiA9IHBjdV9zb2NrX3RpbWVvdXQ7Ci0JCW9zbW9fdGltZXJfc2NoZWR1bGUoJnN0YXRlLT50aW1lciwgNSwgMCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOwotCWJmZC0+Y2IgPSBwY3Vfc29ja19jYjsKLQliZmQtPmRhdGEgPSBzdGF0ZTsKLQotCXJjID0gb3Ntb19mZF9yZWdpc3RlcihiZmQpOwotCWlmIChyYyA8IDApIHsKLQkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWdpc3RlciBQQ1UgZmQ6ICVkXG4iLCByYyk7Ci0JCWNsb3NlKGJmZC0+ZmQpOwotCQl0YWxsb2NfZnJlZShzdGF0ZSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlMT0dQKERMMUlGLCBMT0dMX05PVElDRSwgIlBDVS1TWVNNTyBzb2NrZXQgaGFzIGJlZW4gY29ubmVjdGVkXG4iKTsKLQotCXBjdV9zb2NrX3N0YXRlID0gc3RhdGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBwY3VfbDFpZl9jbG9zZSh2b2lkKQotewotCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSBwY3Vfc29ja19zdGF0ZTsKLQlzdHJ1Y3Qgb3Ntb19mZCAqYmZkOwotCi0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuOwotCi0JaWYgKG9zbW9fdGltZXJfcGVuZGluZygmc3RhdGUtPnRpbWVyKSkKLQkJb3Ntb190aW1lcl9kZWwoJnN0YXRlLT50aW1lcik7Ci0KLQliZmQgPSAmc3RhdGUtPmNvbm5fYmZkOwotCWlmIChiZmQtPmZkID4gMCkKLQkJcGN1X3NvY2tfY2xvc2Uoc3RhdGUpOwotCXRhbGxvY19mcmVlKHN0YXRlKTsKLQlwY3Vfc29ja19zdGF0ZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjdV9zb2NrX3RpbWVvdXQodm9pZCAqX3ByaXYpCi17Ci0JcGN1X2wxaWZfb3BlbigpOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9zcmMvc3lzbW9fc29jay5jcHAgYi9zcmMvc3lzbW9fc29jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4M2NhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zeXNtb19zb2NrLmNwcApAQCAtMCwwICsxLDMwMyBAQAorLyogc3lzbW9fc29jay5jcHAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQW5kcmVhcyBFdmVyc2JlcmcgPGpvbGx5QGV2ZXJzYmVyZy5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPG9zbW9jb20vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29tL2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvbS9jb3JlL21zZ2IuaD4KK30KKworI2luY2x1ZGUgPGdwcnNfcmxjbWFjLmg+CisjaW5jbHVkZSA8cGN1X2wxX2lmLmg+CisjaW5jbHVkZSA8Z3Byc19kZWJ1Zy5oPgorI2luY2x1ZGUgPGdwcnNfYnNzZ3BfcGN1Lmg+CisjaW5jbHVkZSA8cGN1aWZfcHJvdG8uaD4KKworCisvKgorICogU1lTTU8tUENVIHNvY2tldCBmdW5jdGlvbnMKKyAqLworCitzdHJ1Y3QgcGN1X3NvY2tfc3RhdGUgeworCXN0cnVjdCBvc21vX2ZkIGNvbm5fYmZkOwkvKiBmZCBmb3IgY29ubmVjdGlvbiB0byBsY3IgKi8KKwlzdHJ1Y3Qgb3Ntb190aW1lcl9saXN0IHRpbWVyOwkvKiBzb2NrZXQgY29ubmVjdCByZXRyeSB0aW1lciAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CS8qIHF1ZXVlIGZvciBzZW5kaW5nIG1lc3NhZ2VzICovCit9ICpwY3Vfc29ja19zdGF0ZSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHBjdV9zb2NrX3RpbWVvdXQodm9pZCAqX3ByaXYpOworCitpbnQgcGN1X3NvY2tfc2VuZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSBwY3Vfc29ja19zdGF0ZTsKKwlzdHJ1Y3Qgb3Ntb19mZCAqY29ubl9iZmQ7CisKKwlpZiAoIXN0YXRlKSB7CisJCUxPR1AoREwxSUYsIExPR0xfTk9USUNFLCAiUENVIHNvY2tldCBub3QgY3JlYXRlZCwgZHJvcHBpbmcgIgorCQkJIm1lc3NhZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29ubl9iZmQgPSAmc3RhdGUtPmNvbm5fYmZkOworCWlmIChjb25uX2JmZC0+ZmQgPD0gMCkgeworCQlMT0dQKERMMUlGLCBMT0dMX05PVElDRSwgIlBDVSBzb2NrZXQgbm90IGNvbm5lY3RlZCwgZHJvcHBpbmcgIgorCQkJIm1lc3NhZ2VcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnYl9lbnF1ZXVlKCZzdGF0ZS0+dXBxdWV1ZSwgbXNnKTsKKwljb25uX2JmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGN1X3NvY2tfY2xvc2Uoc3RydWN0IHBjdV9zb2NrX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgb3Ntb19mZCAqYmZkID0gJnN0YXRlLT5jb25uX2JmZDsKKwlzdHJ1Y3QgZ3Byc19ybGNtYWNfYnRzICpidHMgPSBncHJzX3JsY21hY19idHM7CisJc3RydWN0IGdwcnNfcmxjbWFjX3RiZiAqdGJmOworCXVpbnQ4X3QgdHJ4LCB0cywgdGZpOworCisJTE9HUChETDFJRiwgTE9HTF9OT1RJQ0UsICJQQ1Ugc29ja2V0IGhhcyBMT1NUIGNvbm5lY3Rpb25cbiIpOworCisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCW9zbW9fZmRfdW5yZWdpc3RlcihiZmQpOworCisJLyogZmx1c2ggdGhlIHF1ZXVlICovCisJd2hpbGUgKCFsbGlzdF9lbXB0eSgmc3RhdGUtPnVwcXVldWUpKSB7CisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2RlcXVldWUoJnN0YXRlLT51cHF1ZXVlKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJLyogZGlzYWJsZSBhbGwgc2xvdHMsIGtpY2sgYWxsIFRCRnMgKi8KKwlmb3IgKHRyeCA9IDA7IHRyeCA8IDg7IHRyeCsrKSB7CisJCWZvciAodHMgPSAwOyB0cyA8IDg7IHRzKyspIHsKKwkJCWJ0cy0+dHJ4W3RyeF0ucGRjaFt0c10uZW5hYmxlID0gMDsKKwkJCWZvciAodGZpID0gMDsgdGZpIDwgMzI7IHRmaSsrKSB7CisJCQkJdGJmID0gYnRzLT50cnhbdHJ4XS5wZGNoW3RzXS50YmZbdGZpXTsKKwkJCQlpZiAodGJmKQorCQkJCQl0YmZfZnJlZSh0YmYpOworCQkJfQorCQl9CisJfQorCisJZ3Byc19ic3NncF9kZXN0cm95KCk7CisKKwlzdGF0ZS0+dGltZXIuY2IgPSBwY3Vfc29ja190aW1lb3V0OworCW9zbW9fdGltZXJfc2NoZWR1bGUoJnN0YXRlLT50aW1lciwgNSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcGN1X3NvY2tfcmVhZChzdHJ1Y3Qgb3Ntb19mZCAqYmZkKQoreworCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdV9zb2NrX3N0YXRlICopYmZkLT5kYXRhOworCXN0cnVjdCBnc21fcGN1X2lmICpwY3VfcHJpbTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYzsKKworCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKCpwY3VfcHJpbSksICJwY3Vfc29ja19yeCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjdV9wcmltID0gKHN0cnVjdCBnc21fcGN1X2lmICopIG1zZy0+dGFpbDsKKworCXJjID0gcmVjdihiZmQtPmZkLCBtc2ctPnRhaWwsIG1zZ2JfdGFpbHJvb20obXNnKSwgMCk7CisJaWYgKHJjID09IDApCisJCWdvdG8gY2xvc2U7CisKKwlpZiAocmMgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQlyZXR1cm4gMDsKKwkJZ290byBjbG9zZTsKKwl9CisKKwlyYyA9IHBjdV9yeChwY3VfcHJpbS0+bXNnX3R5cGUsIHBjdV9wcmltKTsKKworCS8qIGFzIHdlIGFsd2F5cyBzeW5jaHJvbm91c2x5IHByb2Nlc3MgdGhlIG1lc3NhZ2UgaW4gcGN1X3J4KCkgYW5kCisJICogaXRzIGNhbGxiYWNrcywgd2UgY2FuIGZyZWUgdGhlIG1lc3NhZ2UgaGVyZS4gKi8KKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByYzsKKworY2xvc2U6CisJbXNnYl9mcmVlKG1zZyk7CisJcGN1X3NvY2tfY2xvc2Uoc3RhdGUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwY3Vfc29ja193cml0ZShzdHJ1Y3Qgb3Ntb19mZCAqYmZkKQoreworCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBjdV9zb2NrX3N0YXRlICopYmZkLT5kYXRhOworCWludCByYzsKKworCXdoaWxlICghbGxpc3RfZW1wdHkoJnN0YXRlLT51cHF1ZXVlKSkgeworCQlzdHJ1Y3QgbXNnYiAqbXNnLCAqbXNnMjsKKwkJc3RydWN0IGdzbV9wY3VfaWYgKnBjdV9wcmltOworCisJCS8qIHBlZWsgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgKi8KKwkJbXNnID0gbGxpc3RfZW50cnkoc3RhdGUtPnVwcXVldWUubmV4dCwgc3RydWN0IG1zZ2IsIGxpc3QpOworCQlwY3VfcHJpbSA9IChzdHJ1Y3QgZ3NtX3BjdV9pZiAqKW1zZy0+ZGF0YTsKKworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCQkvKiBidWcgaHVudGVyIDgtKTogbWF5YmUgc29tZW9uZSBmb3Jnb3QgbXNnYl9wdXQoLi4uKSA/ICovCisJCWlmICghbXNnYl9sZW5ndGgobXNnKSkgeworCQkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIm1lc3NhZ2UgdHlwZSAoJWQpIHdpdGggWkVSTyAiCisJCQkJImJ5dGVzIVxuIiwgcGN1X3ByaW0tPm1zZ190eXBlKTsKKwkJCWdvdG8gZG9udHNlbmQ7CisJCX0KKworCQkvKiB0cnkgdG8gc2VuZCBpdCBvdmVyIHRoZSBzb2NrZXQgKi8KKwkJcmMgPSB3cml0ZShiZmQtPmZkLCBtc2diX2RhdGEobXNnKSwgbXNnYl9sZW5ndGgobXNnKSk7CisJCWlmIChyYyA9PSAwKQorCQkJZ290byBjbG9zZTsKKwkJaWYgKHJjIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVBR0FJTikgeworCQkJCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlnb3RvIGNsb3NlOworCQl9CisKK2RvbnRzZW5kOgorCQkvKiBfYWZ0ZXJfIHdlIHNlbmQgaXQsIHdlIGNhbiBkZXVldWUgKi8KKwkJbXNnMiA9IG1zZ2JfZGVxdWV1ZSgmc3RhdGUtPnVwcXVldWUpOworCQlhc3NlcnQobXNnID09IG1zZzIpOworCQltc2diX2ZyZWUobXNnKTsKKwl9CisJcmV0dXJuIDA7CisKK2Nsb3NlOgorCXBjdV9zb2NrX2Nsb3NlKHN0YXRlKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwY3Vfc29ja19jYihzdHJ1Y3Qgb3Ntb19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IHJjID0gMDsKKworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IHBjdV9zb2NrX3JlYWQoYmZkKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gcGN1X3NvY2tfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworaW50IHBjdV9sMWlmX29wZW4odm9pZCkKK3sKKwlzdHJ1Y3QgcGN1X3NvY2tfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBvc21vX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX3VuIGxvY2FsOworCXVuc2lnbmVkIGludCBuYW1lbGVuOworCWludCByYzsKKworCXN0YXRlID0gcGN1X3NvY2tfc3RhdGU7CisJaWYgKCFzdGF0ZSkgeworCQlzdGF0ZSA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBwY3Vfc29ja19zdGF0ZSk7CisJCWlmICghc3RhdGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJSU5JVF9MTElTVF9IRUFEKCZzdGF0ZS0+dXBxdWV1ZSk7CisJfQorCisJYmZkID0gJnN0YXRlLT5jb25uX2JmZDsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TRVFQQUNLRVQsIDApOworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBQQ1UtU1lTTU8gc29ja2V0LlxuIik7CisJCXRhbGxvY19mcmVlKHN0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxvY2FsLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCXN0cm5jcHkobG9jYWwuc3VuX3BhdGgsICIvdG1wL3BjdV9idHMiLCBzaXplb2YobG9jYWwuc3VuX3BhdGgpKTsKKwlsb2NhbC5zdW5fcGF0aFtzaXplb2YobG9jYWwuc3VuX3BhdGgpIC0gMV0gPSAnXDAnOworCisJLyogd2UgdXNlIHRoZSBzYW1lIG1hZ2ljIHRoYXQgWDExIHVzZXMgaW4gWHRyYW5zc29jay5jIGZvcgorCSAqIGNhbGN1bGF0aW5nIHRoZSBwcm9wZXIgbGVuZ3RoIG9mIHRoZSBzb2NrYWRkciAqLworI2lmIGRlZmluZWQoQlNENDRTT0NLRVRTKSB8fCBkZWZpbmVkKF9fVU5JWFdBUkVfXykKKwlsb2NhbC5zdW5fbGVuID0gc3RybGVuKGxvY2FsLnN1bl9wYXRoKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQlNENDRTT0NLRVRTKSB8fCBkZWZpbmVkKFNVTl9MRU4pCisJbmFtZWxlbiA9IFNVTl9MRU4oJmxvY2FsKTsKKyNlbHNlCisJbmFtZWxlbiA9IHN0cmxlbihsb2NhbC5zdW5fcGF0aCkgKworCQkgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOworI2VuZGlmCisJcmMgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxvY2FsLCBuYW1lbGVuKTsKKwlpZiAocmMgIT0gMCkgeworCQlMT0dQKERMMUlGLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIENvbm5lY3QgdGhlIFBDVS1TWVNNTyAiCisJCQkic29ja2V0LCBkZWxheWluZy4uLiAnJXMnXG4iLCBsb2NhbC5zdW5fcGF0aCk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQliZmQtPmZkID0gLTE7CisJCXN0YXRlLT50aW1lci5jYiA9IHBjdV9zb2NrX3RpbWVvdXQ7CisJCW9zbW9fdGltZXJfc2NoZWR1bGUoJnN0YXRlLT50aW1lciwgNSwgMCk7CisJCXJldHVybiAwOworCX0KKworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCWJmZC0+Y2IgPSBwY3Vfc29ja19jYjsKKwliZmQtPmRhdGEgPSBzdGF0ZTsKKworCXJjID0gb3Ntb19mZF9yZWdpc3RlcihiZmQpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETDFJRiwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWdpc3RlciBQQ1UgZmQ6ICVkXG4iLCByYyk7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShzdGF0ZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlMT0dQKERMMUlGLCBMT0dMX05PVElDRSwgIlBDVS1TWVNNTyBzb2NrZXQgaGFzIGJlZW4gY29ubmVjdGVkXG4iKTsKKworCXBjdV9zb2NrX3N0YXRlID0gc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwY3VfbDFpZl9jbG9zZSh2b2lkKQoreworCXN0cnVjdCBwY3Vfc29ja19zdGF0ZSAqc3RhdGUgPSBwY3Vfc29ja19zdGF0ZTsKKwlzdHJ1Y3Qgb3Ntb19mZCAqYmZkOworCisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuOworCisJaWYgKG9zbW9fdGltZXJfcGVuZGluZygmc3RhdGUtPnRpbWVyKSkKKwkJb3Ntb190aW1lcl9kZWwoJnN0YXRlLT50aW1lcik7CisKKwliZmQgPSAmc3RhdGUtPmNvbm5fYmZkOworCWlmIChiZmQtPmZkID4gMCkKKwkJcGN1X3NvY2tfY2xvc2Uoc3RhdGUpOworCXRhbGxvY19mcmVlKHN0YXRlKTsKKwlwY3Vfc29ja19zdGF0ZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBjdV9zb2NrX3RpbWVvdXQodm9pZCAqX3ByaXYpCit7CisJcGN1X2wxaWZfb3BlbigpOworfQo=