LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpZmRlZiBIQVZFX1BUSFJFQURfSAoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NTUFOX0gKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgojaW5jbHVkZSAid2luZS9wdGhyZWFkLmgiCgojZGVmaW5lIFBfT1VUUFVUKHN0dWZmKSB3cml0ZSgyLHN0dWZmLHN0cmxlbihzdHVmZikpCgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KQogKiBhbHNvOiBhc3N1bWUgdGhhdCBzdGF0aWMgaW5pdGlhbGl6ZXIgc2V0cyBwb2ludGVyIHRvIE5VTEwKICovCnR5cGVkZWYgc3RydWN0CnsKI2lmZGVmIF9fR0xJQkNfXwogIGludCByZXNlcnZlZDsKI2VuZGlmCiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7CgovKiBzZWUgd2luZV9tdXRleCBhYm92ZSBmb3IgY29tbWVudHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIFJUTF9SV0xPQ0sgKmxvY2s7Cn0gKndpbmVfcndsb2NrOwoKc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQKewogICAgdm9pZCogKCpzdGFydF9yb3V0aW5lKSh2b2lkKik7CiAgICB2b2lkKiBhcmc7Cn07CgpzdGF0aWMgRFdPUkQgQ0FMTEJBQ0sgcHRocmVhZF90aHJlYWRfc3RhcnQoTFBWT0lEIGRhdGEpCnsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCBpbml0ID0gKihzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCopZGF0YTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsZGF0YSk7CiAgcmV0dXJuIChEV09SRClpbml0LnN0YXJ0X3JvdXRpbmUoaW5pdC5hcmcpOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiB0aHJlYWQsIGNvbnN0IHB0aHJlYWRfYXR0cl90KiBhdHRyLCB2b2lkKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICBIQU5ETEUgaFRocmVhZDsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCogaWRhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KSk7CgogIGlkYXRhLT5zdGFydF9yb3V0aW5lID0gc3RhcnRfcm91dGluZTsKICBpZGF0YS0+YXJnID0gYXJnOwogIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIDAsIHB0aHJlYWRfdGhyZWFkX3N0YXJ0LCBpZGF0YSwgMCwgKExQRFdPUkQpdGhyZWFkKTsKCiAgaWYoaFRocmVhZCkKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIGVsc2UKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaWRhdGEpOyAvKiBmcmVlIGlkYXRhIHN0cnVjdCBvbiBmYWlsdXJlICovCiAgICByZXR1cm4gRUFHQUlOOwogIH0KCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgKERXT1JEKXRocmVhZCk7CgogIGlmKCFUZXJtaW5hdGVUaHJlYWQoaFRocmVhZCwgMCkpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAgICAgIC8qIHJldHVybiBlcnJvciAqLwogIH0KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CgogIHJldHVybiAwOyAgICAgICAgICAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CiAgaWYoIUdldEV4aXRDb2RlVGhyZWFkKGhUaHJlYWQsIChMUERXT1JEKXZhbHVlX3B0cikpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAvKiBGSVhNRTogbWFrZSB0aGlzIG1vcmUgY29ycmVjdGx5IG1hdGNoICovCiAgfSAgICAgICAgICAgICAgICAvKiB3aW5kb3dzIGVycm9ycyAqLwoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICByZXR1cm4gMDsKfQoKLypGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMgb25lLi4uICovCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfZGV0YWNoXG4iKTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1VVEVYRVMgKioqKiovCgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgLyogZ2xpYmMgaGFzIGEgdGVuZGVuY3kgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIHZlcnkgb2Z0ZW4sIGV2ZW4KICAgICBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXkgYXJlIG5vdCByZWFsbHkgdXNlZCBsYXRlciBvbi4KCiAgICAgQXMgZm9yIHVzLCBpbml0aWFsaXppbmcgYSBtdXRleCBpcyB2ZXJ5IGV4cGVuc2l2ZSwgd2UgcG9zdHBvbmUKICAgICB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdGltZSB0aGUgbXV0ZXggaXMgZmlyc3QgdXNlZC4gKi8KCiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBtdXRleF9yZWFsX2luaXQoIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggKQp7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNyaXRzZWN0KTsKICB9Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFSdGxUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXQgPSAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdDsKCiAgICBpZiAoIWNyaXQpIHJldHVybiAwOwogICAgaWYgKGNyaXQtPk93bmluZ1RocmVhZCAhPSAoSEFORExFKUdldEN1cnJlbnRUaHJlYWRJZCgpKSByZXR1cm4gRVBFUk07CiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiggY3JpdCApOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIHJldHVybiAwOwogIGlmICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpIHsKI2lmIDAgLyogdGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gbGliYzYgdGhhdCBtYWtlcyB0aGlzIGEgYmFkIGlkZWEgKi8KICAgIHJldHVybiBFQlVTWTsKI2Vsc2UKICAgIHdoaWxlICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpCiAgICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKI2VuZGlmCiAgfQogIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ID0gTlVMTDsKICByZXR1cm4gMDsKfQoKLyoqKioqIFJFQUQtV1JJVEUgTE9DS1MgKioqKiovCgpzdGF0aWMgdm9pZCByd2xvY2tfcmVhbF9pbml0KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIFJUTF9SV0xPQ0sgKmxvY2sgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKFJUTF9SV0xPQ0spKTsKICBSdGxJbml0aWFsaXplUmVzb3VyY2UobG9jayk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoKHZvaWQqKikmKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayksbG9jayxOVUxMKSAhPSBOVUxMKSB7CiAgICAvKiB0b28gbGF0ZSwgc29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBkaWQgaXQgKi8KICAgIFJ0bERlbGV0ZVJlc291cmNlKGxvY2spOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbG9jayk7CiAgfQp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2ssIGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICpyd2xvY2tfYXR0cikKewogICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja19kZXN0cm95KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxEZWxldGVSZXNvdXJjZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgd2hpbGUoVFJVRSkKICAgIGlmIChSdGxBY3F1aXJlUmVzb3VyY2VTaGFyZWQoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBUUlVFKSkKICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VTaGFyZWQoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICBpZiAoIVJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIEZBTFNFKSkgcmV0dXJuIEVCVVNZOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfdW5sb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSByZXR1cm4gMDsKICBSdGxSZWxlYXNlUmVzb3VyY2UoICgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayApOwogIHJldHVybiAwOwp9CgovKioqKiogQ09ORElUSU9OUyAqKioqKi8KCi8qIFRoZSBjb25kaXRpb24gY29kZSBpcyBiYXNpY2FsbHkgY3V0LWFuZC1wYXN0ZWQgZnJvbSBEb3VnbGFzCiAqIFNjaG1pZHQncyBwYXBlcjoKICogICAiU3RyYXRlZ2llcyBmb3IgSW1wbGVtZW50aW5nIFBPU0lYIENvbmRpdGlvbiBWYXJpYWJsZXMgb24gV2luMzIiLAogKiBhdCBodHRwOi8vd3d3LmNzLnd1c3RsLmVkdS9+c2NobWlkdC93aW4zMi1jdi0xLmh0bWwgYW5kCiAqIGh0dHA6Ly93d3cuY3Mud3VzdGwuZWR1L35zY2htaWR0L3dpbjMyLWN2LTIuaHRtbC4KICogVGhpcyBwYXBlciBmb3JtZWQgdGhlIGJhc2lzIGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCiAqIGltcGVtZW50YXRpb24gdXNlZCBpbiB0aGUgQUNFIGxpYnJhcnkuCiAqLwoKLyogUG9zc2libGUgcHJvYmxlbXMgd2l0aCBBQ0U6CiAqIC0gdW5pbXBsZW1lbnRlZCBwdGhyZWFkX211dGV4YXR0cl9pbml0CiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgLyogTnVtYmVyIG9mIHdhaXRpbmcgdGhyZWFkcy4gKi8KICBpbnQgd2FpdGVyc19jb3VudDsKCiAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudD4uICovCiAgQ1JJVElDQUxfU0VDVElPTiB3YWl0ZXJzX2NvdW50X2xvY2s7CgogIC8qCiAgICogU2VtYXBob3JlIHVzZWQgdG8gcXVldWUgdXAgdGhyZWFkcyB3YWl0aW5nIGZvciB0aGUgY29uZGl0aW9uIHRvCiAgICogYmVjb21lIHNpZ25hbGVkLgogICAqLwogIEhBTkRMRSBzZW1hOwoKICAvKgogICAqIEFuIGF1dG8tcmVzZXQgZXZlbnQgdXNlZCBieSB0aGUgYnJvYWRjYXN0L3NpZ25hbCB0aHJlYWQgdG8gd2FpdAogICAqIGZvciBhbGwgdGhlIHdhaXRpbmcgdGhyZWFkKHMpIHRvIHdha2UgdXAgYW5kIGJlIHJlbGVhc2VkIGZyb20gdGhlCiAgICogc2VtYXBob3JlLgogICAqLwogIEhBTkRMRSB3YWl0ZXJzX2RvbmU7CgogIC8qCiAgICogS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB3ZSB3ZXJlIGJyb2FkY2FzdGluZyBvciBzaWduYWxpbmcuICBUaGlzCiAgICogYWxsb3dzIHVzIHRvIG9wdGltaXplIHRoZSBjb2RlIGlmIHdlJ3JlIGp1c3Qgc2lnbmFsaW5nLgogICAqLwogIHNpemVfdCB3YXNfYnJvYWRjYXN0Owp9IHdpbmVfY29uZF9kZXRhaWw7CgovKiBzZWUgd2luZV9tdXRleCBhYm92ZSBmb3IgY29tbWVudHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewogIHdpbmVfY29uZF9kZXRhaWwgKmNvbmQ7Cn0gKndpbmVfY29uZDsKCnN0YXRpYyB2b2lkIHdpbmVfY29uZF9yZWFsX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWwgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHdpbmVfY29uZF9kZXRhaWwpKTsKICBkZXRhaWwtPndhaXRlcnNfY291bnQgPSAwOwogIGRldGFpbC0+d2FzX2Jyb2FkY2FzdCA9IDA7CiAgZGV0YWlsLT5zZW1hID0gQ3JlYXRlU2VtYXBob3JlVyggTlVMTCwgMCwgMHg3ZmZmZmZmZiwgTlVMTCApOwogIGRldGFpbC0+d2FpdGVyc19kb25lID0gQ3JlYXRlRXZlbnRXKCBOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwgKTsKICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfY29uZCljb25kKS0+Y29uZCksIGRldGFpbCwgTlVMTCkgIT0gTlVMTCkKICB7CiAgICAvKiB0b28gbGF0ZSwgc29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBkaWQgaXQgKi8KICAgIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfaW5pdDpleHBlY3QgdHJvdWJsZXMuLi5cbiIpOwogICAgQ2xvc2VIYW5kbGUoZGV0YWlsLT5zZW1hKTsKICAgIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogICAgQ2xvc2VIYW5kbGUoZGV0YWlsLT53YWl0ZXJzX2RvbmUpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV0YWlsKTsKICB9Cn0KCmludCB3aW5lX3B0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKmNvbmRfYXR0cikKewogIC8qIFRoZSBzYW1lIGFzIGZvciB3aW5lX3B0aHJlYWRfbXV0ZXhfaW5pdCwgd2UgcG9zdHBvbmUgaW5pdGlhbGl6YXRpb24KICAgICB1bnRpbCBjb25kaXRpb24gaXMgcmVhbGx5IHVzZWQuKi8KICAoKHdpbmVfY29uZCljb25kKS0+Y29uZCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCmludCB3aW5lX3B0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgd2luZV9jb25kX2RldGFpbCAqZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIGlmICghZGV0YWlsKSByZXR1cm4gMDsKICBDbG9zZUhhbmRsZShkZXRhaWwtPnNlbWEpOwogIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIENsb3NlSGFuZGxlKGRldGFpbC0+d2FpdGVyc19kb25lKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXRhaWwpOwogICgod2luZV9jb25kKWNvbmQpLT5jb25kID0gTlVMTDsKICByZXR1cm4gMDsKfQoKaW50IHdpbmVfcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIGludCBoYXZlX3dhaXRlcnM7CiAgd2luZV9jb25kX2RldGFpbCAqZGV0YWlsOwoKICBpZiAoICEoKHdpbmVfY29uZCljb25kKS0+Y29uZCApIHdpbmVfY29uZF9yZWFsX2luaXQoY29uZCk7CiAgZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIGhhdmVfd2FpdGVycyA9IGRldGFpbC0+d2FpdGVyc19jb3VudCA+IDA7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgd2FpdGVycywgdGhlbiB0aGlzIGlzIGEgbm8tb3AuICovCiAgaWYgKGhhdmVfd2FpdGVycykKICAgIFJlbGVhc2VTZW1hcGhvcmUoZGV0YWlsLT5zZW1hLCAxLCBOVUxMKTsKCiAgcmV0dXJuIDA7Cn0KCmludCB3aW5lX3B0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBpbnQgaGF2ZV93YWl0ZXJzID0gMDsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgLyoKICAgKiBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCA8d2FpdGVyc19jb3VudD4gYW5kIDx3YXNfYnJvYWRjYXN0PiBhcmUKICAgKiBjb25zaXN0ZW50IHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCiAgICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIGlmIChkZXRhaWwtPndhaXRlcnNfY291bnQgPiAwKSB7CiAgICAvKgogICAgICogV2UgYXJlIGJyb2FkY2FzdGluZywgZXZlbiBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3YWl0ZXIuLi4KICAgICAqIFJlY29yZCB0aGF0IHdlIGFyZSBicm9hZGNhc3RpbmcsIHdoaWNoIGhlbHBzIG9wdGltaXplCiAgICAgKiA8cHRocmVhZF9jb25kX3dhaXQ+IGZvciB0aGUgbm9uLWJyb2FkY2FzdCBjYXNlLgogICAgICovCiAgICBkZXRhaWwtPndhc19icm9hZGNhc3QgPSAxOwogICAgaGF2ZV93YWl0ZXJzID0gMTsKICB9CgogIGlmIChoYXZlX3dhaXRlcnMpIHsKICAgIC8qIFdha2UgdXAgYWxsIHRoZSB3YWl0ZXJzIGF0b21pY2FsbHkuICovCiAgICBSZWxlYXNlU2VtYXBob3JlKGRldGFpbC0+c2VtYSwgZGV0YWlsLT53YWl0ZXJzX2NvdW50LCBOVUxMKTsKCiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgICAvKiBXYWl0IGZvciBhbGwgdGhlIGF3YWtlbmVkIHRocmVhZHMgdG8gYWNxdWlyZSB0aGUgY291bnRpbmcgc2VtYXBob3JlLiAqLwogICAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT53YWl0ZXJzX2RvbmUsIElORklOSVRFKTsKCiAgICAvKgogICAgICogVGhpcyBhc3NpZ25tZW50IGlzIG9rYXksIGV2ZW4gd2l0aG91dCB0aGUgPHdhaXRlcnNfY291bnRfbG9jaz4gaGVsZAogICAgICogYmVjYXVzZSBubyBvdGhlciB3YWl0ZXIgdGhyZWFkcyBjYW4gd2FrZSB1cCB0byBhY2Nlc3MgaXQuCiAgICAgKi8KICAgIGRldGFpbC0+d2FzX2Jyb2FkY2FzdCA9IDA7CiAgfQogIGVsc2UKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIHJldHVybiAwOwp9CgppbnQgd2luZV9wdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKICBpbnQgbGFzdF93YWl0ZXI7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgLyogQXZvaWQgcmFjZSBjb25kaXRpb25zLiAqLwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIGRldGFpbC0+d2FpdGVyc19jb3VudCsrOwogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ICk7CiAgV2FpdEZvclNpbmdsZU9iamVjdChkZXRhaWwtPnNlbWEsIElORklOSVRFKTsKCiAgLyogUmVhY3F1aXJlIGxvY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLiAqLwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKiBXZSdyZSBubyBsb25nZXIgd2FpdGluZy4uLiAqLwogIGRldGFpbC0+d2FpdGVyc19jb3VudC0tOwoKICAvKiBDaGVjayB0byBzZWUgaWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIGFmdGVyIDxwdGhyZWFkX2NvbmRfYnJvYWRjYXN0Pi4gKi8KICBsYXN0X3dhaXRlciA9IGRldGFpbC0+d2FzX2Jyb2FkY2FzdCAmJiBkZXRhaWwtPndhaXRlcnNfY291bnQgPT0gMDsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIC8qCiAgICogSWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRocmVhZCBkdXJpbmcgdGhpcyBwYXJ0aWN1bGFyIGJyb2FkY2FzdAogICAqIHRoZW4gbGV0IGFsbCB0aGUgb3RoZXIgdGhyZWFkcyBwcm9jZWVkLgogICAqLwogIGlmIChsYXN0X3dhaXRlcikgU2V0RXZlbnQoZGV0YWlsLT53YWl0ZXJzX2RvbmUpOwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0KCmludCB3aW5lX3B0aHJlYWRfY29uZF90aW1lZHdhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQp7CiAgRFdPUkQgbXMgPSBhYnN0aW1lLT50dl9zZWMgKiAxMDAwICsgYWJzdGltZS0+dHZfbnNlYyAvIDEwMDAwMDA7CiAgaW50IGxhc3Rfd2FpdGVyOwogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKCiAgaWYgKCAhKCh3aW5lX2NvbmQpY29uZCktPmNvbmQgKSB3aW5lX2NvbmRfcmVhbF9pbml0KGNvbmQpOwogIGRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICAvKiBBdm9pZCByYWNlIGNvbmRpdGlvbnMuICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgZGV0YWlsLT53YWl0ZXJzX2NvdW50Kys7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT5zZW1hLCBtcyk7CgogIC8qIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogV2UncmUgbm8gbG9uZ2VyIHdhaXRpbmcuLi4gKi8KICBkZXRhaWwtPndhaXRlcnNfY291bnQtLTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciBhZnRlciA8cHRocmVhZF9jb25kX2Jyb2FkY2FzdD4uICovCiAgbGFzdF93YWl0ZXIgPSBkZXRhaWwtPndhc19icm9hZGNhc3QgJiYgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID09IDA7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKgogICAqIElmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0aHJlYWQgZHVyaW5nIHRoaXMgcGFydGljdWxhciBicm9hZGNhc3QKICAgKiB0aGVuIGxldCBhbGwgdGhlIG90aGVyIHRocmVhZHMgcHJvY2VlZC4KICAgKi8KICBpZiAobGFzdF93YWl0ZXIpIFNldEV2ZW50IChkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1JU0MgKioqKiovCgpzdGF0aWMgcHRocmVhZF90IHdpbmVfcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9CgpzdGF0aWMgdm9pZCB3aW5lX3B0aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSkKewogICAgRXhpdFRocmVhZCgoRFdPUkQpcmV0dmFsKTsKfQoKc3RhdGljIHZvaWQgKndpbmVfZ2V0X3RocmVhZF9kYXRhKHZvaWQpCnsKICAgIHJldHVybiBOdEN1cnJlbnRUZWIoKS0+cHRocmVhZF9kYXRhOwp9CgpzdGF0aWMgdm9pZCB3aW5lX3NldF90aHJlYWRfZGF0YSggdm9pZCAqZGF0YSApCnsKICAgIE50Q3VycmVudFRlYigpLT5wdGhyZWFkX2RhdGEgPSBkYXRhOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHdpbmVfcHRocmVhZF9mdW5jdGlvbnMgZnVuY3Rpb25zID0KewogICAgc2l6ZW9mKGZ1bmN0aW9ucyksICAgICAgICAgICAgICAvKiBzaXplICovCiAgICB3aW5lX2dldF90aHJlYWRfZGF0YSwgICAgICAgICAgIC8qIHB0cl9nZXRfdGhyZWFkX2RhdGEgKi8KICAgIHdpbmVfc2V0X3RocmVhZF9kYXRhLCAgICAgICAgICAgLyogcHRyX3NldF90aHJlYWRfZGF0YSAqLwogICAgd2luZV9wdGhyZWFkX3NlbGYsICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZWxmICovCiAgICB3aW5lX3B0aHJlYWRfZXF1YWwsICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2VxdWFsICovCiAgICB3aW5lX3B0aHJlYWRfY3JlYXRlLCAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NyZWF0ZSAqLwogICAgd2luZV9wdGhyZWFkX2NhbmNlbCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9jYW5jZWwgKi8KICAgIHdpbmVfcHRocmVhZF9qb2luLCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfam9pbiAqLwogICAgd2luZV9wdGhyZWFkX2RldGFjaCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9kZXRhY2ggKi8KICAgIHdpbmVfcHRocmVhZF9leGl0LCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXhpdCAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X2luaXQsICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfbG9jaywgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2xvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF90cnlsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF91bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95LCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19pbml0LCAgICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfaW5pdCAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19kZXN0cm95LCAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19yZGxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfcmRsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3VubG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja191bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX2luaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfY29uZF9kZXN0cm95LCAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfc2lnbmFsLCAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3NpZ25hbCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCAgICAvKiBwdHJfcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfd2FpdCwgICAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3dhaXQgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX3RpbWVkd2FpdCAgICAgLyogcHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQgKi8KfTsKCnZvaWQgUFRIUkVBRF9Jbml0KHZvaWQpCnsKICAgIHdpbmVfcHRocmVhZF9pbml0X3Byb2Nlc3MoICZmdW5jdGlvbnMgKTsKfQoKI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9IICovCg==