LyoKICogIFBoaXNoaW5nIG1vZHVsZTogd2hpdGVsaXN0IGltcGxlbWVudGF0aW9uLgogKgogKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVPZy9msgRWR2aW4gPGVkd2luQGNsYW1hdi5uZXQ+CiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCiAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKICogIE1BIDAyMTEwLTEzMDEsIFVTQS4KICoKICovCgojaWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSAiY2xhbWF2LWNvbmZpZy5oIgojZW5kaWYKCgojaWZuZGVmIENMX0RFQlVHCiNkZWZpbmUgTkRFQlVHCiNlbmRpZgoKI2lmZGVmIENMX1RIUkVBRF9TQUZFCiNpZm5kZWYgX1JFRU5UUkFOVAojZGVmaW5lIF9SRUVOVFJBTlQKI2VuZGlmCiNlbmRpZgoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2luY2x1ZGUgImNsYW1hdi5oIgojaW5jbHVkZSAib3RoZXJzLmgiCiNpbmNsdWRlICJwaGlzaF93aGl0ZWxpc3QuaCIKI2luY2x1ZGUgInJlZ2V4X2xpc3QuaCIKCmludCB3aGl0ZWxpc3RfbWF0Y2goY29uc3Qgc3RydWN0IGNsX2VuZ2luZSogZW5naW5lLGNoYXIqIHJlYWxfdXJsLGNvbnN0IGNoYXIqIGRpc3BsYXlfdXJsLGludCBob3N0T25seSkKewoJY29uc3QgY2hhciogaW5mbzsvKnVudXNlZCovCgljbGlfZGJnbXNnKCJQaGlzaGluZzogbG9va2luZyB1cCBpbiB3aGl0ZWxpc3Q6ICVzOiVzOyBob3N0LW9ubHk6JWRcbiIscmVhbF91cmwsZGlzcGxheV91cmwsaG9zdE9ubHkpOwoJcmV0dXJuCWVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIgPyByZWdleF9saXN0X21hdGNoKGVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIscmVhbF91cmwsZGlzcGxheV91cmwsTlVMTCxob3N0T25seSwmaW5mbywxKSA6IDA7Cn0KCmludCBpbml0X3doaXRlbGlzdChzdHJ1Y3QgY2xfZW5naW5lKiBlbmdpbmUpCnsKCWlmKGVuZ2luZSkgewoJCWVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIgPSAoc3RydWN0IHJlZ2V4X21hdGNoZXIgKikgY2xpX21hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ2V4X21hdGNoZXIpKTsKCQlpZighZW5naW5lLT53aGl0ZWxpc3RfbWF0Y2hlcikKCQkJcmV0dXJuIENMX0VNRU07CgkJcmV0dXJuCWluaXRfcmVnZXhfbGlzdChlbmdpbmUtPndoaXRlbGlzdF9tYXRjaGVyKTsKCX0KCWVsc2UKCQlyZXR1cm4gQ0xfRU5VTExBUkc7Cn0KCmludCBpc193aGl0ZWxpc3Rfb2soY29uc3Qgc3RydWN0IGNsX2VuZ2luZSogZW5naW5lKQp7CglyZXR1cm4gKGVuZ2luZSAmJiBlbmdpbmUtPndoaXRlbGlzdF9tYXRjaGVyKSA/IGlzX3JlZ2V4X29rKGVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIpIDogMTsKfQoKdm9pZCB3aGl0ZWxpc3RfY2xlYW51cChjb25zdCBzdHJ1Y3QgY2xfZW5naW5lKiBlbmdpbmUpCnsKCWlmKGVuZ2luZSAmJiBlbmdpbmUtPndoaXRlbGlzdF9tYXRjaGVyKSB7CgkJcmVnZXhfbGlzdF9jbGVhbnVwKGVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIpOwoJfQp9Cgp2b2lkIHdoaXRlbGlzdF9kb25lKHN0cnVjdCBjbF9lbmdpbmUqIGVuZ2luZSkKewoJaWYoZW5naW5lICYmIGVuZ2luZS0+d2hpdGVsaXN0X21hdGNoZXIpIHsKCQlyZWdleF9saXN0X2RvbmUoZW5naW5lLT53aGl0ZWxpc3RfbWF0Y2hlcik7CQoJCWZyZWUoZW5naW5lLT53aGl0ZWxpc3RfbWF0Y2hlcik7CgkJZW5naW5lLT53aGl0ZWxpc3RfbWF0Y2hlciA9IE5VTEw7Cgl9Cn0KCg==