LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpZmRlZiBIQVZFX1BUSFJFQURfSAoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NTUFOX0gKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgImtlcm5lbF9wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL3B0aHJlYWQuaCIKCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpCiAqIGFsc286IGFzc3VtZSB0aGF0IHN0YXRpYyBpbml0aWFsaXplciBzZXRzIHBvaW50ZXIgdG8gTlVMTAogKi8KdHlwZWRlZiBzdHJ1Y3QKewojaWZkZWYgX19HTElCQ19fCiAgaW50IHJlc2VydmVkOwojZW5kaWYKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdAp7CiAgICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKICAgIHZvaWQqIGFyZzsKfTsKCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBwdGhyZWFkX3RocmVhZF9zdGFydChMUFZPSUQgZGF0YSkKewogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0IGluaXQgPSAqKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KilkYXRhOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKICByZXR1cm4gKERXT1JEX1BUUilpbml0LnN0YXJ0X3JvdXRpbmUoaW5pdC5hcmcpOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiB0aHJlYWQsIGNvbnN0IHB0aHJlYWRfYXR0cl90KiBhdHRyLCB2b2lkKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICBIQU5ETEUgaFRocmVhZDsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCogaWRhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KSk7CgogIGlkYXRhLT5zdGFydF9yb3V0aW5lID0gc3RhcnRfcm91dGluZTsKICBpZGF0YS0+YXJnID0gYXJnOwogIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIDAsIHB0aHJlYWRfdGhyZWFkX3N0YXJ0LCBpZGF0YSwgMCwgKExQRFdPUkQpdGhyZWFkKTsKCiAgaWYoaFRocmVhZCkKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIGVsc2UKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaWRhdGEpOyAvKiBmcmVlIGlkYXRhIHN0cnVjdCBvbiBmYWlsdXJlICovCiAgICByZXR1cm4gRUFHQUlOOwogIH0KCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgKERXT1JEKXRocmVhZCk7CgogIGlmKCFUZXJtaW5hdGVUaHJlYWQoaFRocmVhZCwgMCkpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAgICAgIC8qIHJldHVybiBlcnJvciAqLwogIH0KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CgogIHJldHVybiAwOyAgICAgICAgICAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CiAgaWYoIUdldEV4aXRDb2RlVGhyZWFkKGhUaHJlYWQsIChMUERXT1JEKXZhbHVlX3B0cikpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAvKiBGSVhNRTogbWFrZSB0aGlzIG1vcmUgY29ycmVjdGx5IG1hdGNoICovCiAgfSAgICAgICAgICAgICAgICAvKiB3aW5kb3dzIGVycm9ycyAqLwoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICByZXR1cm4gMDsKfQoKLypGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMgb25lLi4uICovCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfZGV0YWNoXG4iKTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1VVEVYRVMgKioqKiovCgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgLyogZ2xpYmMgaGFzIGEgdGVuZGVuY3kgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIHZlcnkgb2Z0ZW4sIGV2ZW4KICAgICBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXkgYXJlIG5vdCByZWFsbHkgdXNlZCBsYXRlciBvbi4KCiAgICAgQXMgZm9yIHVzLCBpbml0aWFsaXppbmcgYSBtdXRleCBpcyB2ZXJ5IGV4cGVuc2l2ZSwgd2UgcG9zdHBvbmUKICAgICB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdGltZSB0aGUgbXV0ZXggaXMgZmlyc3QgdXNlZC4gKi8KCiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBtdXRleF9yZWFsX2luaXQoIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggKQp7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNyaXRzZWN0KTsKICB9Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFSdGxUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXQgPSAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdDsKCiAgICBpZiAoIWNyaXQpIHJldHVybiAwOwogICAgaWYgKGNyaXQtPk93bmluZ1RocmVhZCAhPSBVTG9uZ1RvSGFuZGxlKEdldEN1cnJlbnRUaHJlYWRJZCgpKSkgcmV0dXJuIEVQRVJNOwogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oIGNyaXQgKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBpZiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KSB7CiNpZiAwIC8qIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIGxpYmM2IHRoYXQgbWFrZXMgdGhpcyBhIGJhZCBpZGVhICovCiAgICByZXR1cm4gRUJVU1k7CiNlbHNlCiAgICB3aGlsZSAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KQogICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiNlbmRpZgogIH0KICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKc3RhdGljIHZvaWQgcndsb2NrX3JlYWxfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBSVExfUldMT0NLICpsb2NrID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihSVExfUldMT0NLKSk7CiAgUnRsSW5pdGlhbGl6ZVJlc291cmNlKGxvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spLGxvY2ssTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVSZXNvdXJjZShsb2NrKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxvY2spOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSByZXR1cm4gRUJVU1k7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgd2hpbGUoVFJVRSkKICAgIGlmIChSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBUUlVFKSkKICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsUmVsZWFzZVJlc291cmNlKCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgKTsKICByZXR1cm4gMDsKfQoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCgovKiBUaGUgY29uZGl0aW9uIGNvZGUgaXMgYmFzaWNhbGx5IGN1dC1hbmQtcGFzdGVkIGZyb20gRG91Z2xhcwogKiBTY2htaWR0J3MgcGFwZXI6CiAqICAgIlN0cmF0ZWdpZXMgZm9yIEltcGxlbWVudGluZyBQT1NJWCBDb25kaXRpb24gVmFyaWFibGVzIG9uIFdpbjMyIiwKICogYXQgaHR0cDovL3d3dy5jcy53dXN0bC5lZHUvfnNjaG1pZHQvd2luMzItY3YtMS5odG1sIGFuZAogKiBodHRwOi8vd3d3LmNzLnd1c3RsLmVkdS9+c2NobWlkdC93aW4zMi1jdi0yLmh0bWwuCiAqIFRoaXMgcGFwZXIgZm9ybWVkIHRoZSBiYXNpcyBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQogKiBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIHRoZSBBQ0UgbGlicmFyeS4KICovCgovKiBQb3NzaWJsZSBwcm9ibGVtcyB3aXRoIEFDRToKICogLSB1bmltcGxlbWVudGVkIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQKICovCnR5cGVkZWYgc3RydWN0IHsKICAvKiBOdW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzLiAqLwogIGludCB3YWl0ZXJzX2NvdW50OwoKICAvKiBTZXJpYWxpemUgYWNjZXNzIHRvIDx3YWl0ZXJzX2NvdW50Pi4gKi8KICBDUklUSUNBTF9TRUNUSU9OIHdhaXRlcnNfY291bnRfbG9jazsKCiAgLyoKICAgKiBTZW1hcGhvcmUgdXNlZCB0byBxdWV1ZSB1cCB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBjb25kaXRpb24gdG8KICAgKiBiZWNvbWUgc2lnbmFsZWQuCiAgICovCiAgSEFORExFIHNlbWE7CgogIC8qCiAgICogQW4gYXV0by1yZXNldCBldmVudCB1c2VkIGJ5IHRoZSBicm9hZGNhc3Qvc2lnbmFsIHRocmVhZCB0byB3YWl0CiAgICogZm9yIGFsbCB0aGUgd2FpdGluZyB0aHJlYWQocykgdG8gd2FrZSB1cCBhbmQgYmUgcmVsZWFzZWQgZnJvbSB0aGUKICAgKiBzZW1hcGhvcmUuCiAgICovCiAgSEFORExFIHdhaXRlcnNfZG9uZTsKCiAgLyoKICAgKiBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIHdlcmUgYnJvYWRjYXN0aW5nIG9yIHNpZ25hbGluZy4gIFRoaXMKICAgKiBhbGxvd3MgdXMgdG8gb3B0aW1pemUgdGhlIGNvZGUgaWYgd2UncmUganVzdCBzaWduYWxpbmcuCiAgICovCiAgc2l6ZV90IHdhc19icm9hZGNhc3Q7Cn0gd2luZV9jb25kX2RldGFpbDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgd2luZV9jb25kX2RldGFpbCAqY29uZDsKfSAqd2luZV9jb25kOwoKc3RhdGljIHZvaWQgd2luZV9jb25kX3JlYWxfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2Yod2luZV9jb25kX2RldGFpbCkpOwogIGRldGFpbC0+d2FpdGVyc19jb3VudCA9IDA7CiAgZGV0YWlsLT53YXNfYnJvYWRjYXN0ID0gMDsKICBkZXRhaWwtPnNlbWEgPSBDcmVhdGVTZW1hcGhvcmVXKCBOVUxMLCAwLCAweDdmZmZmZmZmLCBOVUxMICk7CiAgZGV0YWlsLT53YWl0ZXJzX2RvbmUgPSBDcmVhdGVFdmVudFcoIE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCApOwogIFJ0bEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoKHZvaWQqKikmKCgod2luZV9jb25kKWNvbmQpLT5jb25kKSwgZGV0YWlsLCBOVUxMKSAhPSBOVUxMKQogIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9pbml0OmV4cGVjdCB0cm91Ymxlcy4uLlxuIik7CiAgICBDbG9zZUhhbmRsZShkZXRhaWwtPnNlbWEpOwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgICBDbG9zZUhhbmRsZShkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXRhaWwpOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKmNvbmRfYXR0cikKewogIC8qIFRoZSBzYW1lIGFzIGZvciB3aW5lX3B0aHJlYWRfbXV0ZXhfaW5pdCwgd2UgcG9zdHBvbmUgaW5pdGlhbGl6YXRpb24KICAgICB1bnRpbCBjb25kaXRpb24gaXMgcmVhbGx5IHVzZWQuKi8KICAoKHdpbmVfY29uZCljb25kKS0+Y29uZCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICBpZiAoIWRldGFpbCkgcmV0dXJuIDA7CiAgQ2xvc2VIYW5kbGUoZGV0YWlsLT5zZW1hKTsKICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBDbG9zZUhhbmRsZShkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV0YWlsKTsKICAoKHdpbmVfY29uZCljb25kKS0+Y29uZCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgaW50IGhhdmVfd2FpdGVyczsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgaGF2ZV93YWl0ZXJzID0gZGV0YWlsLT53YWl0ZXJzX2NvdW50ID4gMDsKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogSWYgdGhlcmUgYXJlbid0IGFueSB3YWl0ZXJzLCB0aGVuIHRoaXMgaXMgYSBuby1vcC4gKi8KICBpZiAoaGF2ZV93YWl0ZXJzKQogICAgUmVsZWFzZVNlbWFwaG9yZShkZXRhaWwtPnNlbWEsIDEsIE5VTEwpOwoKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBpbnQgaGF2ZV93YWl0ZXJzID0gMDsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgLyoKICAgKiBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCA8d2FpdGVyc19jb3VudD4gYW5kIDx3YXNfYnJvYWRjYXN0PiBhcmUKICAgKiBjb25zaXN0ZW50IHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCiAgICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIGlmIChkZXRhaWwtPndhaXRlcnNfY291bnQgPiAwKSB7CiAgICAvKgogICAgICogV2UgYXJlIGJyb2FkY2FzdGluZywgZXZlbiBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3YWl0ZXIuLi4KICAgICAqIFJlY29yZCB0aGF0IHdlIGFyZSBicm9hZGNhc3RpbmcsIHdoaWNoIGhlbHBzIG9wdGltaXplCiAgICAgKiA8cHRocmVhZF9jb25kX3dhaXQ+IGZvciB0aGUgbm9uLWJyb2FkY2FzdCBjYXNlLgogICAgICovCiAgICBkZXRhaWwtPndhc19icm9hZGNhc3QgPSAxOwogICAgaGF2ZV93YWl0ZXJzID0gMTsKICB9CgogIGlmIChoYXZlX3dhaXRlcnMpIHsKICAgIC8qIFdha2UgdXAgYWxsIHRoZSB3YWl0ZXJzIGF0b21pY2FsbHkuICovCiAgICBSZWxlYXNlU2VtYXBob3JlKGRldGFpbC0+c2VtYSwgZGV0YWlsLT53YWl0ZXJzX2NvdW50LCBOVUxMKTsKCiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgICAvKiBXYWl0IGZvciBhbGwgdGhlIGF3YWtlbmVkIHRocmVhZHMgdG8gYWNxdWlyZSB0aGUgY291bnRpbmcgc2VtYXBob3JlLiAqLwogICAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT53YWl0ZXJzX2RvbmUsIElORklOSVRFKTsKCiAgICAvKgogICAgICogVGhpcyBhc3NpZ25tZW50IGlzIG9rYXksIGV2ZW4gd2l0aG91dCB0aGUgPHdhaXRlcnNfY291bnRfbG9jaz4gaGVsZAogICAgICogYmVjYXVzZSBubyBvdGhlciB3YWl0ZXIgdGhyZWFkcyBjYW4gd2FrZSB1cCB0byBhY2Nlc3MgaXQuCiAgICAgKi8KICAgIGRldGFpbC0+d2FzX2Jyb2FkY2FzdCA9IDA7CiAgfQogIGVsc2UKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CiAgaW50IGxhc3Rfd2FpdGVyOwoKICBpZiAoICEoKHdpbmVfY29uZCljb25kKS0+Y29uZCApIHdpbmVfY29uZF9yZWFsX2luaXQoY29uZCk7CiAgZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBkZXRhaWwtPndhaXRlcnNfY291bnQrKzsKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCApOwogIFdhaXRGb3JTaW5nbGVPYmplY3QoZGV0YWlsLT5zZW1hLCBJTkZJTklURSk7CgogIC8qIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogV2UncmUgbm8gbG9uZ2VyIHdhaXRpbmcuLi4gKi8KICBkZXRhaWwtPndhaXRlcnNfY291bnQtLTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciBhZnRlciA8cHRocmVhZF9jb25kX2Jyb2FkY2FzdD4uICovCiAgbGFzdF93YWl0ZXIgPSBkZXRhaWwtPndhc19icm9hZGNhc3QgJiYgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID09IDA7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKgogICAqIElmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0aHJlYWQgZHVyaW5nIHRoaXMgcGFydGljdWxhciBicm9hZGNhc3QKICAgKiB0aGVuIGxldCBhbGwgdGhlIG90aGVyIHRocmVhZHMgcHJvY2VlZC4KICAgKi8KICBpZiAobGFzdF93YWl0ZXIpIFNldEV2ZW50KGRldGFpbC0+d2FpdGVyc19kb25lKTsKICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX3RpbWVkd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQp7CiAgRFdPUkQgbXMgPSBhYnN0aW1lLT50dl9zZWMgKiAxMDAwICsgYWJzdGltZS0+dHZfbnNlYyAvIDEwMDAwMDA7CiAgaW50IGxhc3Rfd2FpdGVyOwogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKCiAgaWYgKCAhKCh3aW5lX2NvbmQpY29uZCktPmNvbmQgKSB3aW5lX2NvbmRfcmVhbF9pbml0KGNvbmQpOwogIGRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICAvKiBBdm9pZCByYWNlIGNvbmRpdGlvbnMuICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgZGV0YWlsLT53YWl0ZXJzX2NvdW50Kys7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT5zZW1hLCBtcyk7CgogIC8qIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogV2UncmUgbm8gbG9uZ2VyIHdhaXRpbmcuLi4gKi8KICBkZXRhaWwtPndhaXRlcnNfY291bnQtLTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciBhZnRlciA8cHRocmVhZF9jb25kX2Jyb2FkY2FzdD4uICovCiAgbGFzdF93YWl0ZXIgPSBkZXRhaWwtPndhc19icm9hZGNhc3QgJiYgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID09IDA7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKgogICAqIElmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0aHJlYWQgZHVyaW5nIHRoaXMgcGFydGljdWxhciBicm9hZGNhc3QKICAgKiB0aGVuIGxldCBhbGwgdGhlIG90aGVyIHRocmVhZHMgcHJvY2VlZC4KICAgKi8KICBpZiAobGFzdF93YWl0ZXIpIFNldEV2ZW50IChkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1JU0MgKioqKiovCgpzdGF0aWMgcHRocmVhZF90IHdpbmVfcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9CgpzdGF0aWMgdm9pZCB3aW5lX3B0aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSkKewogICAgRXhpdFRocmVhZCgoRFdPUkRfUFRSKXJldHZhbCk7Cn0KCnN0YXRpYyB2b2lkICp3aW5lX2dldF90aHJlYWRfZGF0YSh2b2lkKQp7CiAgICByZXR1cm4ga2VybmVsX2dldF90aHJlYWRfZGF0YSgpLT5wdGhyZWFkX2RhdGE7Cn0KCnN0YXRpYyB2b2lkIHdpbmVfc2V0X3RocmVhZF9kYXRhKCB2b2lkICpkYXRhICkKewogICAga2VybmVsX2dldF90aHJlYWRfZGF0YSgpLT5wdGhyZWFkX2RhdGEgPSBkYXRhOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9jYWxsYmFja3MgY2FsbGJhY2tzID0KewogICAgd2luZV9nZXRfdGhyZWFkX2RhdGEsICAgICAgICAgICAvKiBwdHJfZ2V0X3RocmVhZF9kYXRhICovCiAgICB3aW5lX3NldF90aHJlYWRfZGF0YSwgICAgICAgICAgIC8qIHB0cl9zZXRfdGhyZWFkX2RhdGEgKi8KICAgIHdpbmVfcHRocmVhZF9zZWxmLCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfc2VsZiAqLwogICAgd2luZV9wdGhyZWFkX2VxdWFsLCAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9lcXVhbCAqLwogICAgd2luZV9wdGhyZWFkX2NyZWF0ZSwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9jcmVhdGUgKi8KICAgIHdpbmVfcHRocmVhZF9jYW5jZWwsICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfY2FuY2VsICovCiAgICB3aW5lX3B0aHJlYWRfam9pbiwgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2pvaW4gKi8KICAgIHdpbmVfcHRocmVhZF9kZXRhY2gsICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZGV0YWNoICovCiAgICB3aW5lX3B0aHJlYWRfZXhpdCwgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2V4aXQgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF9pbml0LCAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfaW5pdCAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X2xvY2ssICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9sb2NrICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3RyeWxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF91bmxvY2ssICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdW5sb2NrICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2Rlc3Ryb3kgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfaW5pdCwgICAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX2luaXQgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfcmRsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3JkbG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3dybG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja193cmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja191bmxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfdW5sb2NrICovCiAgICB3aW5lX3B0aHJlYWRfY29uZF9pbml0LCAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRfaW5pdCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfZGVzdHJveSwgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX2Rlc3Ryb3kgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX3NpZ25hbCwgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZF9zaWduYWwgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX2Jyb2FkY2FzdCwgICAgLyogcHRyX3B0aHJlYWRfY29uZF9icm9hZGNhc3QgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX3dhaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZF93YWl0ICovCiAgICB3aW5lX3B0aHJlYWRfY29uZF90aW1lZHdhaXQgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRfdGltZWR3YWl0ICovCn07CgpzdGF0aWMgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgcHRocmVhZF9mdW5jdGlvbnM7Cgp2b2lkIFBUSFJFQURfSW5pdCh2b2lkKQp7CiAgICB3aW5lX3B0aHJlYWRfZ2V0X2Z1bmN0aW9ucyggJnB0aHJlYWRfZnVuY3Rpb25zLCBzaXplb2YocHRocmVhZF9mdW5jdGlvbnMpICk7CiAgICBwdGhyZWFkX2Z1bmN0aW9ucy5pbml0X3Byb2Nlc3MoICZjYWxsYmFja3MsIHNpemVvZihjYWxsYmFja3MpICk7Cn0KCiNlbmRpZiAvKiBIQVZFX1BUSFJFQURfSCAqLwo=