LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9pMmMuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIEkyQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfaTJjLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgSTJDIA0KICAqIEBicmllZiBJMkMgZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLyANCg0KLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KLyogSTJDIFNQRSBtYXNrICovDQojZGVmaW5lIENSMV9QRV9TZXQgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDAxKQ0KI2RlZmluZSBDUjFfUEVfUmVzZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGRSkNCg0KLyogSTJDIFNUQVJUIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX1NUQVJUX1NldCAgICAgICAgICAgKCh1aW50MTZfdCkweDAxMDApDQojZGVmaW5lIENSMV9TVEFSVF9SZXNldCAgICAgICAgICgodWludDE2X3QpMHhGRUZGKQ0KDQovKiBJMkMgU1RPUCBtYXNrICovDQojZGVmaW5lIENSMV9TVE9QX1NldCAgICAgICAgICAgICgodWludDE2X3QpMHgwMjAwKQ0KI2RlZmluZSBDUjFfU1RPUF9SZXNldCAgICAgICAgICAoKHVpbnQxNl90KTB4RkRGRikNCg0KLyogSTJDIEFDSyBtYXNrICovDQojZGVmaW5lIENSMV9BQ0tfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgwNDAwKQ0KI2RlZmluZSBDUjFfQUNLX1Jlc2V0ICAgICAgICAgICAoKHVpbnQxNl90KTB4RkJGRikNCg0KLyogSTJDIEVOR0MgbWFzayAqLw0KI2RlZmluZSBDUjFfRU5HQ19TZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDA0MCkNCiNkZWZpbmUgQ1IxX0VOR0NfUmVzZXQgICAgICAgICAgKCh1aW50MTZfdCkweEZGQkYpDQoNCi8qIEkyQyBTV1JTVCBtYXNrICovDQojZGVmaW5lIENSMV9TV1JTVF9TZXQgICAgICAgICAgICgodWludDE2X3QpMHg4MDAwKQ0KI2RlZmluZSBDUjFfU1dSU1RfUmVzZXQgICAgICAgICAoKHVpbnQxNl90KTB4N0ZGRikNCg0KLyogSTJDIFBFQyBtYXNrICovDQojZGVmaW5lIENSMV9QRUNfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgxMDAwKQ0KI2RlZmluZSBDUjFfUEVDX1Jlc2V0ICAgICAgICAgICAoKHVpbnQxNl90KTB4RUZGRikNCg0KLyogSTJDIEVOUEVDIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0VOUEVDX1NldCAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApDQojZGVmaW5lIENSMV9FTlBFQ19SZXNldCAgICAgICAgICgodWludDE2X3QpMHhGRkRGKQ0KDQovKiBJMkMgRU5BUlAgbWFzayAqLw0KI2RlZmluZSBDUjFfRU5BUlBfU2V0ICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAxMCkNCiNkZWZpbmUgQ1IxX0VOQVJQX1Jlc2V0ICAgICAgICAgKCh1aW50MTZfdCkweEZGRUYpDQoNCi8qIEkyQyBOT1NUUkVUQ0ggbWFzayAqLw0KI2RlZmluZSBDUjFfTk9TVFJFVENIX1NldCAgICAgICAoKHVpbnQxNl90KTB4MDA4MCkNCiNkZWZpbmUgQ1IxX05PU1RSRVRDSF9SZXNldCAgICAgKCh1aW50MTZfdCkweEZGN0YpDQoNCi8qIEkyQyByZWdpc3RlcnMgTWFza3MgKi8NCiNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgICAgKCh1aW50MTZfdCkweEZCRjUpDQoNCi8qIEkyQyBETUFFTiBtYXNrICovDQojZGVmaW5lIENSMl9ETUFFTl9TZXQgICAgICAgICAgICgodWludDE2X3QpMHgwODAwKQ0KI2RlZmluZSBDUjJfRE1BRU5fUmVzZXQgICAgICAgICAoKHVpbnQxNl90KTB4RjdGRikNCg0KLyogSTJDIExBU1QgbWFzayAqLw0KI2RlZmluZSBDUjJfTEFTVF9TZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4MTAwMCkNCiNkZWZpbmUgQ1IyX0xBU1RfUmVzZXQgICAgICAgICAgKCh1aW50MTZfdCkweEVGRkYpDQoNCi8qIEkyQyBGUkVRIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0ZSRVFfUmVzZXQgICAgICAgICAgKCh1aW50MTZfdCkweEZGQzApDQoNCi8qIEkyQyBBREQwIG1hc2sgKi8NCiNkZWZpbmUgT0FSMV9BREQwX1NldCAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQojZGVmaW5lIE9BUjFfQUREMF9SZXNldCAgICAgICAgICgodWludDE2X3QpMHhGRkZFKQ0KDQovKiBJMkMgRU5EVUFMIG1hc2sgKi8NCiNkZWZpbmUgT0FSMl9FTkRVQUxfU2V0ICAgICAgICAgKCh1aW50MTZfdCkweDAwMDEpDQojZGVmaW5lIE9BUjJfRU5EVUFMX1Jlc2V0ICAgICAgICgodWludDE2X3QpMHhGRkZFKQ0KDQovKiBJMkMgQUREMiBtYXNrICovDQojZGVmaW5lIE9BUjJfQUREMl9SZXNldCAgICAgICAgICgodWludDE2X3QpMHhGRjAxKQ0KDQovKiBJMkMgRi9TIG1hc2sgKi8NCiNkZWZpbmUgQ0NSX0ZTX1NldCAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDgwMDApDQoNCi8qIEkyQyBDQ1IgbWFzayAqLw0KI2RlZmluZSBDQ1JfQ0NSX1NldCAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MEZGRikNCg0KLyogSTJDIEZMQUcgbWFzayAqLw0KI2RlZmluZSBGTEFHX01hc2sgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBGRkZGRkYpDQoNCi8qIEkyQyBJbnRlcnJ1cHQgRW5hYmxlIG1hc2sgKi8NCiNkZWZpbmUgSVRFTl9NYXNrICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDA3MDAwMDAwKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgSTJDX1ByaXZhdGVfVmFyaWFibGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBJMkNfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEkyQ19Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgSTJDeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfRGVJbml0KEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KDQogIGlmIChJMkN4ID09IEkyQzEpDQogIHsNCiAgICAvKiBFbmFibGUgSTJDMSByZXNldCBzdGF0ZSAqLw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMSwgRU5BQkxFKTsNCiAgICAvKiBSZWxlYXNlIEkyQzEgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMSwgRElTQUJMRSk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRW5hYmxlIEkyQzIgcmVzZXQgc3RhdGUgKi8NCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzIsIEVOQUJMRSk7DQogICAgLyogUmVsZWFzZSBJMkMyIGZyb20gcmVzZXQgc3RhdGUgKi8NCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzIsIERJU0FCTEUpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEkyQ3ggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCANCiAgKiAgIHBhcmFtZXRlcnMgaW4gdGhlIEkyQ19Jbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSTJDIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19Jbml0KEkyQ19UeXBlRGVmKiBJMkN4LCBJMkNfSW5pdFR5cGVEZWYqIEkyQ19Jbml0U3RydWN0KQ0Kew0KICB1aW50MTZfdCB0bXByZWcgPSAwLCBmcmVxcmFuZ2UgPSAwOw0KICB1aW50MTZfdCByZXN1bHQgPSAweDA0Ow0KICB1aW50MzJfdCBwY2xrMSA9IDgwMDAwMDA7DQogIFJDQ19DbG9ja3NUeXBlRGVmICByY2NfY2xvY2tzOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0NMT0NLX1NQRUVEKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX01PREUoSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfRFVUWV9DWUNMRShJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX09XTl9BRERSRVNTMShJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3MxKSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfQUNLX1NUQVRFKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrKSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfQUNLTk9XTEVER0VfQUREUkVTUyhJMkNfSW5pdFN0cnVjdC0+STJDX0Fja25vd2xlZGdlZEFkZHJlc3MpKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogR2V0IHRoZSBJMkN4IENSMiB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5DUjI7DQogIC8qIENsZWFyIGZyZXF1ZW5jeSBGUkVRWzU6MF0gYml0cyAqLw0KICB0bXByZWcgJj0gQ1IyX0ZSRVFfUmVzZXQ7DQogIC8qIEdldCBwY2xrMSBmcmVxdWVuY3kgdmFsdWUgKi8NCiAgUkNDX0dldENsb2Nrc0ZyZXEoJnJjY19jbG9ja3MpOw0KICBwY2xrMSA9IHJjY19jbG9ja3MuUENMSzFfRnJlcXVlbmN5Ow0KICAvKiBTZXQgZnJlcXVlbmN5IGJpdHMgZGVwZW5kaW5nIG9uIHBjbGsxIHZhbHVlICovDQogIGZyZXFyYW5nZSA9ICh1aW50MTZfdCkocGNsazEgLyAxMDAwMDAwKTsNCiAgdG1wcmVnIHw9IGZyZXFyYW5nZTsNCiAgLyogV3JpdGUgdG8gSTJDeCBDUjIgKi8NCiAgSTJDeC0+Q1IyID0gdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCB0byBjb25maWd1cmUgVFJJU0UgKi8NCiAgSTJDeC0+Q1IxICY9IENSMV9QRV9SZXNldDsNCiAgLyogUmVzZXQgdG1wcmVnIHZhbHVlICovDQogIC8qIENsZWFyIEYvUywgRFVUWSBhbmQgQ0NSWzExOjBdIGJpdHMgKi8NCiAgdG1wcmVnID0gMDsNCg0KICAvKiBDb25maWd1cmUgc3BlZWQgaW4gc3RhbmRhcmQgbW9kZSAqLw0KICBpZiAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkIDw9IDEwMDAwMCkNCiAgew0KICAgIC8qIFN0YW5kYXJkIG1vZGUgc3BlZWQgY2FsY3VsYXRlICovDQogICAgcmVzdWx0ID0gKHVpbnQxNl90KShwY2xrMSAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPDwgMSkpOw0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4NCovDQogICAgaWYgKHJlc3VsdCA8IDB4MDQpDQogICAgew0KICAgICAgLyogU2V0IG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAqLw0KICAgICAgcmVzdWx0ID0gMHgwNDsgIA0KICAgIH0NCiAgICAvKiBTZXQgc3BlZWQgdmFsdWUgZm9yIHN0YW5kYXJkIG1vZGUgKi8NCiAgICB0bXByZWcgfD0gcmVzdWx0OwkgIA0KICAgIC8qIFNldCBNYXhpbXVtIFJpc2UgVGltZSBmb3Igc3RhbmRhcmQgbW9kZSAqLw0KICAgIEkyQ3gtPlRSSVNFID0gZnJlcXJhbmdlICsgMTsgDQogIH0NCiAgLyogQ29uZmlndXJlIHNwZWVkIGluIGZhc3QgbW9kZSAqLw0KICBlbHNlIC8qKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA8PSA0MDAwMDApKi8NCiAgew0KICAgIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSA9PSBJMkNfRHV0eUN5Y2xlXzIpDQogICAgew0KICAgICAgLyogRmFzdCBtb2RlIHNwZWVkIGNhbGN1bGF0ZTogVGxvdy9UaGlnaCA9IDIgKi8NCiAgICAgIHJlc3VsdCA9ICh1aW50MTZfdCkocGNsazEgLyAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19DbG9ja1NwZWVkICogMykpOw0KICAgIH0NCiAgICBlbHNlIC8qSTJDX0luaXRTdHJ1Y3QtPkkyQ19EdXR5Q3ljbGUgPT0gSTJDX0R1dHlDeWNsZV8xNl85Ki8NCiAgICB7DQogICAgICAvKiBGYXN0IG1vZGUgc3BlZWQgY2FsY3VsYXRlOiBUbG93L1RoaWdoID0gMTYvOSAqLw0KICAgICAgcmVzdWx0ID0gKHVpbnQxNl90KShwY2xrMSAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgKiAyNSkpOw0KICAgICAgLyogU2V0IERVVFkgYml0ICovDQogICAgICByZXN1bHQgfD0gSTJDX0R1dHlDeWNsZV8xNl85Ow0KICAgIH0NCg0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4MSovDQogICAgaWYgKChyZXN1bHQgJiBDQ1JfQ0NSX1NldCkgPT0gMCkNCiAgICB7DQogICAgICAvKiBTZXQgbWluaW11bSBhbGxvd2VkIHZhbHVlICovDQogICAgICByZXN1bHQgfD0gKHVpbnQxNl90KTB4MDAwMTsgIA0KICAgIH0NCiAgICAvKiBTZXQgc3BlZWQgdmFsdWUgYW5kIHNldCBGL1MgYml0IGZvciBmYXN0IG1vZGUgKi8NCiAgICB0bXByZWcgfD0gKHVpbnQxNl90KShyZXN1bHQgfCBDQ1JfRlNfU2V0KTsNCiAgICAvKiBTZXQgTWF4aW11bSBSaXNlIFRpbWUgZm9yIGZhc3QgbW9kZSAqLw0KICAgIEkyQ3gtPlRSSVNFID0gKHVpbnQxNl90KSgoKGZyZXFyYW5nZSAqICh1aW50MTZfdCkzMDApIC8gKHVpbnQxNl90KTEwMDApICsgKHVpbnQxNl90KTEpOyAgDQogIH0NCg0KICAvKiBXcml0ZSB0byBJMkN4IENDUiAqLw0KICBJMkN4LT5DQ1IgPSB0bXByZWc7DQogIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8NCiAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJMkN4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgSTJDeCBDUjEgdmFsdWUgKi8NCiAgdG1wcmVnID0gSTJDeC0+Q1IxOw0KICAvKiBDbGVhciBBQ0ssIFNNQlRZUEUgYW5kICBTTUJVUyBiaXRzICovDQogIHRtcHJlZyAmPSBDUjFfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIEkyQ3g6IG1vZGUgYW5kIGFja25vd2xlZGdlbWVudCAqLw0KICAvKiBTZXQgU01CVFlQRSBhbmQgU01CVVMgYml0cyBhY2NvcmRpbmcgdG8gSTJDX01vZGUgdmFsdWUgKi8NCiAgLyogU2V0IEFDSyBiaXQgYWNjb3JkaW5nIHRvIEkyQ19BY2sgdmFsdWUgKi8NCiAgdG1wcmVnIHw9ICh1aW50MTZfdCkoKHVpbnQzMl90KUkyQ19Jbml0U3RydWN0LT5JMkNfTW9kZSB8IEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrKTsNCiAgLyogV3JpdGUgdG8gSTJDeCBDUjEgKi8NCiAgSTJDeC0+Q1IxID0gdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBPQVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgSTJDeCBPd24gQWRkcmVzczEgYW5kIGFja25vd2xlZGdlZCBhZGRyZXNzICovDQogIEkyQ3gtPk9BUjEgPSAoSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2tub3dsZWRnZWRBZGRyZXNzIHwgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Pd25BZGRyZXNzMSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBJMkNfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIEkyQ19Jbml0U3RydWN0OiBwb2ludGVyIHRvIGFuIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX1N0cnVjdEluaXQoSTJDX0luaXRUeXBlRGVmKiBJMkNfSW5pdFN0cnVjdCkNCnsNCi8qLS0tLS0tLS0tLS0tLS0tLSBSZXNldCBJMkMgaW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIGluaXRpYWxpemUgdGhlIEkyQ19DbG9ja1NwZWVkIG1lbWJlciAqLw0KICBJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPSA1MDAwOw0KICAvKiBJbml0aWFsaXplIHRoZSBJMkNfTW9kZSBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlID0gSTJDX01vZGVfSTJDOw0KICAvKiBJbml0aWFsaXplIHRoZSBJMkNfRHV0eUN5Y2xlIG1lbWJlciAqLw0KICBJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSA9IEkyQ19EdXR5Q3ljbGVfMjsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX093bkFkZHJlc3MxIG1lbWJlciAqLw0KICBJMkNfSW5pdFN0cnVjdC0+STJDX093bkFkZHJlc3MxID0gMDsNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0FjayBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2sgPSBJMkNfQWNrX0Rpc2FibGU7DQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzIG1lbWJlciAqLw0KICBJMkNfSW5pdFN0cnVjdC0+STJDX0Fja25vd2xlZGdlZEFkZHJlc3MgPSBJMkNfQWNrbm93bGVkZ2VkQWRkcmVzc183Yml0Ow0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDeCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19DbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIHBlcmlwaGVyYWwgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX1BFX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBETUEgcmVxdWVzdHMuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBETUEgdHJhbnNmZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfRE1BQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgRE1BIHJlcXVlc3RzICovDQogICAgSTJDeC0+Q1IyIHw9IENSMl9ETUFFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIERNQSByZXF1ZXN0cyAqLw0KICAgIEkyQ3gtPkNSMiAmPSBDUjJfRE1BRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBTcGVjaWZpZXMgaWYgdGhlIG5leHQgRE1BIHRyYW5zZmVyIHdpbGwgYmUgdGhlIGxhc3Qgb25lLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgRE1BIGxhc3QgdHJhbnNmZXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfRE1BTGFzdFRyYW5zZmVyQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogTmV4dCBETUEgdHJhbnNmZXIgaXMgdGhlIGxhc3QgdHJhbnNmZXIgKi8NCiAgICBJMkN4LT5DUjIgfD0gQ1IyX0xBU1RfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIE5leHQgRE1BIHRyYW5zZmVyIGlzIG5vdCB0aGUgbGFzdCB0cmFuc2ZlciAqLw0KICAgIEkyQ3gtPkNSMiAmPSBDUjJfTEFTVF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RBUlQgY29uZGl0aW9uLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgSTJDX0dlbmVyYXRlU1RBUlQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBHZW5lcmF0ZSBhIFNUQVJUIGNvbmRpdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfU1RBUlRfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNUQVJUIGNvbmRpdGlvbiBnZW5lcmF0aW9uICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9TVEFSVF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RPUCBjb25kaXRpb24uDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIEkyQ19HZW5lcmF0ZVNUT1AoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBHZW5lcmF0ZSBhIFNUT1AgY29uZGl0aW9uICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9TVE9QX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9TVE9QX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBhY2tub3dsZWRnZSBmZWF0dXJlLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgQWNrbm93bGVkZ2VtZW50Lg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUuDQogICovDQp2b2lkIEkyQ19BY2tub3dsZWRnZUNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgYWNrbm93bGVkZ2VtZW50ICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9BQ0tfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIGFja25vd2xlZGdlbWVudCAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfQUNLX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIEkyQyBvd24gYWRkcmVzczIuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgN2JpdCBJMkMgb3duIGFkZHJlc3MyLg0KICAqIEByZXR2YWwgTm9uZS4NCiAgKi8NCnZvaWQgSTJDX093bkFkZHJlc3MyQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50OF90IEFkZHJlc3MpDQp7DQogIHVpbnQxNl90IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCg0KICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5PQVIyOw0KDQogIC8qIFJlc2V0IEkyQ3ggT3duIGFkZHJlc3MyIGJpdCBbNzoxXSAqLw0KICB0bXByZWcgJj0gT0FSMl9BREQyX1Jlc2V0Ow0KDQogIC8qIFNldCBJMkN4IE93biBhZGRyZXNzMiAqLw0KICB0bXByZWcgfD0gKHVpbnQxNl90KSgodWludDE2X3QpQWRkcmVzcyAmICh1aW50MTZfdCkweDAwRkUpOw0KDQogIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgSTJDeC0+T0FSMiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIGR1YWwgYWRkcmVzc2luZyBtb2RlLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgZHVhbCBhZGRyZXNzaW5nIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfRHVhbEFkZHJlc3NDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgZHVhbCBhZGRyZXNzaW5nIG1vZGUgKi8NCiAgICBJMkN4LT5PQVIyIHw9IE9BUjJfRU5EVUFMX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGR1YWwgYWRkcmVzc2luZyBtb2RlICovDQogICAgSTJDeC0+T0FSMiAmPSBPQVIyX0VORFVBTF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgZ2VuZXJhbCBjYWxsIGZlYXR1cmUuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBHZW5lcmFsIGNhbGwuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfR2VuZXJhbENhbGxDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgZ2VuZXJhbGwgY2FsbCAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfRU5HQ19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSBnZW5lcmFsbCBjYWxsICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9FTkdDX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHRzLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfSVQ6IHNwZWNpZmllcyB0aGUgSTJDIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgSTJDX0lUX0JVRjogQnVmZmVyIGludGVycnVwdCBtYXNrDQogICogICAgIEBhcmcgSTJDX0lUX0VWVDogRXZlbnQgaW50ZXJydXB0IG1hc2sNCiAgKiAgICAgQGFyZyBJMkNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgbWFzaw0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX0lUQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MTZfdCBJMkNfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19DT05GSUdfSVQoSTJDX0lUKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIGludGVycnVwdHMgKi8NCiAgICBJMkN4LT5DUjIgfD0gSTJDX0lUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBpbnRlcnJ1cHRzICovDQogICAgSTJDeC0+Q1IyICY9ICh1aW50MTZfdCl+STJDX0lUOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2VuZHMgYSBkYXRhIGJ5dGUgdGhyb3VnaCB0aGUgSTJDeCBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBEYXRhOiBCeXRlIHRvIGJlIHRyYW5zbWl0dGVkLi4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX1NlbmREYXRhKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50OF90IERhdGEpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQogIEkyQ3gtPkRSID0gRGF0YTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBJMkN4IHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIFRoZSB2YWx1ZSBvZiB0aGUgcmVjZWl2ZWQgZGF0YS4NCiAgKi8NCnVpbnQ4X3QgSTJDX1JlY2VpdmVEYXRhKEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICAvKiBSZXR1cm4gdGhlIGRhdGEgaW4gdGhlIERSIHJlZ2lzdGVyICovDQogIHJldHVybiAodWludDhfdClJMkN4LT5EUjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUcmFuc21pdHMgdGhlIGFkZHJlc3MgYnl0ZSB0byBzZWxlY3QgdGhlIHNsYXZlIGRldmljZS4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgQWRkcmVzczogc3BlY2lmaWVzIHRoZSBzbGF2ZSBhZGRyZXNzIHdoaWNoIHdpbGwgYmUgdHJhbnNtaXR0ZWQNCiAgKiBAcGFyYW0gIEkyQ19EaXJlY3Rpb246IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBJMkMgZGV2aWNlIHdpbGwgYmUgYQ0KICAqICAgVHJhbnNtaXR0ZXIgb3IgYSBSZWNlaXZlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KICAqICAgICBAYXJnIEkyQ19EaXJlY3Rpb25fVHJhbnNtaXR0ZXI6IFRyYW5zbWl0dGVyIG1vZGUNCiAgKiAgICAgQGFyZyBJMkNfRGlyZWN0aW9uX1JlY2VpdmVyOiBSZWNlaXZlciBtb2RlDQogICogQHJldHZhbCBOb25lLg0KICAqLw0Kdm9pZCBJMkNfU2VuZDdiaXRBZGRyZXNzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50OF90IEFkZHJlc3MsIHVpbnQ4X3QgSTJDX0RpcmVjdGlvbikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19ESVJFQ1RJT04oSTJDX0RpcmVjdGlvbikpOw0KICAvKiBUZXN0IG9uIHRoZSBkaXJlY3Rpb24gdG8gc2V0L3Jlc2V0IHRoZSByZWFkL3dyaXRlIGJpdCAqLw0KICBpZiAoSTJDX0RpcmVjdGlvbiAhPSBJMkNfRGlyZWN0aW9uX1RyYW5zbWl0dGVyKQ0KICB7DQogICAgLyogU2V0IHRoZSBhZGRyZXNzIGJpdDAgZm9yIHJlYWQgKi8NCiAgICBBZGRyZXNzIHw9IE9BUjFfQUREMF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIGFkZHJlc3MgYml0MCBmb3Igd3JpdGUgKi8NCiAgICBBZGRyZXNzICY9IE9BUjFfQUREMF9SZXNldDsNCiAgfQ0KICAvKiBTZW5kIHRoZSBhZGRyZXNzICovDQogIEkyQ3gtPkRSID0gQWRkcmVzczsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWFkcyB0aGUgc3BlY2lmaWVkIEkyQyByZWdpc3RlciBhbmQgcmV0dXJucyBpdHMgdmFsdWUuDQogICogQHBhcmFtICBJMkNfUmVnaXN0ZXI6IHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgdG8gcmVhZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX0NSMTogIENSMSByZWdpc3Rlci4NCiAgKiAgICAgQGFyZyBJMkNfUmVnaXN0ZXJfQ1IyOiAgIENSMiByZWdpc3Rlci4NCiAgKiAgICAgQGFyZyBJMkNfUmVnaXN0ZXJfT0FSMTogIE9BUjEgcmVnaXN0ZXIuDQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX09BUjI6ICBPQVIyIHJlZ2lzdGVyLg0KICAqICAgICBAYXJnIEkyQ19SZWdpc3Rlcl9EUjogICAgRFIgcmVnaXN0ZXIuDQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX1NSMTogICBTUjEgcmVnaXN0ZXIuDQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX1NSMjogICBTUjIgcmVnaXN0ZXIuDQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX0NDUjogICBDQ1IgcmVnaXN0ZXIuDQogICogICAgIEBhcmcgSTJDX1JlZ2lzdGVyX1RSSVNFOiBUUklTRSByZWdpc3Rlci4NCiAgKiBAcmV0dmFsIFRoZSB2YWx1ZSBvZiB0aGUgcmVhZCByZWdpc3Rlci4NCiAgKi8NCnVpbnQxNl90IEkyQ19SZWFkUmVnaXN0ZXIoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQ4X3QgSTJDX1JlZ2lzdGVyKQ0Kew0KICBfX0lPIHVpbnQzMl90IHRtcCA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19SRUdJU1RFUihJMkNfUmVnaXN0ZXIpKTsNCg0KICB0bXAgPSAodWludDMyX3QpIEkyQ3g7DQogIHRtcCArPSBJMkNfUmVnaXN0ZXI7DQoNCiAgLyogUmV0dXJuIHRoZSBzZWxlY3RlZCByZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gKCooX19JTyB1aW50MTZfdCAqKSB0bXApOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgc29mdHdhcmUgcmVzZXQuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBzb2Z0d2FyZSByZXNldC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19Tb2Z0d2FyZVJlc2V0Q21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogUGVyaXBoZXJhbCB1bmRlciByZXNldCAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfU1dSU1RfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFBlcmlwaGVyYWwgbm90IHVuZGVyIHJlc2V0ICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9TV1JTVF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERyaXZlcyB0aGUgU01CdXNBbGVydCBwaW4gaGlnaCBvciBsb3cgZm9yIHRoZSBzcGVjaWZpZWQgSTJDLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfU01CdXNBbGVydDogc3BlY2lmaWVzIFNNQkFsZXJ0IHBpbiBsZXZlbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIEkyQ19TTUJ1c0FsZXJ0X0xvdzogU01CQWxlcnQgcGluIGRyaXZlbiBsb3cNCiAgKiAgICAgQGFyZyBJMkNfU01CdXNBbGVydF9IaWdoOiBTTUJBbGVydCBwaW4gZHJpdmVuIGhpZ2gNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX1NNQnVzQWxlcnRDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQxNl90IEkyQ19TTUJ1c0FsZXJ0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX1NNQlVTX0FMRVJUKEkyQ19TTUJ1c0FsZXJ0KSk7DQogIGlmIChJMkNfU01CdXNBbGVydCA9PSBJMkNfU01CdXNBbGVydF9Mb3cpDQogIHsNCiAgICAvKiBEcml2ZSB0aGUgU01CdXNBbGVydCBwaW4gTG93ICovDQogICAgSTJDeC0+Q1IxIHw9IEkyQ19TTUJ1c0FsZXJ0X0xvdzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEcml2ZSB0aGUgU01CdXNBbGVydCBwaW4gSGlnaCAgKi8NCiAgICBJMkN4LT5DUjEgJj0gSTJDX1NNQnVzQWxlcnRfSGlnaDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgUEVDIHRyYW5zZmVyLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgUEVDIHRyYW5zbWlzc2lvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19UcmFuc21pdFBFQyhJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB0cmFuc21pc3Npb24gKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX1BFQ19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB0cmFuc21pc3Npb24gKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX1BFQ19SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIHNwZWNpZmllZCBJMkMgUEVDIHBvc2l0aW9uLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfUEVDUG9zaXRpb246IHNwZWNpZmllcyB0aGUgUEVDIHBvc2l0aW9uLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgSTJDX1BFQ1Bvc2l0aW9uX05leHQ6IGluZGljYXRlcyB0aGF0IHRoZSBuZXh0IGJ5dGUgaXMgUEVDDQogICogICAgIEBhcmcgSTJDX1BFQ1Bvc2l0aW9uX0N1cnJlbnQ6IGluZGljYXRlcyB0aGF0IGN1cnJlbnQgYnl0ZSBpcyBQRUMNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX1BFQ1Bvc2l0aW9uQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MTZfdCBJMkNfUEVDUG9zaXRpb24pDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfUEVDX1BPU0lUSU9OKEkyQ19QRUNQb3NpdGlvbikpOw0KICBpZiAoSTJDX1BFQ1Bvc2l0aW9uID09IEkyQ19QRUNQb3NpdGlvbl9OZXh0KQ0KICB7DQogICAgLyogTmV4dCBieXRlIGluIHNoaWZ0IHJlZ2lzdGVyIGlzIFBFQyAqLw0KICAgIEkyQ3gtPkNSMSB8PSBJMkNfUEVDUG9zaXRpb25fTmV4dDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDdXJyZW50IGJ5dGUgaW4gc2hpZnQgcmVnaXN0ZXIgaXMgUEVDICovDQogICAgSTJDeC0+Q1IxICY9IEkyQ19QRUNQb3NpdGlvbl9DdXJyZW50Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUEVDIHZhbHVlIGNhbGN1bGF0aW9uIG9mIHRoZSB0cmFuc2ZlcmVkIGJ5dGVzLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IFBFQyB2YWx1ZSBjYWxjdWxhdGlvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19DYWxjdWxhdGVQRUMoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBQRUMgY2FsY3VsYXRpb24gKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX0VOUEVDX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgUEVDIGNhbGN1bGF0aW9uICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9FTlBFQ19SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIFBFQyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBJMkMuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIFRoZSBQRUMgdmFsdWUuDQogICovDQp1aW50OF90IEkyQ19HZXRQRUMoSTJDX1R5cGVEZWYqIEkyQ3gpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB2YWx1ZSAqLw0KICByZXR1cm4gKChJMkN4LT5TUjIpID4+IDgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgQVJQLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IEFSUC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfQVJQQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgQVJQICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9FTkFSUF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIEFSUCAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfRU5BUlBfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIENsb2NrIHN0cmV0Y2hpbmcuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQ3ggQ2xvY2sgc3RyZXRjaGluZy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEkyQ19TdHJldGNoQ2xvY2tDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlID09IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBDbG9jayBzdHJldGNoaW5nICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9OT1NUUkVUQ0hfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBDbG9jayBzdHJldGNoaW5nICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9OT1NUUkVUQ0hfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgSTJDIGZhc3QgbW9kZSBkdXR5IGN5Y2xlLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfRHV0eUN5Y2xlOiBzcGVjaWZpZXMgdGhlIGZhc3QgbW9kZSBkdXR5IGN5Y2xlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBJMkNfRHV0eUN5Y2xlXzI6IEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaCA9IDINCiAgKiAgICAgQGFyZyBJMkNfRHV0eUN5Y2xlXzE2Xzk6IEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaCA9IDE2LzkNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSTJDX0Zhc3RNb2RlRHV0eUN5Y2xlQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MTZfdCBJMkNfRHV0eUN5Y2xlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0RVVFlfQ1lDTEUoSTJDX0R1dHlDeWNsZSkpOw0KICBpZiAoSTJDX0R1dHlDeWNsZSAhPSBJMkNfRHV0eUN5Y2xlXzE2XzkpDQogIHsNCiAgICAvKiBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2g9MiAqLw0KICAgIEkyQ3gtPkNDUiAmPSBJMkNfRHV0eUN5Y2xlXzI7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogSTJDIGZhc3QgbW9kZSBUbG93L1RoaWdoPTE2LzkgKi8NCiAgICBJMkN4LT5DQ1IgfD0gSTJDX0R1dHlDeWNsZV8xNl85Ow0KICB9DQp9DQoNCg0KDQovKioNCiAqIEBicmllZg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICBJMkMgU3RhdGUgTW9uaXRvcmluZyBGdW5jdGlvbnMNCiAqICAgICAgICAgICAgICAgICAgICAgICANCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgDQogKiBUaGlzIEkyQyBkcml2ZXIgcHJvdmlkZXMgdGhyZWUgZGlmZmVyZW50IHdheXMgZm9yIEkyQyBzdGF0ZSBtb25pdG9yaW5nDQogKiAgZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgYW5kIGNvbnN0cmFpbnRzOg0KICogICAgICAgIA0KICogIA0KICogMSkgQmFzaWMgc3RhdGUgbW9uaXRvcmluZzoNCiAqICAgIFVzaW5nIEkyQ19DaGVja0V2ZW50KCkgZnVuY3Rpb246DQogKiAgICBJdCBjb21wYXJlcyB0aGUgc3RhdHVzIHJlZ2lzdGVycyAoU1IxIGFuZCBTUjIpIGNvbnRlbnQgdG8gYSBnaXZlbiBldmVudA0KICogICAgKGNhbiBiZSB0aGUgY29tYmluYXRpb24gb2Ygb25lIG9yIG1vcmUgZmxhZ3MpLg0KICogICAgSXQgcmV0dXJucyBTVUNDRVNTIGlmIHRoZSBjdXJyZW50IHN0YXR1cyBpbmNsdWRlcyB0aGUgZ2l2ZW4gZmxhZ3MgDQogKiAgICBhbmQgcmV0dXJucyBFUlJPUiBpZiBvbmUgb3IgbW9yZSBmbGFncyBhcmUgbWlzc2luZyBpbiB0aGUgY3VycmVudCBzdGF0dXMuDQogKiAgICAtIFdoZW4gdG8gdXNlOg0KICogICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgZm9yIG1vc3QgYXBwbGNpYXRpb25zIGFzIHdlbGwgYXMgZm9yIHN0YXJ0dXAgDQogKiAgICAgIGFjdGl2aXR5IHNpbmNlIHRoZSBldmVudHMgYXJlIGZ1bGx5IGRlc2NyaWJlZCBpbiB0aGUgcHJvZHVjdCByZWZlcmVuY2UgbWFudWFsIA0KICogICAgICAoUk0wMDA4KS4NCiAqICAgICAgLSBJdCBpcyBhbHNvIHN1aXRhYmxlIGZvciB1c2VycyB3aG8gbmVlZCB0byBkZWZpbmUgdGhlaXIgb3duIGV2ZW50cy4NCiAqICAgIC0gTGltaXRhdGlvbnM6DQogKiAgICAgIC0gSWYgYW4gZXJyb3Igb2NjdXJzIChpZS4gZXJyb3IgZmxhZ3MgYXJlIHNldCBiZXNpZGVzIHRvIHRoZSBtb25pdG9yZWQgZmxhZ3MpLA0KICogICAgICAgIHRoZSBJMkNfQ2hlY2tFdmVudCgpIGZ1bmN0aW9uIG1heSByZXR1cm4gU1VDQ0VTUyBkZXNwaXRlIHRoZSBjb21tdW5pY2F0aW9uDQogKiAgICAgICAgaG9sZCBvciBjb3JydXB0ZWQgcmVhbCBzdGF0ZS4gDQogKiAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCBpcyBhZHZpc2VkIHRvIHVzZSBlcnJvciBpbnRlcnJ1cHRzIHRvIG1vbml0b3IgdGhlIGVycm9yDQogKiAgICAgICAgZXZlbnRzIGFuZCBoYW5kbGUgdGhlbSBpbiB0aGUgaW50ZXJydXB0IElSUSBoYW5kbGVyLg0KICogICAgICAgIA0KICogICAgICAgIEBub3RlIA0KICogICAgICAgIEZvciBlcnJvciBtYW5hZ2VtZW50LCBpdCBpcyBhZHZpc2VkIHRvIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoNCiAqICAgICAgICAgIC0gSTJDX0lUQ29uZmlnKCkgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgdGhlIGVycm9yIGludGVycnVwdHMgKEkyQ19JVF9FUlIpLg0KICogICAgICAgICAgLSBJMkN4X0VSX0lSUUhhbmRsZXIoKSB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgZXJyb3IgaW50ZXJ1cnB0IG9jY3Vycy4NCiAqICAgICAgICAgICAgV2hlcmUgeCBpcyB0aGUgcGVyaXBoZXJhbCBpbnN0YW5jZSAoSTJDMSwgSTJDMiAuLi4pDQogKiAgICAgICAgICAtIEkyQ19HZXRGbGFnU3RhdHVzKCkgb3IgSTJDX0dldElUU3RhdHVzKCkgdG8gYmUgY2FsbGVkIGludG8gSTJDeF9FUl9JUlFIYW5kbGVyKCkgDQogKiAgICAgICAgICAgIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBlcnJvciBvY2N1cmVkLg0KICogICAgICAgICAgLSBJMkNfQ2xlYXJGbGFnKCkgb3IgSTJDX0NsZWFySVRQZW5kaW5nQml0KCkgYW5kL29yIEkyQ19Tb2Z0d2FyZVJlc2V0Q21kKCkNCiAqICAgICAgICAgICAgYW5kL29yIEkyQ19HZW5lcmF0ZVN0b3AoKSBpbiBvcmRlciB0byBjbGVhciB0aGUgZXJyb3IgZmxhZyBhbmQgc291cmNlLA0KICogICAgICAgICAgICBhbmQgcmV0dXJuIHRvIGNvcnJlY3QgY29tbXVuaWNhdGlvbiBzdGF0dXMuDQogKiAgICAgICAgICAgIA0KICoNCiAqICAyKSBBZHZhbmNlZCBzdGF0ZSBtb25pdG9yaW5nOg0KICogICAgIFVzaW5nIHRoZSBmdW5jdGlvbiBJMkNfR2V0TGFzdEV2ZW50KCkgd2hpY2ggcmV0dXJucyB0aGUgaW1hZ2Ugb2YgYm90aCBzdGF0dXMgDQogKiAgICAgcmVnaXN0ZXJzIGluIGEgc2luZ2xlIHdvcmQgKHVpbnQzMl90KSAoU3RhdHVzIFJlZ2lzdGVyIDIgdmFsdWUgaXMgc2hpZnRlZCBsZWZ0IA0KICogICAgIGJ5IDE2IGJpdHMgYW5kIGNvbmNhdGVuYXRlZCB0byBTdGF0dXMgUmVnaXN0ZXIgMSkuDQogKiAgICAgLSBXaGVuIHRvIHVzZToNCiAqICAgICAgIC0gVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdGhlIHNhbWUgYXBwbGljYXRpb25zIGFib3ZlIGJ1dCBpdCBhbGxvd3MgdG8NCiAqICAgICAgICAgb3ZlcmNvbWUgdGhlIG1lbnRpb25uZWQgbGltaXRhdGlvbiBvZiBJMkNfR2V0RmxhZ1N0YXR1cygpIGZ1bmN0aW9uLg0KICogICAgICAgICBUaGUgcmV0dXJuZWQgdmFsdWUgY291bGQgYmUgY29tcGFyZWQgdG8gZXZlbnRzIGFscmVhZHkgZGVmaW5lZCBpbiB0aGUgDQogKiAgICAgICAgIGxpYnJhcnkgKHN0bTMyZjEweF9pMmMuaCkgb3IgdG8gY3VzdG9tIHZhbHVlcyBkZWZpZW5kIGJ5IHVzZXIuDQogKiAgICAgICAtIFRoaXMgZnVuY3Rpb24gaXMgc3VpdGFibGUgd2hlbiBtdWx0aXBsZSBmbGFncyBhcmUgbW9uaXRvcmVkIGF0IHRoZSBzYW1lIHRpbWUuDQogKiAgICAgICAtIEF0IHRoZSBvcHBvc2l0ZSBvZiBJMkNfQ2hlY2tFdmVudCgpIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB1c2VyIHRvDQogKiAgICAgICAgIGNob29zZSB3aGVuIGFuIGV2ZW50IGlzIGFjY2VwdGVkICh3aGVuIGFsbCBldmVudHMgZmxhZ3MgYXJlIHNldCBhbmQgbm8gDQogKiAgICAgICAgIG90aGVyIGZsYWdzIGFyZSBzZXQgb3IganVzdCB3aGVuIHRoZSBuZWVkZWQgZmxhZ3MgYXJlIHNldCBsaWtlIA0KICogICAgICAgICBJMkNfQ2hlY2tFdmVudCgpIGZ1bmN0aW9uKS4NCiAqICAgICAtIExpbWl0YXRpb25zOg0KICogICAgICAgLSBVc2VyIG1heSBuZWVkIHRvIGRlZmluZSBoaXMgb3duIGV2ZW50cy4NCiAqICAgICAgIC0gU2FtZSByZW1hcmsgY29uY2VybmluZyB0aGUgZXJyb3IgbWFuYWdlbWVudCBpcyBhcHBsaWNhYmxlIGZvciB0aGlzIA0KICogICAgICAgICBmdW5jdGlvbiBpZiB1c2VyIGRlY2lkZXMgdG8gY2hlY2sgb25seSByZWd1bGFyIGNvbW11bmljYXRpb24gZmxhZ3MgKGFuZCANCiAqICAgICAgICAgaWdub3JlcyBlcnJvciBmbGFncykuDQogKiAgICAgDQogKg0KICogIDMpIEZsYWctYmFzZWQgc3RhdGUgbW9uaXRvcmluZzoNCiAqICAgICBVc2luZyB0aGUgZnVuY3Rpb24gSTJDX0dldEZsYWdTdGF0dXMoKSB3aGljaCBzaW1wbHkgcmV0dXJucyB0aGUgc3RhdHVzIG9mIA0KICogICAgIG9uZSBzaW5nbGUgZmxhZyAoaWUuIEkyQ19GTEFHX1JYTkUgLi4uKS4gDQogKiAgICAgLSBXaGVuIHRvIHVzZToNCiAqICAgICAgICAtIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgdXNlZCBmb3Igc3BlY2lmaWMgYXBwbGljYXRpb25zIG9yIGluIGRlYnVnIHBoYXNlLg0KICogICAgICAgIC0gSXQgaXMgc3VpdGFibGUgd2hlbiBvbmx5IG9uZSBmbGFnIGNoZWNraW5nIGlzIG5lZWRlZCAobW9zdCBJMkMgZXZlbnRzIA0KICogICAgICAgICAgYXJlIG1vbml0b3JlZCB0aHJvdWdoIG11bHRpcGxlIGZsYWdzKS4NCiAqICAgICAtIExpbWl0YXRpb25zOiANCiAqICAgICAgICAtIFdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU3RhdHVzIHJlZ2lzdGVyIGlzIGFjY2Vzc2VkLiBTb21lIGZsYWdzIGFyZQ0KICogICAgICAgICAgY2xlYXJlZCB3aGVuIHRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgYWNjZXNzZWQuIFNvIGNoZWNraW5nIHRoZSBzdGF0dXMNCiAqICAgICAgICAgIG9mIG9uZSBGbGFnLCBtYXkgY2xlYXIgb3RoZXIgb25lcy4NCiAqICAgICAgICAtIEZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCB0d2ljZSBvciBtb3JlIGluIG9yZGVyIHRvIG1vbml0b3Igb25lIA0KICogICAgICAgICAgc2luZ2xlIGV2ZW50Lg0KICoNCiAqICBGb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgRXZlbnRzLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiBJMkNfRXZlbnRzIGluIA0KICogIHN0bTMyZjEweF9pMmMuaCBmaWxlLg0KICogIA0KICovDQoNCi8qKg0KICogDQogKiAgMSkgQmFzaWMgc3RhdGUgbW9uaXRvcmluZw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqLw0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBsYXN0IEkyQ3ggRXZlbnQgaXMgZXF1YWwgdG8gdGhlIG9uZSBwYXNzZWQNCiAgKiAgIGFzIHBhcmFtZXRlci4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgSTJDX0VWRU5UOiBzcGVjaWZpZXMgdGhlIGV2ZW50IHRvIGJlIGNoZWNrZWQuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBJMkNfRVZFTlRfU0xBVkVfVFJBTlNNSVRURVJfQUREUkVTU19NQVRDSEVEICAgICAgICAgICA6IEVWMQ0KICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9SRUNFSVZFUl9BRERSRVNTX01BVENIRUQgICAgICAgICAgICAgIDogRVYxDQogICogICAgIEBhcmcgSTJDX0VWRU5UX1NMQVZFX1RSQU5TTUlUVEVSX1NFQ09OREFERFJFU1NfTUFUQ0hFRCAgICAgOiBFVjENCiAgKiAgICAgQGFyZyBJMkNfRVZFTlRfU0xBVkVfUkVDRUlWRVJfU0VDT05EQUREUkVTU19NQVRDSEVEICAgICAgICA6IEVWMQ0KICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9HRU5FUkFMQ0FMTEFERFJFU1NfTUFUQ0hFRCAgICAgICAgICAgIDogRVYxDQogICogICAgIEBhcmcgSTJDX0VWRU5UX1NMQVZFX0JZVEVfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVjINCiAgKiAgICAgQGFyZyAoSTJDX0VWRU5UX1NMQVZFX0JZVEVfUkVDRUlWRUQgfCBJMkNfRkxBR19EVUFMRikgICAgICA6IEVWMg0KICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9SRUNFSVZFRCB8IEkyQ19GTEFHX0dFTkNBTEwpICAgIDogRVYyDQogICogICAgIEBhcmcgSTJDX0VWRU5UX1NMQVZFX0JZVEVfVFJBTlNNSVRURUQgICAgICAgICAgICAgICAgICAgICAgOiBFVjMNCiAgKiAgICAgQGFyZyAoSTJDX0VWRU5UX1NMQVZFX0JZVEVfVFJBTlNNSVRURUQgfCBJMkNfRkxBR19EVUFMRikgICA6IEVWMw0KICAqICAgICBAYXJnIChJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCB8IEkyQ19GTEFHX0dFTkNBTEwpIDogRVYzDQogICogICAgIEBhcmcgSTJDX0VWRU5UX1NMQVZFX0FDS19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVjNfMg0KICAqICAgICBAYXJnIEkyQ19FVkVOVF9TTEFWRV9TVE9QX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgIDogRVY0DQogICogICAgIEBhcmcgSTJDX0VWRU5UX01BU1RFUl9NT0RFX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVjUNCiAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX1RSQU5TTUlUVEVSX01PREVfU0VMRUNURUQgICAgICAgICAgICA6IEVWNiAgICAgDQogICogICAgIEBhcmcgSTJDX0VWRU5UX01BU1RFUl9SRUNFSVZFUl9NT0RFX1NFTEVDVEVEICAgICAgICAgICAgICAgOiBFVjYNCiAgKiAgICAgQGFyZyBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICA6IEVWNw0KICAqICAgICBAYXJnIEkyQ19FVkVOVF9NQVNURVJfQllURV9UUkFOU01JVFRJTkcgICAgICAgICAgICAgICAgICAgIDogRVY4DQogICogICAgIEBhcmcgSTJDX0VWRU5UX01BU1RFUl9CWVRFX1RSQU5TTUlUVEVEICAgICAgICAgICAgICAgICAgICAgOiBFVjhfMg0KICAqICAgICBAYXJnIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9BRERSRVNTMTAgICAgICAgICAgICAgICAgICAgICAgIDogRVY5DQogICogICAgIA0KICAqIEBub3RlOiBGb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgRXZlbnRzLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiANCiAgKiAgICBJMkNfRXZlbnRzIGluIHN0bTMyZjEweF9pMmMuaCBmaWxlLg0KICAqICAgIA0KICAqIEByZXR2YWwgQW4gRXJyb3JTdGF0dXMgZW51bXVyYXRpb24gdmFsdWU6DQogICogLSBTVUNDRVNTOiBMYXN0IGV2ZW50IGlzIGVxdWFsIHRvIHRoZSBJMkNfRVZFTlQNCiAgKiAtIEVSUk9SOiBMYXN0IGV2ZW50IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBJMkNfRVZFTlQNCiAgKi8NCkVycm9yU3RhdHVzIEkyQ19DaGVja0V2ZW50KEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRVZFTlQpDQp7DQogIHVpbnQzMl90IGxhc3RldmVudCA9IDA7DQogIHVpbnQzMl90IGZsYWcxID0gMCwgZmxhZzIgPSAwOw0KICBFcnJvclN0YXR1cyBzdGF0dXMgPSBFUlJPUjsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0VWRU5UKEkyQ19FVkVOVCkpOw0KDQogIC8qIFJlYWQgdGhlIEkyQ3ggc3RhdHVzIHJlZ2lzdGVyICovDQogIGZsYWcxID0gSTJDeC0+U1IxOw0KICBmbGFnMiA9IEkyQ3gtPlNSMjsNCiAgZmxhZzIgPSBmbGFnMiA8PCAxNjsNCg0KICAvKiBHZXQgdGhlIGxhc3QgZXZlbnQgdmFsdWUgZnJvbSBJMkMgc3RhdHVzIHJlZ2lzdGVyICovDQogIGxhc3RldmVudCA9IChmbGFnMSB8IGZsYWcyKSAmIEZMQUdfTWFzazsNCg0KICAvKiBDaGVjayB3aGV0aGVyIHRoZSBsYXN0IGV2ZW50IGNvbnRhaW5zIHRoZSBJMkNfRVZFTlQgKi8NCiAgaWYgKChsYXN0ZXZlbnQgJiBJMkNfRVZFTlQpID09IEkyQ19FVkVOVCkNCiAgew0KICAgIC8qIFNVQ0NFU1M6IGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogICAgc3RhdHVzID0gU1VDQ0VTUzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBFUlJPUjogbGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSBJMkNfRVZFTlQgKi8NCiAgICBzdGF0dXMgPSBFUlJPUjsNCiAgfQ0KICAvKiBSZXR1cm4gc3RhdHVzICovDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICogDQogKiAgMikgQWR2YW5jZWQgc3RhdGUgbW9uaXRvcmluZw0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqLw0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGxhc3QgSTJDeCBFdmVudC4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqICAgICANCiAgKiBAbm90ZTogRm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIEV2ZW50cywgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gDQogICogICAgSTJDX0V2ZW50cyBpbiBzdG0zMmYxMHhfaTJjLmggZmlsZS4NCiAgKiAgICANCiAgKiBAcmV0dmFsIFRoZSBsYXN0IGV2ZW50DQogICovDQp1aW50MzJfdCBJMkNfR2V0TGFzdEV2ZW50KEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICB1aW50MzJfdCBsYXN0ZXZlbnQgPSAwOw0KICB1aW50MzJfdCBmbGFnMSA9IDAsIGZsYWcyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KDQogIC8qIFJlYWQgdGhlIEkyQ3ggc3RhdHVzIHJlZ2lzdGVyICovDQogIGZsYWcxID0gSTJDeC0+U1IxOw0KICBmbGFnMiA9IEkyQ3gtPlNSMjsNCiAgZmxhZzIgPSBmbGFnMiA8PCAxNjsNCg0KICAvKiBHZXQgdGhlIGxhc3QgZXZlbnQgdmFsdWUgZnJvbSBJMkMgc3RhdHVzIHJlZ2lzdGVyICovDQogIGxhc3RldmVudCA9IChmbGFnMSB8IGZsYWcyKSAmIEZMQUdfTWFzazsNCg0KICAvKiBSZXR1cm4gc3RhdHVzICovDQogIHJldHVybiBsYXN0ZXZlbnQ7DQp9DQoNCi8qKg0KICogDQogKiAgMykgRmxhZy1iYXNlZCBzdGF0ZSBtb25pdG9yaW5nDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICovDQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBJMkMgZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgSTJDX0ZMQUdfRFVBTEY6IER1YWwgZmxhZyAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJIT1NUOiBTTUJ1cyBob3N0IGhlYWRlciAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJERUZBVUxUOiBTTUJ1cyBkZWZhdWx0IGhlYWRlciAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19HRU5DQUxMOiBHZW5lcmFsIGNhbGwgaGVhZGVyIGZsYWcgKFNsYXZlIG1vZGUpDQogICogICAgIEBhcmcgSTJDX0ZMQUdfVFJBOiBUcmFuc21pdHRlci9SZWNlaXZlciBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfQlVTWTogQnVzIGJ1c3kgZmxhZw0KICAqICAgICBAYXJnIEkyQ19GTEFHX01TTDogTWFzdGVyL1NsYXZlIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KICAqICAgICBAYXJnIEkyQ19GTEFHX1RJTUVPVVQ6IFRpbWVvdXQgb3IgVGxvdyBlcnJvciBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KICAqICAgICBAYXJnIEkyQ19GTEFHX1RYRTogRGF0YSByZWdpc3RlciBlbXB0eSBmbGFnIChUcmFuc21pdHRlcikNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19SWE5FOiBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAoUmVjZWl2ZXIpIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TVE9QRjogU3RvcCBkZXRlY3Rpb24gZmxhZyAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19BREQxMDogMTAtYml0IGhlYWRlciBzZW50IGZsYWcgKE1hc3RlciBtb2RlKQ0KICAqICAgICBAYXJnIEkyQ19GTEFHX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfQUREUjogQWRkcmVzcyBzZW50IGZsYWcgKE1hc3RlciBtb2RlKSCTQURTTJQNCiAgKiAgIEFkZHJlc3MgbWF0Y2hlZCBmbGFnIChTbGF2ZSBtb2RlKZRFTkRBRJQNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBJMkNfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgSTJDX0dldEZsYWdTdGF0dXMoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQzMl90IEkyQ19GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICBfX0lPIHVpbnQzMl90IGkyY3JlZyA9IDAsIGkyY3hiYXNlID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0dFVF9GTEFHKEkyQ19GTEFHKSk7DQoNCiAgLyogR2V0IHRoZSBJMkN4IHBlcmlwaGVyYWwgYmFzZSBhZGRyZXNzICovDQogIGkyY3hiYXNlID0gKHVpbnQzMl90KUkyQ3g7DQogIA0KICAvKiBSZWFkIGZsYWcgcmVnaXN0ZXIgaW5kZXggKi8NCiAgaTJjcmVnID0gSTJDX0ZMQUcgPj4gMjg7DQogIA0KICAvKiBHZXQgYml0WzIzOjBdIG9mIHRoZSBmbGFnICovDQogIEkyQ19GTEFHICY9IEZMQUdfTWFzazsNCiAgDQogIGlmKGkyY3JlZyAhPSAwKQ0KICB7DQogICAgLyogR2V0IHRoZSBJMkN4IFNSMSByZWdpc3RlciBhZGRyZXNzICovDQogICAgaTJjeGJhc2UgKz0gMHgxNDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBGbGFnIGluIEkyQ3ggU1IyIFJlZ2lzdGVyICovDQogICAgSTJDX0ZMQUcgPSAodWludDMyX3QpKEkyQ19GTEFHID4+IDE2KTsNCiAgICAvKiBHZXQgdGhlIEkyQ3ggU1IyIHJlZ2lzdGVyIGFkZHJlc3MgKi8NCiAgICBpMmN4YmFzZSArPSAweDE4Ow0KICB9DQogIA0KICBpZigoKCooX19JTyB1aW50MzJfdCAqKWkyY3hiYXNlKSAmIEkyQ19GTEFHKSAhPSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICAvKiBJMkNfRkxBRyBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogSTJDX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICANCiAgLyogUmV0dXJuIHRoZSBJMkNfRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCg0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgSTJDeCdzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIEkyQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KICAqICAgICBAYXJnIEkyQ19GTEFHX1RJTUVPVVQ6IFRpbWVvdXQgb3IgVGxvdyBlcnJvciBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBmbGFnDQogICogICAgIEBhcmcgSTJDX0ZMQUdfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KICAqICAgDQogICogQG5vdGUNCiAgKiAgIC0gU1RPUEYgKFNUT1AgZGV0ZWN0aW9uKSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIA0KICAqICAgICB0byBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0RmxhZ1N0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIG9wZXJhdGlvbiANCiAgKiAgICAgdG8gSTJDX0NSMSByZWdpc3RlciAoSTJDX0NtZCgpIHRvIHJlLWVuYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwpLg0KICAqICAgLSBBREQxMCAoMTAtYml0IGhlYWRlciBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgDQogICogICAgIG9wZXJhdGlvbiB0byBJMkNfU1IxIChJMkNfR2V0RmxhZ1N0YXR1cygpKSBmb2xsb3dlZCBieSB3cml0aW5nIHRoZSANCiAgKiAgICAgc2Vjb25kIGJ5dGUgb2YgdGhlIGFkZHJlc3MgaW4gRFIgcmVnaXN0ZXIuDQogICogICAtIEJURiAoQnl0ZSBUcmFuc2ZlciBGaW5pc2hlZCkgaXMgY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZTogYSByZWFkIA0KICAqICAgICBvcGVyYXRpb24gdG8gSTJDX1NSMSByZWdpc3RlciAoSTJDX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSANCiAgKiAgICAgcmVhZC93cml0ZSB0byBJMkNfRFIgcmVnaXN0ZXIgKEkyQ19TZW5kRGF0YSgpKS4NCiAgKiAgIC0gQUREUiAoQWRkcmVzcyBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KICAqICAgICBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0RmxhZ1N0YXR1cygpKSBmb2xsb3dlZCBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KICAqICAgICBJMkNfU1IyIHJlZ2lzdGVyICgodm9pZCkoSTJDeC0+U1IyKSkuDQogICogICAtIFNCIChTdGFydCBCaXQpIGlzIGNsZWFyZWQgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gSTJDX1NSMQ0KICAqICAgICByZWdpc3RlciAoSTJDX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24gdG8gSTJDX0RSDQogICogICAgIHJlZ2lzdGVyICAoSTJDX1NlbmREYXRhKCkpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfQ2xlYXJGbGFnKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfRkxBRykNCnsNCiAgdWludDMyX3QgZmxhZ3BvcyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfQ0xFQVJfRkxBRyhJMkNfRkxBRykpOw0KICAvKiBHZXQgdGhlIEkyQyBmbGFnIHBvc2l0aW9uICovDQogIGZsYWdwb3MgPSBJMkNfRkxBRyAmIEZMQUdfTWFzazsNCiAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEkyQyBmbGFnICovDQogIEkyQ3gtPlNSMSA9ICh1aW50MTZfdCl+ZmxhZ3BvczsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgSTJDX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBJMkNfSVRfU01CQUxFUlQ6IFNNQnVzIEFsZXJ0IGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfVElNRU9VVDogVGltZW91dCBvciBUbG93IGVycm9yIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfT1ZSOiBPdmVycnVuL1VuZGVycnVuIGZsYWcgKFNsYXZlIG1vZGUpDQogICogICAgIEBhcmcgSTJDX0lUX0FGOiBBY2tub3dsZWRnZSBmYWlsdXJlIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiAgKiAgICAgQGFyZyBJMkNfSVRfQkVSUjogQnVzIGVycm9yIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfVFhFOiBEYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcgKFRyYW5zbWl0dGVyKQ0KICAqICAgICBAYXJnIEkyQ19JVF9SWE5FOiBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAoUmVjZWl2ZXIpIGZsYWcNCiAgKiAgICAgQGFyZyBJMkNfSVRfU1RPUEY6IFN0b3AgZGV0ZWN0aW9uIGZsYWcgKFNsYXZlIG1vZGUpDQogICogICAgIEBhcmcgSTJDX0lUX0FERDEwOiAxMC1iaXQgaGVhZGVyIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpDQogICogICAgIEBhcmcgSTJDX0lUX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQogICogICAgIEBhcmcgSTJDX0lUX0FERFI6IEFkZHJlc3Mgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkgk0FEU0yUDQogICogICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF0Y2hlZCBmbGFnIChTbGF2ZSBtb2RlKZRFTkRBRJQNCiAgKiAgICAgQGFyZyBJMkNfSVRfU0I6IFN0YXJ0IGJpdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgSTJDX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgSTJDX0dldElUU3RhdHVzKEkyQ19UeXBlRGVmKiBJMkN4LCB1aW50MzJfdCBJMkNfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1aW50MzJfdCBlbmFibGVzdGF0dXMgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfR0VUX0lUKEkyQ19JVCkpOw0KDQogIC8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90ICovDQogIGVuYWJsZXN0YXR1cyA9ICh1aW50MzJfdCkoKChJMkNfSVQgJiBJVEVOX01hc2spID4+IDE2KSAmIChJMkN4LT5DUjIpKSA7DQogIA0KICAvKiBHZXQgYml0WzIzOjBdIG9mIHRoZSBmbGFnICovDQogIEkyQ19JVCAmPSBGTEFHX01hc2s7DQoNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnICovDQogIGlmICgoKEkyQ3gtPlNSMSAmIEkyQ19JVCkgIT0gKHVpbnQzMl90KVJFU0VUKSAmJiBlbmFibGVzdGF0dXMpDQogIHsNCiAgICAvKiBJMkNfSVQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEkyQ19JVCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgSTJDX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIEkyQ3iScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KICAqIEBwYXJhbSAgSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBJMkNfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgSTJDX0lUX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBJMkNfSVRfVElNRU9VVDogVGltZW91dCBvciBUbG93IGVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIEkyQ19JVF9QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gIGludGVycnVwdA0KICAqICAgICBAYXJnIEkyQ19JVF9PVlI6IE92ZXJydW4vVW5kZXJydW4gaW50ZXJydXB0IChTbGF2ZSBtb2RlKQ0KICAqICAgICBAYXJnIEkyQ19JVF9BRjogQWNrbm93bGVkZ2UgZmFpbHVyZSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBJMkNfSVRfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgKE1hc3RlciBtb2RlKQ0KICAqICAgICBAYXJnIEkyQ19JVF9CRVJSOiBCdXMgZXJyb3IgaW50ZXJydXB0DQogICogICANCiAgKiBAbm90ZQ0KICAqICAgLSBTVE9QRiAoU1RPUCBkZXRlY3Rpb24pIGlzIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gDQogICogICAgIHRvIEkyQ19TUjEgcmVnaXN0ZXIgKEkyQ19HZXRJVFN0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIG9wZXJhdGlvbiB0byANCiAgKiAgICAgSTJDX0NSMSByZWdpc3RlciAoSTJDX0NtZCgpIHRvIHJlLWVuYWJsZSB0aGUgSTJDIHBlcmlwaGVyYWwpLg0KICAqICAgLSBBREQxMCAoMTAtYml0IGhlYWRlciBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgDQogICogICAgIG9wZXJhdGlvbiB0byBJMkNfU1IxIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgd3JpdGluZyB0aGUgc2Vjb25kIA0KICAqICAgICBieXRlIG9mIHRoZSBhZGRyZXNzIGluIEkyQ19EUiByZWdpc3Rlci4NCiAgKiAgIC0gQlRGIChCeXRlIFRyYW5zZmVyIEZpbmlzaGVkKSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgDQogICogICAgIG9wZXJhdGlvbiB0byBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSANCiAgKiAgICAgcmVhZC93cml0ZSB0byBJMkNfRFIgcmVnaXN0ZXIgKEkyQ19TZW5kRGF0YSgpKS4NCiAgKiAgIC0gQUREUiAoQWRkcmVzcyBzZW50KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KICAqICAgICBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byANCiAgKiAgICAgSTJDX1NSMiByZWdpc3RlciAoKHZvaWQpKEkyQ3gtPlNSMikpLg0KICAqICAgLSBTQiAoU3RhcnQgQml0KSBpcyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KICAqICAgICBJMkNfU1IxIHJlZ2lzdGVyIChJMkNfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24gdG8gDQogICogICAgIEkyQ19EUiByZWdpc3RlciAoSTJDX1NlbmREYXRhKCkpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBJMkNfQ2xlYXJJVFBlbmRpbmdCaXQoSTJDX1R5cGVEZWYqIEkyQ3gsIHVpbnQzMl90IEkyQ19JVCkNCnsNCiAgdWludDMyX3QgZmxhZ3BvcyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfQ0xFQVJfSVQoSTJDX0lUKSk7DQogIC8qIEdldCB0aGUgSTJDIGZsYWcgcG9zaXRpb24gKi8NCiAgZmxhZ3BvcyA9IEkyQ19JVCAmIEZMQUdfTWFzazsNCiAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEkyQyBmbGFnICovDQogIEkyQ3gtPlNSMSA9ICh1aW50MTZfdCl+ZmxhZ3BvczsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8gDQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKioNCiAgKiBAfQ0KICAqLyANCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==