LyoKICoKICogQ29weXJpZ2h0IChDKSAyMDAwICBSb2JlcnQgT2xzc29uLgogKiBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KICoKICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKICogbGF0ZXIgdmVyc2lvbi4KICoKICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICogMDIxMTEtMTMwNywgVVNBLiAgCiAqLwoKLyogCiAqIFRoaXMgd29yayBpbmNsdWRlcyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyBjb3B5d3JpdGU6CiAqCiAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCBLdW5paGlybyBJc2hpZ3VybwogKgogKi8KCi8qIAogKiBUaGFua3MgdG8gSmVucyBM5eVzIGF0IFN3ZWRpc2ggVW5pdmVyc2l0eSBvZiBBZ3JpY3VsdHVyYWwgU2NpZW5jZXMKICogZm9yIHJldmlld2luZyBhbmQgdGVzdHMuCiAqLwoKCiNpbmNsdWRlIDx6ZWJyYS5oPgoKI2lmZGVmIEhBVkVfSVJEUAoKI2luY2x1ZGUgImlmLmgiCiNpbmNsdWRlICJ2dHkuaCIKI2luY2x1ZGUgInNvY2t1bmlvbi5oIgojaW5jbHVkZSAicHJlZml4LmgiCiNpbmNsdWRlICJjb21tYW5kLmgiCiNpbmNsdWRlICJtZW1vcnkuaCIKI2luY2x1ZGUgInN0cmVhbS5oIgojaW5jbHVkZSAiaW9jdGwuaCIKI2luY2x1ZGUgImNvbm5lY3RlZC5oIgojaW5jbHVkZSAibG9nLmgiCiNpbmNsdWRlICJ6Y2xpZW50LmgiCiNpbmNsdWRlICJ0aHJlYWQuaCIKI2luY2x1ZGUgInByaXZzLmgiCiNpbmNsdWRlICJ6ZWJyYS9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgInplYnJhL3J0YWR2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yaWIuaCIKI2luY2x1ZGUgInplYnJhL3pzZXJ2LmgiCiNpbmNsdWRlICJ6ZWJyYS9yZWRpc3RyaWJ1dGUuaCIKI2luY2x1ZGUgInplYnJhL2lyZHAuaCIKI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgoKI2luY2x1ZGUgImlmLmgiCiNpbmNsdWRlICJzb2NrdW5pb24uaCIKI2luY2x1ZGUgImxvZy5oIgoKLyogR0xPQkFMIFZBUlMgKi8KCmV4dGVybiBzdHJ1Y3QgemVicmFfcHJpdnNfdCB6c2Vydl9wcml2czsKCi8qIE1hc3RlciBvZiB0aHJlYWRzLiAqLwpleHRlcm4gc3RydWN0IHplYnJhX3QgemVicmFkOwpzdHJ1Y3QgdGhyZWFkICp0X2lyZHBfcmF3OwoKLyogVGltZXIgaW50ZXJ2YWwgb2YgaXJkcC4gKi8KaW50IGlyZHBfdGltZXJfaW50ZXJ2YWwgPSBJUkRQX0RFRkFVTFRfSU5URVJWQUw7CgppbnQgaXJkcF9yZWFkX3JhdyhzdHJ1Y3QgdGhyZWFkICpyKTsKaW50IGluX2Nrc3VtICh2b2lkICpwdHIsIGludCBuYnl0ZXMpOwpleHRlcm4gaW50IGlyZHBfc29jazsKdm9pZCBzZW5kX3BhY2tldChzdHJ1Y3QgaW50ZXJmYWNlICppZnAsIAoJCSBzdHJ1Y3Qgc3RyZWFtICpzLAoJCSB1X2ludDMyX3QgZHN0LAoJCSBzdHJ1Y3QgcHJlZml4ICpwLAoJCSB1X2ludDMyX3QgdHRsKTsKCnZvaWQgaXJkcF9pZl9pbml0ICgpOwoKY2hhciAqCmluZXRfMmEodV9pbnQzMl90IGEsIGNoYXIgKmIpCnsKICBzcHJpbnRmKGIsICIldS4ldS4ldS4ldSIsIAogICAgICAgICAgKGEgICAgKSAmIDB4RkYsCiAgICAgICAgICAoYT4+IDgpICYgMHhGRiwgCiAgICAgICAgICAoYT4+MTYpICYgMHhGRiwgCiAgICAgICAgICAoYT4+MjQpICYgMHhGRik7CiAgcmV0dXJuICBiOwp9CgppbnQKaXJkcF9zb2NrX2luaXQgKHZvaWQpCnsKICBpbnQgcmV0LCBpOwoKICBpZiAoIHpzZXJ2X3ByaXZzLmNoYW5nZSAoWlBSSVZTX1JBSVNFKSApCiAgICAgICB6bG9nX2VyciAoImlyZHBfc29ja19pbml0OiBjb3VsZCBub3QgcmFpc2UgcHJpdnMsICVzIiwKICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSApOwoKICBpcmRwX3NvY2sgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApOwoKICBpZiAoIHpzZXJ2X3ByaXZzLmNoYW5nZSAoWlBSSVZTX0xPV0VSKSApCiAgICAgICB6bG9nX2VyciAoImlyZHBfc29ja19pbml0OiBjb3VsZCBub3QgbG93ZXIgcHJpdnMsICVzIiwKICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykgKTsKCiAgaWYgKGlyZHBfc29jayA8IDApIHsKICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGNyZWF0ZSBpcmRwIHNvY2tldCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICByZXR1cm4gaXJkcF9zb2NrOwogIH07CiAgCiAgaSA9IDE7CiAgcmV0ID0gc2V0c29ja29wdCAoaXJkcF9zb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsIAogICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmaSwgc2l6ZW9mIChpKSk7CiAgaWYgKHJldCA8IDApIHsKICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGRvIGlyZHAgc29ja29wdCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICByZXR1cm4gcmV0OwogIH07CiAgCiAgcmV0ID0gc2V0c29ja29wdF9wa3RpbmZvX2lwdjQgKGlyZHBfc29jaywgMSk7CiAgaWYgKHJldCA8IDApIHsKICAgIHpsb2dfd2FybiAoIklSRFA6IGNhbid0IGRvIGlyZHAgc29ja29wdCAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICByZXR1cm4gcmV0OwogIH07CgogIHRfaXJkcF9yYXcgPSB0aHJlYWRfYWRkX3JlYWQgKHplYnJhZC5tYXN0ZXIsIGlyZHBfcmVhZF9yYXcsIE5VTEwsIGlyZHBfc29jayk7IAoKICByZXR1cm4gaXJkcF9zb2NrOwp9CgoKaW50IGdldF9wcmVmKHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcCwgc3RydWN0IHByZWZpeCAqcCkKewogIGxpc3Rub2RlIG5vZGU7CiAgc3RydWN0IEFkdiAqYWR2OwoKICAvKiBVc2UgZGVmYXVsdCBwcmVmZXJlbmNlIG9yIHVzZSB0aGUgb3ZlcnJpZGUgcHJlZiAqLwogIAogIGlmKCBpcmRwLT5BZHZQcmVmTGlzdCA9PSBOVUxMICkgcmV0dXJuIGlyZHAtPlByZWZlcmVuY2U7CiAgCiAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlyZHAtPkFkdlByZWZMaXN0KTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7CiAgICBhZHYgPSBnZXRkYXRhIChub2RlKTsKICAgIGlmKCBwLT51LnByZWZpeDQuc19hZGRyID09IGFkdi0+aXAuc19hZGRyICkKICAgICAgcmV0dXJuIGFkdi0+cHJlZjsKICB9CiAgcmV0dXJuIGlyZHAtPlByZWZlcmVuY2U7Cn0KCi8qIE1ha2UgSUNNUCBSb3V0ZXIgQWR2ZXJ0aXNlbWVudCBNZXNzYWdlLiAqLwppbnQgbWFrZV9hZHZlcnRpc2VtZW50X3BhY2tldCAoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKCQkJICAgICAgIHN0cnVjdCBwcmVmaXggKnAsCgkJCSAgICAgICBzdHJ1Y3Qgc3RyZWFtICpzKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKICBpbnQgc2l6ZTsKICBpbnQgcHJlZjsKICB1X2ludDE2X3QgY2hlY2tzdW07CgogIHByZWYgPSAgZ2V0X3ByZWYoaXJkcCwgcCk7CgogIHN0cmVhbV9wdXRjIChzLCBJQ01QX1JPVVRFUkFEVkVSVCk7IC8qIFR5cGUuICovCiAgc3RyZWFtX3B1dGMgKHMsIDApOwkJLyogQ29kZS4gKi8KICBzdHJlYW1fcHV0dyAocywgMCk7CQkvKiBDaGVja3N1bS4gKi8KICBzdHJlYW1fcHV0YyAocywgMSk7CQkvKiBOdW0gYWRkcmVzcy4gKi8KICBzdHJlYW1fcHV0YyAocywgMik7CQkvKiBBZGRyZXNzIEVudHJ5IFNpemUuICovCgogIGlmKGlyZHAtPmZsYWdzICYgSUZfU0hVVERPV04pICAKICAgIHN0cmVhbV9wdXR3IChzLCAwKTsKICBlbHNlIAogICAgc3RyZWFtX3B1dHcgKHMsIGlyZHAtPkxpZmV0aW1lKTsKCiAgc3RyZWFtX3B1dGwgKHMsIGh0b25sKHAtPnUucHJlZml4NC5zX2FkZHIpKTsgLyogUm91dGVyIGFkZHJlc3MuICovCiAgc3RyZWFtX3B1dGwgKHMsIHByZWYpOwoKICAvKiBpbl9ja3N1bSByZXR1cm4gbmV0d29yayBieXRlIG9yZGVyIHZhbHVlICovCiAgc2l6ZSA9IDE2OwogIGNoZWNrc3VtID0gaW5fY2tzdW0gKHMtPmRhdGEsIHNpemUpOwogIHN0cmVhbV9wdXR3X2F0IChzLCAyLCBodG9ucyhjaGVja3N1bSkpOwoKICByZXR1cm4gc2l6ZTsKfQoKdm9pZCBpcmRwX3NlbmQoc3RydWN0IGludGVyZmFjZSAqaWZwLCAKCSAgICAgICBzdHJ1Y3QgcHJlZml4ICpwLCAKCSAgICAgICBzdHJ1Y3Qgc3RyZWFtICpzKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKICB1X2ludDMyX3QgZHN0OwogIHVfaW50MzJfdCB0dGw9MTsKCiAgaWYgKCEgKGlmcC0+ZmxhZ3MgJiBJRkZfVVApKSByZXR1cm47IAoKICBpZiAoaXJkcC0+ZmxhZ3MgJiBJRl9CUk9BRENBU1QpIAogICAgZHN0ID1JTkFERFJfQlJPQURDQVNUIDsKICBlbHNlIAogICAgZHN0ID0gaHRvbmwoSU5BRERSX0FMTEhPU1RTX0dST1VQKTsKCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NRVNTQUdFUykgCiAgICB6bG9nX3dhcm4oIklSRFA6IFRYIEFkdmVydCBvbiAlcyAlcy8lZCBIb2xkdGltZT0lZCBQcmVmZXJlbmNlPSVkIiwgCgkgICAgICBpZnAtPm5hbWUsCgkgICAgICBpbmV0X250b2EocC0+dS5wcmVmaXg0KSwgCgkgICAgICBwLT5wcmVmaXhsZW4sCgkgICAgICBpcmRwLT5mbGFncyAmIElGX1NIVVRET1dOPyAwIDogaXJkcC0+TGlmZXRpbWUsCgkgICAgICBnZXRfcHJlZihpcmRwLCBwKSk7CgogIHNlbmRfcGFja2V0IChpZnAsIHMsIGRzdCwgcCwgdHRsKTsKfQoKdm9pZCBpcmRwX2FkdmVydGlzZW1lbnQgKHN0cnVjdCBpbnRlcmZhY2UgKmlmcCwgCgkJICAgc3RydWN0IHByZWZpeCAqcCkKewogIHN0cnVjdCBzdHJlYW0gKnM7CiAgcyA9IHN0cmVhbV9uZXcgKDEyOCk7CiAgbWFrZV9hZHZlcnRpc2VtZW50X3BhY2tldCAoaWZwLCBwLCBzKTsKICBpcmRwX3NlbmQoaWZwLCBwLCBzKTsgCn0KCmludCBpcmRwX3NlbmRfdGhyZWFkKHN0cnVjdCB0aHJlYWQgKnRfYWR2ZXJ0KQp7CiAgdV9pbnQzMl90IHRpbWVyLCB0bXA7CiAgc3RydWN0IGludGVyZmFjZSAqaWZwID0gVEhSRUFEX0FSRyAodF9hZHZlcnQpOwogIHN0cnVjdCB6ZWJyYV9pZiAqemk9aWZwLT5pbmZvOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcD0memktPmlyZHA7CiAgc3RydWN0IHByZWZpeCAqcDsKICBsaXN0bm9kZSBub2RlOwogIHN0cnVjdCBjb25uZWN0ZWQgKmlmYzsKCiAgaXJkcC0+ZmxhZ3MgJj0gfklGX1NPTElDSVQ7CgogIGlmKGlmcC0+Y29ubmVjdGVkKSAKICAgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpZnAtPmNvbm5lY3RlZCk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgewogICAgICBpZmMgPSBnZXRkYXRhIChub2RlKTsKCiAgICAgIHAgPSBpZmMtPmFkZHJlc3M7CgogICAgICBpcmRwX2FkdmVydGlzZW1lbnQoaWZwLCBwKTsKICAgICAgaXJkcC0+aXJkcF9zZW50Kys7CgogICAgfQoKICB0bXAgPSBpcmRwLT5NYXhBZHZlcnRJbnRlcnZhbC1pcmRwLT5NaW5BZHZlcnRJbnRlcnZhbDsKICB0aW1lciA9ICAocmFuZG9tICgpICUgdG1wICkgKyAxOwogIHRpbWVyID0gaXJkcC0+TWluQWR2ZXJ0SW50ZXJ2YWwgKyB0aW1lcjsKCiAgaWYoaXJkcC0+aXJkcF9zZW50IDwgIE1BWF9JTklUSUFMX0FEVkVSVElTRU1FTlRTICYmCiAgICAgdGltZXIgPiBNQVhfSU5JVElBTF9BRFZFUlRfSU5URVJWQUwgKSAKCSAgdGltZXI9IE1BWF9JTklUSUFMX0FEVkVSVF9JTlRFUlZBTDsKCiAgaWYoaXJkcC0+ZmxhZ3MgJiBJRl9ERUJVR19NSVNDKQogICAgemxvZ193YXJuKCJJUkRQOiBOZXcgdGltZXIgZm9yICVzIHNldCB0byAldVxuIiwgaWZwLT5uYW1lLCB0aW1lcik7CgogIGlyZHAtPnRfYWR2ZXJ0aXNlID0gdGhyZWFkX2FkZF90aW1lcih6ZWJyYWQubWFzdGVyLCBpcmRwX3NlbmRfdGhyZWFkLCBpZnAsIHRpbWVyKTsKICByZXR1cm4gMDsKfQoKdm9pZCBpcmRwX2FkdmVydF9vZmYoc3RydWN0IGludGVyZmFjZSAqaWZwKQp7CiAgc3RydWN0IHplYnJhX2lmICp6aT1pZnAtPmluZm87CiAgc3RydWN0IGlyZHBfaW50ZXJmYWNlICppcmRwPSZ6aS0+aXJkcDsKICBsaXN0bm9kZSBub2RlOwogIGludCBpOwogIHN0cnVjdCBjb25uZWN0ZWQgKmlmYzsKICBzdHJ1Y3QgcHJlZml4ICpwOwoKICBpZihpcmRwLT50X2FkdmVydGlzZSkgIHRocmVhZF9jYW5jZWwoaXJkcC0+dF9hZHZlcnRpc2UpOwogIGlyZHAtPnRfYWR2ZXJ0aXNlID0gTlVMTDsKICAKICBpZihpZnAtPmNvbm5lY3RlZCkgCiAgICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaWZwLT5jb25uZWN0ZWQpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsKICAgICAgaWZjID0gZ2V0ZGF0YSAobm9kZSk7CgogICAgICBwID0gaWZjLT5hZGRyZXNzOwoKICAgICAgLyogT3V0cHV0IHNvbWUgcGFja2V0cyB3aXRoIExpZmV0aW1lIDAgCgkgd2Ugc2hvdWxkIGFkZCBhIHdhaXQuLi4KICAgICAgKi8KCiAgICAgIGZvcihpPTA7IGk8IElSRFBfTEFTVF9BRFZFUlRfTUVTU0FHRVM7IGkrKykgewoKCWlyZHAtPmlyZHBfc2VudCsrOwoJaXJkcF9hZHZlcnRpc2VtZW50KGlmcCwgcCk7CiAgICAgIH0KICAgIH0KfQoKCnZvaWQgcHJvY2Vzc19zb2xpY2l0IChzdHJ1Y3QgaW50ZXJmYWNlICppZnApCnsKICBzdHJ1Y3QgemVicmFfaWYgKnppPWlmcC0+aW5mbzsKICBzdHJ1Y3QgaXJkcF9pbnRlcmZhY2UgKmlyZHA9JnppLT5pcmRwOwogIHVfaW50MzJfdCB0aW1lcjsKCiAgLyogV2hlbiBTT0xJQ0lUIGlzIGFjdGl2ZSB3ZSByZWplY3QgZnVydGhlciBpbmNvbWluZyBzb2xpY2l0cyAKICAgICB0aGlzIGtlZXBzIGRvd24gdGhlIGFuc3dlcmluZyByYXRlIHNvIHdlIGRvbid0IGhhdmUgdGhpbmsKICAgICBhYm91dCBEb1MgYXR0YWNrcyBoZXJlLiAqLwoKICBpZiggaXJkcC0+ZmxhZ3MgJiBJRl9TT0xJQ0lUKSByZXR1cm47CgogIGlyZHAtPmZsYWdzIHw9IElGX1NPTElDSVQ7CiAgaWYoaXJkcC0+dF9hZHZlcnRpc2UpICB0aHJlYWRfY2FuY2VsKGlyZHAtPnRfYWR2ZXJ0aXNlKTsKICBpcmRwLT50X2FkdmVydGlzZSA9IE5VTEw7CgogIHRpbWVyID0gIChyYW5kb20gKCkgJSBNQVhfUkVTUE9OU0VfREVMQVkpICsgMTsKCiAgaXJkcC0+dF9hZHZlcnRpc2UgPSB0aHJlYWRfYWRkX3RpbWVyKHplYnJhZC5tYXN0ZXIsIAoJCQkJICAgICAgIGlyZHBfc2VuZF90aHJlYWQsIAoJCQkJICAgICAgIGlmcCwgCgkJCQkgICAgICAgdGltZXIpOwp9Cgp2b2lkIGlyZHBfZmluaXNoKCkKewoKICBsaXN0bm9kZSBub2RlOwogIHN0cnVjdCBpbnRlcmZhY2UgKmlmcDsKICBzdHJ1Y3QgemVicmFfaWYgKnppOwogIHN0cnVjdCBpcmRwX2ludGVyZmFjZSAqaXJkcDsKCiAgemxvZ193YXJuKCJJUkRQOiBSZWNlaXZlZCBzaHV0ZG93biBub3RpZmljYXRpb24uIik7CiAgCiAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlmbGlzdCk7IG5vZGU7IG5vZGUgPSBuZXh0bm9kZSAobm9kZSkpCiAgICB7CiAgICAgIGlmcCA9IGdldGRhdGEobm9kZSk7CiAgICAgIHppPSBpZnAtPmluZm87CiAgICAgIGlmKCEgemkpIGNvbnRpbnVlOwogICAgICBpcmRwID0gJnppLT5pcmRwOwogICAgICBpZighaXJkcCkgY29udGludWU7CgogICAgICBpZihpcmRwLT5mbGFncyAmIElGX0FDVElWRSApIHsKCWlyZHAtPmZsYWdzIHw9IElGX1NIVVRET1dOOwoJaXJkcF9hZHZlcnRfb2ZmKGlmcCk7CiAgICAgIH0KICAgIH0KfQoKdm9pZCBpcmRwX2luaXQoKQp7CiAgaXJkcF9zb2NrX2luaXQoKTsKICBpcmRwX2lmX2luaXQgKCk7Cn0KCgoKI2VuZGlmIC8qIEhBVkVfSVJEUCAqLwoKCgoK