LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmg3eHhfaGFsX2NyeXBfZXguYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEV4dGVuZGVkIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIKICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBDUllQIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgogICogICAgICAgICAgICsgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCiAgKgogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICBUaGUgQ1JZUCBleHRlbnNpb24gSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhZnRlciBBRVMtR0NNIG9yIEFFUy1DQ00KICAgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiB0byBnZXQgdGhlIGF1dGhlbnRpY2F0aW9uIG1lc3NhZ2VzLgoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJoN3h4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMySDd4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCiNpZiBkZWZpbmVkIChDUllQKQovKiogQGRlZmdyb3VwIENSWVBFeCBDUllQRXgKICAqIEBicmllZiBDUllQIEV4dGVuc2lvbiBIQUwgbW9kdWxlIGRyaXZlci4KICAqIEB7CiAgKi8KCiNpZmRlZiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRAoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyoqIEBhZGR0b2dyb3VwIENSWVBFeF9Qcml2YXRlX0RlZmluZXMKICAqIEB7CiAgKi8KCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMAojZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMQojZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEgKCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgQ1JZUF9DUl9BTEdPRElSCgojZGVmaW5lICBDUllQRXhfUEhBU0VfUFJPQ0VTUyAgICAgICAweDAyVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gcHJvY2Vzc2luZyBwaGFzZSAqLwojZGVmaW5lICBDUllQRXhfUEhBU0VfRklOQUwgICAgICAgICAweDAzVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gZmluYWwgcGhhc2UgdGhpcyBpcyByZWxldmFudCBvbmx5IHdpdGggQ0NNIGFuZCBHQ00gbW9kZXMgKi8KCi8qICBDVFIwIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCiNkZWZpbmUgQ1JZUF9DQ01fQ1RSMF8wICAgICAgICAgICAgMHgwN0ZGRkZGRlUKI2RlZmluZSBDUllQX0NDTV9DVFIwXzMgICAgICAgICAgICAweEZGRkZGRjAwVQoKLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgovKiBFeHBvcnRlZCBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucwogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgQ1JZUEV4IEV4dGVuZGVkIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgIyMjIyMgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGdlbmVyYXRlIHRoZSBhdXRoZW50aWNhdGlvbgogICAgICAgICAgVEFHIGluIFBvbGxpbmcgbW9kZQogICAgICAoKylIQUxfQ1JZUEV4X0FFU0dDTV9HZW5lcmF0ZUF1dGhUQUcKICAgICAgKCspSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICAgIHRoZXkgc2hvdWxkIGJlIHVzZWQgYWZ0ZXIgRW5jcnlwdC9EZWNyeXB0IG9wZXJhdGlvbi4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKCi8qKgogICogQGJyaWVmICBnZW5lcmF0ZSB0aGUgR0NNIGF1dGhlbnRpY2F0aW9uIFRBRy4KICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIEF1dGhUYWc6IFBvaW50ZXIgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIGJ1ZmZlcgogICogICAgICAgICB0aGUgQXV0aFRhZyBnZW5lcmF0ZWQgaGVyZSBpcyAxMjhiaXRzIGxlbmd0aCwgaWYgdGhlIFRBRyBsZW5ndGggaXMgCiAgKiAgICAgICAgIGxlc3MgdGhhbiAxMjhiaXRzLCB1c2VyIHNob3VsZCBjb25zaWRlciBvbmx5IHRoZSB2YWxpZCBwYXJ0IG9mIEF1dGhUYWcKICAqICAgICAgICAgYnVmZmVyIHdoaWNoIGNvcnJlc3BvbmQgZXhhY3RseSB0byBUQUcgbGVuZ3RoLiAgCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRpY2tzdGFydDsKICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpICogMzJVOyAvKiBIZWFkZXIgbGVuZ3RoIGluIGJpdHMgKi8KICB1aW50NjRfdCBpbnB1dGxlbmd0aCA9ICh1aW50NjRfdCloY3J5cC0+U2l6ZXNTdW0gKiA4VTsgLyogSW5wdXQgbGVuZ3RoIGluIGJpdHMgKi8KICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CgogICAvKiBDb3JyZWN0IGhlYWRlciBsZW5ndGggaWYgSW5pdC5IZWFkZXJTaXplIGlzIGFjdHVhbGx5IGluIGJ5dGVzICovCiAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlcldpZHRoVW5pdCA9PSBDUllQX0hFQURFUldJRFRIVU5JVF9CWVRFKQogIHsKICAgIGhlYWRlcmxlbmd0aCAvPSA0VTsKICB9CgogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaGNyeXApOwoKICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwoKICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCiAgICBpZiAoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQogICAgewogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGhhc2UgKi8KICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUEV4X1BIQVNFX0ZJTkFMOwogICAgfQogICAgZWxzZSAvKiBJbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkKi8KICAgIHsKICAgICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0FVVEhfVEFHX1NFUVVFTkNFOwoKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICB9CgogICAgLyogRGlzYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOwoKICAgIC8qQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiovCiAgICBoY3J5cC0+SW5zdGFuY2UtPkNSICY9ICB+Q1JZUF9DUl9BTEdPRElSOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLyogV3JpdGUgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzCiAgICBpbiB0aGUgcGF5bG9hZCAqLwojaWYgIWRlZmluZWQgKENSWVBfVkVSXzJfMikKICAgIC8qIFNUTTMySDcgcmV2LkIgYW5kIGFib3ZlIDogZGF0YSBoYXMgdG8gYmUgaW5zZXJ0ZWQgbm9ybWFsbHkgKG5vIHN3YXBwaW5nKSovCiAgICBpZiAoaGNyeXAtPlZlcnNpb24gPj0gUkVWX0lEX0IpCiNlbmRpZiAvKkVuZCBvZiBub3QgZGVmaW5lZCBDUllQX1ZFUl8yXzIqLwogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAodWludDMyX3QpKGlucHV0bGVuZ3RoKTsKICAgIH0KI2lmICFkZWZpbmVkIChDUllQX1ZFUl8yXzIpCiAgICBlbHNlLyogZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBhY2NvcmRpbmcgdG8gdGhlIERBVEFUWVBFICovCiAgICB7CiAgICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgICB7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdCloZWFkZXJsZW5ndGgsIDE2VSk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdClpbnB1dGxlbmd0aCwgMTZVKTsKICAgICAgfQogICAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzMyQikKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAodWludDMyX3QpKGhlYWRlcmxlbmd0aCk7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaW5wdXRsZW5ndGgpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICAgfQogICAgfQojZW5kaWYgLypFbmQgb2Ygbm90IGRlZmluZWQgQ1JZUF9WRVJfMl8yKi8KICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CgogICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBBRVMgQ0NNIEF1dGhlbnRpY2F0aW9uIFRBRyBnZW5lcmF0aW9uLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgQXV0aFRhZzogUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCiAgKiAgICAgICAgIHRoZSBBdXRoVGFnIGdlbmVyYXRlZCBoZXJlIGlzIDEyOGJpdHMgbGVuZ3RoLCBpZiB0aGUgVEFHIGxlbmd0aCBpcyAKICAqICAgICAgICAgbGVzcyB0aGFuIDEyOGJpdHMsIHVzZXIgc2hvdWxkIGNvbnNpZGVyIG9ubHkgdGhlIHZhbGlkIHBhcnQgb2YgQXV0aFRhZwogICogICAgICAgICBidWZmZXIgd2hpY2ggY29ycmVzcG9uZCBleGFjdGx5IHRvIFRBRyBsZW5ndGguICAKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGFnYWRkciA9ICh1aW50MzJfdClBdXRoVGFnOwogIHVpbnQzMl90IGN0cjAgWzRdID0gezB9OwogIHVpbnQzMl90IGN0cjBhZGRyID0gKHVpbnQzMl90KWN0cjA7CiAgdWludDMyX3QgdGlja3N0YXJ0OwoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLwogICAgaWYgKGhjcnlwLT5QaGFzZSA9PSBDUllQRXhfUEhBU0VfUFJPQ0VTUykKICAgIHsKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBFeF9QSEFTRV9GSU5BTDsKICAgIH0KICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCiAgICB7CiAgICAgIC8qIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgIC8qIFNlcXVlbmNlIGVycm9yIGNvZGUgZmllbGQgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsKCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQoKICAgIC8qIERpc2FibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICYgQUxHT0RJUiBiaXQgbXVzdCBiZSBzZXQgdG8gkTCSLiAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCB8IENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9QSEFTRV9GSU5BTCB8IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKCiAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwoKICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgIGRhdGEgaGFzIHRvIGJlIHN3YXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBEQVRBVFlQRSovCiAgICBjdHIwWzBdID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMDsKICAgIGN0cjBbMV0gPSBoY3J5cC0+SW5pdC5CMFsxXTsKICAgIGN0cjBbMl0gPSBoY3J5cC0+SW5pdC5CMFsyXTsKICAgIGN0cjBbM10gPSBoY3J5cC0+SW5pdC5CMFszXSAmICBDUllQX0NDTV9DVFIwXzM7CgojaWYgIWRlZmluZWQgKENSWVBfVkVSXzJfMikKICAgIC8qU1RNMzJINyByZXYuQiBhbmQgYWJvdmUgOiBkYXRhIGhhcyB0byBiZSBpbnNlcnRlZCBub3JtYWxseSAobm8gc3dhcHBpbmcpKi8KICAgIGlmIChoY3J5cC0+VmVyc2lvbiA+PSBSRVZfSURfQikKI2VuZGlmIC8qRW5kIG9mIG5vdCBkZWZpbmVkIENSWVBfVkVSXzJfMiovCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICB9CiNpZiAhZGVmaW5lZCAoQ1JZUF9WRVJfMl8yKQogICAgZWxzZSAvKiBkYXRhIGhhcyB0byBiZSBzd2FwcGVkIGFjY29yZGluZyB0byB0aGUgREFUQVRZUEUgKi8KICAgIHsKICAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgfQogICAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgICAgewogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICB9CiAgICB9CiNlbmRpZiAvKkVuZCBvZiBub3QgZGVmaW5lZCBDUllQX1ZFUl8yXzIqLwogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICB7CiAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIENsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogUmVhZCB0aGUgQXV0aCBUQUcgaW4gdGhlIElOIEZJRk8gKi8KICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgogICAgLyogRGlzYWJsZSBDUllQICAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAfQogICovCgoKI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCgovKioKICAqIEB9CiAgKi8KI2VuZGlmIC8qIENSWVAgKi8KLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K