LyogdWlzdGhyZWFkLmMKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgovKiBAQUxMX0lOU1BFQ1RFRCAqLwojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgojaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgojaW5jbHVkZSAidW5pa2xvZy5oIgojaW5jbHVkZSAidWlzdXRpbHMuaCIKI2luY2x1ZGUgInVpc3RocmVhZC5oIgoKI2RlZmluZSBLSUxMKGEsIGIsIGMpIGtpbGxfcGlkKGZpbmRfdnBpZChhKSwgYiwgYykKCi8qIHRoaXMgaXMgc2hvcnRlciB0aGFuIHVzaW5nIF9fRklMRV9fIChmdWxsIHBhdGggbmFtZSkgaW4KICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcwogKi8KI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVUlTTElCX1BDX3Vpc3RocmVhZF9jCiNkZWZpbmUgX19NWUZJTEVfXyAidWlzdGhyZWFkLmMiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogcmV0dXJucyAwIGZvciBmYWlsdXJlLCAxIGZvciBzdWNjZXNzICovCmludAp1aXN0aHJlYWRfc3RhcnQoc3RydWN0IHVpc3RocmVhZF9pbmZvICp0aHJpbmZvLAoJCWludCAoKnRocmVhZGZuKSh2b2lkICopLCB2b2lkICp0aHJjb250ZXh0LCBjaGFyICpuYW1lKQp7Cgl0aHJpbmZvLT5zaG91bGRfc3RvcCA9IDA7CgkvKiB1c2VkIHRvIHN0b3AgdGhlIHRocmVhZCAqLwoJaW5pdF9jb21wbGV0aW9uKCZ0aHJpbmZvLT5oYXNfc3RvcHBlZCk7Cgl0aHJpbmZvLT50YXNrID0ga3RocmVhZF9jcmVhdGUodGhyZWFkZm4sIHRocmNvbnRleHQsIG5hbWUsIE5VTEwpOwoJaWYgKElTX0VSUih0aHJpbmZvLT50YXNrKSkgewoJCXRocmluZm8tPmlkID0gMDsKCQlyZXR1cm4gMDsJLyogZmFpbHVyZSAqLwoJfQoJdGhyaW5mby0+aWQgPSB0aHJpbmZvLT50YXNrLT5waWQ7Cgl3YWtlX3VwX3Byb2Nlc3ModGhyaW5mby0+dGFzayk7CglMT0dJTkYoInN0YXJ0ZWQgdGhyZWFkIHBpZDolZFxuIiwgdGhyaW5mby0+aWQpOwoJcmV0dXJuIDE7Cgp9CkVYUE9SVF9TWU1CT0xfR1BMKHVpc3RocmVhZF9zdGFydCk7Cgp2b2lkCnVpc3RocmVhZF9zdG9wKHN0cnVjdCB1aXN0aHJlYWRfaW5mbyAqdGhyaW5mbykKewoJaW50IHJldDsKCWludCBzdG9wcGVkID0gMDsKCWlmICh0aHJpbmZvLT5pZCA9PSAwKQoJCXJldHVybjsJCS8qIHRocmVhZCBub3QgcnVubmluZyAqLwoKCUxPR0lORigidWlzdGhyZWFkX3N0b3Agc3RvcHBpbmcgaWQ6JWRcbiIsIHRocmluZm8tPmlkKTsKCXRocmluZm8tPnNob3VsZF9zdG9wID0gMTsKCXJldCA9IEtJTEwodGhyaW5mby0+aWQsIFNJR0hVUCwgMSk7CglpZiAocmV0KSB7CgkJTE9HRVJSKCJ1bmFibGUgdG8gc2lnbmFsIHRocmVhZCAlZFxuIiwgcmV0KTsKCX0gZWxzZSB7CgkJLyogZ2l2ZSB1cCBpZiB0aGUgdGhyZWFkIGhhcyBOT1QgZGllZCBpbiAxIG1pbnV0ZSAqLwoJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnRocmluZm8tPmhhc19zdG9wcGVkLCA2MCAqIEhaKSkKCQkJc3RvcHBlZCA9IDE7CgkJZWxzZQoJCQlMT0dFUlIoInRpbWVkIG91dCB0cnlpbmcgdG8gc2lnbmFsIHRocmVhZFxuIik7Cgl9CglpZiAoc3RvcHBlZCkgewoJCUxPR0lORigidWlzdGhyZWFkX3N0b3Agc3RvcHBlZCBpZDolZFxuIiwgdGhyaW5mby0+aWQpOwoJCXRocmluZm8tPmlkID0gMDsKCX0KfQpFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RvcCk7Cg==