LyoKICAgIERyaXZlciBmb3IgU1QgU1RWMDI5OSBkZW1vZHVsYXRvcgoKICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIENvbnZlcmdlbmNlIEludGVncmF0ZWQgTWVkaWEgR21iSAoJPHJhbHBoQGNvbnZlcmdlbmNlLmRlPiwKCTxob2xnZXJAY29udmVyZ2VuY2UuZGU+LAoJPGpzQGNvbnZlcmdlbmNlLmRlPgoKCiAgICBQaGlsaXBzIFNVMTI3OC9TSAoKICAgIENvcHlyaWdodCAoQykgMjAwMiBieSBQZXRlciBTY2hpbGRtYW5uIDxwZXRlci5zY2hpbGRtYW5uQHdlYi5kZT4KCgogICAgTEcgVERRRi1TMDAxRgoKICAgIENvcHlyaWdodCAoQykgMjAwMiBGZWxpeCBEb21rZSA8dG1iaW5jQGVsaXRlZHZiLm5ldD4KCQkgICAgICYgQW5kcmVhcyBPYmVycml0dGVyIDxvYmlAbGludXh0di5vcmc+CgoKICAgIFN1cHBvcnQgZm9yIFNhbXN1bmcgVEJNVTI0MTEySU1CIHVzZWQgb24gVGVjaG5pc2F0IFNreVN0YXIyIHJldi4gMi42QgoKICAgIENvcHlyaWdodCAoQykgMjAwMyBWYWRpbSBDYXRhbmEgPHNreXN0YXJAbW9sZG92YS5jYz46CgogICAgU3VwcG9ydCBmb3IgUGhpbGlwcyBTVTEyNzggb24gVGVjaG5vdHJlbmQgaGFyZHdhcmUKCiAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW5kcmV3IGRlIFF1aW5jZXkgPGFkcV9kdmJAbGlkc2tpYWxmLm5ldD4KCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KCiovCgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgoKI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgojaW5jbHVkZSAic3R2MDI5OS5oIgoKc3RydWN0IHN0djAyOTlfc3RhdGUgewoJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CglzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Cgljb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZzsKCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CgoJdTggaW5pdGlhbGlzZWQ6MTsKCXUzMiB0dW5lcl9mcmVxdWVuY3k7Cgl1MzIgc3ltYm9sX3JhdGU7CglmZV9jb2RlX3JhdGVfdCBmZWNfaW5uZXI7CglpbnQgZXJybW9kZTsKfTsKCiNkZWZpbmUgU1RBVFVTX0JFUiAwCiNkZWZpbmUgU1RBVFVTX1VDQkxPQ0tTIDEKCnN0YXRpYyBpbnQgZGVidWc7CnN0YXRpYyBpbnQgZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoOwojZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAoJZG8geyBcCgkJaWYgKGRlYnVnKSBwcmludGsoS0VSTl9ERUJVRyAic3R2MDI5OTogIiBhcmdzKTsgXAoJfSB3aGlsZSAoMCkKCgpzdGF0aWMgaW50IHN0djAyOTlfd3JpdGVyZWdJIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIHU4IHJlZywgdTggZGF0YSkKewoJaW50IHJldDsKCXU4IGJ1ZiBbXSA9IHsgcmVnLCBkYXRhIH07CglzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKCglyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpOwoKCWlmIChyZXQgIT0gMSkKCQlkcHJpbnRrKCIlczogd3JpdGVyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHZhbCA9PSAweCUwMngsICIKCQkJInJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCBkYXRhLCByZXQpOwoKCXJldHVybiAocmV0ICE9IDEpID8gLUVSRU1PVEVJTyA6IDA7Cn0KCmludCBzdHYwMjk5X3dyaXRlcmVnIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTggcmVnLCB1OCBkYXRhKQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CgoJcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCByZWcsIGRhdGEpOwp9CgpzdGF0aWMgdTggc3R2MDI5OV9yZWFkcmVnIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIHU4IHJlZykKewoJaW50IHJldDsKCXU4IGIwIFtdID0geyByZWcgfTsKCXU4IGIxIFtdID0geyAwIH07CglzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH0sCgkJCSAgIHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9IH07CgoJcmV0ID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCBtc2csIDIpOwoKCWlmIChyZXQgIT0gMikKCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwKCQkJCV9fRlVOQ1RJT05fXywgcmVnLCByZXQpOwoKCXJldHVybiBiMVswXTsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRyZWdzIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIHU4IHJlZzEsIHU4ICpiLCB1OCBsZW4pCnsKCWludCByZXQ7CglzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gJnJlZzEsIC5sZW4gPSAxIH0sCgkJCSAgIHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIsIC5sZW4gPSBsZW4gfSB9OwoKCXJldCA9IGkyY190cmFuc2ZlciAoc3RhdGUtPmkyYywgbXNnLCAyKTsKCglpZiAocmV0ICE9IDIpCgkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKCglyZXR1cm4gcmV0ID09IDIgPyAwIDogcmV0Owp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2V0X0ZFQyAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlLCBmZV9jb2RlX3JhdGVfdCBmZWMpCnsKCWRwcmludGsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKCglzd2l0Y2ggKGZlYykgewoJY2FzZSBGRUNfQVVUTzoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDFmKTsKCX0KCWNhc2UgRkVDXzFfMjoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDAxKTsKCX0KCWNhc2UgRkVDXzJfMzoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDAyKTsKCX0KCWNhc2UgRkVDXzNfNDoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDA0KTsKCX0KCWNhc2UgRkVDXzVfNjoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDA4KTsKCX0KCWNhc2UgRkVDXzdfODoKCXsKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDMxLCAweDEwKTsKCX0KCWRlZmF1bHQ6Cgl7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiAgICB9Cn0KCnN0YXRpYyBmZV9jb2RlX3JhdGVfdCBzdHYwMjk5X2dldF9mZWMgKHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSkKewoJc3RhdGljIGZlX2NvZGVfcmF0ZV90IGZlY190YWIgW10gPSB7IEZFQ18yXzMsIEZFQ18zXzQsIEZFQ181XzYsCgkJCQkJICAgICBGRUNfN184LCBGRUNfMV8yIH07Cgl1OCBpbmRleDsKCglkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CgoJaW5kZXggPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFiKTsKCWluZGV4ICY9IDB4NzsKCglpZiAoaW5kZXggPiA0KQoJCXJldHVybiBGRUNfQVVUTzsKCglyZXR1cm4gZmVjX3RhYiBbaW5kZXhdOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfd2FpdF9kaXNlcWNfZmlmbyAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlLCBpbnQgdGltZW91dCkKewoJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXdoaWxlIChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGEpICYgMSkgewoJCWlmIChqaWZmaWVzIC0gc3RhcnQgPiB0aW1lb3V0KSB7CgkJCWRwcmludGsgKCIlczogdGltZW91dCEhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQlyZXR1cm4gLUVUSU1FRE9VVDsKCQl9CgkJbXNsZWVwKDEwKTsKCX07CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUsIGludCB0aW1lb3V0KQp7Cgl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKCglkcHJpbnRrICgiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CgoJd2hpbGUgKChzdHYwMjk5X3JlYWRyZWcoc3RhdGUsIDB4MGEpICYgMykgIT0gMiApIHsKCQlpZiAoamlmZmllcyAtIHN0YXJ0ID4gdGltZW91dCkgewoJCQlkcHJpbnRrICgiJXM6IHRpbWVvdXQhIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJcmV0dXJuIC1FVElNRURPVVQ7CgkJfQoJCW1zbGVlcCgxMCk7Cgl9OwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2V0X3N5bWJvbHJhdGUgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgc3JhdGUpCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCXU2NCBiaWcgPSBzcmF0ZTsKCXUzMiByYXRpbzsKCgkvLyBjaGVjayByYXRlIGlzIHdpdGhpbiBsaW1pdHMKCWlmICgoc3JhdGUgPCAxMDAwMDAwKSB8fCAoc3JhdGUgPiA0NTAwMDAwMCkpIHJldHVybiAtRUlOVkFMOwoKCS8vIGNhbGN1bGF0ZSB2YWx1ZSB0byBwcm9ncmFtCgliaWcgPSBiaWcgPDwgMjA7CgliaWcgKz0gKHN0YXRlLT5jb25maWctPm1jbGstMSk7IC8vIHJvdW5kIGNvcnJlY3RseQoJZG9fZGl2KGJpZywgc3RhdGUtPmNvbmZpZy0+bWNsayk7CglyYXRpbyA9IGJpZyA8PCA0OwoKCXJldHVybiBzdGF0ZS0+Y29uZmlnLT5zZXRfc3ltYm9sX3JhdGUoZmUsIHNyYXRlLCByYXRpbyk7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9nZXRfc3ltYm9scmF0ZSAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlKQp7Cgl1MzIgTWNsayA9IHN0YXRlLT5jb25maWctPm1jbGsgLyA0MDk2TDsKCXUzMiBzcmF0ZTsKCXMzMiBvZmZzZXQ7Cgl1OCBzZnJbM107CglzOCBydGY7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXN0djAyOTlfcmVhZHJlZ3MgKHN0YXRlLCAweDFmLCBzZnIsIDMpOwoJc3R2MDI5OV9yZWFkcmVncyAoc3RhdGUsIDB4MWEsICZydGYsIDEpOwoKCXNyYXRlID0gKHNmclswXSA8PCA4KSB8IHNmclsxXTsKCXNyYXRlICo9IE1jbGs7CglzcmF0ZSAvPSAxNjsKCXNyYXRlICs9IChzZnJbMl0gPj4gNCkgKiBNY2xrIC8gMjU2OwoJb2Zmc2V0ID0gKHMzMikgcnRmICogKHNyYXRlIC8gNDA5NkwpOwoJb2Zmc2V0IC89IDEyODsKCglkcHJpbnRrICgiJXMgOiBzcmF0ZSA9ICVpXG4iLCBfX0ZVTkNUSU9OX18sIHNyYXRlKTsKCWRwcmludGsgKCIlcyA6IG9mc2V0ID0gJWlcbiIsIF9fRlVOQ1RJT05fXywgb2Zmc2V0KTsKCglzcmF0ZSArPSBvZmZzZXQ7CgoJc3JhdGUgKz0gMTAwMDsKCXNyYXRlIC89IDIwMDA7CglzcmF0ZSAqPSAyMDAwOwoKCXJldHVybiBzcmF0ZTsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCgkJCQkgICAgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqbSkKewogICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJdTggdmFsOwoJaW50IGk7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCWlmIChzdHYwMjk5X3dhaXRfZGlzZXFjX2lkbGUgKHN0YXRlLCAxMDApIDwgMCkKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCgl2YWwgPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDA4KTsKCglpZiAoc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAodmFsICYgfjB4NykgfCAweDYpKSAgLyogRGlTRXFDIG1vZGUgKi8KCQlyZXR1cm4gLUVSRU1PVEVJTzsKCglmb3IgKGk9MDsgaTxtLT5tc2dfbGVuOyBpKyspIHsKCQlpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19maWZvIChzdGF0ZSwgMTAwKSA8IDApCgkJCXJldHVybiAtRVRJTUVET1VUOwoKCQlpZiAoc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA5LCBtLT5tc2dbaV0pKQoJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCX0KCglpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdGF0ZSwgMTAwKSA8IDApCgkJcmV0dXJuIC1FVElNRURPVVQ7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9zZW5kX2Rpc2VxY19idXJzdCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IGJ1cnN0KQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Cgl1OCB2YWw7CgoJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwoKCWlmIChzdHYwMjk5X3dhaXRfZGlzZXFjX2lkbGUgKHN0YXRlLCAxMDApIDwgMCkKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCgl2YWwgPSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDA4KTsKCglpZiAoc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAodmFsICYgfjB4NykgfCAweDIpKQkvKiBidXJzdCBtb2RlICovCgkJcmV0dXJuIC1FUkVNT1RFSU87CgoJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOSwgYnVyc3QgPT0gU0VDX01JTklfQSA/IDB4MDAgOiAweGZmKSkKCQlyZXR1cm4gLUVSRU1PVEVJTzsKCglpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdGF0ZSwgMTAwKSA8IDApCgkJcmV0dXJuIC1FVElNRURPVVQ7CgoJaWYgKHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgdmFsKSkKCQlyZXR1cm4gLUVSRU1PVEVJTzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCXU4IHZhbDsKCglpZiAoc3R2MDI5OV93YWl0X2Rpc2VxY19pZGxlIChzdGF0ZSwgMTAwKSA8IDApCgkJcmV0dXJuIC1FVElNRURPVVQ7CgoJdmFsID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwOCk7CgoJc3dpdGNoICh0b25lKSB7CgljYXNlIFNFQ19UT05FX09OOgoJCXJldHVybiBzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MDgsIHZhbCB8IDB4Myk7CgoJY2FzZSBTRUNfVE9ORV9PRkY6CgkJcmV0dXJuIHN0djAyOTlfd3JpdGVyZWdJIChzdGF0ZSwgMHgwOCwgKHZhbCAmIH4weDMpIHwgMHgwMik7CgoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKc3RhdGljIGludCBzdHYwMjk5X3NldF92b2x0YWdlIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Cgl1OCByZWcweDA4OwoJdTggcmVnMHgwYzsKCglkcHJpbnRrKCIlczogJXNcbiIsIF9fRlVOQ1RJT05fXywKCQl2b2x0YWdlID09IFNFQ19WT0xUQUdFXzEzID8gIlNFQ19WT0xUQUdFXzEzIiA6CgkJdm9sdGFnZSA9PSBTRUNfVk9MVEFHRV8xOCA/ICJTRUNfVk9MVEFHRV8xOCIgOiAiPz8iKTsKCglyZWcweDA4ID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwOCk7CglyZWcweDBjID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgwYyk7CgoJLyoqCgkgKiAgSC9WIHN3aXRjaGluZyBvdmVyIE9QMCwgT1AxIGFuZCBPUDIgYXJlIExOQiBwb3dlciBlbmFibGUgYml0cwoJICovCglyZWcweDBjICY9IDB4MGY7CgoJaWYgKHZvbHRhZ2UgPT0gU0VDX1ZPTFRBR0VfT0ZGKSB7CgkJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDBjLCAweDAwKTsgLyoJTE5CIHBvd2VyIG9mZiEgKi8KCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAweDAwKTsgLyoJTE5CIHBvd2VyIG9mZiEgKi8KCX0KCglzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MDgsIChyZWcweDA4ICYgMHgzZikgfCAoc3RhdGUtPmNvbmZpZy0+bG9ja19vdXRwdXQgPDwgNikpOwoKCXN3aXRjaCAodm9sdGFnZSkgewoJY2FzZSBTRUNfVk9MVEFHRV8xMzoKCQlpZiAoc3RhdGUtPmNvbmZpZy0+dm9sdDEzX29wMF9vcDEgPT0gU1RWMDI5OV9WT0xUMTNfT1AwKSByZWcweDBjIHw9IDB4MTA7CgkJZWxzZSByZWcweDBjIHw9IDB4NDA7CgoJCXJldHVybiBzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwYywgcmVnMHgwYyk7CgoJY2FzZSBTRUNfVk9MVEFHRV8xODoKCQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MGMsIHJlZzB4MGMgfCAweDUwKTsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Owp9CgpzdGF0aWMgaW50IHN0djAyOTlfc2VuZF9sZWdhY3lfZGlzaF9jbWQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgY21kKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCXU4IHJlZzB4MDg7Cgl1OCByZWcweDBjOwoJdTggbHZfbWFzayA9IDB4NDA7Cgl1OCBsYXN0ID0gMTsKCWludCBpOwoJc3RydWN0IHRpbWV2YWwgbmV4dHRpbWU7CglzdHJ1Y3QgdGltZXZhbCB0dlsxMF07CgoJcmVnMHgwOCA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MDgpOwoJcmVnMHgwYyA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MGMpOwoJcmVnMHgwYyAmPSAweDBmOwoJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDA4LCAocmVnMHgwOCAmIDB4M2YpIHwgKHN0YXRlLT5jb25maWctPmxvY2tfb3V0cHV0IDw8IDYpKTsKCWlmIChzdGF0ZS0+Y29uZmlnLT52b2x0MTNfb3AwX29wMSA9PSBTVFYwMjk5X1ZPTFQxM19PUDApCgkJbHZfbWFzayA9IDB4MTA7CgoJY21kID0gY21kIDw8IDE7CglpZiAoZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoKQoJCXByaW50ayAoIiVzIHN3aXRjaCBjb21tYW5kOiAweCUwNHhcbiIsX19GVU5DVElPTl9fLCBjbWQpOwoKCWRvX2dldHRpbWVvZmRheSAoJm5leHR0aW1lKTsKCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCgkJbWVtY3B5ICgmdHZbMF0sICZuZXh0dGltZSwgc2l6ZW9mIChzdHJ1Y3QgdGltZXZhbCkpOwoJc3R2MDI5OV93cml0ZXJlZ0kgKHN0YXRlLCAweDBjLCByZWcweDBjIHwgMHg1MCk7IC8qIHNldCBMTkIgdG8gMThWICovCgoJZHZiX2Zyb250ZW5kX3NsZWVwX3VudGlsKCZuZXh0dGltZSwgMzIwMDApOwoKCWZvciAoaT0wOyBpPDk7IGkrKykgewoJCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpCgkJCWRvX2dldHRpbWVvZmRheSAoJnR2W2krMV0pOwoJCWlmKChjbWQgJiAweDAxKSAhPSBsYXN0KSB7CgkJCS8qIHNldCB2b2x0YWdlIHRvIChsYXN0ID8gMTNWIDogMThWKSAqLwoJCQlzdHYwMjk5X3dyaXRlcmVnSSAoc3RhdGUsIDB4MGMsIHJlZzB4MGMgfCAobGFzdCA/IGx2X21hc2sgOiAweDUwKSk7CgkJCWxhc3QgPSAobGFzdCkgPyAwIDogMTsKCQl9CgoJCWNtZCA9IGNtZCA+PiAxOwoKCQlpZiAoaSAhPSA4KQoJCQlkdmJfZnJvbnRlbmRfc2xlZXBfdW50aWwoJm5leHR0aW1lLCA4MDAwKTsKCX0KCWlmIChkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gpIHsKCQlwcmludGsgKCIlcyglZCk6IHN3aXRjaCBkZWxheSAoc2hvdWxkIGJlIDMyayBmb2xsb3dlZCBieSBhbGwgOGtcbiIsCgkJCV9fRlVOQ1RJT05fXywgZmUtPmR2Yi0+bnVtKTsKCQlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKCQkJcHJpbnRrICgiJWQ6ICVkXG4iLCBpLCB0aW1ldmFsX3VzZWNfZGlmZih0dltpLTFdICwgdHZbaV0pKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X2luaXQgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CglpbnQgaTsKCglkcHJpbnRrKCJzdHYwMjk5OiBpbml0IGNoaXBcbiIpOwoKCWZvciAoaT0wOyAhKHN0YXRlLT5jb25maWctPmluaXR0YWJbaV0gPT0gMHhmZiAmJiBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2krMV0gPT0gMHhmZik7IGkrPTIpCgkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIHN0YXRlLT5jb25maWctPmluaXR0YWJbaV0sIHN0YXRlLT5jb25maWctPmluaXR0YWJbaSsxXSk7CgoJaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7CgkJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwoJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlLCBzdGF0ZS0+aTJjKTsKCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHgzNSk7CS8qICBkaXNhYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHN0djAyOTlfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCgl1OCBzaWduYWwgPSAweGZmIC0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxOCk7Cgl1OCBzeW5jID0gc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxYik7CgoJZHByaW50ayAoIiVzIDogRkVfUkVBRF9TVEFUVVMgOiBWU1RBVFVTOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgc3luYyk7Cgkqc3RhdHVzID0gMDsKCglpZiAoc2lnbmFsID4gMTApCgkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOwoKCWlmIChzeW5jICYgMHg4MCkKCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOwoKCWlmIChzeW5jICYgMHgxMCkKCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOwoKCWlmIChzeW5jICYgMHgwOCkKCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOwoKCWlmICgoc3luYyAmIDB4OTgpID09IDB4OTgpCgkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKewogICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoKCWlmIChzdGF0ZS0+ZXJybW9kZSAhPSBTVEFUVVNfQkVSKSByZXR1cm4gMDsKCSpiZXIgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CgoJczMyIHNpZ25hbCA9ICAweGZmZmYgLSAoKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTgpIDw8IDgpCgkJCSAgICAgICB8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTkpKTsKCglkcHJpbnRrICgiJXMgOiBGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCA6IEFHQzJJOiAweCUwMnglMDJ4LCBzaWduYWw9MHglMDR4XG4iLCBfX0ZVTkNUSU9OX18sCgkJIHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MTgpLAoJCSBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDE5KSwgKGludCkgc2lnbmFsKTsKCglzaWduYWwgPSBzaWduYWwgKiA1IC8gNDsKCSpzdHJlbmd0aCA9IChzaWduYWwgPiAweGZmZmYpID8gMHhmZmZmIDogKHNpZ25hbCA8IDApID8gMCA6IHNpZ25hbDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHNucikKewogICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoKCXMzMiB4c25yID0gMHhmZmZmIC0gKChzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDI0KSA8PCA4KQoJCQkgICB8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MjUpKTsKCXhzbnIgPSAzICogKHhzbnIgLSAweGExMDApOwoJKnNuciA9ICh4c25yID4gMHhmZmZmKSA/IDB4ZmZmZiA6ICh4c25yIDwgMCkgPyAwIDogeHNucjsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglpZiAoc3RhdGUtPmVycm1vZGUgIT0gU1RBVFVTX1VDQkxPQ0tTKSAqdWNibG9ja3MgPSAwOwoJZWxzZSAqdWNibG9ja3MgPSAoc3R2MDI5OV9yZWFkcmVnIChzdGF0ZSwgMHgxZCkgPDwgOCkgfCBzdHYwMjk5X3JlYWRyZWcgKHN0YXRlLCAweDFlKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICogcCkKewogICAgICAgIHN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwoJaW50IGludnZhbCA9IDA7CgoJZHByaW50ayAoIiVzIDogRkVfU0VUX0ZST05URU5EXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8vIHNldCB0aGUgaW52ZXJzaW9uCglpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PRkYpIGludnZhbCA9IDA7CgllbHNlIGlmIChwLT5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09OKSBpbnZ2YWwgPSAxOwoJZWxzZSB7CgkJcHJpbnRrKCJzdHYwMjk5IGRvZXMgbm90IHN1cHBvcnQgYXV0by1pbnZlcnNpb25cbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJaWYgKHN0YXRlLT5jb25maWctPmludmVydCkgaW52dmFsID0gKH5pbnZ2YWwpICYgMTsKCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDBjLCAoc3R2MDI5OV9yZWFkcmVnKHN0YXRlLCAweDBjKSAmIDB4ZmUpIHwgaW52dmFsKTsKCglzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCglzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBzdGF0ZS0+aTJjLCBwKTsKCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweDM1KTsJLyogIGRpc2FibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCgoJc3R2MDI5OV9zZXRfRkVDIChzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CglzdHYwMjk5X3NldF9zeW1ib2xyYXRlIChmZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDIyLCAweDAwKTsKCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDIzLCAweDAwKTsKCglzdGF0ZS0+dHVuZXJfZnJlcXVlbmN5ID0gcC0+ZnJlcXVlbmN5OwoJc3RhdGUtPmZlY19pbm5lciA9IHAtPnUucXBzay5mZWNfaW5uZXI7CglzdGF0ZS0+c3ltYm9sX3JhdGUgPSBwLT51LnFwc2suc3ltYm9sX3JhdGU7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc3R2MDI5OV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqIHApCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCXMzMiBkZXJvdF9mcmVxOwoJaW50IGludnZhbDsKCglkZXJvdF9mcmVxID0gKHMzMikoczE2KSAoKHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MjIpIDw8IDgpCgkJCQl8IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MjMpKTsKCglkZXJvdF9mcmVxICo9IChzdGF0ZS0+Y29uZmlnLT5tY2xrID4+IDE2KTsKCWRlcm90X2ZyZXEgKz0gNTAwOwoJZGVyb3RfZnJlcSAvPSAxMDAwOwoKCXAtPmZyZXF1ZW5jeSArPSBkZXJvdF9mcmVxOwoKCWludnZhbCA9IHN0djAyOTlfcmVhZHJlZyAoc3RhdGUsIDB4MGMpICYgMTsKCWlmIChzdGF0ZS0+Y29uZmlnLT5pbnZlcnQpIGludnZhbCA9ICh+aW52dmFsKSAmIDE7CglwLT5pbnZlcnNpb24gPSBpbnZ2YWwgPyBJTlZFUlNJT05fT04gOiBJTlZFUlNJT05fT0ZGOwoKCXAtPnUucXBzay5mZWNfaW5uZXIgPSBzdHYwMjk5X2dldF9mZWMgKHN0YXRlKTsKCXAtPnUucXBzay5zeW1ib2xfcmF0ZSA9IHN0djAyOTlfZ2V0X3N5bWJvbHJhdGUgKHN0YXRlKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQp7CiAgICAgICAgc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CgoJc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDIsIDB4ODApOwoJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzdHYwMjk5X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCnsKICAgICAgICBzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCglmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSBzdGF0ZS0+Y29uZmlnLT5taW5fZGVsYXlfbXM7CglpZiAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgPCAxMDAwMDAwMCkgewoJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlIC8gMzIwMDA7CgkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gNTAwMDsKCX0gZWxzZSB7CgkJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyAxNjAwMDsKCQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSBmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSAvIDIwMDA7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgc3R2MDI5OV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQp7CglzdHJ1Y3Qgc3R2MDI5OV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKCWtmcmVlKHN0YXRlKTsKfQoKc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHN0djAyOTlfb3BzOwoKc3RydWN0IGR2Yl9mcm9udGVuZCogc3R2MDI5OV9hdHRhY2goY29uc3Qgc3RydWN0IHN0djAyOTlfY29uZmlnKiBjb25maWcsCgkJCQkgICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpCnsKCXN0cnVjdCBzdHYwMjk5X3N0YXRlKiBzdGF0ZSA9IE5VTEw7CglpbnQgaWQ7CgoJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0djAyOTlfc3RhdGUpLCBHRlBfS0VSTkVMKTsKCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwoKCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwoJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKCXN0YXRlLT5pMmMgPSBpMmM7CgltZW1jcHkoJnN0YXRlLT5vcHMsICZzdHYwMjk5X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CglzdGF0ZS0+aW5pdGlhbGlzZWQgPSAwOwoJc3RhdGUtPnR1bmVyX2ZyZXF1ZW5jeSA9IDA7CglzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOwoJc3RhdGUtPmZlY19pbm5lciA9IDA7CglzdGF0ZS0+ZXJybW9kZSA9IFNUQVRVU19CRVI7CgoJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCglzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwMiwgMHgzNCk7IC8qIHN0YW5kYnkgb2ZmICovCgltc2xlZXAoMjAwKTsKCWlkID0gc3R2MDI5OV9yZWFkcmVnKHN0YXRlLCAweDAwKTsKCgkvKiByZWdpc3RlciAweDAwIGNvbnRhaW5zIDB4YTEgZm9yIFNUVjAyOTkgYW5kIFNUVjAyOTlCICovCgkvKiByZWdpc3RlciAweDAwIG1pZ2h0IGNvbnRhaW4gMHg4MCB3aGVuIHJldHVybmluZyBmcm9tIHN0YW5kYnkgKi8KCWlmIChpZCAhPSAweGExICYmIGlkICE9IDB4ODApIGdvdG8gZXJyb3I7CgoJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwoJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwogICAgICAgIHN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CglyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKCmVycm9yOgoJa2ZyZWUoc3RhdGUpOwoJcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBzdHYwMjk5X29wcyA9IHsKCgkuaW5mbyA9IHsKCQkubmFtZQkJCT0gIlNUIFNUVjAyOTkgRFZCLVMiLAoJCS50eXBlCQkJPSBGRV9RUFNLLAoJCS5mcmVxdWVuY3lfbWluCQk9IDk1MDAwMCwKCQkuZnJlcXVlbmN5X21heAkJPSAyMTUwMDAwLAoJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxMjUsCSAvKiBrSHogZm9yIFFQU0sgZnJvbnRlbmRzICovCgkJLmZyZXF1ZW5jeV90b2xlcmFuY2UJPSAwLAoJCS5zeW1ib2xfcmF0ZV9taW4JPSAxMDAwMDAwLAoJCS5zeW1ib2xfcmF0ZV9tYXgJPSA0NTAwMDAwMCwKCQkuc3ltYm9sX3JhdGVfdG9sZXJhbmNlCT0gNTAwLAkvKiBwcG0gKi8KCQkuY2FwcyA9IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8CgkJICAgICAgRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzdfOCB8CgkJICAgICAgRkVfQ0FOX1FQU0sgfAoJCSAgICAgIEZFX0NBTl9GRUNfQVVUTwoJfSwKCgkucmVsZWFzZSA9IHN0djAyOTlfcmVsZWFzZSwKCgkuaW5pdCA9IHN0djAyOTlfaW5pdCwKCS5zbGVlcCA9IHN0djAyOTlfc2xlZXAsCgoJLnNldF9mcm9udGVuZCA9IHN0djAyOTlfc2V0X2Zyb250ZW5kLAoJLmdldF9mcm9udGVuZCA9IHN0djAyOTlfZ2V0X2Zyb250ZW5kLAoJLmdldF90dW5lX3NldHRpbmdzID0gc3R2MDI5OV9nZXRfdHVuZV9zZXR0aW5ncywKCgkucmVhZF9zdGF0dXMgPSBzdHYwMjk5X3JlYWRfc3RhdHVzLAoJLnJlYWRfYmVyID0gc3R2MDI5OV9yZWFkX2JlciwKCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IHN0djAyOTlfcmVhZF9zaWduYWxfc3RyZW5ndGgsCgkucmVhZF9zbnIgPSBzdHYwMjk5X3JlYWRfc25yLAoJLnJlYWRfdWNibG9ja3MgPSBzdHYwMjk5X3JlYWRfdWNibG9ja3MsCgoJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBzdHYwMjk5X3NlbmRfZGlzZXFjX21zZywKCS5kaXNlcWNfc2VuZF9idXJzdCA9IHN0djAyOTlfc2VuZF9kaXNlcWNfYnVyc3QsCgkuc2V0X3RvbmUgPSBzdHYwMjk5X3NldF90b25lLAoJLnNldF92b2x0YWdlID0gc3R2MDI5OV9zZXRfdm9sdGFnZSwKCS5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kID0gc3R2MDI5OV9zZW5kX2xlZ2FjeV9kaXNoX2NtZCwKfTsKCm1vZHVsZV9wYXJhbShkZWJ1Z19sZWdhY3lfZGlzaF9zd2l0Y2gsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGVidWdfbGVnYWN5X2Rpc2hfc3dpdGNoLCAiRW5hYmxlIHRpbWluZyBhbmFseXNpcyBmb3IgRGlzaCBOZXR3b3JrIGxlZ2FjeSBzd2l0Y2hlcyIpOwoKbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiVHVybiBvbi9vZmYgZnJvbnRlbmQgZGVidWdnaW5nIChkZWZhdWx0Om9mZikuIik7CgpNT0RVTEVfREVTQ1JJUFRJT04oIlNUIFNUVjAyOTkgRFZCIERlbW9kdWxhdG9yIGRyaXZlciIpOwpNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyLCBIb2xnZXIgV2FlY2h0bGVyLCBQZXRlciBTY2hpbGRtYW5uLCBGZWxpeCBEb21rZSwgIgogICAgICAgICAgICAgICJBbmRyZWFzIE9iZXJyaXR0ZXIsIEFuZHJldyBkZSBRdWluY2V5LCBLZW5uZXRoIEFhZmz4eSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgpFWFBPUlRfU1lNQk9MKHN0djAyOTlfd3JpdGVyZWcpOwpFWFBPUlRfU1lNQk9MKHN0djAyOTlfYXR0YWNoKTsK