LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmwweHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgV1dERyBTcGVjaWZpYyBmZWF0dXJlcyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBnZW5lcmF0ZXMgYSBzeXN0ZW0gcmVzZXQgb24gZXhwaXJ5IG9mIGEgcHJvZ3JhbW1lZAogICAgdGltZSBwZXJpb2QsIHVubGVzcyB0aGUgcHJvZ3JhbSByZWZyZXNoZXMgdGhlIGNvdW50ZXIgKFRbNjswXSBkb3duY291bnRlcikKICAgIGJlZm9yZSByZWFjaGluZyAweDNGIHZhbHVlIChpLmUuIGEgcmVzZXQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIKICAgIHZhbHVlIHJvbGxzIGRvd24gZnJvbSAweDQwIHRvIDB4M0YpLgoKICAgICgrKSBBbiBNQ1UgcmVzZXQgaXMgYWxzbyBnZW5lcmF0ZWQgaWYgdGhlIGNvdW50ZXIgdmFsdWUgaXMgcmVmcmVzaGVkCiAgICAgICAgYmVmb3JlIHRoZSBjb3VudGVyIGhhcyByZWFjaGVkIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZS4gVGhpcwogICAgICAgIGltcGxpZXMgdGhhdCB0aGUgY291bnRlciBtdXN0IGJlIHJlZnJlc2hlZCBpbiBhIGxpbWl0ZWQgd2luZG93LgogICAgKCspIE9uY2UgZW5hYmxlZCB0aGUgV1dERyBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIFdXREdSU1QgZmxhZyBpbiBSQ0MgQ1NSIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIHRvIGluZm9ybSB3aGVuIGEgV1dERwogICAgICAgIHJlc2V0IG9jY3Vycy4KICAgICgrKSBUaGUgV1dERyBjb3VudGVyIGlucHV0IGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUgQVBCIGNsb2NrIGRpdmlkZWQKICAgICAgICBieSBhIHByb2dyYW1tYWJsZSBwcmVzY2FsZXIuCiAgICAoKykgV1dERyBjbG9jayAoSHopID0gUENMSzEgLyAoNDA5NiAqIFByZXNjYWxlcikKICAgICgrKSBXV0RHIHRpbWVvdXQgKG1TKSA9IDEwMDAgKiAoVFs1OzBdICsgMSkgLyBXV0RHIGNsb2NrIChIeikKICAgICAgICB3aGVyZSBUWzU7MF0gYXJlIHRoZSBsb3dlc3QgNiBiaXRzIG9mIENvdW50ZXIuCiAgICAoKykgV1dERyBDb3VudGVyIHJlZnJlc2ggaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSBmb2xsb3dpbmcgbGltaXRzIDoKICAgICAgICAoKyspIG1pbiB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSBXaW5kb3cpIC8gV1dERyBjbG9jawogICAgICAgICgrKykgbWF4IHRpbWUgKG1TKSA9IDEwMDAgKiAoQ291bnRlciAtIDB4NDApIC8gV1dERyBjbG9jawogICAgKCspIFR5cGljYWwgdmFsdWVzOgogICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA1NiBNSHooUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CiAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IH43My4xNCC1cwogICAgICAgICgrKykgQ291bnRlciBtYXggKFRbNTswXSA9IDB4M0YpIEA1NiBNSHooUENMSzEpIHdpdGggcHJlc2NhbGVyIGRpdmlkaW5nIGJ5IDEyODoKICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogfjU5OS4xOCBtcwoKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgICoqKiBDb21tb24gZHJpdmVyIHVzYWdlICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAoKykgRW5hYmxlIFdXREcgQVBCMSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFKCkuCiAgICAoKykgU2V0IHRoZSBXV0RHIHByZXNjYWxlciwgcmVmcmVzaCB3aW5kb3cgYW5kIGNvdW50ZXIgdmFsdWUKICAgICAgICB1c2luZyBIQUxfV1dER19Jbml0KCkgZnVuY3Rpb24uCiAgICAoKykgU3RhcnQgdGhlIFdXREcgdXNpbmcgSEFMX1dXREdfU3RhcnQoKSBmdW5jdGlvbi4KICAgICAgICBXaGVuIHRoZSBXV0RHIGlzIGVuYWJsZWQgdGhlIGNvdW50ZXIgdmFsdWUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgdG8KICAgICAgICBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAweDQwIHRvIHByZXZlbnQgZ2VuZXJhdGluZyBhbiBpbW1lZGlhdGUgcmVzZXQuCiAgICAoKykgT3B0aW9uYWxseSB5b3UgY2FuIGVuYWJsZSB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSB3aGljaCBpcwogICAgICAgIGdlbmVyYXRlZCB3aGVuIHRoZSBjb3VudGVyIHJlYWNoZXMgMHg0MCwgYW5kIHRoZW4gc3RhcnQgdGhlIFdXREcgdXNpbmcKICAgICAgICBIQUxfV1dER19TdGFydF9JVCgpLiBBdCBFV0kgSEFMX1dXREdfV2FrZXVwQ2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCiAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGNhbGxiYWNrIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrLgogICAgICAgIE9uY2UgZW5hYmxlZCwgRVdJIGludGVycnVwdCBjYW5ub3QgYmUgZGlzYWJsZWQgZXhjZXB0IGJ5IGEgc3lzdGVtIHJlc2V0LgogICAgKCspIFRoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gbXVzdCByZWZyZXNoIHRoZSBXV0RHIGNvdW50ZXIgYXQgcmVndWxhcgogICAgICAgIGludGVydmFscyBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiB0byBwcmV2ZW50IGFuIE1DVSByZXNldCwgdXNpbmcKICAgICAgICBIQUxfV1dER19SZWZyZXNoKCkgZnVuY3Rpb24uIFRoaXMgb3BlcmF0aW9uIG11c3Qgb2NjdXIgb25seSB3aGVuCiAgICAgICAgdGhlIGNvdW50ZXIgaXMgbG93ZXIgdGhhbiB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUgYWxyZWFkeSBwcm9ncmFtbWVkLgoKICBbLi5dCiAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMSBhbGxvd3MKICAgIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4gVXNlIEZ1bmN0aW9ucwogICAgQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgoKICAgICgrKSBGdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nCiAgICAgICAgY2FsbGJhY2tzOgogICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgRWFybHkgV2FrZVVwIEludGVycnVwdC4KICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCgogICAgKCspIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KICAgIHRoZSBkZWZhdWx0IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpCiAgICB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUgYW5kIHRoZSBDYWxsYmFjayBJRC4KICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAgKCsrKSBFd2lDYWxsYmFjayA6IGNhbGxiYWNrIGZvciAgRWFybHkgV2FrZVVwIEludGVycnVwdC4KICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KCiAgICBXaGVuIGNhbGxpbmcgQHJlZiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uLCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZQogICAgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOiAKICAgIEByZWYgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjaygpIGFuZCBIQUxfV1dER19Nc3BJbml0KCkgb25seSBpZiB0aGV5IGhhdmUKICAgIG5vdCBiZWVuIHJlZ2lzdGVyZWQgYmVmb3JlLgoKICAgIFdoZW4gY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIAogICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KCiAgICAqKiogV1dERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBXV0RHIEhBTCBkcml2ZXIuCiAgICAgICgrKSBfX0hBTF9XV0RHX0VOQUJMRTogRW5hYmxlIHRoZSBXV0RHIHBlcmlwaGVyYWwKICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0ZMQUc6IEdldCB0aGUgc2VsZWN0ZWQgV1dERydzIGZsYWcgc3RhdHVzCiAgICAgICgrKSBfX0hBTF9XV0RHX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBXV0RHJ3MgcGVuZGluZyBmbGFncwogICAgICAoKykgX19IQUxfV1dER19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgV1dERyBlYXJseSB3YWtldXAgaW50ZXJydXB0CgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJzdG0zMmwweHhfaGFsLmgiCgovKiogQGFkZHRvZ3JvdXAgU1RNMzJMMHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCiNpZmRlZiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRAovKiogQGRlZmdyb3VwIFdXREcgV1dERwogICogQGJyaWVmIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9ucyBXV0RHIEV4cG9ydGVkIEZ1bmN0aW9ucwogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgogKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAgICgrKSBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgICAgICBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KICAgICAgKCspIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZC4KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiAgYXNzb2NpYXRlZCBoYW5kbGUuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIENoZWNrIHRoZSBXV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGh3d2RnID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQUxMX0lOU1RBTkNFKGh3d2RnLT5JbnN0YW5jZSkpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX1BSRVNDQUxFUihod3dkZy0+SW5pdC5QcmVzY2FsZXIpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19XSU5ET1coaHd3ZGctPkluaXQuV2luZG93KSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihod3dkZy0+SW5pdC5Db3VudGVyKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfRVdJX01PREUoaHd3ZGctPkluaXQuRVdJTW9kZSkpOwoKI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgKi8KICBpZihod3dkZy0+RXdpQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogIH0KCiAgaWYoaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OwogIH0KCiAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayhod3dkZyk7CiNlbHNlCiAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgSEFMX1dXREdfTXNwSW5pdChod3dkZyk7CiNlbmRpZgoKICAvKiBTZXQgV1dERyBDb3VudGVyICovCiAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q1IsIChXV0RHX0NSX1dER0EgfCBod3dkZy0+SW5pdC5Db3VudGVyKSk7CgogIC8qIFNldCBXV0RHIFByZXNjYWxlciBhbmQgV2luZG93ICovCiAgV1JJVEVfUkVHKGh3d2RnLT5JbnN0YW5jZS0+Q0ZSLCAoaHd3ZGctPkluaXQuRVdJTW9kZSB8IGh3d2RnLT5Jbml0LlByZXNjYWxlciB8IGh3d2RnLT5Jbml0LldpbmRvdykpOwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKCi8qKgogICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBXV0RHIE1TUC4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQG5vdGUgICBXaGVuIHJld3JpdGluZyB0aGlzIGZ1bmN0aW9uIGluIHVzZXIgZmlsZSwgbWVjaGFuaXNtIG1heSBiZSBhZGRlZAogICogICAgICAgICB0byBhdm9pZCBtdWx0aXBsZSBpbml0aWFsaXplIHdoZW4gSEFMX1dXREdfSW5pdCBmdW5jdGlvbiBpcyBjYWxsZWQKICAqICAgICAgICAgYWdhaW4gdG8gY2hhbmdlIHBhcmFtZXRlcnMuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfV1dER19Nc3BJbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGh3d2RnKTsKCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgdGhlIEhBTF9XV0RHX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgoKI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi8qKgogICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgV1dERyBDYWxsYmFjawogICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKICAqIEBwYXJhbSAgaHd3ZGcgV1dERyBoYW5kbGUKICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19FV0lfQ0JfSUQgRWFybHkgV2FrZVVwIEludGVycnVwdCBDYWxsYmFjayBJRAogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCiAgKiBAcmV0dmFsIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFdXREdfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgaWYocENhbGxiYWNrID09IE5VTEwpCiAgewogICAgc3RhdHVzID0gSEFMX0VSUk9SOwogIH0KICBlbHNlCiAgewogICAgc3dpdGNoKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKICAgICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBXV0RHIENhbGxiYWNrCiAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjayAKICAqIEBwYXJhbSAgaHd3ZGcgV1dERyBoYW5kbGUKICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19FV0lfQ0JfSUQgRWFybHkgV2FrZVVwIEludGVycnVwdCBDYWxsYmFjayBJRAogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfV1dER19NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfVW5SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIHN3aXRjaChDYWxsYmFja0lEKQogIHsKICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CiAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQojZW5kaWYKCi8qKgogICogQH0KICAqLwoKLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgWy4uXQogICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICgrKSBSZWZyZXNoIHRoZSBXV0RHLgogICAgKCspIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNhbGxiYWNrLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgUmVmcmVzaCB0aGUgV1dERy4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVmcmVzaChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogV3JpdGUgdG8gV1dERyBDUiB0aGUgV1dERyBDb3VudGVyIHZhbHVlIHRvIHJlZnJlc2ggd2l0aCAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0LgogICogQG5vdGUgICBUaGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucwogICogICAgICAgICBvciBkYXRhIGxvZ2dpbmcgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBhY3R1YWwgcmVzZXQgaXMgZ2VuZXJhdGVkLgogICogICAgICAgICBUaGUgRVdJIGludGVycnVwdCBpcyBlbmFibGVkIGJ5IGNhbGxpbmcgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiB3aXRoCiAgKiAgICAgICAgIEVXSU1vZGUgc2V0IHRvIFdXREdfRVdJX0VOQUJMRS4KICAqICAgICAgICAgV2hlbiB0aGUgZG93bmNvdW50ZXIgcmVhY2hlcyB0aGUgdmFsdWUgMHg0MCwgYW5kIEVXSSBpbnRlcnJ1cHQgaXMKICAqICAgICAgICAgZ2VuZXJhdGVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIChJU1IpIGNhbgogICogICAgICAgICBiZSB1c2VkIHRvIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9ucyAoc3VjaCBhcyBjb21tdW5pY2F0aW9ucyBvciBkYXRhCiAgKiAgICAgICAgIGxvZ2dpbmcpLCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZXZpY2UuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1dXREdfSVJRSGFuZGxlcihXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogQ2hlY2sgaWYgRWFybHkgV2FrZXVwIEludGVycnVwdCBpcyBlbmFibGUgKi8KICBpZiAoX19IQUxfV1dER19HRVRfSVRfU09VUkNFKGh3d2RnLCBXV0RHX0lUX0VXSSkgIT0gUkVTRVQpCiAgewogICAgLyogQ2hlY2sgaWYgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IG9jY3VycmVkICovCiAgICBpZiAoX19IQUxfV1dER19HRVRfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpICE9IFJFU0VUKQogICAgewogICAgICAvKiBDbGVhciB0aGUgV1dERyBFYXJseSBXYWtldXAgZmxhZyAqLwogICAgICBfX0hBTF9XV0RHX0NMRUFSX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKTsKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAvKiBFYXJseSBXYWtldXAgcmVnaXN0ZXJlZCBjYWxsYmFjayAqLwogICAgICBod3dkZy0+RXdpQ2FsbGJhY2soaHd3ZGcpOwojZWxzZQogICAgICAvKiBFYXJseSBXYWtldXAgY2FsbGJhY2sgKi8KICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhod3dkZyk7CiNlbmRpZgogICAgfQogIH0KfQoKCi8qKgogICogQGJyaWVmICBXV0RHIEVhcmx5IFdha2V1cCBjYWxsYmFjay4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCiNlbmRpZiAvKiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAqLwovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K