ZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZAppbmRleCBmMWM5ZmYwLi4zYzcyZDc4IDEwMDY0NAotLS0gYS9DT05UUklCVVRJTkcubWQKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC01LDkgKzUsOSBAQAogVGhpcyBndWlkZSBtYWlubHkgZm9jdXNlcyBvbiB0aGUgcHJvcGVyIHVzZSBvZiBHaXQuCiAKICMjIyAxLiBCZWZvcmUgb3BlbmluZyBhbiBpc3N1ZQotVG8gcmVwb3J0IGEgYnVnL3JlcXVlc3QgcGxlYXNlIGZpbGUgYW4gaXNzdWUgaW4gdGhlIHJpZ2h0IHJlcG9zaXRvcnkKLShleGFtcGxlIGZvciBbc3RtMzJmN3h4X2hhbF9kcml2ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9TVE1pY3JvZWxlY3Ryb25pY3Mvc3RtMzJmN3h4X2hhbF9kcml2ZXIvaXNzdWVzL25ldy9jaG9vc2UpKS4KLUJ1dCBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgorSW4gb3JkZXIgdG8gY2VudHJhbGl6ZSB5b3VyIGJ1ZyByZXBvcnRzIGFuZCByZXF1ZXN0cyBhbmQgdG8gZWFzZSB0aGVpciB0cmFja2luZyBwbGVhc2UgZmlsZSBhbiBpc3N1ZSBpbnRvIHRoZSBmaXJtd2FyZSByZXBvc2l0b3J5IFtTVE0zMkN1YmVGN10oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVGNy9pc3N1ZXMvbmV3L2Nob29zZSkuCisKK1BsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIGJveGVzIGJlZm9yZSBwb3N0aW5nIGFuIGlzc3VlOgogCiAtIFsgXSBgTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIGxhdGVzdCBjb21taXQgKG1ham9yIHJlbGVhc2VzIGFyZSBUYWdnZWQsIGJ1dCBjb3JyZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFzIG5ldyBjb21taXRzKS5gCiAtIFsgXSBgTWFrZSBzdXJlIHlvdXIgaXNzdWUgaXMgYSBxdWVzdGlvbi9mZWVkYmFjay9zdWdnZXN0aW9ucyBSRUxBVEVEIFRPIHRoZSBzb2Z0d2FyZSBwcm92aWRlZCBpbiB0aGlzIHJlcG8uYCBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBkaXNjdXNzZWQgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgpAQCAtMTUsNyArMTUsNyBAQAogCiAKICMjIyAyLiBQb3N0aW5nIHRoZSBpc3N1ZQotV2hlbiB5b3UgaGF2ZSBjaGVja2VkIHRoZSBwcmV2aW91cyBib3hlcy4gWW91IHdpbGwgZmluZCB0d28gdGVtcGxhdGVzIElzc3VlcyAoQnVnIFJlcG9ydCBvciBPdGhlciBJc3N1ZSkgYXZhaWxhYmxlIGluIHRoZSAqKklzc3VlcyoqIHRhYiBvZiB0aGUgcmVwbworT25jZSB5b3UgaGF2ZSBjaGVja2VkIHRoZSBwcmV2aW91cyBib3hlcywgeW91IHdpbGwgZmluZCB0d28gdGVtcGxhdGVzIGZvciBpc3N1ZXMgKEJ1ZyBSZXBvcnQgb3IgT3RoZXIgSXNzdWUpIGF2YWlsYWJsZSBpbiB0aGUgKipJc3N1ZXMqKiB0YWIgb2YgdGhlIGZpcm13YXJlIHJlcG9zaXRvcnkuCiAKICMjIyAzLiBQdWxsIFJlcXVlc3RzCi1Gb3IgdGhlIG1vbWVudCwgdGhlIFB1bGwgUmVxdWVzdCBmZWF0dXJlIGlzIG5vdCBkZXBsb3llZC4gU1RNaWNyb2xlY3Ryb25pY3MgaXMgd29ya2luZyBvbiBhIENvbnRyaWJ1dG9yIExpY2Vuc2UgQWdyZWVtZW50IHByb2NlZHVyZQorRm9yIHRoZSBtb21lbnQsIHRoZSBQdWxsIFJlcXVlc3QgZmVhdHVyZSBpcyBub3QgZGVwbG95ZWQuIFNUTWljcm9sZWN0cm9uaWNzIGlzIHdvcmtpbmcgb24gYSBDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudCAoQ0xBKSBwcm9jZWR1cmUuCmRpZmYgLS1naXQgYS9JbmMvTGVnYWN5L3N0bTMyX2hhbF9sZWdhY3kuaCBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCmluZGV4IDg4OWRiOGYuLjkwNzY3ZWQgMTAwNjQ0Ci0tLSBhL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCisrKyBiL0luYy9MZWdhY3kvc3RtMzJfaGFsX2xlZ2FjeS5oCkBAIC03LDcgKzcsNyBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE4IFNUTWljcm9lbGVjdHJvbmljcy4KKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgICoKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKQEAgLTIzNiw2ICsyMzYsMTYgQEAKICNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX05PSVNFICAgICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfTk9JU0UKICNkZWZpbmUgREFDX1dBVkVHRU5FUkFUSU9OX1RSSUFOR0xFICAgICAgICAgICAgICAgICAgICAgREFDX1dBVkVfVFJJQU5HTEUKIAorI2lmIGRlZmluZWQoU1RNMzJHNCkgfHwgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBEQUNfQ0hJUENPTk5FQ1RfRElTQUJMRSAgICAgICBEQUNfQ0hJUENPTk5FQ1RfRVhURVJOQUwKKyNkZWZpbmUgREFDX0NISVBDT05ORUNUX0VOQUJMRSAgICAgICAgREFDX0NISVBDT05ORUNUX0lOVEVSTkFMCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRjQpCisjZGVmaW5lIEhBTF9EQUNfTVNQX0lOSVRfQ0JfSUQgICAgICAgSEFMX0RBQ19NU1BJTklUX0NCX0lECisjZGVmaW5lIEhBTF9EQUNfTVNQX0RFSU5JVF9DQl9JRCAgICAgSEFMX0RBQ19NU1BERUlOSVRfQ0JfSUQKKyNlbmRpZgorCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjk2LDggKzMwNiwxNyBAQAogI2RlZmluZSBIQUxfRE1BTVVYX1JFUVVFU1RfR0VOX0ZBTExJTkcgICAgICAgICAgIEhBTF9ETUFNVVhfUkVRX0dFTl9GQUxMSU5HCiAjZGVmaW5lIEhBTF9ETUFNVVhfUkVRVUVTVF9HRU5fUklTSU5HX0ZBTExJTkcgICAgSEFMX0RNQU1VWF9SRVFfR0VOX1JJU0lOR19GQUxMSU5HCiAKKyNpZiBkZWZpbmVkKFNUTTMyTDRSNXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRSOXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRSOXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRTNXh4KSB8fCBkZWZpbmVkKFNUTTMyTDRTN3h4KSB8fCBkZWZpbmVkKFNUTTMyTDRTOXh4KQorI2RlZmluZSBETUFfUkVRVUVTVF9EQ01JX1BTU0kgICAgICAgICAgICAgICAgICAgIERNQV9SRVFVRVNUX0RDTUkKKyNlbmRpZgorCiAjZW5kaWYgLyogU1RNMzJMNCAqLwogCisjaWYgZGVmaW5lZChTVE0zMkcwKQorI2RlZmluZSBETUFfUkVRVUVTVF9EQUMxX0NIQU5ORUwxCQkJCQkJCQkgRE1BX1JFUVVFU1RfREFDMV9DSDEKKyNkZWZpbmUgRE1BX1JFUVVFU1RfREFDMV9DSEFOTkVMMgkJCQkJCQkJIERNQV9SRVFVRVNUX0RBQzFfQ0gyCisjZW5kaWYKKwogI2lmIGRlZmluZWQoU1RNMzJINykKIAogI2RlZmluZSBETUFfUkVRVUVTVF9EQUMxIERNQV9SRVFVRVNUX0RBQzFfQ0gxCkBAIC0zNTUsNiArMzc0LDkgQEAKICNkZWZpbmUgREZTRE1fRklMVEVSX0VYVF9UUklHX0xQVElNMiAgICAgICAgICAgICAgIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTJfT1VUCiAjZGVmaW5lIERGU0RNX0ZJTFRFUl9FWFRfVFJJR19MUFRJTTMgICAgICAgICAgICAgICBERlNETV9GSUxURVJfRVhUX1RSSUdfTFBUSU0zX09VVAogCisjZGVmaW5lIERBQ19UUklHR0VSX0xQMV9PVVQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfVFJJR0dFUl9MUFRJTTFfT1VUCisjZGVmaW5lIERBQ19UUklHR0VSX0xQMl9PVVQgICAgICAgICAgICAgICAgICAgICAgICBEQUNfVFJJR0dFUl9MUFRJTTJfT1VUCisKICNlbmRpZiAvKiBTVE0zMkg3ICovCiAKIC8qKgpAQCAtNDUwLDcgKzQ3Miw5IEBACiAjZGVmaW5lIEZMQVNIX0ZMQUdfU05FQ0NFX0JBTksyUlIgRkxBU0hfRkxBR19TTkVDQ0VSUl9CQU5LMgogI2RlZmluZSBGTEFTSF9GTEFHX0RCRUNDRV9CQU5LMlJSIEZMQVNIX0ZMQUdfREJFQ0NFUlJfQkFOSzIKICNkZWZpbmUgRkxBU0hfRkxBR19TVFJCRVJfQkFOSzJSICBGTEFTSF9GTEFHX1NUUkJFUlJfQkFOSzIKLSNlbmRpZgorI2RlZmluZSBGTEFTSF9GTEFHX1dEVyAgICAgICAgICAgIEZMQVNIX0ZMQUdfV0JORQorI2RlZmluZSBPQl9XUlBfU0VDVE9SX0FsbCAgICAgICAgIE9CX1dSUF9TRUNUT1JfQUxMCisjZW5kaWYgLyogU1RNMzJINyAqLwogCiAvKioKICAgKiBAfQpAQCAtNDg2LDYgKzUxMCwxMyBAQAogI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkMxICAgICAgIEkyQ19GQVNUTU9ERVBMVVNfSTJDMQogI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkMyICAgICAgIEkyQ19GQVNUTU9ERVBMVVNfSTJDMgogI2RlZmluZSBIQUxfU1lTQ0ZHX0ZBU1RNT0RFUExVU19JMkMzICAgICAgIEkyQ19GQVNUTU9ERVBMVVNfSTJDMworI2lmIGRlZmluZWQoU1RNMzJHNCkKKworI2RlZmluZSBIQUxfU1lTQ0ZHX0VuYWJsZUlPQW5hbG9nU3dpdGNoQm9vc3RlciAgICBIQUxfU1lTQ0ZHX0VuYWJsZUlPU3dpdGNoQm9vc3RlcgorI2RlZmluZSBIQUxfU1lTQ0ZHX0Rpc2FibGVJT0FuYWxvZ1N3aXRjaEJvb3N0ZXIgICBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaEJvb3N0ZXIKKyNkZWZpbmUgSEFMX1NZU0NGR19FbmFibGVJT0FuYWxvZ1N3aXRjaFZERCAgICAgICAgSEFMX1NZU0NGR19FbmFibGVJT1N3aXRjaFZERAorI2RlZmluZSBIQUxfU1lTQ0ZHX0Rpc2FibGVJT0FuYWxvZ1N3aXRjaFZERCAgICAgICBIQUxfU1lTQ0ZHX0Rpc2FibGVJT1N3aXRjaFZERAorI2VuZGlmIC8qIFNUTTMyRzQgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC00OTQsNyArNTI1LDcgQEAKIC8qKiBAZGVmZ3JvdXAgTExfRk1DX0FsaWFzZWRfRGVmaW5lcyBMTCBGTUMgQWxpYXNlZCBEZWZpbmVzIG1haW50YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZQogICAqIEB7CiAgICovCi0jaWYgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjcpIHx8IGRlZmluZWQoU1RNMzJINykKKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkg3KSB8fCBkZWZpbmVkKFNUTTMyRzQpCiAjZGVmaW5lIEZNQ19OQU5EX1BDQ19XQUlUX0ZFQVRVUkVfRElTQUJMRSAgICAgICBGTUNfTkFORF9XQUlUX0ZFQVRVUkVfRElTQUJMRQogI2RlZmluZSBGTUNfTkFORF9QQ0NfV0FJVF9GRUFUVVJFX0VOQUJMRSAgICAgICAgRk1DX05BTkRfV0FJVF9GRUFUVVJFX0VOQUJMRQogI2RlZmluZSBGTUNfTkFORF9QQ0NfTUVNX0JVU19XSURUSF84ICAgICAgICAgICAgRk1DX05BTkRfTUVNX0JVU19XSURUSF84CkBAIC01NDcsMTggKzU3OCwyNSBAQAogI2RlZmluZSBHUElPX0FGOV9TRElPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGOV9TRE1NQzIKICNkZWZpbmUgR1BJT19BRjEwX1NESU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjEwX1NETU1DMgogI2RlZmluZSBHUElPX0FGMTFfU0RJTzIgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMTFfU0RNTUMyCi0jZW5kaWYKKworI2lmIGRlZmluZWQgKFNUTTMySDc0M3h4KSB8fCBkZWZpbmVkIChTVE0zMkg3NTN4eCkgIHx8IGRlZmluZWQgKFNUTTMySDc1MHh4KSB8fCBkZWZpbmVkIChTVE0zMkg3NDJ4eCkgfHwgXAorICAgIGRlZmluZWQgKFNUTTMySDc0NXh4KSB8fCBkZWZpbmVkIChTVE0zMkg3NTV4eCkgIHx8IGRlZmluZWQgKFNUTTMySDc0N3h4KSB8fCBkZWZpbmVkIChTVE0zMkg3NTd4eCkKKyNkZWZpbmUgR1BJT19BRjEwX09URzJfSFMgIEdQSU9fQUYxMF9PVEcyX0ZTCisjZGVmaW5lIEdQSU9fQUYxMF9PVEcxX0ZTICBHUElPX0FGMTBfT1RHMV9IUworI2RlZmluZSBHUElPX0FGMTJfT1RHMl9GUyAgR1BJT19BRjEyX09URzFfRlMKKyNlbmRpZiAvKlNUTTMySDc0M3h4IHx8IFNUTTMySDc1M3h4IHx8IFNUTTMySDc1MHh4IHx8IFNUTTMySDc0Mnh4IHx8IFNUTTMySDc0NXh4IHx8IFNUTTMySDc1NXh4IHx8IFNUTTMySDc0N3h4IHx8IFNUTTMySDc1N3h4ICovCisjZW5kaWYgLyogU1RNMzJINyAqLwogCiAjZGVmaW5lIEdQSU9fQUYwX0xQVElNICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fQUYwX0xQVElNMQogI2RlZmluZSBHUElPX0FGMV9MUFRJTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPX0FGMV9MUFRJTTEKICNkZWZpbmUgR1BJT19BRjJfTFBUSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19BRjJfTFBUSU0xCiAKLSNpZiBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkg3KQorI2lmIGRlZmluZWQoU1RNMzJMMCkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRzQpIHx8IGRlZmluZWQoU1RNMzJINykKICNkZWZpbmUgIEdQSU9fU1BFRURfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT19TUEVFRF9GUkVRX0xPVwogI2RlZmluZSAgR1BJT19TUEVFRF9NRURJVU0gICAgICAgICAgICAgICAgICAgICAgICBHUElPX1NQRUVEX0ZSRVFfTUVESVVNCiAjZGVmaW5lICBHUElPX1NQRUVEX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9ISUdICiAjZGVmaW5lICBHUElPX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9fU1BFRURfRlJFUV9WRVJZX0hJR0gKLSNlbmRpZiAvKiBTVE0zMkwwIHx8IFNUTTMyTDQgfHwgU1RNMzJGNCB8fCBTVE0zMkYyIHx8IFNUTTMyRjcgfHwgU1RNMzJINyovCisjZW5kaWYgLyogU1RNMzJMMCB8fCBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGMiB8fCBTVE0zMkY3IHx8IFNUTTMyRzQgfHwgU1RNMzJINyovCiAKICNpZiBkZWZpbmVkKFNUTTMyTDEpCiAgI2RlZmluZSAgR1BJT19TUEVFRF9WRVJZX0xPVyAgICBHUElPX1NQRUVEX0ZSRVFfTE9XCkBAIC01OTksNiArNjM3LDE4NSBAQAogI2RlZmluZSBfX0hBTF9IUlRJTV9HZXRDbG9ja1ByZXNjYWxlciBfX0hBTF9IUlRJTV9HRVRDTE9DS1BSRVNDQUxFUgogI2RlZmluZSBfX0hBTF9IUlRJTV9TZXRDb21wYXJlICAgICAgICBfX0hBTF9IUlRJTV9TRVRDT01QQVJFCiAjZGVmaW5lIF9fSEFMX0hSVElNX0dldENvbXBhcmUgICAgICAgIF9fSEFMX0hSVElNX0dFVENPTVBBUkUKKworI2lmIGRlZmluZWQoU1RNMzJHNCkKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyQ29uZmlnICAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJDb25maWcKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyRW5hYmxlICAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJFbmFibGUKKyNkZWZpbmUgSEFMX0hSVElNX0V4dGVybmFsRXZlbnRDb3VudGVyRGlzYWJsZSAgIEhBTF9IUlRJTV9FeHRFdmVudENvdW50ZXJEaXNhYmxlCisjZGVmaW5lIEhBTF9IUlRJTV9FeHRlcm5hbEV2ZW50Q291bnRlclJlc2V0ICAgICBIQUxfSFJUSU1fRXh0RXZlbnRDb3VudGVyUmVzZXQKKyNlbmRpZiAvKiBTVE0zMkc0ICovCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYxX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYyX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVYzX1RJTUNDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY0X1RJTUNDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY1X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY2X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1BRVY5X1RJTUZDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVYzX1RJTUNDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY0X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY1X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY2X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY3X1RJTUVDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1CRVY5X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVYzX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY0X1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY2X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY3X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1DRVY5X1RJTUZDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYxX1RJTUFDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYyX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVYzX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY0X1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY2X1RJTUVDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY3X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY4X1RJTUZDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1ERVY5X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYxX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYyX1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVYzX1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY2X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY3X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY4X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FRVY5X1RJTUZDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl85CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYxX1RJTUFDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8xCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYyX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVYzX1RJTUJDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8zCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY0X1RJTUNDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl80CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY2X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl82CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY3X1RJTURDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl83CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1GRVY5X1RJTUVDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl85CisKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWMV9USU1CQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVYyX1RJTUJDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjNfVElNQ0NNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWNF9USU1DQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVY1X1RJTURDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjZfVElNRENNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQUVWN19USU1FQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1BRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUFFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjNfVElNQ0NNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWNF9USU1DQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVY1X1RJTURDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQkVWN19USU1FQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1CRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUJFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVYyX1RJTUFDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWNF9USU1CQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjZfVElNRENNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNQ0VWN19USU1FQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1DRVY4X1RJTUVDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUNFVjlfVElNRkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWMV9USU1BQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVYyX1RJTUFDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjNfVElNQkNNUDIgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWNF9USU1CQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjZfVElNRUNNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNREVWN19USU1FQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1ERVY4X1RJTUZDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTURFVjlfVElNRkNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWMV9USU1BQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVYyX1RJTUJDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWNF9USU1DQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVY1X1RJTURDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjZfVElNRENNUDEgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRUVWN19USU1EQ01QMiBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FRVY4X1RJTUZDTVAzIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVFVjlfVElNRkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWMV9USU1BQ01QMyBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVYyX1RJTUJDTVAxIEhSVElNX09VVFBVVFNFVF9USU1FVl8yCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjNfVElNQkNNUDQgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzMKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWNF9USU1DQ01QMSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNAorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVY1X1RJTUNDTVA0IEhSVElNX09VVFBVVFNFVF9USU1FVl81CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjZfVElNRENNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzYKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRkVWN19USU1EQ01QNCBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1GRVY4X1RJTUVDTVAyIEhSVElNX09VVFBVVFNFVF9USU1FVl84CisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUZFVjlfVElNRUNNUDMgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzkKKyNlbmRpZiAvKiBTVE0zMkg3ICovCisKKyNpZiBkZWZpbmVkKFNUTTMyRjMpCisvKiogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyBhdmFpbGFibGUgc291cmNlcyBhc3NvY2lhdGVkIHRvIGV4dGVybmFsIGV2ZW50cy4KKyAgKi8KKyNkZWZpbmUgSFJUSU1fRVZFTlRTUkNfMSAgICAgICAgICAgICAgKDB4MDAwMDAwMDBVKQorI2RlZmluZSBIUlRJTV9FVkVOVFNSQ18yICAgICAgICAgICAgICAoSFJUSU1fRUVDUjFfRUUxU1JDXzApCisjZGVmaW5lIEhSVElNX0VWRU5UU1JDXzMgICAgICAgICAgICAgIChIUlRJTV9FRUNSMV9FRTFTUkNfMSkKKyNkZWZpbmUgSFJUSU1fRVZFTlRTUkNfNCAgICAgICAgICAgICAgKEhSVElNX0VFQ1IxX0VFMVNSQ18xIHwgSFJUSU1fRUVDUjFfRUUxU1JDXzApCisKKy8qKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBldmVudHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgdG8gY29uZmlndXJlIHRoZQorICAqICAgICAgICBzZXQvcmVzZXQgY3Jvc3NiYXIgb2YgYSB0aW1lciBvdXRwdXQKKyAgKi8KKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzEgICAgICAgKEhSVElNX1NFVDFSX1RJTUVWTlQxKQorI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfMiAgICAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDIpCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FVl8zICAgICAgIChIUlRJTV9TRVQxUl9USU1FVk5UMykKKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzQgICAgICAgKEhSVElNX1NFVDFSX1RJTUVWTlQ0KQorI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfNSAgICAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDUpCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FVl82ICAgICAgIChIUlRJTV9TRVQxUl9USU1FVk5UNikKKyNkZWZpbmUgSFJUSU1fT1VUUFVUU0VUX1RJTUVWXzcgICAgICAgKEhSVElNX1NFVDFSX1RJTUVWTlQ3KQorI2RlZmluZSBIUlRJTV9PVVRQVVRTRVRfVElNRVZfOCAgICAgICAoSFJUSU1fU0VUMVJfVElNRVZOVDgpCisjZGVmaW5lIEhSVElNX09VVFBVVFNFVF9USU1FVl85ICAgICAgIChIUlRJTV9TRVQxUl9USU1FVk5UOSkKKworI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl8xICAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDEpCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzIgICAgIChIUlRJTV9SU1QxUl9USU1FVk5UMikKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfMyAgICAgKEhSVElNX1JTVDFSX1RJTUVWTlQzKQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl80ICAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDQpCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzUgICAgIChIUlRJTV9SU1QxUl9USU1FVk5UNSkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfNiAgICAgKEhSVElNX1JTVDFSX1RJTUVWTlQ2KQorI2RlZmluZSBIUlRJTV9PVVRQVVRSRVNFVF9USU1FVl83ICAgICAoSFJUSU1fUlNUMVJfVElNRVZOVDcpCisjZGVmaW5lIEhSVElNX09VVFBVVFJFU0VUX1RJTUVWXzggICAgIChIUlRJTV9SU1QxUl9USU1FVk5UOCkKKyNkZWZpbmUgSFJUSU1fT1VUUFVUUkVTRVRfVElNRVZfOSAgICAgKEhSVElNX1JTVDFSX1RJTUVWTlQ5KQorCisvKiogQGJyaWVmIENvbnN0YW50cyBkZWZpbmluZyB0aGUgZXZlbnQgZmlsdGVyaW5nIGFwcGxpZWQgdG8gZXh0ZXJuYWwgZXZlbnRzCisgICogICAgICAgIGJ5IGEgdGltZXIKKyAgKi8KKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfTk9ORSAgICAgICAgICAgICAoMHgwMDAwMDAwMFUpCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HQ01QMSAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMCkKKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfQkxBTktJTkdDTVAyICAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8xKQorI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0NNUDMgICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HQ01QNCAgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMikKKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfQkxBTktJTkdGTFRSMSAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKQorI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFIyICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEpCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HRkxUUjMgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMiB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMSB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMCkKKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfQkxBTktJTkdGTFRSNCAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zKQorI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI1ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX0JMQU5LSU5HRkxUUjYgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMyB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMSkKKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfQkxBTktJTkdGTFRSNyAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8xIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8wKQorI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9CTEFOS0lOR0ZMVFI4ICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIpCisjZGVmaW5lIEhSVElNX1RJTUVWRU5URklMVEVSX1dJTkRPV0lOR0NNUDIgICAgKEhSVElNX0VFRlIxX0VFMUZMVFJfMyB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMiB8IEhSVElNX0VFRlIxX0VFMUZMVFJfMCkKKyNkZWZpbmUgSFJUSU1fVElNRVZFTlRGSUxURVJfV0lORE9XSU5HQ01QMyAgICAoSFJUSU1fRUVGUjFfRUUxRkxUUl8zIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8yIHwgSFJUSU1fRUVGUjFfRUUxRkxUUl8xKQorI2RlZmluZSBIUlRJTV9USU1FVkVOVEZJTFRFUl9XSU5ET1dJTkdUSU0gICAgIChIUlRJTV9FRUZSMV9FRTFGTFRSXzMgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzIgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzEgfCBIUlRJTV9FRUZSMV9FRTFGTFRSXzApCisKKy8qKiBAYnJpZWYgQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBETEwgY2FsaWJyYXRpb24gcGVyaW9kcyAoaW4gbWljcm8gc2Vjb25kcykKKyAgKi8KKyNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzczMDAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgSFJUSU1fQ0FMSUJSQVRJT05SQVRFXzkxMCAgICAgICAgICAgICAgKEhSVElNX0RMTENSX0NBTFJURV8wKQorI2RlZmluZSBIUlRJTV9DQUxJQlJBVElPTlJBVEVfMTE0ICAgICAgICAgICAgICAoSFJUSU1fRExMQ1JfQ0FMUlRFXzEpCisjZGVmaW5lIEhSVElNX0NBTElCUkFUSU9OUkFURV8xNCAgICAgICAgICAgICAgIChIUlRJTV9ETExDUl9DQUxSVEVfMSB8IEhSVElNX0RMTENSX0NBTFJURV8wKQorCisjZW5kaWYgLyogU1RNMzJGMyAqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTczOCw2ICs5NTUsMTIgQEAKICNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9WTTAgICAgICAgICAgICAgICAgICBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9JTzAKICNkZWZpbmUgT1BBTVBfUEdBQ09OTkVDVF9WTTEgICAgICAgICAgICAgICAgICBPUEFNUF9QR0FfQ09OTkVDVF9JTlZFUlRJTkdJTlBVVF9JTzEKIAorI2lmIGRlZmluZWQoU1RNMzJMMSkgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMyTDUpIHx8IGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgSEFMX09QQU1QX01TUF9JTklUX0NCX0lEICAgICAgIEhBTF9PUEFNUF9NU1BJTklUX0NCX0lECisjZGVmaW5lIEhBTF9PUEFNUF9NU1BfREVJTklUX0NCX0lEICAgICBIQUxfT1BBTVBfTVNQREVJTklUX0NCX0lECisjZW5kaWYKKworCiAvKioKICAgKiBAfQogICAqLwpAQCAtNzUzLDcgKzk3Niw2IEBACiAKICAgI2RlZmluZSBJMlNfRkxBR19UWEUgICAgICAgICAgICAgSTJTX0ZMQUdfVFhQCiAgICNkZWZpbmUgSTJTX0ZMQUdfUlhORSAgICAgICAgICAgIEkyU19GTEFHX1JYUAotICAjZGVmaW5lIEkyU19GTEFHX0ZSRSAgICAgICAgICAgICBJMlNfRkxBR19USUZSRQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFNUTTMyRjcpCkBAIC04MjQsNiArMTA0NiwxNiBAQAogI2RlZmluZSBSVENfVEFNUEVSUElOX1BBMCAgUlRDX1RBTVBFUlBJTl9QT1MxCiAjZGVmaW5lIFJUQ19UQU1QRVJQSU5fUEk4ICBSVENfVEFNUEVSUElOX1BPUzEKIAorI2lmIGRlZmluZWQoU1RNMzJINykKKyNkZWZpbmUgUlRDX1RBTVBDUl9UQU1QWEUgICAgICAgICAgUlRDX1RBTVBFUl9YCisjZGVmaW5lIFJUQ19UQU1QQ1JfVEFNUFhJRSAgICAgICAgIFJUQ19UQU1QRVJfWF9JTlRFUlJVUFQKKworI2RlZmluZSBSVENfVEFNUEVSMV9JTlRFUlJVUFQgICAgICBSVENfSVRfVEFNUDEKKyNkZWZpbmUgUlRDX1RBTVBFUjJfSU5URVJSVVBUICAgICAgUlRDX0lUX1RBTVAyCisjZGVmaW5lIFJUQ19UQU1QRVIzX0lOVEVSUlVQVCAgICAgIFJUQ19JVF9UQU1QMworI2RlZmluZSBSVENfQUxMX1RBTVBFUl9JTlRFUlJVUFQgICBSVENfSVRfVEFNUEFMTAorI2VuZGlmIC8qIFNUTTMySDcgKi8KKwogLyoqCiAgICogQH0KICAgKi8KQEAgLTk3MSw2ICsxMjAzLDI0IEBACiAjZGVmaW5lIElTX1RJTV9IQUxMX0lOVEVSRkFDRV9JTlNUQU5DRSAgIElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UKICNlbmRpZgogCisjaWYgZGVmaW5lZChTVE0zMkg3KQorI2RlZmluZSBUSU1fVElNMV9FVFJfQ09NUDFfT1VUICAgICAgICBUSU1fVElNMV9FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTFfRVRSX0NPTVAyX09VVCAgICAgICAgVElNX1RJTTFfRVRSX0NPTVAyCisjZGVmaW5lIFRJTV9USU04X0VUUl9DT01QMV9PVVQgICAgICAgIFRJTV9USU04X0VUUl9DT01QMQorI2RlZmluZSBUSU1fVElNOF9FVFJfQ09NUDJfT1VUICAgICAgICBUSU1fVElNOF9FVFJfQ09NUDIKKyNkZWZpbmUgVElNX1RJTTJfRVRSX0NPTVAxX09VVCAgICAgICAgVElNX1RJTTJfRVRSX0NPTVAxCisjZGVmaW5lIFRJTV9USU0yX0VUUl9DT01QMl9PVVQgICAgICAgIFRJTV9USU0yX0VUUl9DT01QMgorI2RlZmluZSBUSU1fVElNM19FVFJfQ09NUDFfT1VUICAgICAgICBUSU1fVElNM19FVFJfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTFfVEkxX0NPTVAxX09VVCAgICAgICAgVElNX1RJTTFfVEkxX0NPTVAxCisjZGVmaW5lIFRJTV9USU04X1RJMV9DT01QMl9PVVQgICAgICAgIFRJTV9USU04X1RJMV9DT01QMgorI2RlZmluZSBUSU1fVElNMl9USTRfQ09NUDFfT1VUICAgICAgICBUSU1fVElNMl9USTRfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTJfVEk0X0NPTVAyX09VVCAgICAgICAgVElNX1RJTTJfVEk0X0NPTVAyCisjZGVmaW5lIFRJTV9USU0yX1RJNF9DT01QMUNPTVAyX09VVCAgIFRJTV9USU0yX1RJNF9DT01QMV9DT01QMgorI2RlZmluZSBUSU1fVElNM19USTFfQ09NUDFfT1VUICAgICAgICBUSU1fVElNM19USTFfQ09NUDEKKyNkZWZpbmUgVElNX1RJTTNfVEkxX0NPTVAyX09VVCAgICAgICAgVElNX1RJTTNfVEkxX0NPTVAyCisjZGVmaW5lIFRJTV9USU0zX1RJMV9DT01QMUNPTVAyX09VVCAgIFRJTV9USU0zX1RJMV9DT01QMV9DT01QMgorI2VuZGlmCisKIC8qKgogICAqIEB9CiAgICovCkBAIC0xMTk5LDYgKzE0NDksMzAgQEAKIAogI2RlZmluZSBIQVNIX0hNQUNLZXlUeXBlX1Nob3J0S2V5ICBIQVNIX0hNQUNfS0VZVFlQRV9TSE9SVEtFWQogI2RlZmluZSBIQVNIX0hNQUNLZXlUeXBlX0xvbmdLZXkgICBIQVNIX0hNQUNfS0VZVFlQRV9MT05HS0VZCisKKyNpZiBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMySDcpCisKKyNkZWZpbmUgSEFMX0hBU0hfTUQ1X0FjY3VtdWxhdGUgICAgICAgICAgICAgICAgSEFMX0hBU0hfTUQ1X0FjY21sdAorI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9FbmQgICAgICAgICAgICBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZAorI2RlZmluZSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZV9JVCAgICAgICAgICAgICBIQUxfSEFTSF9NRDVfQWNjbWx0X0lUCisjZGVmaW5lIEhBTF9IQVNIX01ENV9BY2N1bXVsYXRlX0VuZF9JVCAgICAgICAgIEhBTF9IQVNIX01ENV9BY2NtbHRfRW5kX0lUCisKKyNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlICAgICAgICAgICAgICAgSEFMX0hBU0hfU0hBMV9BY2NtbHQKKyNkZWZpbmUgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlX0VuZCAgICAgICAgICAgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kCisjZGVmaW5lIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZV9JVCAgICAgICAgICAgIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0lUCisjZGVmaW5lIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZV9FbmRfSVQgICAgICAgIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0VuZF9JVAorCisjZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjI0X0FjY3VtdWxhdGUgICAgICAgICAgIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0VuZCAgICAgICBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kCisjZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjI0X0FjY3VtdWxhdGVfSVQgICAgICAgIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9JVAorI2RlZmluZSBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlX0VuZF9JVCAgICBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kX0lUCisKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZSAgICAgICAgICAgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0CisjZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGVfRW5kICAgICAgIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmQKKyNkZWZpbmUgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZV9JVCAgICAgICAgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0lUCisjZGVmaW5lIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGVfRW5kX0lUICAgIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmRfSVQKKworI2VuZGlmICAvKiBTVE0zMkw0IHx8IFNUTTMyRjQgfHwgU1RNMzJGNyB8fCBTVE0zMkg3ICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMTIyMSw2ICsxNDk1LDEzIEBACiAjZW5kaWYKICNkZWZpbmUgSEFMX0FEQ19FbmFibGVCdWZmZXJfQ21kKGNtZCkgICgoKGNtZCk9PUVOQUJMRSkgPyBIQUxfQURDRXhfRW5hYmxlVlJFRklOVCgpIDogSEFMX0FEQ0V4X0Rpc2FibGVWUkVGSU5UKCkpCiAjZGVmaW5lIEhBTF9BRENfRW5hYmxlQnVmZmVyU2Vuc29yX0NtZChjbWQpICgoKGNtZCk9PUVOQUJMRSkgPyAgSEFMX0FEQ0V4X0VuYWJsZVZSRUZJTlRUZW1wU2Vuc29yKCkgOiBIQUxfQURDRXhfRGlzYWJsZVZSRUZJTlRUZW1wU2Vuc29yKCkpCisjaWYgZGVmaW5lZChTVE0zMkg3QTN4eCkgfHwgZGVmaW5lZChTVE0zMkg3QjN4eCkgfHwgZGVmaW5lZChTVE0zMkg3QjB4eCkgfHwgZGVmaW5lZChTVE0zMkg3QTN4eFEpIHx8IGRlZmluZWQoU1RNMzJIN0IzeHhRKSB8fCBkZWZpbmVkKFNUTTMySDdCMHh4USkKKyNkZWZpbmUgSEFMX0VuYWJsZVNSRG9tYWluREJHU3RvcE1vZGUgICAgICBIQUxfRW5hYmxlRG9tYWluM0RCR1N0b3BNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlU1JEb21haW5EQkdTdG9wTW9kZSAgICAgSEFMX0Rpc2FibGVEb21haW4zREJHU3RvcE1vZGUKKyNkZWZpbmUgSEFMX0VuYWJsZVNSRG9tYWluREJHU3RhbmRieU1vZGUgICBIQUxfRW5hYmxlRG9tYWluM0RCR1N0YW5kYnlNb2RlCisjZGVmaW5lIEhBTF9EaXNhYmxlU1JEb21haW5EQkdTdGFuZGJ5TW9kZSAgSEFMX0Rpc2FibGVEb21haW4zREJHU3RhbmRieU1vZGUKKyNlbmRpZiAvKiBTVE0zMkg3QTN4eCB8fCBTVE0zMkg3QjN4eCB8fCBTVE0zMkg3QjB4eCB8fCBTVE0zMkg3QTN4eFEgfHwgU1RNMzJIN0IzeHhRICB8fCBTVE0zMkg3QjB4eFEgKi8KKwogLyoqCiAgICogQH0KICAgKi8KQEAgLTEyNTAsMTYgKzE1MzEsMTggQEAKIAogI2RlZmluZSBIQUxfSTJDRmFzdE1vZGVQbHVzQ29uZmlnKFNZU0NGR19JMkNGYXN0TW9kZVBsdXMsIGNtZCkgKCgoY21kKT09RU5BQkxFKT8gSEFMX0kyQ0V4X0VuYWJsZUZhc3RNb2RlUGx1cyhTWVNDRkdfSTJDRmFzdE1vZGVQbHVzKTogSEFMX0kyQ0V4X0Rpc2FibGVGYXN0TW9kZVBsdXMoU1lTQ0ZHX0kyQ0Zhc3RNb2RlUGx1cykpCiAKLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjApIHx8IGRlZmluZWQoU1RNMzJGMSkgfHwgZGVmaW5lZChTVE0zMkYyKSB8fCBkZWZpbmVkKFNUTTMyRjMpIHx8IGRlZmluZWQoU1RNMzJGNCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyTDApIHx8IGRlZmluZWQoU1RNMzJMNCkgfHwgZGVmaW5lZChTVE0zMkw1KSB8fCBkZWZpbmVkKFNUTTMyRzQpCiAjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgIEhBTF9JMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVAogI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1JlY2VpdmVfSVQgICBIQUxfSTJDX01hc3Rlcl9TZXFfUmVjZWl2ZV9JVAogI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgICBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9JVAogI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfUmVjZWl2ZV9JVCAgICBIQUxfSTJDX1NsYXZlX1NlcV9SZWNlaXZlX0lUCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMldCICB8fCBTVE0zMkcwIHx8IFNUTTMyRjAgfHwgU1RNMzJGMSB8fCBTVE0zMkYyIHx8IFNUTTMyRjMgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgfHwgU1RNMzJMNCB8fCBTVE0zMkw1IHx8IFNUTTMyRzQgKi8KKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpIHx8IGRlZmluZWQoU1RNMzJMNSkgfHwgZGVmaW5lZChTVE0zMkc0KQogI2RlZmluZSBIQUxfSTJDX01hc3Rlcl9TZXF1ZW50aWFsX1RyYW5zbWl0X0RNQSBIQUxfSTJDX01hc3Rlcl9TZXFfVHJhbnNtaXRfRE1BCiAjZGVmaW5lIEhBTF9JMkNfTWFzdGVyX1NlcXVlbnRpYWxfUmVjZWl2ZV9ETUEgIEhBTF9JMkNfTWFzdGVyX1NlcV9SZWNlaXZlX0RNQQogI2RlZmluZSBIQUxfSTJDX1NsYXZlX1NlcXVlbnRpYWxfVHJhbnNtaXRfRE1BICBIQUxfSTJDX1NsYXZlX1NlcV9UcmFuc21pdF9ETUEKICNkZWZpbmUgSEFMX0kyQ19TbGF2ZV9TZXF1ZW50aWFsX1JlY2VpdmVfRE1BICAgSEFMX0kyQ19TbGF2ZV9TZXFfUmVjZWl2ZV9ETUEKLSNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyV0IgIHx8IFNUTTMyRzAgfHwgU1RNMzJGNCB8fCBTVE0zMkY3ICovCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMldCICB8fCBTVE0zMkcwIHx8IFNUTTMyRjQgfHwgU1RNMzJGNyB8fCBTVE0zMkwwIHx8IFNUTTMyTDQgfHwgU1RNMzJMNSB8fCBTVE0zMkc0ICovCiAKICNpZiBkZWZpbmVkKFNUTTMyRjQpCiAjZGVmaW5lIEhBTF9GTVBJMkNfTWFzdGVyX1NlcXVlbnRpYWxfVHJhbnNtaXRfSVQgIEhBTF9GTVBJMkNfTWFzdGVyX1NlcV9UcmFuc21pdF9JVApAQCAtMTI3OCw2ICsxNTYxLDEzIEBACiAvKiogQGRlZmdyb3VwIEhBTF9QV1JfQWxpYXNlZCBIQUwgUFdSIEFsaWFzZWQgbWFpbnRhaW5lZCBmb3IgbGVnYWN5IHB1cnBvc2UKICAgKiBAewogICAqLworCisjaWYgZGVmaW5lZChTVE0zMkcwKQorI2RlZmluZSBIQUxfUFdSX0NvbmZpZ1BWRAkJCQkJCQkJCQkJCQkJCUhBTF9QV1JFeF9Db25maWdQVkQKKyNkZWZpbmUgSEFMX1BXUl9FbmFibGVQVkQJCQkJCQkJCQkJCQkJCQlIQUxfUFdSRXhfRW5hYmxlUFZECisjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZVBWRAkJCQkJCQkJCQkJCQkgIEhBTF9QV1JFeF9EaXNhYmxlUFZECisjZGVmaW5lIEhBTF9QV1JfUFZEX0lSUUhhbmRsZXIJCQkJCQkJCQkJCSAgSEFMX1BXUkV4X1BWRF9JUlFIYW5kbGVyCisjZW5kaWYKICNkZWZpbmUgSEFMX1BXUl9QVkRDb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QV1JfQ29uZmlnUFZECiAjZGVmaW5lIEhBTF9QV1JfRGlzYWJsZUJrVXBSZWcgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUFdSRXhfRGlzYWJsZUJrVXBSZWcKICNkZWZpbmUgSEFMX1BXUl9EaXNhYmxlRmxhc2hQb3dlckRvd24gICAgICAgICAgICAgICAgIEhBTF9QV1JFeF9EaXNhYmxlRmxhc2hQb3dlckRvd24KQEAgLTEzNTAsMTQgKzE2NDAsMTQgQEAKICNkZWZpbmUgSEFMX1RJTV9ETUFFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX0RNQUVycm9yCiAjZGVmaW5lIEhBTF9USU1fRE1BQ2FwdHVyZUNwbHQgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFDYXB0dXJlQ3BsdAogI2RlZmluZSBIQUxfVElNRXhfRE1BQ29tbXV0YXRpb25DcGx0ICAgICAgICAgICAgICAgICAgICBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQKLSNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJMMCkKKyNpZiBkZWZpbmVkKFNUTTMySDcpIHx8IGRlZmluZWQoU1RNMzJHMCkgfHwgZGVmaW5lZChTVE0zMkYwKSB8fCBkZWZpbmVkKFNUTTMyRjEpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkYzKSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkwwKSB8fCBkZWZpbmVkKFNUTTMyTDQpCiAjZGVmaW5lIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb24gICAgICAgICAgICAgIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvCiAjZGVmaW5lIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvbml6YXRpb25fSVQgICAgICAgICAgIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUCiAjZGVmaW5lIEhBTF9USU1FeF9Db21tdXRhdGlvbkNhbGxiYWNrICAgICAgICAgICAgICAgICAgIEhBTF9USU1FeF9Db21tdXRDYWxsYmFjawogI2RlZmluZSBIQUxfVElNRXhfQ29uZmlnQ29tbXV0YXRpb25FdmVudCAgICAgICAgICAgICAgICBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnQKICNkZWZpbmUgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dGF0aW9uRXZlbnRfSVQgICAgICAgICAgICAgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUCiAjZGVmaW5lIEhBTF9USU1FeF9Db25maWdDb21tdXRhdGlvbkV2ZW50X0RNQSAgICAgICAgICAgIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9ETUEKLSNlbmRpZiAvKiBTVE0zMkg3IHx8IFNUTTMyRzAgfHwgU1RNMzJGNyB8fCBTVE0zMkY0ICB8fCBTVE0zMkwwICovCisjZW5kaWYgLyogU1RNMzJINyB8fCBTVE0zMkcwIHx8IFNUTTMyRjAgfHwgU1RNMzJGMSB8fCBTVE0zMkYyIHx8IFNUTTMyRjMgfHwgU1RNMzJGNCB8fCBTVE0zMkY3IHx8IFNUTTMyTDAgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0yNDc2LDEyICsyNzY2LDI4IEBACiAjZGVmaW5lIF9fVVNCX09UR19GU19DTEtfRElTQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRQogI2RlZmluZSBfX1VTQl9PVEdfRlNfQ0xLX0VOQUJMRSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRU5BQkxFCiAjZGVmaW5lIF9fVVNCX1JFTEVBU0VfUkVTRVQgX19IQUxfUkNDX1VTQl9SRUxFQVNFX1JFU0VUCisKKyNpZiBkZWZpbmVkKFNUTTMySDcpCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFICAgX19IQUxfUkNDX1dXREcxX0NMS19ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUgICBfX0hBTF9SQ0NfV1dERzFfQ0xLX0VOQUJMRQorI2RlZmluZSBfX0hBTF9SQ0NfV1dER19DTEtfU0xFRVBfRElTQUJMRSAgX19IQUxfUkNDX1dXREcxX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUgIF9fSEFMX1JDQ19XV0RHMV9DTEtfU0xFRVBfRU5BQkxFCisKKyNkZWZpbmUgX19IQUxfUkNDX1dXREdfRk9SQ0VfUkVTRVQgICAgKCh2b2lkKTBVKSAgLyogTm90IGF2YWlsYWJsZSBvbiB0aGUgU1RNMzJINyovCisjZGVmaW5lIF9fSEFMX1JDQ19XV0RHX1JFTEVBU0VfUkVTRVQgKCh2b2lkKTBVKSAvKiBOb3QgYXZhaWxhYmxlIG9uIHRoZSBTVE0zMkg3Ki8KKworCisjZGVmaW5lICBfX0hBTF9SQ0NfV1dER19JU19DTEtfRU5BQkxFRCAgICBfX0hBTF9SQ0NfV1dERzFfSVNfQ0xLX0VOQUJMRUQKKyNkZWZpbmUgIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRCAgX19IQUxfUkNDX1dXREcxX0lTX0NMS19ESVNBQkxFRAorI2VuZGlmCisKICNkZWZpbmUgX19XV0RHX0NMS19ESVNBQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19ESVNBQkxFCiAjZGVmaW5lIF9fV1dER19DTEtfRU5BQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUKICNkZWZpbmUgX19XV0RHX0NMS19TTEVFUF9ESVNBQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9ESVNBQkxFCiAjZGVmaW5lIF9fV1dER19DTEtfU0xFRVBfRU5BQkxFIF9fSEFMX1JDQ19XV0RHX0NMS19TTEVFUF9FTkFCTEUKICNkZWZpbmUgX19XV0RHX0ZPUkNFX1JFU0VUIF9fSEFMX1JDQ19XV0RHX0ZPUkNFX1JFU0VUCiAjZGVmaW5lIF9fV1dER19SRUxFQVNFX1JFU0VUIF9fSEFMX1JDQ19XV0RHX1JFTEVBU0VfUkVTRVQKKwogI2RlZmluZSBfX1RJTTIxX0NMS19FTkFCTEUgICBfX0hBTF9SQ0NfVElNMjFfQ0xLX0VOQUJMRQogI2RlZmluZSBfX1RJTTIxX0NMS19ESVNBQkxFICAgX19IQUxfUkNDX1RJTTIxX0NMS19ESVNBQkxFCiAjZGVmaW5lIF9fVElNMjFfRk9SQ0VfUkVTRVQgICBfX0hBTF9SQ0NfVElNMjFfRk9SQ0VfUkVTRVQKQEAgLTI4MTQsNiArMzEyMCwxNSBAQAogI2RlZmluZSBfX1dXREdfSVNfQ0xLX0VOQUJMRUQgICAgICAgX19IQUxfUkNDX1dXREdfSVNfQ0xLX0VOQUJMRUQKICNkZWZpbmUgX19XV0RHX0lTX0NMS19ESVNBQkxFRCAgICAgIF9fSEFMX1JDQ19XV0RHX0lTX0NMS19ESVNBQkxFRAogCisjaWYgZGVmaW5lZChTVE0zMkwxKQorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9DTEtfRElTQUJMRSAgICAgICAgIF9fSEFMX1JDQ19BRVNfQ0xLX0RJU0FCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX0VOQUJMRSAgICAgICAgICBfX0hBTF9SQ0NfQUVTX0NMS19FTkFCTEUKKyNkZWZpbmUgX19IQUxfUkNDX0NSWVBfQ0xLX1NMRUVQX0RJU0FCTEUgICBfX0hBTF9SQ0NfQUVTX0NMS19TTEVFUF9ESVNBQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0NMS19TTEVFUF9FTkFCTEUgICAgX19IQUxfUkNDX0FFU19DTEtfU0xFRVBfRU5BQkxFCisjZGVmaW5lIF9fSEFMX1JDQ19DUllQX0ZPUkNFX1JFU0VUICAgICAgICAgX19IQUxfUkNDX0FFU19GT1JDRV9SRVNFVAorI2RlZmluZSBfX0hBTF9SQ0NfQ1JZUF9SRUxFQVNFX1JFU0VUICAgICAgIF9fSEFMX1JDQ19BRVNfUkVMRUFTRV9SRVNFVAorI2VuZGlmIC8qIFNUTTMyTDEgKi8KKwogI2lmIGRlZmluZWQoU1RNMzJGNCkKICNkZWZpbmUgX19IQUxfUkNDX1NETU1DMV9GT1JDRV9SRVNFVCAgICAgICBfX0hBTF9SQ0NfU0RJT19GT1JDRV9SRVNFVAogI2RlZmluZSBfX0hBTF9SQ0NfU0RNTUMxX1JFTEVBU0VfUkVTRVQgICAgIF9fSEFMX1JDQ19TRElPX1JFTEVBU0VfUkVTRVQKQEAgLTI5MzAsNyArMzI0NSw3IEBACiAKICNpZiBkZWZpbmVkKFNUTTMyTDQpCiAjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLICAgICBSQ0NfUlRDQ0xLU09VUkNFX05PTkUKLSNlbGlmIGRlZmluZWQoU1RNMzJXQikgfHwgZGVmaW5lZChTVE0zMkcwKQorI2VsaWYgZGVmaW5lZChTVE0zMldCKSB8fCBkZWZpbmVkKFNUTTMyRzApIHx8IGRlZmluZWQoU1RNMzJHNCkgfHwgZGVmaW5lZChTVE0zMkw1KQogI2Vsc2UKICNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV9OT05FICAgICAgIFJDQ19SVENDTEtTT1VSQ0VfTk9fQ0xLCiAjZW5kaWYKQEAgLTMwNTgsNyArMzM3Myw3IEBACiAvKiogQGRlZmdyb3VwIEhBTF9SVENfQWxpYXNlZF9NYWNyb3MgSEFMIFJUQyBBbGlhc2VkIE1hY3JvcyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQogICAqIEB7CiAgICovCi0jaWYgZGVmaW5lZCAoU1RNMzJHMCkgfHwgZGVmaW5lZCAoU1RNMzJMNDEyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDQyMnh4KSB8fCBkZWZpbmVkIChTVE0zMkw0UDV4eCkgfHwgZGVmaW5lZCAoU1RNMzJMNFE1eHgpCisjaWYgZGVmaW5lZCAoU1RNMzJHMCkgfHwgZGVmaW5lZCAoU1RNMzJMNSkgfHwgZGVmaW5lZCAoU1RNMzJMNDEyeHgpIHx8IGRlZmluZWQgKFNUTTMyTDQyMnh4KSB8fCBkZWZpbmVkIChTVE0zMkw0UDV4eCkgfHwgZGVmaW5lZCAoU1RNMzJMNFE1eHgpIHx8IGRlZmluZWQgKFNUTTMyRzQpCiAjZWxzZQogI2RlZmluZSBfX0hBTF9SVENfQ0xFQVJfRkxBRyAgICAgICAgICAgICAgICAgICAgICBfX0hBTF9SVENfRVhUSV9DTEVBUl9GTEFHCiAjZW5kaWYKQEAgLTMxNzQsMTQgKzM0ODksMTQgQEAKICNkZWZpbmUgIFNESU9fSVJRSGFuZGxlciAgICAgICAgICAgIFNETU1DMV9JUlFIYW5kbGVyCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoU1RNMzJGNykgfHwgZGVmaW5lZChTVE0zMkY0KSB8fCBkZWZpbmVkKFNUTTMyRjIpCisjaWYgZGVmaW5lZChTVE0zMkY3KSB8fCBkZWZpbmVkKFNUTTMyRjQpIHx8IGRlZmluZWQoU1RNMzJGMikgfHwgZGVmaW5lZChTVE0zMkw0KSB8fCBkZWZpbmVkKFNUTTMySDcpCiAjZGVmaW5lICBIQUxfU0RfQ2FyZENJRFR5cGVkZWYgICAgICAgSEFMX1NEX0NhcmRDSURUeXBlRGVmCiAjZGVmaW5lICBIQUxfU0RfQ2FyZENTRFR5cGVkZWYgICAgICAgSEFMX1NEX0NhcmRDU0RUeXBlRGVmCiAjZGVmaW5lICBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVkZWYgICAgSEFMX1NEX0NhcmRTdGF0dXNUeXBlRGVmCiAjZGVmaW5lICBIQUxfU0RfQ2FyZFN0YXRlVHlwZWRlZiAgICAgSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChTVE0zMkg3KQorI2lmIGRlZmluZWQoU1RNMzJINykgfHwgZGVmaW5lZChTVE0zMkw1KQogI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIwQ3BsdENhbGxiYWNrICAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMENwbHRDYWxsYmFjawogI2RlZmluZSBIQUxfTU1DRXhfUmVhZF9ETUFEb3VibGVCdWZmZXIxQ3BsdENhbGxiYWNrICAgSEFMX01NQ0V4X1JlYWRfRE1BRG91YmxlQnVmMUNwbHRDYWxsYmFjawogI2RlZmluZSBIQUxfTU1DRXhfV3JpdGVfRE1BRG91YmxlQnVmZmVyMENwbHRDYWxsYmFjayAgSEFMX01NQ0V4X1dyaXRlX0RNQURvdWJsZUJ1ZjBDcGx0Q2FsbGJhY2sKQEAgLTM0MjEsMTggKzM3MzYsMjggQEAKIC8qKiBAZGVmZ3JvdXAgSEFMX0hSVElNX0FsaWFzZWRfRnVuY3Rpb25zIEhBTCBIUlRJTSBBbGlhc2VkIEZ1bmN0aW9ucyBtYWludGFpbmVkIGZvciBsZWdhY3kgcHVycG9zZQogICAqIEB7CiAgICovCi0jaWYgZGVmaW5lZCAoU1RNMzJINykgfHwgZGVmaW5lZCAoU1RNMzJGMykKLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0lUIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RhcnRfSVQKLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0RNQSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0X0RNQQotI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnQgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydAotI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9JVCBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3BfSVQKLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3BfRE1BIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9ETUEKLSNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0b3AgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdG9wCisjaWYgZGVmaW5lZCAoU1RNMzJINykgfHwgZGVmaW5lZCAoU1RNMzJHNCkgfHwgZGVmaW5lZCAoU1RNMzJGMykKKyNkZWZpbmUgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRlclN0YXJ0X0lUICAgICAgSEFMX0hSVElNX1dhdmVmb3JtQ291bnRTdGFydF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnRfRE1BICAgICBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0X0RNQQorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RhcnQgICAgICAgICBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0YXJ0CisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wX0lUICAgICAgIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcF9JVAorI2RlZmluZSBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudGVyU3RvcF9ETUEgICAgICBIQUxfSFJUSU1fV2F2ZWZvcm1Db3VudFN0b3BfRE1BCisjZGVmaW5lIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50ZXJTdG9wICAgICAgICAgIEhBTF9IUlRJTV9XYXZlZm9ybUNvdW50U3RvcAogI2VuZGlmCiAvKioKICAgKiBAfQogICAqLwogCisvKiogQGRlZmdyb3VwIEhBTF9RU1BJX0FsaWFzZWRfTWFjcm9zIEhBTCBRU1BJIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCisgICogQHsKKyAgKi8KKyNpZiBkZWZpbmVkIChTVE0zMkw0KSB8fCBkZWZpbmVkIChTVE0zMkY0KSB8fCBkZWZpbmVkIChTVE0zMkY3KQorI2RlZmluZSBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgSEFMX1FTUElfVElNRU9VVF9ERUZBVUxUX1ZBTFVFCisjZW5kaWYgLyogU1RNMzJMNCB8fCBTVE0zMkY0IHx8IFNUTTMyRjcgKi8KKy8qKgorICAqIEB9CisgICovCisKIC8qKiBAZGVmZ3JvdXAgSEFMX1BQUF9BbGlhc2VkX01hY3JvcyBIQUwgUFBQIEFsaWFzZWQgTWFjcm9zIG1haW50YWluZWQgZm9yIGxlZ2FjeSBwdXJwb3NlCiAgICogQHsKICAgKi8KZGlmZiAtLWdpdCBhL0luYy9MZWdhY3kvc3RtMzJmN3h4X2hhbF9jYW5fbGVnYWN5LmggYi9JbmMvTGVnYWN5L3N0bTMyZjd4eF9oYWxfY2FuX2xlZ2FjeS5oCmluZGV4IGMwOTVkZWYuLjQ5ODRhMWMgMTAwNjQ0Ci0tLSBhL0luYy9MZWdhY3kvc3RtMzJmN3h4X2hhbF9jYW5fbGVnYWN5LmgKKysrIGIvSW5jL0xlZ2FjeS9zdG0zMmY3eHhfaGFsX2Nhbl9sZWdhY3kuaApAQCAtNiwxMyArNiwyOSBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4KLSAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+CiAgICoKLSAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKLSAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCi0gICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgICoKKyAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfYWRjLmggYi9JbmMvc3RtMzJmN3h4X2hhbF9hZGMuaAppbmRleCA2ZDQ5M2RmLi4yZDg4MmMwIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9hZGMuaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF9hZGMuaApAQCAtMTgsOCArMTgsOCBAQAogICAqLwogCiAvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBfX1NUTTMyRjd4eF9BRENfSAotI2RlZmluZSBfX1NUTTMyRjd4eF9BRENfSAorI2lmbmRlZiBTVE0zMkY3eHhfQURDX0gKKyNkZWZpbmUgU1RNMzJGN3h4X0FEQ19ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwogIGV4dGVybiAiQyIgewpAQCAtNDE2LDggKzQxNiwxMCBAQAogI2RlZmluZSBBRENfQ0hBTk5FTF8xNyAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ1IxX0FXRENIXzQgfCBBRENfQ1IxX0FXRENIXzApKQogI2RlZmluZSBBRENfQ0hBTk5FTF8xOCAgICAgICAgICAoKHVpbnQzMl90KShBRENfQ1IxX0FXRENIXzQgfCBBRENfQ1IxX0FXRENIXzEpKQogCisjZGVmaW5lIEFEQ19JTlRFUk5BTF9OT05FICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMFUKICNkZWZpbmUgQURDX0NIQU5ORUxfVlJFRklOVCAgICAgKCh1aW50MzJfdClBRENfQ0hBTk5FTF8xNykKICNkZWZpbmUgQURDX0NIQU5ORUxfVkJBVCAgICAgICAgKCh1aW50MzJfdClBRENfQ0hBTk5FTF8xOCkKKyNkZWZpbmUgQURDX0NIQU5ORUxfVEVNUFNFTlNPUiAgKCh1aW50MzJfdCkoQURDX0NIQU5ORUxfMTggfCAweDEwMDAwMDAwVSkpCiAvKioKICAgKiBAfQogICAqLyAKQEAgLTczMiw2ICs3MzQsMTAgQEAKICAgKi8KICNkZWZpbmUgQURDX0NMRUFSX0VSUk9SQ09ERShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICgoX19IQU5ETEVfXyktPkVycm9yQ29kZSA9IEhBTF9BRENfRVJST1JfTk9ORSkKKworI2RlZmluZSBJU19BRENfQ0hBTk5FTChDSEFOTkVMKSAoKChDSEFOTkVMKSA8PSBBRENfQ0hBTk5FTF8xOCkgICAgICAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDSEFOTkVMKSA9PSBBRENfSU5URVJOQUxfTk9ORSkpCiAjZGVmaW5lIElTX0FEQ19DTE9DS1BSRVNDQUxFUihfX0FEQ19DTE9DS19fKSAgICAgKCgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVYyKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVY0KSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRENfQ0xPQ0tfXykgPT0gQURDX0NMT0NLX1NZTkNfUENMS19ESVY2KSB8fCBcCkBAIC05NDcsNyArOTUzLDcgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLypfX1NUTTMyRjd4eF9BRENfSCAqLworI2VuZGlmIC8qIFNUTTMyRjd4eF9BRENfSCAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9hZGNfZXguaCBiL0luYy9zdG0zMmY3eHhfaGFsX2FkY19leC5oCmluZGV4IGMyZGExYWYuLmNlZjhmNDkgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX2FkY19leC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2FkY19leC5oCkBAIC0xOCw4ICsxOCw4IEBACiAgICovCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fU1RNMzJGN3h4X0FEQ19FWF9ICi0jZGVmaW5lIF9fU1RNMzJGN3h4X0FEQ19FWF9ICisjaWZuZGVmIFNUTTMyRjd4eF9BRENfRVhfSAorI2RlZmluZSBTVE0zMkY3eHhfQURDX0VYX0gKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiAgZXh0ZXJuICJDIiB7CkBAIC0yMTAsNyArMjEwLDcgQEAKIC8qKiBAZGVmZ3JvdXAgQURDRXhfY2hhbm5lbHMgIEFEQyBTcGVjaWZpYyBDaGFubmVscwogICAqIEB7CiAgICovCi0jZGVmaW5lIEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IgICgodWludDMyX3QpQURDX0NIQU5ORUxfMTggfCAweDEwMDAwMDAwVSkgICAgCisKIC8qKgogICAqIEB9CiAgICovCkBAIC0yNzQsOCArMjc0LDYgQEAKIC8qKiBAZGVmZ3JvdXAgQURDRXhfUHJpdmF0ZV9NYWNyb3MgQURDIFByaXZhdGUgTWFjcm9zCiAgICogQHsKICAgKi8KLSNkZWZpbmUgSVNfQURDX0NIQU5ORUwoQ0hBTk5FTCkgKCgoQ0hBTk5FTCkgPD0gQURDX0NIQU5ORUxfMTgpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENIQU5ORUwpID09IEFEQ19DSEFOTkVMX1RFTVBTRU5TT1IpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogI2RlZmluZSBJU19BRENfTU9ERShfX01PREVfXykgKCgoX19NT0RFX18pID09IEFEQ19NT0RFX0lOREVQRU5ERU5UKSAgICAgICAgICAgICAgICAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IEFEQ19EVUFMTU9ERV9SRUdTSU1VTFRfSU5KRUNTSU1VTFQpICAgfHwgXApAQCAtMzUyLDcgKzM1MCw3IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qX19TVE0zMkY3eHhfQURDX0VYX0ggKi8KKyNlbmRpZiAvKiBTVE0zMkY3eHhfQURDX0VYX0ggKi8KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfY3J5cC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfY3J5cC5oCmluZGV4IGE4ZjhiYWYuLjA3NmQyY2QgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX2NyeXAuaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF9jcnlwLmgKQEAgLTYsMjMgKzYsMjMgQEAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICogQGF0dGVudGlvbgogICAqCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAgKgogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAotICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqLyAKKyAgKi8KIAogLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpZm5kZWYgX19TVE0zMkY3eHhfSEFMX0NSWVBfSAogI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfQ1JZUF9ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwotIGV4dGVybiAiQyIgeworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogCkBAIC01MSw4NyArNTEsOTcgQEAKIHsKICAgdWludDMyX3QgRGF0YVR5cGU7ICAgICAgICAgICAgICAgICAgIC8qITwgMzItYml0IGRhdGEsIDE2LWJpdCBkYXRhLCA4LWJpdCBkYXRhIG9yIDEtYml0IHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIENSWVBfRGF0YV9UeXBlICovCi0gIHVpbnQzMl90IEtleVNpemU7ICAgICAgICAgICAgICAgICAgICAvKiE8IFVzZWQgb25seSBpbiBBRVMgbW9kZSA6IDEyOCwgMTkyIG9yIDI1NiBiaXQga2V5IGxlbmd0aCBpbiBDUllQMS4gCisgIHVpbnQzMl90IEtleVNpemU7ICAgICAgICAgICAgICAgICAgICAvKiE8IFVzZWQgb25seSBpbiBBRVMgbW9kZSA6IDEyOCwgMTkyIG9yIDI1NiBiaXQga2V5IGxlbmd0aCBpbiBDUllQMS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjggb3IgMjU2IGJpdCBrZXkgbGVuZ3RoIGluIFRpbnlBRVMgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDUllQX0tleV9TaXplICovCi0gIHVpbnQzMl90KiBwS2V5OyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uICovCi0gIHVpbnQzMl90KiBwSW5pdFZlY3Q7ICAgICAgICAgICAgICAgICAvKiE8IFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdXNlZCBhbHNvIGFzIGluaXRpYWxpemF0aW9uCisgIHVpbnQzMl90ICpwS2V5OyAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBrZXkgdXNlZCBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uICovCisgIHVpbnQzMl90ICpwSW5pdFZlY3Q7ICAgICAgICAgICAgICAgICAvKiE8IFRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdXNlZCBhbHNvIGFzIGluaXRpYWxpemF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgaW4gQ1RSIG1vZGUgKi8KLSAgdWludDMyX3QgQWxnb3JpdGhtOyAgICAgICAgICAgICAgICAgIC8qITwgIERFUy8gVERFUyBBbGdvcml0aG0gRUNCL0NCQyAKKyAgdWludDMyX3QgQWxnb3JpdGhtOyAgICAgICAgICAgICAgICAgIC8qITwgIERFUy8gVERFUyBBbGdvcml0aG0gRUNCL0NCQwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFUyBBbGdvcml0aG0gRUNCL0NCQy9DVFIvR0NNIG9yIENDTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgQ1JZUF9BbGdvcml0aG1fTW9kZSAqLwotICB1aW50MzJfdCogSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgLyohPCB1c2VkIG9ubHkgaW4gQUVTIEdDTSBhbmQgQ0NNIEFsZ29yaXRobSBmb3IgYXV0aGVudGljYXRpb24sCisgIHVpbnQzMl90ICpIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAvKiE8IHVzZWQgb25seSBpbiBBRVMgR0NNIGFuZCBDQ00gQWxnb3JpdGhtIGZvciBhdXRoZW50aWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ00gOiBhbHNvIGtub3duIGFzIEFkZGl0aW9uYWwgQXV0aGVudGljYXRpb24gRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDTSA6IG5hbWVkIEIxIGNvbXBvc2VkIG9mIHRoZSBhc3NvY2lhdGVkIGRhdGEgbGVuZ3RoIGFuZCBBc3NvY2lhdGVkIERhdGEuICovCiAgIHVpbnQzMl90IEhlYWRlclNpemU7ICAgICAgICAgICAgICAgIC8qITwgVGhlIHNpemUgb2YgaGVhZGVyIGJ1ZmZlciBpbiB3b3JkICAqLwotICB1aW50MzJfdCogQjA7ICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEIwIGlzIGZpcnN0IGF1dGhlbnRpY2F0aW9uIGJsb2NrIHVzZWQgb25seSAgaW4gQUVTIENDTSBtb2RlICovCisgIHVpbnQzMl90ICpCMDsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgQjAgaXMgZmlyc3QgYXV0aGVudGljYXRpb24gYmxvY2sgdXNlZCBvbmx5ICBpbiBBRVMgQ0NNIG1vZGUgKi8KICAgdWludDMyX3QgRGF0YVdpZHRoVW5pdDsgICAgICAgICAgICAgIC8qITwgRGF0YSBXaXRoIFVuaXQsIHRoaXMgcGFyYW1ldGVyIGNhbiBiZSB2YWx1ZSBvZiBAcmVmIENSWVBfRGF0YV9XaWR0aF9Vbml0Ki8KKyAgdWludDMyX3QgS2V5SVZDb25maWdTa2lwOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBza2lwLCB0byBjb25maWcgS2V5IGFuZCBJbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBvbmx5IG9uY2UgYW5kIHRvIHNraXAgY29uZmlndXJhdGlvbiBmb3IgY29uc2VjdXRpdmUgcHJvY2Vzc2luZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBDUllQX0NvbmZpZ3VyYXRpb25fU2tpcCAqLwogCi19Q1JZUF9Db25maWdUeXBlRGVmOworfSBDUllQX0NvbmZpZ1R5cGVEZWY7CiAKIAogLyoqCiAgICogQGJyaWVmICBDUllQIFN0YXRlIFN0cnVjdHVyZSBkZWZpbml0aW9uCiAgICovCi0gICAgCisKIHR5cGVkZWYgZW51bQogewogICBIQUxfQ1JZUF9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgLyohPCBDUllQIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCiAgIEhBTF9DUllQX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAvKiE8IENSWVAgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KICAgSEFMX0NSWVBfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSAgLyohPCBDUllQIEJVU1ksIGludGVybmFsIHByb2Nlc3NpbmcgaXMgb25nb2luZyAgKi8KLX1IQUxfQ1JZUF9TVEFURVR5cGVEZWY7Ci0gIAorfSBIQUxfQ1JZUF9TVEFURVR5cGVEZWY7CisKIAogLyoqCiAgICogQGJyaWVmICBDUllQIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgogICAqLwotICAKKwogdHlwZWRlZiBzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYKIHsKICNpZiBkZWZpbmVkIChDUllQKQotICAgICAgQ1JZUF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAvKiE8IENSWVAgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAqLworICBDUllQX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgICAgIC8qITwgQ1JZUCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzICovCiAjZWxzZSAvKiBBRVMqLwotICAgICAgQUVTX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAvKiE8IEFFUyBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8gICAKKyAgQUVTX1R5cGVEZWYgICAgICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAgICAvKiE8IEFFUyBSZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KIAotICAgICAgQ1JZUF9Db25maWdUeXBlRGVmICAgICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgQ1JZUCByZXF1aXJlZCBwYXJhbWV0ZXJzICovCi0gCi0gICAgICBGdW5jdGlvbmFsU3RhdGUgICAgICAgICAgICAgICAgICAgQXV0b0tleURlcml2YXRpb247ICAgLyohPCBVc2VkIG9ubHkgaW4gVGlueUFFUyB0byBhbGxvd3MgdG8gYnlwYXNzIG9yIG5vdCBrZXkgd3JpdGUtdXAgYmVmb3JlIGRlY3J5cHRpb24uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgRU5BQkxFL0RJU0FCTEUgKi8gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDcnlwSW5CdWZmUHRyOyAgLyohPCBQb2ludGVyIHRvIENSWVAgcHJvY2Vzc2luZyAoZW5jcnlwdGlvbiwgZGVjcnlwdGlvbiwuLi4pIGJ1ZmZlciAqLworICBDUllQX0NvbmZpZ1R5cGVEZWYgICAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBDUllQIHJlcXVpcmVkIHBhcmFtZXRlcnMgKi8KIAotICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ3J5cE91dEJ1ZmZQdHI7IC8qITwgUG9pbnRlciB0byBDUllQIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24sIGRlY3J5cHRpb24sLi4uKSBidWZmZXIgKi8KKyAgRnVuY3Rpb25hbFN0YXRlICAgICAgICAgICAgICAgICAgIEF1dG9LZXlEZXJpdmF0aW9uOyAgIC8qITwgVXNlZCBvbmx5IGluIFRpbnlBRVMgdG8gYWxsb3dzIHRvIGJ5cGFzcyBvciBub3Qga2V5IHdyaXRlLXVwIGJlZm9yZSBkZWNyeXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgRU5BQkxFL0RJU0FCTEUgKi8KIAotICAgICAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBIZWFkZXJDb3VudDsgICAvKiE8IENvdW50ZXIgb2YgaGVhZGVyIGRhdGEgKi8KLSAgICAgIAotICAgICAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBJbkNvdW50OyAgICAgIC8qITwgQ291bnRlciBvZiBpbnB1dCBkYXRhICovCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAqcENyeXBJbkJ1ZmZQdHI7ICAvKiE8IFBvaW50ZXIgdG8gQ1JZUCBwcm9jZXNzaW5nIChlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLC4uLikgYnVmZmVyICovCiAKLSAgICAgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwT3V0Q291bnQ7ICAgICAvKiE8IENvdW50ZXIgb2Ygb3V0cHV0IGRhdGEgKi8KLSAgICAgIAotICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAvKiE8IGxlbmd0aCBvZiBpbnB1dCBkYXRhIGluIHdvcmQgKi8KKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ3J5cE91dEJ1ZmZQdHI7IC8qITwgUG9pbnRlciB0byBDUllQIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24sIGRlY3J5cHRpb24sLi4uKSBidWZmZXIgKi8KIAotICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIFBoYXNlOyAgICAgICAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIHBoYXNlICovCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwSGVhZGVyQ291bnQ7ICAgLyohPCBDb3VudGVyIG9mIGhlYWRlciBkYXRhICovCiAKLSAgICAgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICAgICAqaGRtYWluOyAgICAgICAgICAvKiE8IENSWVAgSW4gRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisgIF9fSU8gdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBDcnlwSW5Db3VudDsgICAgICAvKiE8IENvdW50ZXIgb2YgaW5wdXQgZGF0YSAqLwogCi0gICAgICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICAgICAgKmhkbWFvdXQ7ICAgICAgICAgLyohPCBDUllQIE91dCBETUEgaGFuZGxlIHBhcmFtZXRlcnMgKi8KKyAgX19JTyB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIENyeXBPdXRDb3VudDsgICAgIC8qITwgQ291bnRlciBvZiBvdXRwdXQgZGF0YSAqLwogCi0gICAgICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBDUllQIGxvY2tpbmcgb2JqZWN0ICovCisgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgLyohPCBsZW5ndGggb2YgaW5wdXQgZGF0YSBpbiB3b3JkICovCiAKLSAgICAgIF9fSU8gIEhBTF9DUllQX1NUQVRFVHlwZURlZiAgICAgICBTdGF0ZTsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwotICAgICAgCi0gICAgICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgZXJyb3IgY29kZSAqLwotICAgICAgCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBQaGFzZTsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBwaGFzZSAqLworCisgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgICAgICAqaGRtYWluOyAgICAgICAgICAvKiE8IENSWVAgSW4gRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisKKyAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAgICAgICpoZG1hb3V0OyAgICAgICAgIC8qITwgQ1JZUCBPdXQgRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICovCisKKyAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgICAgIC8qITwgQ1JZUCBsb2NraW5nIG9iamVjdCAqLworCisgIF9fSU8gIEhBTF9DUllQX1NUQVRFVHlwZURlZiAgICAgICBTdGF0ZTsgICAgICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworCisgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBlcnJvciBjb2RlICovCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUlWQ29uZmlnOyAgICAgIC8qITwgQ1JZUCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBmbGFnLCB1c2VkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBjYW4gYmUgc2tpcHBlZCAqLworCisgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplc1N1bTsgICAgICAgICAvKiE8IFN1bSBvZiBzdWNjZXNzaXZlIHBheWxvYWRzIGxlbmd0aHMgKGluIGJ5dGVzKSwgc3RvcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIHNpbmdsZSBzaWduYXR1cmUgY29tcHV0YXRpb24gYWZ0ZXIgc2V2ZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcyBwcm9jZXNzaW5nICovCisKICNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotIHZvaWQgKCpJbkNwbHRDYWxsYmFjaykgICAgKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgLyohPCBDUllQIElucHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrICAqLwotIHZvaWQgKCpPdXRDcGx0Q2FsbGJhY2spICAgKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgLyohPCBDUllQIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLwotIHZvaWQgKCpFcnJvckNhbGxiYWNrKSAgICAgKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgLyohPCBDUllQIEVycm9yIGNhbGxiYWNrICovCi0gCi0gdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spICAoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICogaGNyeXApOyAvKiE8IENSWVAgTXNwIEluaXQgY2FsbGJhY2sgICovCi0gdm9pZCAoKiBNc3BEZUluaXRDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICogaGNyeXApOyAvKiE8IENSWVAgTXNwIERlSW5pdCBjYWxsYmFjayAgKi8KKyAgdm9pZCAoKkluQ3BsdENhbGxiYWNrKShzdHJ1Y3QgX19DUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsgICAgICAvKiE8IENSWVAgSW5wdXQgRklGTyB0cmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2sgICovCisgIHZvaWQgKCpPdXRDcGx0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAgLyohPCBDUllQIE91dHB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayAqLworICB2b2lkICgqRXJyb3JDYWxsYmFjaykoc3RydWN0IF9fQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgICAgIC8qITwgQ1JZUCBFcnJvciBjYWxsYmFjayAqLwogCi0jZW5kaWYgLyogKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MpICovIAotfUNSWVBfSGFuZGxlVHlwZURlZjsKKyAgdm9pZCAoKiBNc3BJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgICAvKiE8IENSWVAgTXNwIEluaXQgY2FsbGJhY2sgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0NSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOyAgLyohPCBDUllQIE1zcCBEZUluaXQgY2FsbGJhY2sgICovCisKKyNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KK30gQ1JZUF9IYW5kbGVUeXBlRGVmOwogCiAKIC8qKgpAQCAtMTUyLDcgKzE2Miw3IEBACiAgIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgICAgICAgID0gMHgwNFUsICAgIC8qITwgQ1JZUCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICAgKi8KICAgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEICAgICAgPSAweDA1VSAgICAgLyohPCBDUllQIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgICAqLwogCi19SEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWY7Cit9IEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmOwogLyoqCiAgICogQH0KICAgKi8KQEAgLTE2Miw3ICsxNzIsNyBAQAogICAqIEB7CiAgICovCiAKLXR5cGVkZWYgIHZvaWQgKCpwQ1JZUF9DYWxsYmFja1R5cGVEZWYpKENSWVBfSGFuZGxlVHlwZURlZiAqIGhjcnlwKTsgICAvKiE8IHBvaW50ZXIgdG8gYSBjb21tb24gQ1JZUCBjYWxsYmFjayBmdW5jdGlvbiAqLwordHlwZWRlZiAgdm9pZCAoKnBDUllQX0NhbGxiYWNrVHlwZURlZikoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7ICAgIC8qITwgcG9pbnRlciB0byBhIGNvbW1vbiBDUllQIGNhbGxiYWNrIGZ1bmN0aW9uICovCiAKIC8qKgogICAqIEB9CkBAIC0xODEsNyArMTkxLDcgQEAKICNkZWZpbmUgSEFMX0NSWVBfRVJST1JfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgTm8gZXJyb3IgICAgICAgICovCiAjZGVmaW5lIEhBTF9DUllQX0VSUk9SX1dSSVRFICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IFdyaXRlIGVycm9yICAgICAqLwogI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDAyVSAgLyohPCBSZWFkIGVycm9yICAgICAgKi8KLSNkZWZpbmUgSEFMX0NSWVBfRVJST1JfRE1BICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgIC8qITwgRE1BIGVycm9yICAgICAgICovICAKKyNkZWZpbmUgSEFMX0NSWVBfRVJST1JfRE1BICAgICAgICAgICAgICAgMHgwMDAwMDAwNFUgIC8qITwgRE1BIGVycm9yICAgICAgICovCiAjZGVmaW5lIEhBTF9DUllQX0VSUk9SX0JVU1kgICAgICAgICAgICAgIDB4MDAwMDAwMDhVICAvKiE8IEJ1c3kgZmxhZyBlcnJvciAqLwogI2RlZmluZSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUICAgICAgICAgICAweDAwMDAwMDEwVSAgLyohPCBUaW1lb3V0IGVycm9yICovCiAjZGVmaW5lIEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQgICAgIDB4MDAwMDAwMjBVICAvKiE8IE5vdCBzdXBwb3J0ZWQgbW9kZSAqLwpAQCAtMTg5LDIxICsxOTksMjEgQEAKICNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogI2RlZmluZSAgSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotLyoqIAorLyoqCiAgICogQH0KICAgKi8KIAotLyoqIEBkZWZncm91cCBDUllQX0RhdGFfV2lkdGhfVW5pdCBDUllQIERhdGEgV2lkdGggVW5pdCAKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9EYXRhX1dpZHRoX1VuaXQgQ1JZUCBEYXRhIFdpZHRoIFVuaXQKICAgKiBAewogICAqLwogCiAjZGVmaW5lIENSWVBfREFUQVdJRFRIVU5JVF9XT1JEICAgMHgwMDAwMDAwMFUgIC8qITwgQnkgZGVmYXVsdCwgc2l6ZSB1bml0IGlzIHdvcmQgKi8KLSNkZWZpbmUgQ1JZUF9EQVRBV0lEVEhVTklUX0JZVEUgICAweDAwMDAwMDAxVSAgLyohPCBCeSBkZWZhdWx0LCBzaXplIHVuaXQgaXMgd29yZCAqLyAgIAorI2RlZmluZSBDUllQX0RBVEFXSURUSFVOSVRfQllURSAgIDB4MDAwMDAwMDFVICAvKiE8IEJ5IGRlZmF1bHQsIHNpemUgdW5pdCBpcyB3b3JkICovCiAKLS8qKiAKKy8qKgogICAqIEB9Ci0gICovIAotICAgIAorICAqLworCiAvKiogQGRlZmdyb3VwIENSWVBfQWxnb3JpdGhtX01vZGUgQ1JZUCBBbGdvcml0aG0gTW9kZQogICAqIEB7CiAgICovCkBAIC0yMTIsMTQgKzIyMiwxNCBAQAogI2RlZmluZSBDUllQX0RFU19FQ0IgICAgIENSWVBfQ1JfQUxHT01PREVfREVTX0VDQgogI2RlZmluZSBDUllQX0RFU19DQkMgICAgIENSWVBfQ1JfQUxHT01PREVfREVTX0NCQwogI2RlZmluZSBDUllQX1RERVNfRUNCICAgIENSWVBfQ1JfQUxHT01PREVfVERFU19FQ0IKLSNkZWZpbmUgQ1JZUF9UREVTX0NCQyAgICBDUllQX0NSX0FMR09NT0RFX1RERVNfQ0JDIAorI2RlZmluZSBDUllQX1RERVNfQ0JDICAgIENSWVBfQ1JfQUxHT01PREVfVERFU19DQkMKICNkZWZpbmUgQ1JZUF9BRVNfRUNCICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19FQ0IKICNkZWZpbmUgQ1JZUF9BRVNfQ0JDICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19DQkMKICNkZWZpbmUgQ1JZUF9BRVNfQ1RSICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19DVFIKIAotI2RlZmluZSBDUllQX0FFU19HQ00gICAgIENSWVBfQ1JfQUxHT01PREVfQUVTX0dDTSAgICAKKyNkZWZpbmUgQ1JZUF9BRVNfR0NNICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19HQ00KICNkZWZpbmUgQ1JZUF9BRVNfQ0NNICAgICBDUllQX0NSX0FMR09NT0RFX0FFU19DQ00KLSAKKwogI2Vsc2UgLyogQUVTKi8KICNkZWZpbmUgQ1JZUF9BRVNfRUNCICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRWxlY3Ryb25pYyBjb2RlYm9vayBjaGFpbmluZyBhbGdvcml0aG0gICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgQ1JZUF9BRVNfQ0JDICAgICAgICAgICAgQUVTX0NSX0NITU9EXzAgICAgICAgICAgICAgICAgICAgIC8qITwgQ2lwaGVyIGJsb2NrIGNoYWluaW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIyOCw3ICsyMzgsNyBAQAogI2RlZmluZSBDUllQX0FFU19DQ00gICAgICAgICAgICBBRVNfQ1JfQ0hNT0RfMiAgICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHdpdGggQ2lwaGVyIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCi0vKiogCisvKioKICAgKiBAfQogICAqLwogCkBAIC0yNDAsMTAgKzI1MCwxMCBAQAogI2RlZmluZSBDUllQX0tFWVNJWkVfMTkyQiAgICAgICAgIENSWVBfQ1JfS0VZU0laRV8wCiAjZGVmaW5lIENSWVBfS0VZU0laRV8yNTZCICAgICAgICAgQ1JZUF9DUl9LRVlTSVpFXzEKICNlbHNlIC8qIEFFUyovCi0jZGVmaW5lIENSWVBfS0VZU0laRV8xMjhCICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPCAxMjgtYml0IGxvbmcga2V5ICovIAotI2RlZmluZSBDUllQX0tFWVNJWkVfMjU2QiAgICAgICAgIEFFU19DUl9LRVlTSVpFICAgICAgIC8qITwgMjU2LWJpdCBsb25nIGtleSAqLyAKKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzEyOEIgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAvKiE8IDEyOC1iaXQgbG9uZyBrZXkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlTSVpFXzI1NkIgICAgICAgICBBRVNfQ1JfS0VZU0laRSAgICAgICAvKiE8IDI1Ni1iaXQgbG9uZyBrZXkgKi8KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KLS8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKioKICAgKiBAfQogICAqLwogCkBAIC0yNjEsMTUgKzI3MSwxNSBAQAogI2RlZmluZSBDUllQX0RBVEFUWVBFXzhCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRV8xICAgICAgIC8qITwgOC1iaXQgZGF0YSB0eXBlIChieXRlIHN3YXBwaW5nKSAgICAgICAqLwogI2RlZmluZSBDUllQX0RBVEFUWVBFXzFCICAgICAgICAgIEFFU19DUl9EQVRBVFlQRSAgICAgICAgIC8qITwgMS1iaXQgZGF0YSB0eXBlIChiaXQgc3dhcHBpbmcpICAgICAgICAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAgIAotLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoqCiAgICogQH0KICAgKi8KIAogLyoqIEBkZWZncm91cCBDUllQX0ludGVycnVwdCAgQ1JZUCBJbnRlcnJ1cHQKICAgKiBAewogICAqLwotI2lmIGRlZmluZWQgKENSWVApIAorI2lmIGRlZmluZWQgKENSWVApCiAjZGVmaW5lIENSWVBfSVRfSU5JICAgICAgIENSWVBfSU1TQ1JfSU5JTSAgIC8qITwgSW5wdXQgRklGTyBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgQ1JZUF9JVF9PVVRJICAgICAgQ1JZUF9JTVNDUl9PVVRJTSAgLyohPCBPdXRwdXQgRklGTyBJbnRlcnJ1cHQgKi8KICNlbHNlIC8qIEFFUyovCkBAIC0yOTcsNyArMzA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEga2V5IHByZXBhcmF0aW9uIChmb3IgQUVTIGRlY3J5cHRpb24pLiAqLwogLyogRmxhZ3MgaW4gdGhlIFJJU1IgcmVnaXN0ZXIgKi8KICNkZWZpbmUgQ1JZUF9GTEFHX09VVFJJUyAgMHgwMTAwMDAwMlUgIC8qITwgT3V0cHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZSBDUllQX0ZMQUdfSU5SSVMgICAweDAxMDAwMDAxVSAgLyohPCBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBzdGF0dXMqLyAgCisjZGVmaW5lIENSWVBfRkxBR19JTlJJUyAgIDB4MDEwMDAwMDFVICAvKiE8IElucHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IHN0YXR1cyovCiAjZWxzZSAvKiBBRVMqLwogLyogc3RhdHVzIGZsYWdzICovCiAjZGVmaW5lIENSWVBfRkxBR19CVVNZICAgIEFFU19TUl9CVVNZICAgLyohPCBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbiAqLwpAQCAtMzEyLDcgKzMyMiwxOCBAQAogLyoqCiAgICogQH0KICAgKi8KLSAgICAKKworLyoqIEBkZWZncm91cCBDUllQX0NvbmZpZ3VyYXRpb25fU2tpcCBDUllQIEtleSBhbmQgSVYgQ29uZmlndXJhdGlvbiBTa2lwIE1vZGUKKyAgKiBAeworICAqLworCisjZGVmaW5lIENSWVBfS0VZSVZDT05GSUdfQUxXQVlTICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgIC8qITwgUGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gdG8gZG8gc3lzdGVtYXRpY2FsbHkgKi8KKyNkZWZpbmUgQ1JZUF9LRVlJVkNPTkZJR19PTkNFICAgICAgICAgIDB4MDAwMDAwMDFVICAgICAgICAgICAgLyohPCBQZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiB0byBkbyBvbmx5IG9uY2UgICAgICAqLworCisvKioKKyAgKiBAfQorICAqLworCiAKIC8qKgogICAqIEB9CkBAIC0zMzYsNyArMzU3LDcgQEAKICNlbHNlCiAjZGVmaW5lIF9fSEFMX0NSWVBfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICggKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogLyoqCiAgICogQGJyaWVmICBFbmFibGUvRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KQEAgLTM0NSwzMyArMzY2LDMzIEBACiAjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBDUllQX0NSX0NSWVBFTikKICNkZWZpbmUgX19IQUxfQ1JZUF9ESVNBQkxFKF9fSEFORExFX18pICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmPSAgfkNSWVBfQ1JfQ1JZUEVOKQotI2Vsc2UgLyogQUVTKi8gCisjZWxzZSAvKiBBRVMqLwogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBBRVNfQ1JfRU4pCiAjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgJj0gIH5BRVNfQ1JfRU4pCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAgCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBzdGF0dXMgZmxhZyBpcyBzZXQgb3Igbm90LgogICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6Ci0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9GTEFHX0JVU1kgR0NNIHByb2Nlc3Mgc3VzcGVuc2lvbiBmb3JiaWRkZW4gIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IgCi0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9SREVSUiBSZWFkIEVycm9yIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGIENvbXB1dGF0aW9uIENvbXBsZXRlICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0ZMQUdfQlVTWSBHQ00gcHJvY2VzcyBzdXNwZW5zaW9uIGZvcmJpZGRlbgorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiBDb21wdXRhdGlvbiBDb21wbGV0ZQogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKLSAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX0JVU1k6IFRoZSBDUllQIGNvcmUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBibG9jayBvZiBkYXRhIAotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBrZXkgcHJlcGFyYXRpb24gKGZvciBBRVMgZGVjcnlwdGlvbikuIAorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfQlVTWTogVGhlIENSWVAgY29yZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIGJsb2NrIG9mIGRhdGEKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEga2V5IHByZXBhcmF0aW9uIChmb3IgQUVTIGRlY3J5cHRpb24pLgogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZFTTogSW5wdXQgRklGTyBpcyBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSUZORjogSW5wdXQgRklGTyBpcyBub3QgZnVsbAogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfSU5SSVM6IElucHV0IEZJRk8gc2VydmljZSByYXcgaW50ZXJydXB0IGlzIHBlbmRpbmcKICAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9GTEFHX09GTkU6IE91dHB1dCBGSUZPIGlzIG5vdCBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT0ZGVTogT3V0cHV0IEZJRk8gaXMgZnVsbAotICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT1VUUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nIAotICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgorICAqICAgICAgICAgICAgQGFyZyBDUllQX0ZMQUdfT1VUUklTOiBJbnB1dCBGSUZPIHNlcnZpY2UgcmF3IGludGVycnVwdCBpcyBwZW5kaW5nCisgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgX19GTEFHX18gKFRSVUUgb3IgRkFMU0UpLgogICAqLwogI2RlZmluZSBDUllQX0ZMQUdfTUFTSyAgMHgwMDAwMDAxRlUKLSNpZiBkZWZpbmVkKENSWVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKCgodWludDhfdCkoKF9fRkxBR19fKSA+PiAyNCkpID09IDB4MDFVKT8oKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SSVNSKSAmICgoX19GTEFHX18pICYgQ1JZUF9GTEFHX01BU0spKSA9PSAoKF9fRkxBR19fKSAmIENSWVBfRkxBR19NQVNLKSkpCiAjZWxzZSAvKiBBRVMqLwogI2RlZmluZSBfX0hBTF9DUllQX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSICYgKF9fRkxBR19fKSkgPT0gKF9fRkxBR19fKSkKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KQEAgLTM4MCwxMiArNDAxLDEyIEBACiAgICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0VSUl9DTEVBUiBSZWFkIChSREVSUikgb3IgV3JpdGUgRXJyb3IgKFdSRVJSKSBGbGFnIENsZWFyCi0gICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9DQ0ZfQ0xFQVIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAoQ0NGKSBDbGVhciAgCisgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9DQ0ZfQ0xFQVIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAoQ0NGKSBDbGVhcgogICAqIEBwYXJhbSAgX19IQU5ETEVfXzogc3BlY2lmaWVzIHRoZSBDUllQIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIAotI2lmIGRlZmluZWQoQUVTKSAKKyNpZiBkZWZpbmVkKEFFUykKICNkZWZpbmUgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19GTEFHX18pKQogCiAKQEAgLTM5MywzNyArNDE0LDM5IEBACiAgICogQHBhcmFtIF9fSU5URVJSVVBUX186IENSWVAgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjawogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0ICAgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgU3RhdGUgb2YgaW50ZXJydXB0aW9uIChUUlVFIG9yIEZBTFNFKS4KICAgKi8KIAotI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQorI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKIAogI2VuZGlmIC8qIEFFUyAqLwogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ1JZUCBpbnRlcnJ1cHQgaXMgc2V0IG9yIG5vdC4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHRvIGNoZWNrLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1dSRVJSIFdyaXRlIEVycm9yIAotICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfUkRFUlIgUmVhZCBFcnJvciAKLSAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiAgQ29tcHV0YXRpb24gQ29tcGxldGUgIAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfV1JFUlIgV3JpdGUgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX1JERVJSIFJlYWQgRXJyb3IKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRiAgQ29tcHV0YXRpb24gQ29tcGxldGUKICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIENSWVA6CiAgICogICAgICAgICAgICBAYXJnIENSWVBfSVRfSU5JOiBJbnB1dCBGSUZPIHNlcnZpY2UgbWFza2VkIGludGVycnVwdCBzdGF0dXMKICAgKiAgICAgICAgICAgIEBhcmcgQ1JZUF9JVF9PVVRJOiBPdXRwdXQgRklGTyBzZXJ2aWNlIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzCiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFRSVUUgb3IgRkFMU0UpLgogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgIAotI2RlZmluZSBfX0hBTF9DUllQX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPk1JU1IgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKKyNpZiBkZWZpbmVkKENSWVApCisjZGVmaW5lIF9fSEFMX0NSWVBfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+TUlTUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQogI2Vsc2UgLyogQUVTKi8KICNkZWZpbmUgX19IQUxfQ1JZUF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiAmIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCiAvKioKLSAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuICAKKyAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgQ1JZUCBpbnRlcnJ1cHQuCiAgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBDUllQIEludGVycnVwdC4KLSAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6ICAKKyAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIFRpbnlBRVM6CiAgICogICAgICAgICAgICBAYXJnIEByZWYgQ1JZUF9JVF9FUlJJRSBFcnJvciBpbnRlcnJ1cHQgKHVzZWQgZm9yIFJERVJSIGFuZCBXUkVSUikKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0NDRklFIENvbXB1dGF0aW9uIENvbXBsZXRlIGludGVycnVwdAogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgQ1JZUDoKQEAgLTQzMiwxNiArNDU1LDE2IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklNU0NSKSB8PSAoX19JTlRFUlJVUFRfXykpCi0jZWxzZSAvKiBBRVMqLyAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIF9fSEFMX0NSWVBfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IpIHw9IChfX0lOVEVSUlVQVF9fKSkKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBDUllQIGludGVycnVwdC4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IENSWVAgSW50ZXJydXB0LgotICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzogIAorICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgVGlueUFFUzoKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBDUllQX0lUX0VSUklFIEVycm9yIGludGVycnVwdCAodXNlZCBmb3IgUkRFUlIgYW5kIFdSRVJSKQogICAqICAgICAgICAgICAgQGFyZyBAcmVmIENSWVBfSVRfQ0NGSUUgQ29tcHV0YXRpb24gQ29tcGxldGUgaW50ZXJydXB0CiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBDUllQOgpAQCAtNDUwLDkgKzQ3Myw5IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fOiBzcGVjaWZpZXMgdGhlIENSWVAgaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2lmIGRlZmluZWQoQ1JZUCkgCisjaWYgZGVmaW5lZChDUllQKQogI2RlZmluZSBfX0hBTF9DUllQX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JTVNDUikgJj0gfihfX0lOVEVSUlVQVF9fKSkKLSNlbHNlIC8qIEFFUyovICAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIF9fSEFMX0NSWVBfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSKSAmPSB+KF9fSU5URVJSVVBUX18pKQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogCkBAIC00NjgsMjggKzQ5MSwzMSBAQAogCiAvKiogQGFkZHRvZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCiAgICogQHsKLSAgKi8gICAgCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogdm9pZCBIQUxfQ1JZUF9Nc3BJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogdm9pZCBIQUxfQ1JZUF9Nc3BEZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9TZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZiApOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfR2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYgKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1NldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKTsKICNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENSWVBfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIKICAgKiBAewotICAqLyAKKyAgKi8KIAogLyogZW5jcnlwdGlvbi9kZWNyeXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KTsKQEAgLTQ5NywxMiArNTIzLDEyIEBACiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCiAKIC8qKiBAYWRkdG9ncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKICAgKiBAewotICAqLyAgCisgICovCiAvKiBJbnRlcnJ1cHQgSGFuZGxlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEhBTF9DUllQX0lSUUhhbmRsZXIoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiBIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CkBAIC01MTMsOCArNTM5LDggQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gIAorICAqLworCiAvKioKICAgKiBAfQogICAqLwpAQCAtNTI5LDIzICs1NTUsMjMgQEAKICAgKi8KICNpZiBkZWZpbmVkKENSWVApCiAjZGVmaW5lIElTX0NSWVBfQUxHT1JJVEhNKEFMR09SSVRITSkgKCgoQUxHT1JJVEhNKSA9PSBDUllQX0RFU19FQ0IpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfREVTX0NCQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9UREVTX0VDQikgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX1RERVNfQ0JDKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0VDQikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0JDKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DVFIpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0dDTSkgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ0NNKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0RFU19DQkMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfVERFU19FQ0IpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9UREVTX0NCQykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19FQ0IpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19HQ00pICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NDTSkpCiAjZGVmaW5lIElTX0NSWVBfS0VZU0laRShLRVlTSVpFKSgoKEtFWVNJWkUpID09IENSWVBfS0VZU0laRV8xMjhCKSAgIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoS0VZU0laRSkgPT0gQ1JZUF9LRVlTSVpFXzE5MkIpICAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChLRVlTSVpFKSA9PSBDUllQX0tFWVNJWkVfMjU2QikpCi0jZWxzZSAvKiBBRVMqLyAKKyNlbHNlIC8qIEFFUyovCiAjZGVmaW5lIElTX0NSWVBfQUxHT1JJVEhNKEFMR09SSVRITSkgKCgoQUxHT1JJVEhNKSA9PSBDUllQX0FFU19FQ0IpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0dDTV9HTUFDKXx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQ00pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0NCQykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUxHT1JJVEhNKSAgPT0gQ1JZUF9BRVNfQ1RSKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMR09SSVRITSkgID09IENSWVBfQUVTX0dDTV9HTUFDKXx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBTEdPUklUSE0pICA9PSBDUllQX0FFU19DQ00pKQogCiAKICNkZWZpbmUgSVNfQ1JZUF9LRVlTSVpFKEtFWVNJWkUpKCgoS0VZU0laRSkgPT0gQ1JZUF9LRVlTSVpFXzEyOEIpICAgfHwgXApAQCAtNTU3LDYgKzU4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8xQikpCiAKKyNkZWZpbmUgSVNfQ1JZUF9JTklUKENPTkZJRykoKChDT05GSUcpID09IENSWVBfS0VZSVZDT05GSUdfQUxXQVlTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ09ORklHKSA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTU3Myw3ICs2MDEsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIC8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9EZWZpbmVzIENSWVAgUHJpdmF0ZSBEZWZpbmVzCiAgICogQHsKQEAgLTU4MSw4ICs2MDksOCBAQAogCiAvKioKICAgKiBAfQotICAqLyAKLSAgICAgICAgICAKKyAgKi8KKwogLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQIFByaXZhdGUgVmFyaWFibGVzCiAgICogQHsKQEAgLTU5MCw3ICs2MTgsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIC8qIFByaXZhdGUgZnVuY3Rpb25zIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBfUHJpdmF0ZV9GdW5jdGlvbnNfUHJvdG90eXBlcyBDUllQIFByaXZhdGUgRnVuY3Rpb25zIFByb3RvdHlwZXMKICAgKiBAewpAQCAtNjA4LDIxICs2MzYsMjEgQEAKIC8qKgogICAqIEB9CiAgICovCi0gCi0gICAgIAotLyoqCi0gICogQH0KLSAgKi8gCiAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCisKKworLyoqCisgICogQH0KKyAgKi8KICNlbmRpZiAvKiBUaW55QUVTIG9yIENSWVAqLwogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9jcnlwX2V4LmggYi9JbmMvc3RtMzJmN3h4X2hhbF9jcnlwX2V4LmgKaW5kZXggODU2ODYyZS4uZDlmYTc3NiAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfY3J5cF9leC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2NyeXBfZXguaApAQCAtNiwyMyArNiwyMyBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmbmRlZiBfX1NUTTMyRjd4eF9IQUxfQ1JZUF9FWF9ICiAjZGVmaW5lIF9fU1RNMzJGN3h4X0hBTF9DUllQX0VYX0gKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi0gZXh0ZXJuICJDIiB7CitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzUsMTQgKzM1LDE0IEBACiAvKiogQGFkZHRvZ3JvdXAgQ1JZUEV4CiAgICogQHsKICAgKi8KLS8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAorLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX1R5cGVzIENSWVBFeCBFeHBvcnRlZCB0eXBlcwogICAqIEB7CiAgICovCiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0NvbnN0YW50cyBDUllQRXggRXhwb3J0ZWQgY29uc3RhbnRzCiAgICogQHsKQEAgLTUwLDggKzUwLDggQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gCisgICovCisKIC8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX1R5cGVzIENSWVBFeCBQcml2YXRlIFR5cGVzCiAgICogQHsKQEAgLTU5LDcgKzU5LDcgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX1ZhcmlhYmxlcyBDUllQRXggUHJpdmF0ZSBWYXJpYWJsZXMKQEAgLTY4LDcgKzY4LDcgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIENSWVBFeF9Qcml2YXRlX0NvbnN0YW50cyBDUllQRXggUHJpdmF0ZSBDb25zdGFudHMKQEAgLTc3LDE3ICs3NywxNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfTWFjcm9zIENSWVBFeCBQcml2YXRlIE1hY3JvcwogICAqIEB7CiAgICovCiAKLSAvKioKKy8qKgogICAqIEB9Ci0gICovIAotICAKKyAqLworCiAvKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBDUllQRXhfUHJpdmF0ZV9GdW5jdGlvbnMgQ1JZUEV4IFByaXZhdGUgRnVuY3Rpb25zCiAgICogQHsKQEAgLTEwNCw3ICsxMDQsNyBAQAogI2lmIGRlZmluZWQgKENSWVApIHx8IGRlZmluZWQgKEFFUykKIC8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQogICAqIEB7Ci0gICovICAgIAorICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCk7CiAvKioKQEAgLTExMiwxMCArMTEyLDEwIEBACiAgICovCiAjZW5kaWYgLyogQ1JZUHx8QUVTICovCiAKLSNpZiBkZWZpbmVkIChBRVMpICAgIAorI2lmIGRlZmluZWQgKEFFUykKIC8qKiBAYWRkdG9ncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgogICAqIEB7Ci0gICovICAgIAorICAqLwogdm9pZCAgSEFMX0NSWVBFeF9FbmFibGVBdXRvS2V5RGVyaXZhdGlvbihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKIHZvaWQgIEhBTF9DUllQRXhfRGlzYWJsZUF1dG9LZXlEZXJpdmF0aW9uKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwogLyoqCkBAIC0xMjUsMTYgKzEyNSwxNiBAQAogCiAvKioKICAgKiBAfQotICAqLyAKLSAgIAotLyoqCi0gICogQH0KLSAgKi8gCisgICovCiAKIC8qKgogICAqIEB9Ci0gICovIAotICAKKyAgKi8KKworLyoqCisgICogQH0KKyAgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2RjbWkuaCBiL0luYy9zdG0zMmY3eHhfaGFsX2RjbWkuaAppbmRleCAxZTM5OGUyLi43ODgyMTk4IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9kY21pLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfZGNtaS5oCkBAIC0xOCwxOCArMTgsMTggQEAKICAgKi8KIAogLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19TVE0zMkY3eHhfSEFMX0RDTUlfSAotI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfRENNSV9ICisjaWZuZGVmIFNUTTMyRjd4eF9IQUxfRENNSV9ICisjZGVmaW5lIFNUTTMyRjd4eF9IQUxfRENNSV9ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwotIGV4dGVybiAiQyIgeworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsX2RlZi5oIgogCiAjaWYgZGVmaW5lZCAoRENNSSkKLSAKKwogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyCiAgICogQHsKICAgKi8KQEAgLTM3LDE1ICszNywxNSBAQAogLyoqIEBhZGR0b2dyb3VwIERDTUkgRENNSQogICAqIEBicmllZiBEQ01JIEhBTCBtb2R1bGUgZHJpdmVyCiAgICogQHsKLSAgKi8gIAorICAqLwogCiAvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBEQ01JX0V4cG9ydGVkX1R5cGVzIERDTUkgRXhwb3J0ZWQgVHlwZXMKICAgKiBAewogICAqLwotLyoqIAorLyoqCiAgICogQGJyaWVmICBIQUwgRENNSSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KLSAgKi8gCisgICovCiB0eXBlZGVmIGVudW0KIHsKICAgSEFMX0RDTUlfU1RBVEVfUkVTRVQgICAgICAgICAgICAgPSAweDAwVSwgIC8qITwgRENNSSBub3QgeWV0IGluaXRpYWxpemVkIG9yIGRpc2FibGVkICAqLwpAQCAtNTMsMjMgKzUzLDMzIEBACiAgIEhBTF9EQ01JX1NUQVRFX0JVU1kgICAgICAgICAgICAgID0gMHgwMlUsICAvKiE8IERDTUkgaW50ZXJuYWwgcHJvY2Vzc2luZyBpcyBvbmdvaW5nICAgKi8KICAgSEFMX0RDTUlfU1RBVEVfVElNRU9VVCAgICAgICAgICAgPSAweDAzVSwgIC8qITwgRENNSSB0aW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAqLwogICBIQUxfRENNSV9TVEFURV9FUlJPUiAgICAgICAgICAgICA9IDB4MDRVLCAgLyohPCBEQ01JIGVycm9yIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICovCi0gIEhBTF9EQ01JX1NUQVRFX1NVU1BFTkRFRCAgICAgICAgID0gMHgwNVUgICAvKiE8IERDTUkgc3VzcGVuZCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8gICAgCi19SEFMX0RDTUlfU3RhdGVUeXBlRGVmOworICBIQUxfRENNSV9TVEFURV9TVVNQRU5ERUQgICAgICAgICA9IDB4MDVVICAgLyohPCBEQ01JIHN1c3BlbmQgc3RhdGUgICAgICAgICAgICAgICAgICAgICovCit9IEhBTF9EQ01JX1N0YXRlVHlwZURlZjsKIAotLyoqIAorLyoqCiAgICogQGJyaWVmICAgRENNSUV4IEVtYmVkZGVkIFN5bmNocm9uaXNhdGlvbiBDT0RFIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KLSAgKi8gCisgICovCiB0eXBlZGVmIHN0cnVjdAogewogICB1aW50OF90IEZyYW1lU3RhcnRDb2RlOyAvKiE8IFNwZWNpZmllcyB0aGUgY29kZSBvZiB0aGUgZnJhbWUgc3RhcnQgZGVsaW1pdGVyLiAqLwogICB1aW50OF90IExpbmVTdGFydENvZGU7ICAvKiE8IFNwZWNpZmllcyB0aGUgY29kZSBvZiB0aGUgbGluZSBzdGFydCBkZWxpbWl0ZXIuICAqLwogICB1aW50OF90IExpbmVFbmRDb2RlOyAgICAvKiE8IFNwZWNpZmllcyB0aGUgY29kZSBvZiB0aGUgbGluZSBlbmQgZGVsaW1pdGVyLiAgICAqLwogICB1aW50OF90IEZyYW1lRW5kQ29kZTsgICAvKiE8IFNwZWNpZmllcyB0aGUgY29kZSBvZiB0aGUgZnJhbWUgZW5kIGRlbGltaXRlci4gICAqLwotfURDTUlfQ29kZXNJbml0VHlwZURlZjsKK30gRENNSV9Db2Rlc0luaXRUeXBlRGVmOwogCi0vKiogCisvKioKKyAgKiBAYnJpZWYgICBEQ01JIEVtYmVkZGVkIFN5bmNocm9uaXNhdGlvbiBDT0RFIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQ4X3QgRnJhbWVTdGFydFVubWFzazsgLyohPCBTcGVjaWZpZXMgdGhlIGZyYW1lIHN0YXJ0IGRlbGltaXRlciB1bm1hc2suICovCisgIHVpbnQ4X3QgTGluZVN0YXJ0VW5tYXNrOyAgLyohPCBTcGVjaWZpZXMgdGhlIGxpbmUgc3RhcnQgZGVsaW1pdGVyIHVubWFzay4gICovCisgIHVpbnQ4X3QgTGluZUVuZFVubWFzazsgICAgLyohPCBTcGVjaWZpZXMgdGhlIGxpbmUgZW5kIGRlbGltaXRlciB1bm1hc2suICAgICovCisgIHVpbnQ4X3QgRnJhbWVFbmRVbm1hc2s7ICAgLyohPCBTcGVjaWZpZXMgdGhlIGZyYW1lIGVuZCBkZWxpbWl0ZXIgdW5tYXNrLiAgICovCit9IERDTUlfU3luY1VubWFza1R5cGVEZWY7CisvKioKICAgKiBAYnJpZWYgICBEQ01JIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KLSAgKi8gIAorICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgdWludDMyX3QgIFN5bmNocm9Nb2RlOyAgICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgU3luY2hyb25pemF0aW9uIE1vZGU6IEhhcmR3YXJlIG9yIEVtYmVkZGVkLgpAQCAtOTMsMjMgKzEwMywyNSBAQAogICBEQ01JX0NvZGVzSW5pdFR5cGVEZWYgU3luY3JvQ29kZTsgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb2RlIG9mIHRoZSBsaW5lL2ZyYW1lIHN0YXJ0IGRlbGltaXRlciBhbmQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lL2ZyYW1lIGVuZCBkZWxpbWl0ZXIgKi8KIAotICB1aW50MzJfdCBKUEVHTW9kZTsgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIERpc2FibGUgdGhlIEpQRUcgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB1aW50MzJfdCBKUEVHTW9kZTsgICAgICAgICAgICAgICAgICAgIC8qITwgRW5hYmxlIG9yIERpc2FibGUgdGhlIEpQRUcgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRENNSV9NT0RFX0pQRUcgICAgICAgICAgICAqLwogCi0gIHVpbnQzMl90IEJ5dGVTZWxlY3RNb2RlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGRhdGEgdG8gYmUgY2FwdHVyZWQgYnkgdGhlIGludGVyZmFjZSAKKyNpZmRlZiBEQ01JX0NSX0JTTQorICB1aW50MzJfdCBCeXRlU2VsZWN0TW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBkYXRhIHRvIGJlIGNhcHR1cmVkIGJ5IHRoZSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQ01JX0J5dGVfU2VsZWN0X01vZGUgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogICB1aW50MzJfdCBCeXRlU2VsZWN0U3RhcnQ7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIGlmIHRoZSBkYXRhIHRvIGJlIGNhcHR1cmVkIGJ5IHRoZSBpbnRlcmZhY2UgaXMgZXZlbiBvciBvZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBEQ01JX0J5dGVfU2VsZWN0X1N0YXJ0ICAgICAqLwogCi0gIHVpbnQzMl90IExpbmVTZWxlY3RNb2RlOyAgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgdGhlIGxpbmUgb2YgZGF0YSB0byBiZSBjYXB0dXJlZCBieSB0aGUgaW50ZXJmYWNlIAorICB1aW50MzJfdCBMaW5lU2VsZWN0TW9kZTsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBsaW5lIG9mIGRhdGEgdG8gYmUgY2FwdHVyZWQgYnkgdGhlIGludGVyZmFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIERDTUlfTGluZV9TZWxlY3RfTW9kZSAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgIHVpbnQzMl90IExpbmVTZWxlY3RTdGFydDsgICAgICAgICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIGxpbmUgb2YgZGF0YSB0byBiZSBjYXB0dXJlZCBieSB0aGUgaW50ZXJmYWNlIGlzIGV2ZW4gb3Igb2RkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRENNSV9MaW5lX1NlbGVjdF9TdGFydCAgICAgKi8KLX1EQ01JX0luaXRUeXBlRGVmOworI2VuZGlmCit9IERDTUlfSW5pdFR5cGVEZWY7CiAKLS8qKiAKKy8qKgogICAqIEBicmllZiAgRENNSSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KICAgKi8KIHR5cGVkZWYgc3RydWN0IF9fRENNSV9IYW5kbGVUeXBlRGVmCkBAIC0xMzQsMjcgKzE0NiwyNyBAQAogCiAgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgIEVycm9yQ29kZTsgICAgICAgICAgIC8qITwgRENNSSBFcnJvciBjb2RlICAgICAgICAgICAgICAqLwogI2lmIChVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gIHZvaWQgICAgKCogRnJhbWVFdmVudENhbGxiYWNrKSAoIHN0cnVjdCBfX0RDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOyAgLyohPCBEQ01JIEZyYW1lIEV2ZW50IENhbGxiYWNrICovCi0gIHZvaWQgICAgKCogVnN5bmNFdmVudENhbGxiYWNrKSAoIHN0cnVjdCBfX0RDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOyAgLyohPCBEQ01JIFZzeW5jIEV2ZW50IENhbGxiYWNrICovCi0gIHZvaWQgICAgKCogTGluZUV2ZW50Q2FsbGJhY2sgKSAoIHN0cnVjdCBfX0RDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOyAgLyohPCBEQ01JIExpbmUgRXZlbnQgQ2FsbGJhY2sgICovIAotICB2b2lkICAgICgqIEVycm9yQ2FsbGJhY2spICAgICAgKCBzdHJ1Y3QgX19EQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsgIC8qITwgRENNSSBFcnJvciBDYWxsYmFjayAgICAgICAqLwotICB2b2lkICAgICgqIE1zcEluaXRDYWxsYmFjaykgICAgKCBzdHJ1Y3QgX19EQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsgIC8qITwgRENNSSBNc3AgSW5pdCBjYWxsYmFjayAgICAqLwotICB2b2lkICAgICgqIE1zcERlSW5pdENhbGxiYWNrKSAgKCBzdHJ1Y3QgX19EQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsgIC8qITwgRENNSSBNc3AgRGVJbml0IGNhbGxiYWNrICAqLyAgCi0jZW5kaWYgIC8qIFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCi19RENNSV9IYW5kbGVUeXBlRGVmOworICB2b2lkICgqIEZyYW1lRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7ICAgICAgIC8qITwgRENNSSBGcmFtZSBFdmVudCBDYWxsYmFjayAqLworICB2b2lkICgqIFZzeW5jRXZlbnRDYWxsYmFjaykoc3RydWN0IF9fRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7ICAgICAgIC8qITwgRENNSSBWc3luYyBFdmVudCBDYWxsYmFjayAqLworICB2b2lkICgqIExpbmVFdmVudENhbGxiYWNrKShzdHJ1Y3QgX19EQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsgICAgICAgIC8qITwgRENNSSBMaW5lIEV2ZW50IENhbGxiYWNrICAqLworICB2b2lkICgqIEVycm9yQ2FsbGJhY2spKHN0cnVjdCBfX0RDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOyAgICAgICAgICAgIC8qITwgRENNSSBFcnJvciBDYWxsYmFjayAgICAgICAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7ICAgICAgICAgIC8qITwgRENNSSBNc3AgSW5pdCBjYWxsYmFjayAgICAqLworICB2b2lkICgqIE1zcERlSW5pdENhbGxiYWNrKShzdHJ1Y3QgX19EQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsgICAgICAgIC8qITwgRENNSSBNc3AgRGVJbml0IGNhbGxiYWNrICAqLworI2VuZGlmICAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCit9IERDTUlfSGFuZGxlVHlwZURlZjsKIAogI2lmIChVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiB0eXBlZGVmIGVudW0KIHsKICAgSEFMX0RDTUlfRlJBTUVfRVZFTlRfQ0JfSUQgICAgPSAweDAwVSwgICAgLyohPCBEQ01JIEZyYW1lIEV2ZW50IENhbGxiYWNrIElEICovCiAgIEhBTF9EQ01JX1ZTWU5DX0VWRU5UX0NCX0lEICAgID0gMHgwMVUsICAgIC8qITwgRENNSSBWc3luYyBFdmVudCBDYWxsYmFjayBJRCAqLwotICBIQUxfRENNSV9MSU5FX0VWRU5UX0NCX0lEICAgICA9IDB4MDJVLCAgICAvKiE8IERDTUkgTGluZSBFdmVudCBDYWxsYmFjayBJRCAgKi8gCisgIEhBTF9EQ01JX0xJTkVfRVZFTlRfQ0JfSUQgICAgID0gMHgwMlUsICAgIC8qITwgRENNSSBMaW5lIEV2ZW50IENhbGxiYWNrIElEICAqLwogICBIQUxfRENNSV9FUlJPUl9DQl9JRCAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IERDTUkgRXJyb3IgQ2FsbGJhY2sgSUQgICAgICAgKi8KICAgSEFMX0RDTUlfTVNQSU5JVF9DQl9JRCAgICAgICAgPSAweDA0VSwgICAgLyohPCBEQ01JIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICovCiAgIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCAgICAgID0gMHgwNVUgICAgIC8qITwgRENNSSBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAqLwotICAKLX1IQUxfRENNSV9DYWxsYmFja0lEVHlwZURlZjsKLSAgICAKKworfSBIQUxfRENNSV9DYWxsYmFja0lEVHlwZURlZjsKKwogdHlwZWRlZiB2b2lkICgqcERDTUlfQ2FsbGJhY2tUeXBlRGVmKShEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKICNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKQEAgLTE4NSw3ICsxOTcsNyBAQAogCiAvKiogQGRlZmdyb3VwIERDTUlfQ2FwdHVyZV9Nb2RlIERDTUkgQ2FwdHVyZSBNb2RlCiAgICogQHsKLSAgKi8gCisgICovCiAjZGVmaW5lIERDTUlfTU9ERV9DT05USU5VT1VTICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBUaGUgcmVjZWl2ZWQgZGF0YSBhcmUgdHJhbnNmZXJyZWQgY29udGludW91c2x5IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgdGhyb3VnaCB0aGUgRE1BICAgICAgICAgICAgICovCiAjZGVmaW5lIERDTUlfTU9ERV9TTkFQU0hPVCAgICAgICAgICAgICAoKHVpbnQzMl90KURDTUlfQ1JfQ00pICAvKiE8IE9uY2UgYWN0aXZhdGVkLCB0aGUgaW50ZXJmYWNlIHdhaXRzIGZvciB0aGUgc3RhcnQgb2YgCkBAIC0xOTYsNyArMjA4LDcgQEAKIAogLyoqIEBkZWZncm91cCBEQ01JX1N5bmNocm9uaXphdGlvbl9Nb2RlIERDTUkgU3luY2hyb25pemF0aW9uIE1vZGUKICAgKiBAewotICAqLyAKKyAgKi8KICNkZWZpbmUgRENNSV9TWU5DSFJPX0hBUkRXQVJFICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgIC8qITwgSGFyZHdhcmUgc3luY2hyb25pemF0aW9uIGRhdGEgY2FwdHVyZSAoZnJhbWUvbGluZSBzdGFydC9zdG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBIU1lOQy9WU1lOQyBzaWduYWxzICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRENNSV9TWU5DSFJPX0VNQkVEREVEICAgICAgICAoKHVpbnQzMl90KURDTUlfQ1JfRVNTKSAgLyohPCBFbWJlZGRlZCBzeW5jaHJvbml6YXRpb24gZGF0YSBjYXB0dXJlIGlzIHN5bmNocm9uaXplZCB3aXRoIApAQCAtMjI4LDcgKzI0MCw3IEBACiAKIC8qKiBAZGVmZ3JvdXAgRENNSV9IU1lOQ19Qb2xhcml0eSBEQ01JIEhTWU5DIFBvbGFyaXR5CiAgICogQHsKLSAgKi8gCisgICovCiAjZGVmaW5lIERDTUlfSFNQT0xBUklUWV9MT1cgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAvKiE8IEhvcml6b250YWwgc3luY2hyb25pemF0aW9uIGFjdGl2ZSBMb3cgICovCiAjZGVmaW5lIERDTUlfSFNQT0xBUklUWV9ISUdIICAgICgodWludDMyX3QpRENNSV9DUl9IU1BPTCkgIC8qITwgSG9yaXpvbnRhbCBzeW5jaHJvbml6YXRpb24gYWN0aXZlIEhpZ2ggKi8KIApAQCAtMjY5LDcgKzI4MSw3IEBACiAgICogQH0KICAgKi8KIAotLyoqIEBkZWZncm91cCBEQ01JX1dpbmRvd19Db29yZGluYXRlIERDTUkgV2luZG93IENvb3JkaW5hdGUgCisvKiogQGRlZmdyb3VwIERDTUlfV2luZG93X0Nvb3JkaW5hdGUgRENNSSBXaW5kb3cgQ29vcmRpbmF0ZQogICAqIEB7CiAgICovCiAjZGVmaW5lIERDTUlfV0lORE9XX0NPT1JESU5BVEUgICAgKCh1aW50MzJfdCkweDNGRkZVKSAgLyohPCBXaW5kb3cgY29vcmRpbmF0ZSAqLwpAQCAtMjgwLDcgKzI5Miw3IEBACiAKIC8qKiBAZGVmZ3JvdXAgRENNSV9XaW5kb3dfSGVpZ2h0IERDTUkgV2luZG93IEhlaWdodAogICAqIEB7Ci0gICovIAorICAqLwogI2RlZmluZSBEQ01JX1dJTkRPV19IRUlHSFQgICAgKCh1aW50MzJfdCkweDFGRkZVKSAgLyohPCBXaW5kb3cgSGVpZ2h0ICovCiAKIC8qKgpAQCAtMzAzLDMxICszMTUsMzEgQEAKICAgKiBAewogICAqLwogCi0vKiogCisvKioKICAgKiBAYnJpZWYgICBEQ01JIFNSIHJlZ2lzdGVyCi0gICovIAorICAqLwogI2RlZmluZSBEQ01JX0ZMQUdfSFNZTkMgICAgICgodWludDMyX3QpRENNSV9TUl9JTkRFWHxEQ01JX1NSX0hTWU5DKSAvKiE8IEhTWU5DIHBpbiBzdGF0ZSAoYWN0aXZlIGxpbmUgLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBsaW5lcykgICAqLwogI2RlZmluZSBEQ01JX0ZMQUdfVlNZTkMgICAgICgodWludDMyX3QpRENNSV9TUl9JTkRFWHxEQ01JX1NSX1ZTWU5DKSAvKiE8IFZTWU5DIHBpbiBzdGF0ZSAoYWN0aXZlIGZyYW1lIC8gc3luY2hyb25pemF0aW9uIGJldHdlZW4gZnJhbWVzKSAqLwogI2RlZmluZSBEQ01JX0ZMQUdfRk5FICAgICAgICgodWludDMyX3QpRENNSV9TUl9JTkRFWHxEQ01JX1NSX0ZORSkgICAvKiE8IEZJRk8gbm90IGVtcHR5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKiAKLSAgKiBAYnJpZWYgICBEQ01JIFJJUyByZWdpc3RlciAgCi0gICovIAotI2RlZmluZSBEQ01JX0ZMQUdfRlJBTUVSSSAgICAoKHVpbnQzMl90KURDTUlfUklTX0ZSQU1FX1JJUykgIC8qITwgRnJhbWUgY2FwdHVyZSBjb21wbGV0ZSBpbnRlcnJ1cHQgZmxhZyAqLyAKLSNkZWZpbmUgRENNSV9GTEFHX09WUlJJICAgICAgKCh1aW50MzJfdClEQ01JX1JJU19PVlJfUklTKSAgICAvKiE8IE92ZXJydW4gaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAgICAgKi8gCi0jZGVmaW5lIERDTUlfRkxBR19FUlJSSSAgICAgICgodWludDMyX3QpRENNSV9SSVNfRVJSX1JJUykgICAgLyohPCBTeW5jaHJvbml6YXRpb24gZXJyb3IgaW50ZXJydXB0IGZsYWcgICovIAotI2RlZmluZSBEQ01JX0ZMQUdfVlNZTkNSSSAgICAoKHVpbnQzMl90KURDTUlfUklTX1ZTWU5DX1JJUykgIC8qITwgVlNZTkMgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAgICAgICAqLyAKLSNkZWZpbmUgRENNSV9GTEFHX0xJTkVSSSAgICAgKCh1aW50MzJfdClEQ01JX1JJU19MSU5FX1JJUykgICAvKiE8IExpbmUgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAgICAgICAgKi8gCi0vKiogCi0gICogQGJyaWVmICAgRENNSSBNSVMgcmVnaXN0ZXIgIAotICAqLyAKLSNkZWZpbmUgRENNSV9GTEFHX0ZSQU1FTUkgICAgKCh1aW50MzJfdClEQ01JX01JU19JTkRFWHxEQ01JX01JU19GUkFNRV9NSVMpICAvKiE8IERDTUkgRnJhbWUgY2FwdHVyZSBjb21wbGV0ZSBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAqLyAgICAgIAotI2RlZmluZSBEQ01JX0ZMQUdfT1ZSTUkgICAgICAoKHVpbnQzMl90KURDTUlfTUlTX0lOREVYfERDTUlfTUlTX09WUl9NSVMgICkgIC8qITwgRENNSSBPdmVycnVuIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgCi0jZGVmaW5lIERDTUlfRkxBR19FUlJNSSAgICAgICgodWludDMyX3QpRENNSV9NSVNfSU5ERVh8RENNSV9NSVNfRVJSX01JUyAgKSAgLyohPCBEQ01JIFN5bmNocm9uaXphdGlvbiBlcnJvciBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAgKi8gCi0jZGVmaW5lIERDTUlfRkxBR19WU1lOQ01JICAgICgodWludDMyX3QpRENNSV9NSVNfSU5ERVh8RENNSV9NSVNfVlNZTkNfTUlTKSAgLyohPCBEQ01JIFZTWU5DIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgIAotI2RlZmluZSBEQ01JX0ZMQUdfTElORU1JICAgICAoKHVpbnQzMl90KURDTUlfTUlTX0lOREVYfERDTUlfTUlTX0xJTkVfTUlTICkgIC8qITwgRENNSSBMaW5lIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgCisvKioKKyAgKiBAYnJpZWYgICBEQ01JIFJJUyByZWdpc3RlcgorICAqLworI2RlZmluZSBEQ01JX0ZMQUdfRlJBTUVSSSAgICAoKHVpbnQzMl90KURDTUlfUklTX0ZSQU1FX1JJUykgIC8qITwgRnJhbWUgY2FwdHVyZSBjb21wbGV0ZSBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBEQ01JX0ZMQUdfT1ZSUkkgICAgICAoKHVpbnQzMl90KURDTUlfUklTX09WUl9SSVMpICAgIC8qITwgT3ZlcnJ1biBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQ01JX0ZMQUdfRVJSUkkgICAgICAoKHVpbnQzMl90KURDTUlfUklTX0VSUl9SSVMpICAgIC8qITwgU3luY2hyb25pemF0aW9uIGVycm9yIGludGVycnVwdCBmbGFnICAqLworI2RlZmluZSBEQ01JX0ZMQUdfVlNZTkNSSSAgICAoKHVpbnQzMl90KURDTUlfUklTX1ZTWU5DX1JJUykgIC8qITwgVlNZTkMgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQ01JX0ZMQUdfTElORVJJICAgICAoKHVpbnQzMl90KURDTUlfUklTX0xJTkVfUklTKSAgIC8qITwgTGluZSBpbnRlcnJ1cHQgZmxhZyAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICogQGJyaWVmICAgRENNSSBNSVMgcmVnaXN0ZXIKKyAgKi8KKyNkZWZpbmUgRENNSV9GTEFHX0ZSQU1FTUkgICAgKCh1aW50MzJfdClEQ01JX01JU19JTkRFWHxEQ01JX01JU19GUkFNRV9NSVMpICAvKiE8IERDTUkgRnJhbWUgY2FwdHVyZSBjb21wbGV0ZSBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBEQ01JX0ZMQUdfT1ZSTUkgICAgICAoKHVpbnQzMl90KURDTUlfTUlTX0lOREVYfERDTUlfTUlTX09WUl9NSVMgICkgIC8qITwgRENNSSBPdmVycnVuIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDTUlfRkxBR19FUlJNSSAgICAgICgodWludDMyX3QpRENNSV9NSVNfSU5ERVh8RENNSV9NSVNfRVJSX01JUyAgKSAgLyohPCBEQ01JIFN5bmNocm9uaXphdGlvbiBlcnJvciBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAgKi8KKyNkZWZpbmUgRENNSV9GTEFHX1ZTWU5DTUkgICAgKCh1aW50MzJfdClEQ01JX01JU19JTkRFWHxEQ01JX01JU19WU1lOQ19NSVMpICAvKiE8IERDTUkgVlNZTkMgbWFza2VkIGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEQ01JX0ZMQUdfTElORU1JICAgICAoKHVpbnQzMl90KURDTUlfTUlTX0lOREVYfERDTUlfTUlTX0xJTkVfTUlTICkgIC8qITwgRENNSSBMaW5lIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzICAgICAgICAgICAgICAgICAgICovCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyoqIEBkZWZncm91cCBEQ01JX0J5dGVfU2VsZWN0X01vZGUgRENNSSBCeXRlIFNlbGVjdCBNb2RlCiAgICogQHsKQEAgLTM0Myw3ICszNTUsNyBAQAogCiAvKiogQGRlZmdyb3VwIERDTUlfQnl0ZV9TZWxlY3RfU3RhcnQgRENNSSBCeXRlIFNlbGVjdCBTdGFydAogICAqIEB7Ci0gICovIAorICAqLwogI2RlZmluZSBEQ01JX09FQlNfT0REICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBJbnRlcmZhY2UgY2FwdHVyZXMgZmlyc3QgZGF0YSBmcm9tIHRoZSBmcmFtZS9saW5lIHN0YXJ0LCBzZWNvbmQgb25lIGJlaW5nIGRyb3BwZWQgKi8KICNkZWZpbmUgRENNSV9PRUJTX0VWRU4gICAgICAgICAgICAgICgodWludDMyX3QpRENNSV9DUl9PRUJTKSAvKiE8IEludGVyZmFjZSBjYXB0dXJlcyBzZWNvbmQgZGF0YSBmcm9tIHRoZSBmcmFtZS9saW5lIHN0YXJ0LCBmaXJzdCBvbmUgYmVpbmcgZHJvcHBlZCAqLwogCkBAIC0zNjMsMjMgKzM3NSwyMyBAQAogCiAvKiogQGRlZmdyb3VwIERDTUlfTGluZV9TZWxlY3RfU3RhcnQgRENNSSBMaW5lIFNlbGVjdCBTdGFydAogICAqIEB7Ci0gICovIAorICAqLwogI2RlZmluZSBEQ01JX09FTFNfT0REICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgLyohPCBJbnRlcmZhY2UgY2FwdHVyZXMgZmlyc3QgbGluZSBmcm9tIHRoZSBmcmFtZSBzdGFydCwgc2Vjb25kIG9uZSBiZWluZyBkcm9wcGVkICovCiAjZGVmaW5lIERDTUlfT0VMU19FVkVOICAgICAgICAgICAgICAoKHVpbnQzMl90KURDTUlfQ1JfT0VMUykgLyohPCBJbnRlcmZhY2UgY2FwdHVyZXMgc2Vjb25kIGxpbmUgZnJvbSB0aGUgZnJhbWUgc3RhcnQsIGZpcnN0IG9uZSBiZWluZyBkcm9wcGVkICovCiAKIC8qKgogICAqIEB9CiAgICovCi0gICAgCisKIC8qKgogICAqIEB9CiAgICovCi0gCisKIC8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIERDTUlfRXhwb3J0ZWRfTWFjcm9zIERDTUkgRXhwb3J0ZWQgTWFjcm9zCiAgICogQHsKICAgKi8KLSAgCisKIC8qKiBAYnJpZWYgUmVzZXQgRENNSSBoYW5kbGUgc3RhdGUKICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBEQ01JIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKQEAgLTQxMCwxOSArNDIyLDE5IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fIERDTUkgaGFuZGxlCiAgICogQHBhcmFtICBfX0ZMQUdfXyBHZXQgdGhlIHNwZWNpZmllZCBmbGFnLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyAobm8gY29tYmluYXRpb24gYWxsb3dlZCkKLSAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX0hTWU5DOiBIU1lOQyBwaW4gc3RhdGUgKGFjdGl2ZSBsaW5lIC8gc3luY2hyb25pemF0aW9uIGJldHdlZW4gbGluZXMpICAgCi0gICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19WU1lOQzogVlNZTkMgcGluIHN0YXRlIChhY3RpdmUgZnJhbWUgLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBmcmFtZXMpIAotICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfRk5FOiBGSUZPIGVtcHR5IGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfSFNZTkM6IEhTWU5DIHBpbiBzdGF0ZSAoYWN0aXZlIGxpbmUgLyBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBsaW5lcykKKyAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX1ZTWU5DOiBWU1lOQyBwaW4gc3RhdGUgKGFjdGl2ZSBmcmFtZSAvIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIGZyYW1lcykKKyAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX0ZORTogRklGTyBlbXB0eSBmbGFnCiAgICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19GUkFNRVJJOiBGcmFtZSBjYXB0dXJlIGNvbXBsZXRlIGZsYWcgbWFzawogICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfT1ZSUkk6IE92ZXJydW4gZmxhZyBtYXNrCiAgICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19FUlJSSTogU3luY2hyb25pemF0aW9uIGVycm9yIGZsYWcgbWFzawogICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfVlNZTkNSSTogVlNZTkMgZmxhZyBtYXNrCiAgICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19MSU5FUkk6IExpbmUgZmxhZyBtYXNrCi0gICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19GUkFNRU1JOiBEQ01JIENhcHR1cmUgY29tcGxldGUgbWFza2VkIGludGVycnVwdCBzdGF0dXMgICAgICAKLSAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX09WUk1JOiBEQ01JIE92ZXJydW4gbWFza2VkIGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAgICAKLSAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX0VSUk1JOiBEQ01JIFN5bmNocm9uaXphdGlvbiBlcnJvciBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cyAKLSAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX1ZTWU5DTUk6IERDTUkgVlNZTkMgbWFza2VkIGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAgICAgIAotICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfTElORU1JOiBEQ01JIExpbmUgbWFza2VkIGludGVycnVwdCBzdGF0dXMgICAgICAgICAgICAgICAgICAKKyAgKiAgICAgICAgICAgIEBhcmcgRENNSV9GTEFHX0ZSQU1FTUk6IERDTUkgQ2FwdHVyZSBjb21wbGV0ZSBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfT1ZSTUk6IERDTUkgT3ZlcnJ1biBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cworICAqICAgICAgICAgICAgQGFyZyBEQ01JX0ZMQUdfRVJSTUk6IERDTUkgU3luY2hyb25pemF0aW9uIGVycm9yIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzCisgICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19WU1lOQ01JOiBEQ01JIFZTWU5DIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzCisgICogICAgICAgICAgICBAYXJnIERDTUlfRkxBR19MSU5FTUk6IERDTUkgTGluZSBtYXNrZWQgaW50ZXJydXB0IHN0YXR1cwogICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIEZMQUcuCiAgICovCiAjZGVmaW5lIF9fSEFMX0RDTUlfR0VUX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pXApAQCAtNDQ2LDcgKzQ1OCw3IEBACiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIERDTUkgaW50ZXJydXB0cy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gICAgRENNSSBoYW5kbGUKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBEQ01JIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuIAorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERDTUkgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIERDTUlfSVRfRlJBTUU6IEZyYW1lIGNhcHR1cmUgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKICAgKiAgICAgICAgICAgIEBhcmcgRENNSV9JVF9PVkY6IE92ZXJmbG93IGludGVycnVwdCBtYXNrCkBAIC00NjAsNyArNDcyLDcgQEAKIC8qKgogICAqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIERDTUkgaW50ZXJydXB0cy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gRENNSSBoYW5kbGUKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBEQ01JIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuIAorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIERDTUkgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZC4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIERDTUlfSVRfRlJBTUU6IEZyYW1lIGNhcHR1cmUgY29tcGxldGUgaW50ZXJydXB0IG1hc2sKICAgKiAgICAgICAgICAgIEBhcmcgRENNSV9JVF9PVkY6IE92ZXJmbG93IGludGVycnVwdCBtYXNrCkBAIC00ODgsNyArNTAwLDcgQEAKIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIERDTUlfRXhwb3J0ZWRfRnVuY3Rpb25zIERDTUkgRXhwb3J0ZWQgRnVuY3Rpb25zCiAgICogQHsKQEAgLTUwMCwyNiArNTEyLDI2IEBACiAvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX0RlSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKLXZvaWQgICAgICAgSEFMX0RDTUlfTXNwSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pKTsKLXZvaWQgICAgICAgSEFMX0RDTUlfTXNwRGVJbml0KERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWkpOwordm9pZCAgICAgICBIQUxfRENNSV9Nc3BJbml0KERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOwordm9pZCAgICAgICBIQUxfRENNSV9Nc3BEZUluaXQoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7CiAKIC8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgKFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgICAKKyNpZiAoVVNFX0hBTF9EQ01JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfUmVnaXN0ZXJDYWxsYmFjayhEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pLCBIQUxfRENNSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwRENNSV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1VuUmVnaXN0ZXJDYWxsYmFjayhEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pLCBIQUxfRENNSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKICNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAvKioKICAgKiBAfQogICAqLwotICAKKwogLyoqIEBhZGR0b2dyb3VwIERDTUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCiAgKiBAewogICovCiAvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3RhcnRfRE1BKERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWksIHVpbnQzMl90IERDTUlfTW9kZSwgdWludDMyX3QgcERhdGEsIHVpbnQzMl90IExlbmd0aCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9TdG9wKERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWkpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3VzcGVuZChEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pKTsKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1Jlc3VtZShEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1N0YXJ0X0RNQShEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pLCB1aW50MzJfdCBEQ01JX01vZGUsIHVpbnQzMl90IHBEYXRhLCB1aW50MzJfdCBMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3RvcChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1N1c3BlbmQoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9SZXN1bWUoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7CiB2b2lkICAgICAgIEhBTF9EQ01JX0Vycm9yQ2FsbGJhY2soRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7CiB2b2lkICAgICAgIEhBTF9EQ01JX0xpbmVFdmVudENhbGxiYWNrKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpOwogdm9pZCAgICAgICBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2soRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSk7CkBAIC01MjgsNyArNTQwLDcgQEAKIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiogQGFkZHRvZ3JvdXAgRENNSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKICAqIEB7CiAgKi8KQEAgLTUzNiwxMSArNTQ4LDEyIEBACiBIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0RDTUlfQ29uZmlnQ3JvcChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pLCB1aW50MzJfdCBYMCwgdWludDMyX3QgWTAsIHVpbnQzMl90IFhTaXplLCB1aW50MzJfdCBZU2l6ZSk7CiBIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0RDTUlfRW5hYmxlQ3JvcChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKIEhBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfRENNSV9EaXNhYmxlQ3JvcChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKTsKK0hBTF9TdGF0dXNUeXBlRGVmICAgICBIQUxfRENNSV9Db25maWdTeW5jVW5tYXNrKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWksIERDTUlfU3luY1VubWFza1R5cGVEZWYgKlN5bmNVbm1hc2spOwogCiAvKioKICAgKiBAfQogICAqLwotICAKKwogLyoqIEBhZGR0b2dyb3VwIERDTUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucwogICogQHsKICAqLwpAQCAtNTYyLDQxICs1NzUsNDEgQEAKICAgKiBAewogICAqLwogI2RlZmluZSBEQ01JX01JU19JTkRFWCAgICAgICAgKCh1aW50MzJfdCkweDEwMDApIC8qITwgRENNSSBNSVMgcmVnaXN0ZXIgaW5kZXggKi8KLSNkZWZpbmUgRENNSV9TUl9JTkRFWCAgICAgICAgICgodWludDMyX3QpMHgyMDAwKSAvKiE8IERDTUkgU1IgcmVnaXN0ZXIgaW5kZXggICovICAgCisjZGVmaW5lIERDTUlfU1JfSU5ERVggICAgICAgICAoKHVpbnQzMl90KTB4MjAwMCkgLyohPCBEQ01JIFNSIHJlZ2lzdGVyIGluZGV4ICAqLwogLyoqCiAgICogQH0KLSAgKi8gICAKKyAgKi8KIC8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIERDTUlfUHJpdmF0ZV9NYWNyb3MgRENNSSBQcml2YXRlIE1hY3JvcwogICAqIEB7CiAgICovCiAjZGVmaW5lIElTX0RDTUlfQ0FQVFVSRV9NT0RFKE1PREUpKCgoTU9ERSkgPT0gRENNSV9NT0RFX0NPTlRJTlVPVVMpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQ01JX01PREVfU05BUFNIT1QpKQotCQkJCQkJCQkJCQkJCQkJCQkJCSAKKwogI2RlZmluZSBJU19EQ01JX1NZTkNIUk8oTU9ERSkoKChNT0RFKSA9PSBEQ01JX1NZTkNIUk9fSEFSRFdBUkUpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gRENNSV9TWU5DSFJPX0VNQkVEREVEKSkKLQkJCQkJCQkJCQkJCQkJCQkJCisKICNkZWZpbmUgSVNfRENNSV9QQ0tQT0xBUklUWShQT0xBUklUWSkoKChQT0xBUklUWSkgPT0gRENNSV9QQ0tQT0xBUklUWV9GQUxMSU5HKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IERDTUlfUENLUE9MQVJJVFlfUklTSU5HKSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQorCiAjZGVmaW5lIElTX0RDTUlfVlNQT0xBUklUWShQT0xBUklUWSkoKChQT0xBUklUWSkgPT0gRENNSV9WU1BPTEFSSVRZX0xPVykgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IERDTUlfVlNQT0xBUklUWV9ISUdIKSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJIAorCiAjZGVmaW5lIElTX0RDTUlfSFNQT0xBUklUWShQT0xBUklUWSkoKChQT0xBUklUWSkgPT0gRENNSV9IU1BPTEFSSVRZX0xPVykgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IERDTUlfSFNQT0xBUklUWV9ISUdIKSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJIAorCiAjZGVmaW5lIElTX0RDTUlfTU9ERV9KUEVHKEpQRUdfTU9ERSkoKChKUEVHX01PREUpID09IERDTUlfSlBFR19ESVNBQkxFKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChKUEVHX01PREUpID09IERDTUlfSlBFR19FTkFCTEUpKQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgCisKICNkZWZpbmUgSVNfRENNSV9DQVBUVVJFX1JBVEUoUkFURSkgKCgoUkFURSkgPT0gRENNSV9DUl9BTExfRlJBTUUpICAgICAgICAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSQVRFKSA9PSBEQ01JX0NSX0FMVEVSTkFURV8yX0ZSQU1FKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJBVEUpID09IERDTUlfQ1JfQUxURVJOQVRFXzRfRlJBTUUpKQotCQkJCQkJCQkJCQkJCQkJCQkJCQkKKwogI2RlZmluZSBJU19EQ01JX0VYVEVOREVEX0RBVEEoREFUQSkoKChEQVRBKSA9PSBEQ01JX0VYVEVORF9EQVRBXzhCKSAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBKSA9PSBEQ01JX0VYVEVORF9EQVRBXzEwQikgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBKSA9PSBEQ01JX0VYVEVORF9EQVRBXzEyQikgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEQVRBKSA9PSBEQ01JX0VYVEVORF9EQVRBXzE0QikpCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQorCiAjZGVmaW5lIElTX0RDTUlfV0lORE9XX0NPT1JESU5BVEUoQ09PUkRJTkFURSkgKChDT09SRElOQVRFKSA8PSBEQ01JX1dJTkRPV19DT09SRElOQVRFKQogCiAjZGVmaW5lIElTX0RDTUlfV0lORE9XX0hFSUdIVChIRUlHSFQpICgoSEVJR0hUKSA8PSBEQ01JX1dJTkRPV19IRUlHSFQpCkBAIC02MDUsMTMgKzYxOCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQ01JX0JTTV9PVEhFUikgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQ01JX0JTTV9BTFRFUk5BVEVfNCkgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQ01JX0JTTV9BTFRFUk5BVEVfMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogI2RlZmluZSBJU19EQ01JX0JZVEVfU0VMRUNUX1NUQVJUKFBPTEFSSVRZKSgoKFBPTEFSSVRZKSA9PSBEQ01JX09FQlNfT0REKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUE9MQVJJVFkpID09IERDTUlfT0VCU19FVkVOKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAjZGVmaW5lIElTX0RDTUlfTElORV9TRUxFQ1RfTU9ERShNT0RFKSgoKE1PREUpID09IERDTUlfTFNNX0FMTCkgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBEQ01JX0xTTV9BTFRFUk5BVEVfMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAjZGVmaW5lIElTX0RDTUlfTElORV9TRUxFQ1RfU1RBUlQoUE9MQVJJVFkpKCgoUE9MQVJJVFkpID09IERDTUlfT0VMU19PREQpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQT0xBUklUWSkgPT0gRENNSV9PRUxTX0VWRU4pKQogCkBAIC02MjMsMjMgKzYzNiwyMyBAQAogLyoqIEBhZGR0b2dyb3VwIERDTUlfUHJpdmF0ZV9GdW5jdGlvbnMgRENNSSBQcml2YXRlIEZ1bmN0aW9ucwogICAqIEB7CiAgICovCi0gIAorCiAvKioKICAgKiBAfQogICAqLwotICAgICAgCisKIC8qKgogICAqIEB9CiAgICovCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KICNlbmRpZiAvKiBEQ01JICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX1NUTTMyRjd4eF9IQUxfRENNSV9IICovCisjZW5kaWYgLyogU1RNMzJGN3h4X0hBTF9EQ01JX0ggKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2RjbWlfZXguaCBiL0luYy9zdG0zMmY3eHhfaGFsX2RjbWlfZXguaAppbmRleCBiNGZmMzRiLi41MDZjZTQ2IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9kY21pX2V4LmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfZGNtaV9leC5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRXhwb3J0ZWQgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEV4cG9ydGVkIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICAgICAgCisvKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAKKy8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfZXh0aS5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfZXh0aS5oCmluZGV4IDFkOTRhNWYuLmU2NDQxNGYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX2V4dGkuaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF9leHRpLmgKQEAgLTE4LDggKzE4LDggQEAKICAgKi8KIAogLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19TVE0zMkY3eHhfSEFMX0VYVElfSAotI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfRVhUSV9ICisjaWZuZGVmIFNUTTMyRjd4eF9IQUxfRVhUSV9ICisjZGVmaW5lIFNUTTMyRjd4eF9IQUxfRVhUSV9ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0zOCwxNCArMzgsMTMgQEAKICAgKi8KIAogLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogLyoqIEBkZWZncm91cCBFWFRJX0V4cG9ydGVkX1R5cGVzIEVYVEkgRXhwb3J0ZWQgVHlwZXMKICAgKiBAewogICAqLwogdHlwZWRlZiBlbnVtCiB7Ci0gIEhBTF9FWFRJX0NPTU1PTl9DQl9JRCAgICAgICAgICA9IDB4MDBVLAotICBIQUxfRVhUSV9SSVNJTkdfQ0JfSUQgICAgICAgICAgPSAweDAxVSwKLSAgSEFMX0VYVElfRkFMTElOR19DQl9JRCAgICAgICAgID0gMHgwMlUsCisgIEhBTF9FWFRJX0NPTU1PTl9DQl9JRCAgICAgICAgICA9IDB4MDBVCiB9IEVYVElfQ2FsbGJhY2tJRFR5cGVEZWY7CiAKIC8qKgpAQCAtNjgsNiArNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgY29tYmluYXRpb24gb2YgQHJlZiBFWFRJX01vZGUgKi8KICAgdWludDMyX3QgVHJpZ2dlcjsgICAvKiE8IFRoZSBFeHRpIFRyaWdnZXIgdG8gYmUgY29uZmlndXJlZC4gVGhpcyBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgRVhUSV9UcmlnZ2VyICovCisgIHVpbnQzMl90IEdQSU9TZWw7ICAgLyohPCBUaGUgRXh0aSBHUElPIG11bHRpcGxleGVyIHNlbGVjdGlvbiB0byBiZSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBwb3NzaWJsZSBmb3IgbGluZSAwIHRvIDE1LiBJdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBFWFRJX0dQSU9TZWwgKi8KIH0gRVhUSV9Db25maWdUeXBlRGVmOwogCiAvKioKQEAgLTgyLDQ4ICs4NCwzNiBAQAogLyoqIEBkZWZncm91cCBFWFRJX0xpbmUgIEVYVEkgTGluZQogICAqIEB7CiAgICovCi0jZGVmaW5lIEVYVElfTElORV8wICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTAgICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMCAqLwotI2RlZmluZSBFWFRJX0xJTkVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xICAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEgKi8KLSNkZWZpbmUgRVhUSV9MSU5FXzIgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMiAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyICovCi0jZGVmaW5lIEVYVElfTElORV8zICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTMgICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMyAqLwotI2RlZmluZSBFWFRJX0xJTkVfNCAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU00ICAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDQgKi8KLSNkZWZpbmUgRVhUSV9MSU5FXzUgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNNSAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA1ICovCi0jZGVmaW5lIEVYVElfTElORV82ICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTYgICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgNiAqLwotI2RlZmluZSBFWFRJX0xJTkVfNyAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU03ICAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDcgKi8KLSNkZWZpbmUgRVhUSV9MSU5FXzggICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNOCAgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA4ICovCi0jZGVmaW5lIEVYVElfTElORV85ICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTkgICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgOSAqLwotI2RlZmluZSBFWFRJX0xJTkVfMTAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xMCAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEwICovCi0jZGVmaW5lIEVYVElfTElORV8xMSAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTExICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEgKi8KLSNkZWZpbmUgRVhUSV9MSU5FXzEyICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTIgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMiAqLwotI2RlZmluZSBFWFRJX0xJTkVfMTMgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xMyAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEzICovCi0jZGVmaW5lIEVYVElfTElORV8xNCAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE0ICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTQgKi8KLSNkZWZpbmUgRVhUSV9MSU5FXzE1ICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTUgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNSAqLwotI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0xNikKLSNkZWZpbmUgRVhUSV9MSU5FXzE2ICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTYgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNiBDb25uZWN0ZWQgdG8gdGhlIFBWRCBPdXRwdXQgKi8KLSNlbmRpZiAvKiBFWFRJX0lNUl9JTTE2ICovCi0jaWYgZGVmaW5lZChFWFRJX0lNUl9JTTE3KQotI2RlZmluZSBFWFRJX0xJTkVfMTcgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0xNyAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE3IENvbm5lY3RlZCB0byB0aGUgUlRDIEFsYXJtIGV2ZW50ICovCi0jZW5kaWYgLyogRVhUSV9JTVJfSU0xNyAqLwotI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0xOCkKLSNkZWZpbmUgRVhUSV9MSU5FXzE4ICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMTggICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOCBDb25uZWN0ZWQgdG8gdGhlIFVTQiBPVEcgRlMgV2FrZXVwIGZyb20gc3VzcGVuZCBldmVudCAqLwotI2VuZGlmIC8qIEVYVElfSU1SX0lNMTggKi8KLSNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMTkpCi0jZGVmaW5lIEVYVElfTElORV8xOSAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTE5ICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTkgQ29ubmVjdGVkIHRvIHRoZSBFdGhlcm5ldCBXYWtldXAgZXZlbnQgKi8KLSNlbmRpZiAvKiBFWFRJX0lNUl9JTTE5ICovCi0jaWYgZGVmaW5lZChFWFRJX0lNUl9JTTIwKQotI2RlZmluZSBFWFRJX0xJTkVfMjAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMCAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIwIENvbm5lY3RlZCB0byB0aGUgVVNCIE9URyBIUyAoY29uZmlndXJlZCBpbiBGUykgV2FrZXVwIGV2ZW50ICAqLwotI2VuZGlmIC8qIEVYVElfSU1SX0lNMjAgKi8KLSNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjEpCi0jZGVmaW5lIEVYVElfTElORV8yMSAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIxICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjEgQ29ubmVjdGVkIHRvIHRoZSBSVEMgVGFtcGVyIGFuZCBUaW1lIFN0YW1wIGV2ZW50cyAqLyAKLSNlbmRpZiAvKiBFWFRJX0lNUl9JTTIxICovCi0jaWYgZGVmaW5lZChFWFRJX0lNUl9JTTIyKQotI2RlZmluZSBFWFRJX0xJTkVfMjIgICAgICAgICAgICAgICAgICAgICAgICAgRVhUSV9JTVJfSU0yMiAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIyIENvbm5lY3RlZCB0byB0aGUgUlRDIFdha2V1cCBldmVudCAqLwotI2VuZGlmIC8qIEVYVElfSU1SX0lNMjIgKi8KLSNpZiBkZWZpbmVkKEVYVElfSU1SX0lNMjMpCi0jZGVmaW5lIEVYVElfTElORV8yMyAgICAgICAgICAgICAgICAgICAgICAgICBFWFRJX0lNUl9JTTIzICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjMgQ29ubmVjdGVkIHRvIHRoZSBMUFRJTSBXYWtldXAgZXZlbnQgKi8KLSNlbmRpZiAvKiBFWFRJX0lNUl9JTTIzICovCisjZGVmaW5lIEVYVElfTElORV8wICAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwMHUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMCAqLworI2RlZmluZSBFWFRJX0xJTkVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgICB8IDB4MDF1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzIgICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgICAgfCAweDAydSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyICovCisjZGVmaW5lIEVYVElfTElORV8zICAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwM3UpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMyAqLworI2RlZmluZSBFWFRJX0xJTkVfNCAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgICB8IDB4MDR1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDQgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzUgICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgICAgfCAweDA1dSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA1ICovCisjZGVmaW5lIEVYVElfTElORV82ICAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwNnUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgNiAqLworI2RlZmluZSBFWFRJX0xJTkVfNyAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgICB8IDB4MDd1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDcgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzggICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgICAgfCAweDA4dSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSA4ICovCisjZGVmaW5lIEVYVElfTElORV85ICAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwOXUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgOSAqLworI2RlZmluZSBFWFRJX0xJTkVfMTAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgICB8IDB4MEF1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEwICovCisjZGVmaW5lIEVYVElfTElORV8xMSAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwQnUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTEgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzEyICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgICAgfCAweDBDdSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxMiAqLworI2RlZmluZSBFWFRJX0xJTkVfMTMgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfR1BJTyAgICAgICB8IDB4MER1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDEzICovCisjZGVmaW5lIEVYVElfTElORV8xNCAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9HUElPICAgICAgIHwgMHgwRXUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTQgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzE1ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0dQSU8gICAgICAgfCAweDBGdSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxNSAqLworI2RlZmluZSBFWFRJX0xJTkVfMTYgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgICB8IDB4MTB1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE2IENvbm5lY3RlZCB0byB0aGUgUFZEIE91dHB1dCAqLworI2RlZmluZSBFWFRJX0xJTkVfMTcgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgICB8IDB4MTF1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDE3IENvbm5lY3RlZCB0byB0aGUgUlRDIEFsYXJtIGV2ZW50ICovCisjZGVmaW5lIEVYVElfTElORV8xOCAgICAgICAgICAgICAgICAgICAgICAgICAoRVhUSV9DT05GSUcgICAgIHwgMHgxMnUpICAgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMTggQ29ubmVjdGVkIHRvIHRoZSBVU0IgT1RHIEZTIFdha2V1cCBmcm9tIHN1c3BlbmQgZXZlbnQgKi8KKyNpZiBkZWZpbmVkKEVUSCkKKyNkZWZpbmUgRVhUSV9MSU5FXzE5ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgICAgfCAweDEzdSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAxOSBDb25uZWN0ZWQgdG8gdGhlIEV0aGVybmV0IFdha2V1cCBldmVudCAqLworI2Vsc2UKKyNkZWZpbmUgRVhUSV9MSU5FXzE5ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX1JFU0VSVkVEICAgfCAweDEzdSkgICAgLyohPCBObyBpbnRlcnJ1cHQgc3VwcG9ydGVkIGluIHRoaXMgbGluZSAqLworI2VuZGlmIC8qIEVUSCAqLworI2RlZmluZSBFWFRJX0xJTkVfMjAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgICB8IDB4MTR1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIwIENvbm5lY3RlZCB0byB0aGUgVVNCIE9URyBIUyAoY29uZmlndXJlZCBpbiBGUykgV2FrZXVwIGV2ZW50ICAqLworI2RlZmluZSBFWFRJX0xJTkVfMjEgICAgICAgICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHICAgICB8IDB4MTV1KSAgICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIxIENvbm5lY3RlZCB0byB0aGUgUlRDIFRhbXBlciBhbmQgVGltZSBTdGFtcCBldmVudHMgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzIyICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgICAgfCAweDE2dSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyMiBDb25uZWN0ZWQgdG8gdGhlIFJUQyBXYWtldXAgZXZlbnQgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzIzICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgICAgfCAweDE3dSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyMyBDb25uZWN0ZWQgdG8gdGhlIExQVElNIFdha2V1cCBldmVudCAqLwogI2lmIGRlZmluZWQoRVhUSV9JTVJfSU0yNCkKLSNkZWZpbmUgRVhUSV9MSU5FXzI0ICAgICAgICAgICAgICAgICAgICAgICAgIEVYVElfSU1SX0lNMjQgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyNCBDb25uZWN0ZWQgdG8gdGhlIE1ESU8gU2xhdmUgZ2xvYmFsIEludGVycnVwdCBXYWtldXAgZXZlbnQgKi8KKyNkZWZpbmUgRVhUSV9MSU5FXzI0ICAgICAgICAgICAgICAgICAgICAgICAgIChFWFRJX0NPTkZJRyAgICAgfCAweDE4dSkgICAgLyohPCBFeHRlcm5hbCBpbnRlcnJ1cHQgbGluZSAyNCBDb25uZWN0ZWQgdG8gdGhlIE1ESU8gU2xhdmUgZ2xvYmFsIEludGVycnVwdCBXYWtldXAgZXZlbnQgKi8KICNlbmRpZiAvKiBFWFRJX0lNUl9JTTI0ICovCiAvKioKICAgKiBAfQpAQCAtMTQyLDYgKzEzMiw3IEBACiAvKiogQGRlZmdyb3VwIEVYVElfVHJpZ2dlciAgRVhUSSBUcmlnZ2VyCiAgICogQHsKICAgKi8KKwogI2RlZmluZSBFWFRJX1RSSUdHRVJfTk9ORSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQogI2RlZmluZSBFWFRJX1RSSUdHRVJfUklTSU5HICAgICAgICAgICAgICAgICAweDAwMDAwMDAxdQogI2RlZmluZSBFWFRJX1RSSUdHRVJfRkFMTElORyAgICAgICAgICAgICAgICAweDAwMDAwMDAydQpAQCAtMTUwLDYgKzE0MSwyNCBAQAogICAqIEB9CiAgICovCiAKKy8qKiBAZGVmZ3JvdXAgRVhUSV9HUElPU2VsICBFWFRJIEdQSU9TZWwKKyAgKiBAYnJpZWYKKyAgKiBAeworICAqLworI2RlZmluZSBFWFRJX0dQSU9BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwdQorI2RlZmluZSBFWFRJX0dQSU9CICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxdQorI2RlZmluZSBFWFRJX0dQSU9DICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAydQorI2RlZmluZSBFWFRJX0dQSU9EICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzdQorI2RlZmluZSBFWFRJX0dQSU9FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0dQorI2RlZmluZSBFWFRJX0dQSU9GICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1dQorI2RlZmluZSBFWFRJX0dQSU9HICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2dQorI2RlZmluZSBFWFRJX0dQSU9IICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3dQorI2RlZmluZSBFWFRJX0dQSU9JICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4dQorI2RlZmluZSBFWFRJX0dQSU9KICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5dQorI2lmIGRlZmluZWQgKEdQSU9LKQorI2RlZmluZSBFWFRJX0dQSU9LICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBBdQorI2VuZGlmIC8qIEdQSU9LICovCisKIC8qKgogICAqIEB9CiAgICovCkBAIC0xNjgsNiArMTc3LDIwIEBACiAgICogQHsKICAgKi8KIC8qKgorICAqIEBicmllZiAgRVhUSSBMaW5lIHByb3BlcnR5IGRlZmluaXRpb24KKyAgKi8KKyNkZWZpbmUgRVhUSV9QUk9QRVJUWV9TSElGVCAgICAgICAgICAgICAgICAgIDI0dQorI2RlZmluZSBFWFRJX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMnVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpCisjZGVmaW5lIEVYVElfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwNHVMIDw8IEVYVElfUFJPUEVSVFlfU0hJRlQpIHwgRVhUSV9DT05GSUcpCisjZGVmaW5lIEVYVElfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICgweDA4dUwgPDwgRVhUSV9QUk9QRVJUWV9TSElGVCkKKyNkZWZpbmUgRVhUSV9QUk9QRVJUWV9NQVNLICAgICAgICAgICAgICAgICAgKEVYVElfQ09ORklHIHwgRVhUSV9HUElPKQorCisvKioKKyAgKiBAYnJpZWYgIEVYVEkgYml0IHVzYWdlCisgICovCisjZGVmaW5lIEVYVElfUElOX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUZ1CisKKy8qKgogICAqIEBicmllZiAgRVhUSSBNYXNrIGZvciBpbnRlcnJ1cHQgJiBldmVudCBtb2RlCiAgICovCiAjZGVmaW5lIEVYVElfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgIChFWFRJX01PREVfRVZFTlQgfCBFWFRJX01PREVfSU5URVJSVVBUKQpAQCAtMTc1LDEyICsxOTgsMTcgQEAKIC8qKgogICAqIEBicmllZiAgRVhUSSBNYXNrIGZvciB0cmlnZ2VyIHBvc3NpYmlsaXRpZXMKICAgKi8KLSNkZWZpbmUgRVhUSV9UUklHR0VSX01BU0sgICAgICAgICAgICAgICAgICAgKEVYVElfVFJJR0dFUl9SSVNJTkcgfCBFWFRJX1RSSUdHRVJfRkFMTElORyB8IEVYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORykKKyNkZWZpbmUgRVhUSV9UUklHR0VSX01BU0sgICAgICAgICAgICAgICAgICAgKEVYVElfVFJJR0dFUl9SSVNJTkcgfCBFWFRJX1RSSUdHRVJfRkFMTElORykKIAogLyoqCiAgICogQGJyaWVmICBFWFRJIExpbmUgbnVtYmVyCiAgICovCisjaWYgZGVmaW5lZChFWFRJX0lNUl9JTTI0KQogI2RlZmluZSBFWFRJX0xJTkVfTkIgICAgICAgICAgICAgICAgICAgICAgICAyNXUKKyNlbHNlCisjZGVmaW5lIEVYVElfTElORV9OQiAgICAgICAgICAgICAgICAgICAgICAgIDI0dQorI2VuZGlmIC8qIEVYVElfSU1SX0lNMjQgKi8KKwogCiAvKioKICAgKiBAfQpAQCAtMTkwLDE2ICsyMTgsNDcgQEAKIC8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX01hY3JvcyBFWFRJIFByaXZhdGUgTWFjcm9zCiAgICogQHsKICAgKi8KLSNkZWZpbmUgSVNfRVhUSV9MSU5FKF9fTElORV9fKSAgICAgICAgICAoKCgoX19MSU5FX18pICYgfkVYVElfSU1SX0lNKSA9PSAweDAwVSkgJiYgKF9fTElORV9fKSkKKyNkZWZpbmUgSVNfRVhUSV9MSU5FKF9fTElORV9fKSAgICAgICAgICAoKCgoX19MSU5FX18pICYgfihFWFRJX1BST1BFUlRZX01BU0sgfCBFWFRJX1BJTl9NQVNLKSkgPT0gMHgwMHUpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoX19MSU5FX18pICYgRVhUSV9QUk9QRVJUWV9NQVNLKSA9PSBFWFRJX0NPTkZJRykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fTElORV9fKSAmIEVYVElfUFJPUEVSVFlfTUFTSykgPT0gRVhUSV9HUElPKSkgICAgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0xJTkVfXykgJiBFWFRJX1BJTl9NQVNLKSA8IEVYVElfTElORV9OQikpCiAKLSNkZWZpbmUgSVNfRVhUSV9NT0RFKF9fTElORV9fKSAgICAgICAgICAoKCgoX19MSU5FX18pICYgfkVYVElfTU9ERV9NQVNLKSA9PSAweDAwVSkpCisjZGVmaW5lIElTX0VYVElfTU9ERShfX0xJTkVfXykgICAgICAgICAgKCgoKF9fTElORV9fKSAmIEVYVElfTU9ERV9NQVNLKSAhPSAweDAwdSkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0xJTkVfXykgJiB+RVhUSV9NT0RFX01BU0spID09IDB4MDB1KSkKIAotI2RlZmluZSBJU19FWFRJX1RSSUdHRVIoX19MSU5FX18pICAgICAgICgoKF9fTElORV9fKSAgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDBVKQorI2RlZmluZSBJU19FWFRJX1RSSUdHRVIoX19MSU5FX18pICAgICAgICgoKF9fTElORV9fKSAgJiB+RVhUSV9UUklHR0VSX01BU0spID09IDB4MDB1KQogCiAjZGVmaW5lIElTX0VYVElfUEVORElOR19FREdFKF9fTElORV9fKSAgKCgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9GQUxMSU5HKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9SSVNJTkcpICB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19MSU5FX18pID09IEVYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORykpCiAKKyNkZWZpbmUgSVNfRVhUSV9DT05GSUdfTElORShfX0xJTkVfXykgICAoKChfX0xJTkVfXykgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpCisKKyNpZiBkZWZpbmVkIChHUElPSykKKyNkZWZpbmUgSVNfRVhUSV9HUElPX1BPUlQoX19QT1JUX18pICAgICAoKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9CKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0MpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0YpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9IKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0kpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPSikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9LKSkKKyNlbHNlCisjZGVmaW5lIElTX0VYVElfR1BJT19QT1JUKF9fUE9SVF9fKSAgICAgKCgoX19QT1JUX18pID09IEVYVElfR1BJT0EpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9DKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0QpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9GKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0cpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPUlRfXykgPT0gRVhUSV9HUElPSCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9SVF9fKSA9PSBFWFRJX0dQSU9JKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT1JUX18pID09IEVYVElfR1BJT0opKQorI2VuZGlmIC8qIEdQSU9LICovCisKICNkZWZpbmUgSVNfRVhUSV9HUElPX1BJTihfX1BJTl9fKSAgICAgICAoKF9fUElOX18pIDwgMTZVKQogLyoqCiAgICogQH0KQEAgLTI1NSw2ICszMTQsNiBAQAogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX1NUTTMyRjd4eF9IQUxfRVhUSV9IICovCisjZW5kaWYgLyogU1RNMzJGN3h4X0hBTF9FWFRJX0ggKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2dwaW8uaCBiL0luYy9zdG0zMmY3eHhfaGFsX2dwaW8uaAppbmRleCA3OGYxYjdjLi40NmE2NDk4IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9ncGlvLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfZ3Bpby5oCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgKiBAewogICAqLwogI2RlZmluZSBJU19HUElPX1BJTl9BQ1RJT04oQUNUSU9OKSAoKChBQ1RJT04pID09IEdQSU9fUElOX1JFU0VUKSB8fCAoKEFDVElPTikgPT0gR1BJT19QSU5fU0VUKSkKLSNkZWZpbmUgSVNfR1BJT19QSU4oX19QSU5fXykgICAgICAgICgoKChfX1BJTl9fKSAmIEdQSU9fUElOX01BU0spICE9ICh1aW50MzJfdCkweDAwKSkKKyNkZWZpbmUgSVNfR1BJT19QSU4oX19QSU5fXykgICAgICAgICgoKCh1aW50MzJfdCkoX19QSU5fXykgJiBHUElPX1BJTl9NQVNLKSAhPSAweDAwVSkpCiAjZGVmaW5lIElTX0dQSU9fTU9ERShNT0RFKSAoKChNT0RFKSA9PSBHUElPX01PREVfSU5QVVQpICAgICAgICAgICAgICB8fFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IEdQSU9fTU9ERV9PVVRQVVRfUFApICAgICAgICAgIHx8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gR1BJT19NT0RFX09VVFBVVF9PRCkgICAgICAgICAgfHxcCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9oYXNoLmggYi9JbmMvc3RtMzJmN3h4X2hhbF9oYXNoLmgKaW5kZXggM2NmNWMyNS4uOTMxNzdiNyAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfaGFzaC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2hhc2guaApAQCAtMTUyLDYgKzE1Miw4IEBACiAKICAgX19JTyAgdWludDMyX3QgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBIQVNIIEVycm9yIGNvZGUgKi8KIAorICBfX0lPICB1aW50MzJfdCAgICAgICAgICAgICBBY2N1bXVsYXRpb247ICAgICAvKiE8IEhBU0ggbXVsdGkgYnVmZmVycyBhY2N1bXVsYXRpb24gZmxhZyAqLworCiAjaWYgKFVTRV9IQUxfSEFTSF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgdm9pZCAgICAoKiBJbkNwbHRDYWxsYmFjaykoIHN0cnVjdCBfX0hBU0hfSGFuZGxlVHlwZURlZiAqIGhoYXNoKTsgICAgLyohPCBIQVNIIGlucHV0IGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KIApAQCAtMjI2LDExICsyMjgsMTEgQEAKIC8qKiBAZGVmZ3JvdXAgSEFTSF9mbGFnc19kZWZpbml0aW9uICBIQVNIIGZsYWdzIGRlZmluaXRpb25zCiAgICogQHsKICAgKi8KLSNkZWZpbmUgSEFTSF9GTEFHX0RJTklTICAgICAgICAgICAgSEFTSF9TUl9ESU5JUyAgLyohPCAxNiBsb2NhdGlvbnMgYXJlIGZyZWUgaW4gdGhlIERJTiA6IGEgbmV3IGJsb2NrIGNhbiBiZSBlbnRlcmVkIGluIHRoZSBJUCAqLwotI2RlZmluZSBIQVNIX0ZMQUdfRENJUyAgICAgICAgICAgICBIQVNIX1NSX0RDSVMgICAvKiE8IERpZ2VzdCBjYWxjdWxhdGlvbiBjb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEhBU0hfRkxBR19ETUFTICAgICAgICAgICAgIEhBU0hfU1JfRE1BUyAgIC8qITwgRE1BIGludGVyZmFjZSBpcyBlbmFibGVkIChETUFFPTEpIG9yIGEgdHJhbnNmZXIgaXMgb25nb2luZyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSEFTSF9GTEFHX0JVU1kgICAgICAgICAgICAgSEFTSF9TUl9CVVNZICAgLyohPCBUaGUgaGFzaCBjb3JlIGlzIEJ1c3ksIHByb2Nlc3NpbmcgYSBibG9jayBvZiBkYXRhICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBIQVNIX0ZMQUdfRElOTkUgICAgICAgICAgICBIQVNIX0NSX0RJTk5FICAvKiE8IERJTiBub3QgZW1wdHkgOiB0aGUgaW5wdXQgYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB3b3JkIG9mIGRhdGEgICAgICovCisjZGVmaW5lIEhBU0hfRkxBR19ESU5JUyAgICAgICAgICAgIEhBU0hfU1JfRElOSVMgIC8qITwgMTYgbG9jYXRpb25zIGFyZSBmcmVlIGluIHRoZSBESU4gOiBhIG5ldyBibG9jayBjYW4gYmUgZW50ZXJlZCBpbiB0aGUgUGVyaXBoZXJhbCAqLworI2RlZmluZSBIQVNIX0ZMQUdfRENJUyAgICAgICAgICAgICBIQVNIX1NSX0RDSVMgICAvKiE8IERpZ2VzdCBjYWxjdWxhdGlvbiBjb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFTSF9GTEFHX0RNQVMgICAgICAgICAgICAgSEFTSF9TUl9ETUFTICAgLyohPCBETUEgaW50ZXJmYWNlIGlzIGVuYWJsZWQgKERNQUU9MSkgb3IgYSB0cmFuc2ZlciBpcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBU0hfRkxBR19CVVNZICAgICAgICAgICAgIEhBU0hfU1JfQlVTWSAgIC8qITwgVGhlIGhhc2ggY29yZSBpcyBCdXN5LCBwcm9jZXNzaW5nIGEgYmxvY2sgb2YgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVNIX0ZMQUdfRElOTkUgICAgICAgICAgICBIQVNIX0NSX0RJTk5FICAvKiE8IERJTiBub3QgZW1wdHkgOiB0aGUgaW5wdXQgYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB3b3JkIG9mIGRhdGEgICAgICAgICAgICAgKi8KIAogLyoqCiAgICogQH0KQEAgLTI3Niw3ICsyNzgsNyBAQAogICAqLwogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIEhBU0ggZmxhZyBpcyBzZXQuCi0gICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLgogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBU0hfRkxBR19ESU5JUyBBIG5ldyBibG9jayBjYW4gYmUgZW50ZXJlZCBpbnRvIHRoZSBpbnB1dCBidWZmZXIuCiAgICogICAgICAgICAgICBAYXJnIEByZWYgSEFTSF9GTEFHX0RDSVMgRGlnZXN0IGNhbGN1bGF0aW9uIGNvbXBsZXRlLgpAQCAtMjkxLDcgKzI5Myw3IEBACiAKIAogLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBIQVNIIGZsYWcuCi0gICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgorICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLgogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBU0hfRkxBR19ESU5JUyBBIG5ldyBibG9jayBjYW4gYmUgZW50ZXJlZCBpbnRvIHRoZSBpbnB1dCBidWZmZXIuCiAgICogICAgICAgICAgICBAYXJnIEByZWYgSEFTSF9GTEFHX0RDSVMgRGlnZXN0IGNhbGN1bGF0aW9uIGNvbXBsZXRlCkBAIC0zMDEsNyArMzAzLDcgQEAKIAogCiAvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBIQVNIIGludGVycnVwdC4KLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgSEFTSCBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBIQVNIIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIEByZWYgSEFTSF9JVF9ESU5JICBBIG5ldyBibG9jayBjYW4gYmUgZW50ZXJlZCBpbnRvIHRoZSBpbnB1dCBidWZmZXIgKERJTikKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBIQVNIX0lUX0RDSSAgIERpZ2VzdCBjYWxjdWxhdGlvbiBjb21wbGV0ZQpAQCAtMzEwLDcgKzMxMiw3IEBACiAjZGVmaW5lIF9fSEFMX0hBU0hfRU5BQkxFX0lUKF9fSU5URVJSVVBUX18pICAgU0VUX0JJVChIQVNILT5JTVIsIChfX0lOVEVSUlVQVF9fKSkKIAogLyoqIEBicmllZiAgRGlzYWJsZSB0aGUgc3BlY2lmaWVkIEhBU0ggaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXzogc3BlY2lmaWVzIHRoZSBIQVNIIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBIQVNIIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBAcmVmIEhBU0hfSVRfRElOSSAgQSBuZXcgYmxvY2sgY2FuIGJlIGVudGVyZWQgaW50byB0aGUgaW5wdXQgYnVmZmVyIChESU4pCiAgICogICAgICAgICAgICBAYXJnIEByZWYgSEFTSF9JVF9EQ0kgICBEaWdlc3QgY2FsY3VsYXRpb24gY29tcGxldGUKQEAgLTMxOSw3ICszMjEsNyBAQAogI2RlZmluZSBfX0hBTF9IQVNIX0RJU0FCTEVfSVQoX19JTlRFUlJVUFRfXykgICBDTEVBUl9CSVQoSEFTSC0+SU1SLCAoX19JTlRFUlJVUFRfXykpCiAKIC8qKiBAYnJpZWYgUmVzZXQgSEFTSCBoYW5kbGUgc3RhdGUuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gSEFTSCBoYW5kbGUuCiAgICogQHJldHZhbCBOb25lCiAgICovCiAKQEAgLTMzNSw3ICszMzcsNyBAQAogCiAKIC8qKiBAYnJpZWYgUmVzZXQgSEFTSCBoYW5kbGUgc3RhdHVzLgotICAqIEBwYXJhbSAgX19IQU5ETEVfXzogSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9IQVNIX1JFU0VUX0hBTkRMRV9TVEFUVVMoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+U3RhdHVzID0gSEFMX09LKQpAQCAtMzYyLDcgKzM2NCw3IEBACiAKIC8qKgogICAqIEBicmllZiBTZXQgdGhlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIHRoZSBsYXN0IHdvcmQgd3JpdHRlbiBpbiBkYXRhIHJlZ2lzdGVyIERJTi4KLSAgKiBAcGFyYW0gIF9fU0laRV9fOiBzaXplIGluIGJ5dGVzIG9mIGxhc3QgZGF0YSB3cml0dGVuIGluIERhdGEgcmVnaXN0ZXIuCisgICogQHBhcmFtICBfX1NJWkVfXyBzaXplIGluIGJ5dGVzIG9mIGxhc3QgZGF0YSB3cml0dGVuIGluIERhdGEgcmVnaXN0ZXIuCiAgICogQHJldHZhbCBOb25lCiAqLwogI2RlZmluZSAgX19IQUxfSEFTSF9TRVRfTkJWQUxJREJJVFMoX19TSVpFX18pICAgIE1PRElGWV9SRUcoSEFTSC0+U1RSLCBIQVNIX1NUUl9OQkxXLCA4VSAqICgoX19TSVpFX18pICUgNFUpKQpAQCAtMzk3LDcgKzM5OSw3IEBACiAKIC8qKgogICAqIEBicmllZiBFbnN1cmUgdGhhdCBIQVNIIGlucHV0IGRhdGEgdHlwZSBpcyB2YWxpZC4KLSAgKiBAcGFyYW0gX19EQVRBVFlQRV9fOiBIQVNIIGlucHV0IGRhdGEgdHlwZS4KKyAgKiBAcGFyYW0gX19EQVRBVFlQRV9fIEhBU0ggaW5wdXQgZGF0YSB0eXBlLgogICAqIEByZXR2YWwgU0VUIChfX0RBVEFUWVBFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0RBVEFUWVBFX18gaXMgaW52YWxpZCkKICAgKi8KICNkZWZpbmUgSVNfSEFTSF9EQVRBVFlQRShfX0RBVEFUWVBFX18pICgoKF9fREFUQVRZUEVfXykgPT0gSEFTSF9EQVRBVFlQRV8zMkIpfHwgXApAQCAtNDA1LDIxICs0MDcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fREFUQVRZUEVfXykgPT0gSEFTSF9EQVRBVFlQRV84QikgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19EQVRBVFlQRV9fKSA9PSBIQVNIX0RBVEFUWVBFXzFCKSkKIAotCi0KLS8qKgotICAqIEBicmllZiBFbnN1cmUgdGhhdCBpbnB1dCBkYXRhIGJ1ZmZlciBzaXplIGlzIHZhbGlkIGZvciBtdWx0aS1idWZmZXIgSEFTSAotICAqICAgICAgICBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZS4KLSAgKiBAbm90ZSAgVGhpcyBjaGVjayBpcyB2YWxpZCBvbmx5IGZvciBtdWx0aS1idWZmZXIgSEFTSCBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZS4KLSAgKiBAcGFyYW0gX19TSVpFX186IGlucHV0IGRhdGEgYnVmZmVyIHNpemUuCi0gICogQHJldHZhbCBTRVQgKF9fU0laRV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19TSVpFX18gaXMgaW52YWxpZCkKLSAgKi8KLSNkZWZpbmUgSVNfSEFTSF9QT0xMSU5HX01VTFRJQlVGRkVSX1NJWkUoX19TSVpFX18pICAoKChfX1NJWkVfXykgJSA0VSkgPT0gMFUpCiAvKioKICAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSBpcyB2YWxpZCBmb3IgbXVsdGktYnVmZmVyIEhBU0gKICAgKiAgICAgICAgcHJvY2Vzc2luZyBpbiBETUEgbW9kZS4KICAgKiBAbm90ZSAgVGhpcyBjaGVjayBpcyB2YWxpZCBvbmx5IGZvciBtdWx0aS1idWZmZXIgSEFTSCBwcm9jZXNzaW5nIGluIERNQSBtb2RlLgotICAqIEBwYXJhbSBfX1NJWkVfXzogaW5wdXQgZGF0YSBidWZmZXIgc2l6ZS4KKyAgKiBAcGFyYW0gX19TSVpFX18gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZS4KICAgKiBAcmV0dmFsIFNFVCAoX19TSVpFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NJWkVfXyBpcyBpbnZhbGlkKQogICAqLwogI2RlZmluZSBJU19IQVNIX0RNQV9NVUxUSUJVRkZFUl9TSVpFKF9fU0laRV9fKSAgKChSRUFEX0JJVChIQVNILT5DUiwgSEFTSF9DUl9NRE1BVCkgPT0gMFUpIHx8ICgoKF9fU0laRV9fKSAlIDRVKSA9PSAwVSkpCkBAIC00MjgsMjEgKzQyMCwyMSBAQAogICAqIEBicmllZiBFbnN1cmUgdGhhdCBpbnB1dCBkYXRhIGJ1ZmZlciBzaXplIGlzIHZhbGlkIGZvciBtdWx0aS1idWZmZXIgSE1BQwogICAqICAgICAgICBwcm9jZXNzaW5nIGluIERNQSBtb2RlLgogICAqIEBub3RlICBUaGlzIGNoZWNrIGlzIHZhbGlkIG9ubHkgZm9yIG11bHRpLWJ1ZmZlciBITUFDIHByb2Nlc3NpbmcgaW4gRE1BIG1vZGUuCi0gICogQHBhcmFtIF9fSEFORExFX186IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSBfX1NJWkVfXzogaW5wdXQgZGF0YSBidWZmZXIgc2l6ZS4KKyAgKiBAcGFyYW0gX19IQU5ETEVfXyBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gX19TSVpFX18gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZS4KICAgKiBAcmV0dmFsIFNFVCAoX19TSVpFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX1NJWkVfXyBpcyBpbnZhbGlkKQogICAqLwogI2RlZmluZSBJU19ITUFDX0RNQV9NVUxUSUJVRkZFUl9TSVpFKF9fSEFORExFX18sX19TSVpFX18pICAoKCgoX19IQU5ETEVfXyktPkRpZ2VzdENhbGN1bGF0aW9uRGlzYWJsZSkgPT0gUkVTRVQpIHx8ICgoKF9fU0laRV9fKSAlIDRVKSA9PSAwVSkpCiAvKioKICAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgaGFuZGxlIHBoYXNlIGlzIHNldCB0byBIQVNIIHByb2Nlc3NpbmcuCi0gICogQHBhcmFtIF9fSEFORExFX186IEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgU0VUIChoYW5kbGUgcGhhc2UgaXMgc2V0IHRvIEhBU0ggcHJvY2Vzc2luZykgb3IgUkVTRVQgKGhhbmRsZSBwaGFzZSBpcyBub3Qgc2V0IHRvIEhBU0ggcHJvY2Vzc2luZykKICAgKi8KICNkZWZpbmUgSVNfSEFTSF9QUk9DRVNTSU5HKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5QaGFzZSA9PSBIQUxfSEFTSF9QSEFTRV9QUk9DRVNTKQogCiAvKioKICAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgaGFuZGxlIHBoYXNlIGlzIHNldCB0byBITUFDIHByb2Nlc3NpbmcuCi0gICogQHBhcmFtIF9fSEFORExFX186IEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSBfX0hBTkRMRV9fIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgU0VUIChoYW5kbGUgcGhhc2UgaXMgc2V0IHRvIEhNQUMgcHJvY2Vzc2luZykgb3IgUkVTRVQgKGhhbmRsZSBwaGFzZSBpcyBub3Qgc2V0IHRvIEhNQUMgcHJvY2Vzc2luZykKICAgKi8KICNkZWZpbmUgSVNfSE1BQ19QUk9DRVNTSU5HKF9fSEFORExFX18pICAoKChfX0hBTkRMRV9fKS0+UGhhc2UgPT0gSEFMX0hBU0hfUEhBU0VfSE1BQ19TVEVQXzEpIHx8IFwKQEAgLTQ5Miw4ICs0ODQsMTEgQEAKIC8qIEhBU0ggcHJvY2Vzc2luZyB1c2luZyBwb2xsaW5nICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9TSEExX1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9NRDVfU3RhcnQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KTsKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9BY2N1bXVsYXRlKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9TSEExX0FjY3VtdWxhdGUoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9BY2NtbHQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfQWNjbWx0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCk7CisKIAogLyoqCiAgICogQH0KQEAgLTUwNSw3ICs1MDAsMTEgQEAKIAogLyogSEFTSCBwcm9jZXNzaW5nIHVzaW5nIElUICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfU3RhcnRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfTUQ1X0FjY21sdF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKTsKIHZvaWQgSEFMX0hBU0hfSVJRSGFuZGxlcihIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKTsKIC8qKgogICAqIEB9CkBAIC01OTEsNiArNTkwLDcgQEAKIC8qIFByaXZhdGUgZnVuY3Rpb25zICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQVNIX1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgQWxnb3JpdGhtKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBU0hfQWNjdW11bGF0ZShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQzMl90IEFsZ29yaXRobSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQVNIX0FjY3VtdWxhdGVfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50MzJfdCBBbGdvcml0aG0pOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFTSF9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IEFsZ29yaXRobSk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQVNIX1N0YXJ0X0RNQShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQzMl90IEFsZ29yaXRobSk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQVNIX0ZpbmlzaChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KTsKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2hhc2hfZXguaCBiL0luYy9zdG0zMmY3eHhfaGFsX2hhc2hfZXguaAppbmRleCA2YzBmYzk5Li42MDcxN2RmIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9oYXNoX2V4LmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfaGFzaF9leC5oCkBAIC01Miw5ICs1MiwxMSBAQAogICAqLwogCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTI1Nl9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCk7CiAKIC8qKgogICAqIEB9CkBAIC02NSw3ICs2NywxMSBAQAogICAqLwogCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kX0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlcik7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTI1Nl9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kX0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlcik7CiAKIC8qKgogICAqIEB9CmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9oY2QuaCBiL0luYy9zdG0zMmY3eHhfaGFsX2hjZC5oCmluZGV4IDc0ODhkYTcuLjI4YzU3OGUgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX2hjZC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2hjZC5oCkBAIC0xMDgsOSArMTA4LDEwIEBACiAvKiogQGRlZmdyb3VwIEhDRF9TcGVlZCBIQ0QgU3BlZWQKICAgKiBAewogICAqLwotI2RlZmluZSBIQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIDBVCi0jZGVmaW5lIEhDRF9TUEVFRF9MT1cgICAgICAgICAgICAgICAgMlUKLSNkZWZpbmUgSENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAzVQorI2RlZmluZSBIQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIFVTQkhfSFNfU1BFRUQKKyNkZWZpbmUgSENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICBVU0JIX0ZTTFNfU1BFRUQKKyNkZWZpbmUgSENEX1NQRUVEX0xPVyAgICAgICAgICAgICAgICBVU0JIX0ZTTFNfU1BFRUQKKwogLyoqCiAgICogQH0KICAgKi8KQEAgLTE2OSwxOSArMTcwLDE1IEBACiAvKiogQGRlZmdyb3VwIEhDRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAgKiBAewogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgICAgICBIQUxfSENEX0luaXQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotSEFMX1N0YXR1c1R5cGVEZWYgICAgICBIQUxfSENEX0RlSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci1IQUxfU3RhdHVzVHlwZURlZiAgICAgIEhBTF9IQ0RfSENfSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGV2X2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbXBzKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX0RlSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX0hDX0luaXQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBudW0sIHVpbnQ4X3QgZGV2X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzcGVlZCwgdWludDhfdCBlcF90eXBlLCB1aW50MTZfdCBtcHMpOwogCi1IQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX0hDRF9IQ19IYWx0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLCB1aW50OF90IGNoX251bSk7Ci12b2lkICAgICAgICAgICAgICAgICAgSEFMX0hDRF9Nc3BJbml0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLXZvaWQgICAgICAgICAgICAgICAgICBIQUxfSENEX01zcERlSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX0hDX0hhbHQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hfbnVtKTsKK3ZvaWQgICAgICAgICAgICAgIEhBTF9IQ0RfTXNwSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkICAgICAgICAgICAgICBIQUxfSENEX01zcERlSW5pdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CiAKICNpZiAoVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogLyoqIEBkZWZncm91cCBIQUxfSENEX0NhbGxiYWNrX0lEX2VudW1lcmF0aW9uX2RlZmluaXRpb24gSEFMIFVTQiBPVEcgSENEIENhbGxiYWNrIElEIGVudW1lcmF0aW9uIGRlZmluaXRpb24KQEAgLTE5MCwxNCArMTg3LDE0IEBACiAgICovCiB0eXBlZGVmIGVudW0KIHsKLSAgSEFMX0hDRF9TT0ZfQ0JfSUQgICAgICAgICAgID0gMHgwMSwgICAgICAgLyohPCBVU0IgSENEIFNPRiBjYWxsYmFjayBJRCAgICAgICAgICAgKi8KLSAgSEFMX0hDRF9DT05ORUNUX0NCX0lEICAgICAgID0gMHgwMiwgICAgICAgLyohPCBVU0IgSENEIENvbm5lY3QgY2FsbGJhY2sgSUQgICAgICAgKi8KLSAgSEFMX0hDRF9ESVNDT05ORUNUX0NCX0lEICAgPSAweDAzLCAgICAgICAvKiE8IFVTQiBIQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRCAgICAqLwotICBIQUxfSENEX1BPUlRfRU5BQkxFRF9DQl9JRCAgID0gMHgwNCwgICAgICAvKiE8IFVTQiBIQ0QgUG9ydCBFbmFibGUgY2FsbGJhY2sgSUQgICAqLwotICBIQUxfSENEX1BPUlRfRElTQUJMRURfQ0JfSUQgID0gMHgwNSwgICAgICAvKiE8IFVTQiBIQ0QgUG9ydCBEaXNhYmxlIGNhbGxiYWNrIElEICAqLworICBIQUxfSENEX1NPRl9DQl9JRCAgICAgICAgICAgID0gMHgwMSwgICAgICAgLyohPCBVU0IgSENEIFNPRiBjYWxsYmFjayBJRCAgICAgICAgICAgKi8KKyAgSEFMX0hDRF9DT05ORUNUX0NCX0lEICAgICAgICA9IDB4MDIsICAgICAgIC8qITwgVVNCIEhDRCBDb25uZWN0IGNhbGxiYWNrIElEICAgICAgICovCisgIEhBTF9IQ0RfRElTQ09OTkVDVF9DQl9JRCAgICAgPSAweDAzLCAgICAgICAvKiE8IFVTQiBIQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRCAgICAqLworICBIQUxfSENEX1BPUlRfRU5BQkxFRF9DQl9JRCAgID0gMHgwNCwgICAgICAgLyohPCBVU0IgSENEIFBvcnQgRW5hYmxlIGNhbGxiYWNrIElEICAgKi8KKyAgSEFMX0hDRF9QT1JUX0RJU0FCTEVEX0NCX0lEICA9IDB4MDUsICAgICAgIC8qITwgVVNCIEhDRCBQb3J0IERpc2FibGUgY2FsbGJhY2sgSUQgICovCiAKLSAgSEFMX0hDRF9NU1BJTklUX0NCX0lEICAgICAgID0gMHgwNiwgICAgICAgLyohPCBVU0IgSENEIE1zcEluaXQgY2FsbGJhY2sgSUQgICAgICAgKi8KLSAgSEFMX0hDRF9NU1BERUlOSVRfQ0JfSUQgICAgID0gMHgwNyAgICAgICAgLyohPCBVU0IgSENEIE1zcERlSW5pdCBjYWxsYmFjayBJRCAgICAgKi8KKyAgSEFMX0hDRF9NU1BJTklUX0NCX0lEICAgICAgICA9IDB4MDYsICAgICAgIC8qITwgVVNCIEhDRCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgICovCisgIEhBTF9IQ0RfTVNQREVJTklUX0NCX0lEICAgICAgPSAweDA3ICAgICAgICAvKiE8IFVTQiBIQ0QgTXNwRGVJbml0IGNhbGxiYWNrIElEICAgICAqLwogCiB9IEhBTF9IQ0RfQ2FsbGJhY2tJRFR5cGVEZWY7CiAvKioKQEAgLTIzMSwyNSArMjI4LDIwIEBACiAvKiogQGFkZHRvZ3JvdXAgSENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSW5wdXQgYW5kIE91dHB1dCBvcGVyYXRpb24gZnVuY3Rpb25zCiAgICogQHsKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9IQ0RfSENfU3VibWl0UmVxdWVzdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGVwX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkb19waW5nKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfSENfU3VibWl0UmVxdWVzdChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaXJlY3Rpb24sIHVpbnQ4X3QgZXBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRva2VuLCB1aW50OF90ICpwYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsIHVpbnQ4X3QgZG9fcGluZyk7CiAKIC8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KLXZvaWQgICAgICAgICAgICAgSEFMX0hDRF9JUlFIYW5kbGVyKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLXZvaWQgICAgICAgICAgICAgSEFMX0hDRF9TT0ZfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX0Nvbm5lY3RfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX0Rpc2Nvbm5lY3RfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX1BvcnRFbmFibGVkX0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLXZvaWQgICAgICAgICAgICAgSEFMX0hDRF9Qb3J0RGlzYWJsZWRfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwotdm9pZCAgICAgICAgICAgICBIQUxfSENEX0hDX05vdGlmeVVSQkNoYW5nZV9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENEX1VSQlN0YXRlVHlwZURlZiB1cmJfc3RhdGUpOwordm9pZCBIQUxfSENEX0lSUUhhbmRsZXIoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwordm9pZCBIQUxfSENEX1NPRl9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfQ29ubmVjdF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfRGlzY29ubmVjdF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfUG9ydEVuYWJsZWRfQ2FsbGJhY2soSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpOwordm9pZCBIQUxfSENEX1BvcnREaXNhYmxlZF9DYWxsYmFjayhIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Cit2b2lkIEhBTF9IQ0RfSENfTm90aWZ5VVJCQ2hhbmdlX0NhbGxiYWNrKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkLCB1aW50OF90IGNobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0RfVVJCU3RhdGVUeXBlRGVmIHVyYl9zdGF0ZSk7CiAvKioKICAgKiBAfQogICAqLwpAQCAtMjU4LDkgKzI1MCw5IEBACiAvKiogQGFkZHRvZ3JvdXAgSENEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwogICAqIEB7CiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfSENEX1Jlc2V0UG9ydChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7Ci1IQUxfU3RhdHVzVHlwZURlZiAgICAgICBIQUxfSENEX1N0YXJ0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgIEhBTF9IQ0RfU3RvcChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX1Jlc2V0UG9ydChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX1N0YXJ0KEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQ0RfU3RvcChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CiAvKioKICAgKiBAfQogICAqLwpAQCAtMjcxLDggKzI2Myw4IEBACiAgICovCiBIQ0RfU3RhdGVUeXBlRGVmICAgICAgICBIQUxfSENEX0dldFN0YXRlKEhDRF9IYW5kbGVUeXBlRGVmICpoaGNkKTsKIEhDRF9VUkJTdGF0ZVR5cGVEZWYgICAgIEhBTF9IQ0RfSENfR2V0VVJCU3RhdGUoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hudW0pOwotdWludDMyX3QgICAgICAgICAgICAgICAgSEFMX0hDRF9IQ19HZXRYZmVyQ291bnQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QsIHVpbnQ4X3QgY2hudW0pOwogSENEX0hDU3RhdGVUeXBlRGVmICAgICAgSEFMX0hDRF9IQ19HZXRTdGF0ZShIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaG51bSk7Cit1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfSENEX0hDX0dldFhmZXJDb3VudChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCwgdWludDhfdCBjaG51bSk7CiB1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfSENEX0dldEN1cnJlbnRGcmFtZShIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CiB1aW50MzJfdCAgICAgICAgICAgICAgICBIQUxfSENEX0dldEN1cnJlbnRTcGVlZChIQ0RfSGFuZGxlVHlwZURlZiAqaGhjZCk7CiAvKioKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2kyY19leC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfaTJjX2V4LmgKaW5kZXggZjM3N2Q4MS4uZjQ1YmU2NyAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfaTJjX2V4LmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfaTJjX2V4LmgKQEAgLTE2Nyw2ICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChfX0NPTkZJR19fKSAmIEkyQ19GQVNUTU9ERVBMVVNfUEI5KSAgPT0gSTJDX0ZBU1RNT0RFUExVU19QQjkpICB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09ORklHX18pICYgSTJDX0ZBU1RNT0RFUExVU19JMkMxKSA9PSBJMkNfRkFTVE1PREVQTFVTX0kyQzEpKQogI2VuZGlmIC8qIFNZU0NGR19QTUNfSTJDMV9GTVAgJiYgU1lTQ0ZHX1BNQ19JMkMyX0ZNUCAmJiBTWVNDRkdfUE1DX0kyQzNfRk1QICYmIFNZU0NGR19QTUNfSTJDNF9GTVAgKi8KKworCisKIC8qKgogICAqIEB9CiAgICovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9pcmRhLmggYi9JbmMvc3RtMzJmN3h4X2hhbF9pcmRhLmgKaW5kZXggZjM4MmQ3My4uMDliYWYyMSAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfaXJkYS5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2lyZGEuaApAQCAtNDM0LDggKzQzNCw4IEBACiAgICovCiAKIC8qKgotICogQH0KLSAqLworICAqIEB9CisgICovCiAKIC8qIEV4cG9ydGVkIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIElSREFfRXhwb3J0ZWRfTWFjcm9zIElSREEgRXhwb3J0ZWQgTWFjcm9zCkBAIC00NjUsMTAgKzQ2NSwxMCBAQAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9JUkRBX0ZMVVNIX0RSUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIElSREFfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCi0gICAgICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgSVJEQV9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKLSAgICAgIH0gd2hpbGUoMFUpCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBJUkRBX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBJUkRBX1RYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICB9IHdoaWxlKDBVKQogCiAvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgcGVuZGluZyBmbGFnLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgpAQCAtNTgyLDcgKzU4Miw4IEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgSVJEQV9JVF9QRSBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSVRfXyAoU0VUIG9yIFJFU0VUKS4KICAgKi8KLSNkZWZpbmUgX19IQUxfSVJEQV9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSICYgKDB4MDFVIDw8ICgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9JU1JfTUFTSyk+PiBJUkRBX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBJUkRBX0lTUl9NQVNLKT4+IElSREFfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKIAogLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSREEgaW50ZXJydXB0IHNvdXJjZSBpcyBlbmFibGVkIG9yIG5vdC4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KQEAgLTU5Nyw4ICs1OTgsOCBAQAogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lUX18gKFNFVCBvciBSRVNFVCkuCiAgICovCiAjZGVmaW5lIF9fSEFMX0lSREFfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMVUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMlUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgodWludDMyX3QpMHgwMVUgPDwgKCgodWludDE2X3QpKF9fSU5URVJSVVBUX18pKSAmIElSREFfSVRfTUFTSykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgSVJEQV9DUl9NQVNLKSA+PiBJUkRBX0NSX1BPUykgPT0gMHgwMlUpPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgSVJEQV9JVF9NQVNLKSkpICE9IDBVKSA/IFNFVCA6IFJFU0VUKQogCiAvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIElSREEgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KQEAgLTYzNiw3ICs2MzcsOCBAQAogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIElSREEgSGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2RlZmluZSBfX0hBTF9JUkRBX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMyAmPSAodWludDMyX3QpfigodWludDMyX3QpVVNBUlRfQ1IzX09ORUJJVCkpCisjZGVmaW5lIF9fSEFMX0lSREFfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKIAogLyoqIEBicmllZiAgRW5hYmxlIFVBUlQvVVNBUlQgYXNzb2NpYXRlZCB0byBJUkRBIEhhbmRsZS4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBJUkRBIEhhbmRsZS4KQEAgLTY4Myw3ICs2ODUsOCBAQAogICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIGNvbW11bmljYXRpb24gbW9kZS4KICAgKiBAcmV0dmFsIFNFVCAoX19NT0RFX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX01PREVfXyBpcyBpbnZhbGlkKQogICAqLwotI2RlZmluZSBJU19JUkRBX1RYX1JYX01PREUoX19NT0RFX18pICgoKChfX01PREVfXykgJiAofigodWludDMyX3QpKElSREFfTU9ERV9UWF9SWCkpKSkgPT0gMHgwMFUpICYmICgoX19NT0RFX18pICE9IDB4MDBVKSkKKyNkZWZpbmUgSVNfSVJEQV9UWF9SWF9NT0RFKF9fTU9ERV9fKSAoKCgoX19NT0RFX18pXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKH4oKHVpbnQzMl90KShJUkRBX01PREVfVFhfUlgpKSkpID09IDB4MDBVKSAmJiAoKF9fTU9ERV9fKSAhPSAweDAwVSkpCiAKIC8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgSVJEQSBwb3dlciBtb2RlIGlzIHZhbGlkLgogICAqIEBwYXJhbSBfX01PREVfXyBJUkRBIHBvd2VyIG1vZGUuCkBAIC03MzUsOCArNzM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUEFSQU1fXykgPT0gSVJEQV9SWERBVEFfRkxVU0hfUkVRVUVTVCkgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QQVJBTV9fKSA9PSBJUkRBX1RYREFUQV9GTFVTSF9SRVFVRVNUKSkKIC8qKgotICogQH0KLSAqLworICAqIEB9CisgICovCiAKIC8qIEluY2x1ZGUgSVJEQSBIQUwgRXh0ZW5kZWQgbW9kdWxlICovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2hhbF9pcmRhX2V4LmgiCkBAIC03NTgsNyArNzYxLDggQEAKIAogI2lmIChVU0VfSEFMX0lSREFfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVnaXN0ZXJDYWxsYmFjayhJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCBIQUxfSVJEQV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwSVJEQV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlZ2lzdGVyQ2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgSEFMX0lSREFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElSREFfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9VblJlZ2lzdGVyQ2FsbGJhY2soSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgSEFMX0lSREFfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CiAjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9pcmRhX2V4LmggYi9JbmMvc3RtMzJmN3h4X2hhbF9pcmRhX2V4LmgKaW5kZXggMjQ3Y2I3NC4uN2U5NWZkNiAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfaXJkYV9leC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX2lyZGFfZXguaApAQCAtMzIsNyArMzIsOCBAQAogICAqIEB7CiAgICovCiAKLS8qKiBAYWRkdG9ncm91cCBJUkRBRXgKKy8qKiBAZGVmZ3JvdXAgSVJEQUV4IElSREFFeAorICAqIEBicmllZiBJUkRBIEV4dGVuZGVkIEhBTCBtb2R1bGUgZHJpdmVyCiAgICogQHsKICAgKi8KIApAQCAtNzMsOCArNzQsOCBAQAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC05MCwxMiArOTEsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTExMSwxMiArMTEyLDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMzIsMTIgKzEzMywxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNCkgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VQVJUNENMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTUzLDEyICsxNTQsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVBUlQ1KSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVUFSVDVfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVUFSVDVDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3NCwxMiArMTc1LDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUNikgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUNl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUNl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUNkNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IElSREFfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xOTUsMTIgKzE5NiwxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDcpICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUN19TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUN19TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VQVJUN0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjE2LDEyICsyMTcsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVBUlQ4KSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVUFSVDhfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVUFSVDhfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVUFSVDhDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gSVJEQV9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIzNyw3ICsyMzgsNyBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBJUkRBX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI1Miw0NCArMjUzLDQ0IEBACiAgICovCiAjZGVmaW5lIElSREFfTUFTS19DT01QVVRBVElPTihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF85QikgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAxRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gSVJEQV9XT1JETEVOR1RIXzhCKSAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfOEIpICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gSVJEQV9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBJUkRBX1dPUkRMRU5HVEhfN0IpICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IElSREFfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IElSREFfV09SRExFTkdUSF83QikgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBJUkRBX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAzRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSgwVSkKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKIAogLyoqIEBicmllZiBFbnN1cmUgdGhhdCBJUkRBIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KICAgKiBAcGFyYW0gX19MRU5HVEhfXyBJUkRBIGZyYW1lIGxlbmd0aC4KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX2xwdGltLmggYi9JbmMvc3RtMzJmN3h4X2hhbF9scHRpbS5oCmluZGV4IGYyZmFhZGUuLjkyNDFiODggMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX2xwdGltLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfbHB0aW0uaApAQCAtMTUsMTQgKzE1LDE0IEBACiAgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKi8gCisgICovCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fU1RNMzJGN3h4X0hBTF9MUFRJTV9ICi0jZGVmaW5lIF9fU1RNMzJGN3h4X0hBTF9MUFRJTV9ICisjaWZuZGVmIFNUTTMyRjd4eF9IQUxfTFBUSU1fSAorI2RlZmluZSBTVE0zMkY3eHhfSEFMX0xQVElNX0gKIAogI2lmZGVmIF9fY3BsdXNwbHVzCi0gZXh0ZXJuICJDIiB7CitleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzIsMjYgKzMyLDIwIEBACiAgICogQHsKICAgKi8KIAotLyoqIEBkZWZncm91cCBMUFRJTSBMUFRJTQotICAqIEBicmllZiBMUFRJTSBIQUwgbW9kdWxlIGRyaXZlcgorI2lmIGRlZmluZWQgKExQVElNMSkKKworLyoqIEBhZGR0b2dyb3VwIExQVElNCiAgICogQHsKICAgKi8KLSAgCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKworLyogRXhwb3J0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfVHlwZXMgTFBUSU0gRXhwb3J0ZWQgVHlwZXMKICAgKiBAewogICAqLworI2RlZmluZSBMUFRJTV9FWFRJX0xJTkVfV0FLRVVQVElNRVJfRVZFTlQgIEVYVElfSU1SX01SMjMgIC8qITwgRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgMjMgQ29ubmVjdGVkIHRvIHRoZSBMUFRJTSBFWFRJIExpbmUgKi8KIAotLyoqIEBkZWZncm91cCBMUFRJTV9XQUtFVVBUSU1FUl9FWFRJTElORSBMUFRJTSBXQUtFVVAgVGltZXIgRVhUSSBMaW5lCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgTFBUSU1fRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UICAoKHVpbnQzMl90KUVYVElfSU1SX01SMjMpICAvKiE8IEV4dGVybmFsIGludGVycnVwdCBsaW5lIDIzIENvbm5lY3RlZCB0byB0aGUgTFBUSU0gRVhUSSBMaW5lICovCiAvKioKLSAgKiBAfQotICAqLwotCi0vKiogCi0gICogQGJyaWVmICBMUFRJTSBDbG9jayBjb25maWd1cmF0aW9uIGRlZmluaXRpb24gIAorICAqIEBicmllZiAgTFBUSU0gQ2xvY2sgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uCiAgICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNjAsMTEgKzU0LDExIEBACiAKICAgdWludDMyX3QgUHJlc2NhbGVyOyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjb3VudGVyIGNsb2NrIFByZXNjYWxlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfUHJlc2NhbGVyICovCi0gIAotfUxQVElNX0Nsb2NrQ29uZmlnVHlwZURlZjsKIAotLyoqIAotICAqIEBicmllZiAgTFBUSU0gQ2xvY2sgY29uZmlndXJhdGlvbiBkZWZpbml0aW9uICAKK30gTFBUSU1fQ2xvY2tDb25maWdUeXBlRGVmOworCisvKioKKyAgKiBAYnJpZWYgIExQVElNIENsb2NrIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbgogICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTczLDkyICs2Nyw5NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gVWx0cmEgbG93IHBvd2VyIGNsb2NrIHNvdXJjZSBpcyB1c2VkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSWYgdGhlIHBvbGFyaXR5IGlzIGNvbmZpZ3VyZWQgb24gJ2JvdGggZWRnZXMnLCBhbiBhdXhpbGlhcnkgY2xvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmUgb2YgdGhlIExvdyBwb3dlciBvc2NpbGxhdG9yKSBtdXN0IGJlIGFjdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfUG9sYXJpdHkgKi8gCi0gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9DbG9ja19Qb2xhcml0eSAqLworCiAgIHVpbnQzMl90IFNhbXBsZVRpbWU7ICAgICAvKiE8IFNlbGVjdHMgdGhlIGNsb2NrIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSBjbG9jayBnbGl0Y2ggZmlsdGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBvbmx5IHdoZW4gVWx0cmEgbG93IHBvd2VyIGNsb2NrIHNvdXJjZSBpcyB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9DbG9ja19TYW1wbGVfVGltZSAqLyAgCi0gIAotfUxQVElNX1VMUENsb2NrQ29uZmlnVHlwZURlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ2xvY2tfU2FtcGxlX1RpbWUgKi8KIAotLyoqIAotICAqIEBicmllZiAgTFBUSU0gVHJpZ2dlciBjb25maWd1cmF0aW9uIGRlZmluaXRpb24gIAorfSBMUFRJTV9VTFBDbG9ja0NvbmZpZ1R5cGVEZWY7CisKKy8qKgorICAqIEBicmllZiAgTFBUSU0gVHJpZ2dlciBjb25maWd1cmF0aW9uIGRlZmluaXRpb24KICAgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgIHVpbnQzMl90IFNvdXJjZTsgICAgICAgIC8qITwgU2VsZWN0cyB0aGUgVHJpZ2dlciBzb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fVHJpZ2dlcl9Tb3VyY2UgKi8KLSAgCisKICAgdWludDMyX3QgQWN0aXZlRWRnZTsgICAgLyohPCBTZWxlY3RzIHRoZSBUcmlnZ2VyIGFjdGl2ZSBlZGdlLgogICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgd2hlbiBhbiBleHRlcm5hbCB0cmlnZ2VyIGlzIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fRXh0ZXJuYWxfVHJpZ2dlcl9Qb2xhcml0eSAqLwotICAKKwogICB1aW50MzJfdCBTYW1wbGVUaW1lOyAgICAvKiE8IFNlbGVjdHMgdGhlIHRyaWdnZXIgc2FtcGxpbmcgdGltZSB0byBjb25maWd1cmUgdGhlIGNsb2NrIGdsaXRjaCBmaWx0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgb25seSB3aGVuIGFuIGV4dGVybmFsIHRyaWdnZXIgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9UcmlnZ2VyX1NhbXBsZV9UaW1lICAqLyAgCi19TFBUSU1fVHJpZ2dlckNvbmZpZ1R5cGVEZWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fVHJpZ2dlcl9TYW1wbGVfVGltZSAgKi8KK30gTFBUSU1fVHJpZ2dlckNvbmZpZ1R5cGVEZWY7CiAKLS8qKiAKLSAgKiBAYnJpZWYgIExQVElNIEluaXRpYWxpemF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKKy8qKgorICAqIEBicmllZiAgTFBUSU0gSW5pdGlhbGl6YXRpb24gU3RydWN0dXJlIGRlZmluaXRpb24KICAgKi8KIHR5cGVkZWYgc3RydWN0Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorewogICBMUFRJTV9DbG9ja0NvbmZpZ1R5cGVEZWYgICAgIENsb2NrOyAgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBjbG9jayBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgTFBUSU1fVUxQQ2xvY2tDb25maWdUeXBlRGVmICBVbHRyYUxvd1Bvd2VyQ2xvY2s7ICAvKiE8IFNwZWNpZmllcyB0aGUgVWx0cmEgTG93IFBvd2VyIGNsb2NrIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogICBMUFRJTV9UcmlnZ2VyQ29uZmlnVHlwZURlZiAgIFRyaWdnZXI7ICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBUcmlnZ2VyIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIE91dHB1dFBvbGFyaXR5OyAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBPdXRwdXQgcG9sYXJpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9PdXRwdXRfUG9sYXJpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBVcGRhdGVNb2RlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cGRhdGUgb2YgdGhlIGF1dG9yZWxhb2QgYW5kIHRoZSBjb21wYXJlCisKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBVcGRhdGVNb2RlOyAgICAgICAgICAvKiE8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cGRhdGUgb2YgdGhlIGF1dG9yZWxvYWQgYW5kIHRoZSBjb21wYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGlzIGRvbmUgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgdGhlIGVuZCBvZiBjdXJyZW50IHBlcmlvZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIExQVElNX1VwZGF0aW5nX01vZGUgKi8KIAogICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIENvdW50ZXJTb3VyY2U7ICAgICAgIC8qITwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZWFjaCBpbnRlcm5hbCBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGVhY2ggZXh0ZXJuYWwgZXZlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBMUFRJTV9Db3VudGVyX1NvdXJjZSAqLyAgCi0gIAotfUxQVElNX0luaXRUeXBlRGVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgTFBUSU1fQ291bnRlcl9Tb3VyY2UgKi8KK30gTFBUSU1fSW5pdFR5cGVEZWY7CiAKLS8qKiAKLSAgKiBAYnJpZWYgIEhBTCBMUFRJTSBTdGF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCi0gICovIAotdHlwZWRlZiBlbnVtIF9fSEFMX0xQVElNX1N0YXRlVHlwZURlZgorLyoqCisgICogQGJyaWVmICBIQUwgTFBUSU0gU3RhdGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KK3R5cGVkZWYgZW51bQogewogICBIQUxfTFBUSU1fU1RBVEVfUkVTRVQgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KICAgSEFMX0xQVElNX1NUQVRFX1JFQURZICAgICAgICAgICAgPSAweDAxVSwgICAgLyohPCBQZXJpcGhlcmFsIEluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlICAgICovCi0gIEhBTF9MUFRJTV9TVEFURV9CVVNZICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgQW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLyAgICAKLSAgSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQgICAgICAgICAgPSAweDAzVSwgICAgLyohPCBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKLSAgSEFMX0xQVElNX1NUQVRFX0VSUk9SICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBJbnRlcm5hbCBQcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfUhBTF9MUFRJTV9TdGF0ZVR5cGVEZWY7CisgIEhBTF9MUFRJTV9TVEFURV9CVVNZICAgICAgICAgICAgID0gMHgwMlUsICAgIC8qITwgQW4gaW50ZXJuYWwgcHJvY2VzcyBpcyBvbmdvaW5nICAgICAgICAgICAgICAqLworICBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCAgICAgICAgICA9IDB4MDNVLCAgICAvKiE8IFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1NUQVRFX0VSUk9SICAgICAgICAgICAgPSAweDA0VSAgICAgLyohPCBJbnRlcm5hbCBQcm9jZXNzIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICovCit9IEhBTF9MUFRJTV9TdGF0ZVR5cGVEZWY7CiAKLS8qKiAKLSAgKiBAYnJpZWYgIExQVElNIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiAgCi0gICovIAorLyoqCisgICogQGJyaWVmICBMUFRJTSBoYW5kbGUgU3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKIHR5cGVkZWYgc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZgorI2Vsc2UKK3R5cGVkZWYgc3RydWN0CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIHsKLSAgTFBUSU1fVHlwZURlZiAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAqLwotICBMUFRJTV9Jbml0VHlwZURlZiAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgLyohPCBMUFRJTSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCi0gIEhBTF9TdGF0dXNUeXBlRGVmICAgICAgICAgICAgICBTdGF0dXM7ICAgICAgICAvKiE8IExQVElNIHBlcmlwaGVyYWwgc3RhdHVzICAgKi8KLSAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICAgIExvY2s7ICAgICAgICAgIC8qITwgTFBUSU0gbG9ja2luZyBvYmplY3QgICAgICAqLwotICBfX0lPICBIQUxfTFBUSU1fU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAgLyohPCBMUFRJTSBwZXJpcGhlcmFsIHN0YXRlICAgICovCisgIExQVElNX1R5cGVEZWYgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgKi8KKworICBMUFRJTV9Jbml0VHlwZURlZiAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBMUFRJTSByZXF1aXJlZCBwYXJhbWV0ZXJzICovCisKKyAgSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgICAgICAgIFN0YXR1czsgICAgICAgICAgIC8qITwgTFBUSU0gcGVyaXBoZXJhbCBzdGF0dXMgICAqLworCisgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IExQVElNIGxvY2tpbmcgb2JqZWN0ICAgICAgKi8KKworICBfX0lPICBIQUxfTFBUSU1fU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBMUFRJTSBwZXJpcGhlcmFsIHN0YXRlICAgICovCiAKICNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgdm9pZCAgKCogTXNwSW5pdENhbGxiYWNrKSAgICAgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAvKiE8IExQVElNIE1zcCBJbml0IENhbGxiYWNrICAgICAgICAgICovCi0gIHZvaWQgICgqIE1zcERlSW5pdENhbGxiYWNrKSAgICAgICAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgLyohPCBMUFRJTSBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAqLwotCi0gIHZvaWQgICgqIENvbXBhcmVNYXRjaENhbGxiYWNrKSAgICAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgLyohPCBMUFRJTSBDb21wYXJlIE1hdGNoIENhbGxiYWNrICAgICAqLwotICB2b2lkICAoKiBBdXRvUmVsb2FkTWF0Y2hDYWxsYmFjaykgKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7IC8qITwgTFBUSU0gQXV0byBSZWxvYWQgTWF0Y2ggQ2FsbGJhY2sgKi8KLSAgdm9pZCAgKCogVHJpZ2dlckNhbGxiYWNrKSAgICAgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAvKiE8IExQVElNIFRyaWdnZXIgQ2FsbGJhY2sgICAgICAgICAgICovCi0gIHZvaWQgICgqIENvbXBhcmVXcml0ZUNhbGxiYWNrKSAgICAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgLyohPCBMUFRJTSBDb21wYXJlIFdyaXRlIENhbGxiYWNrICAgICAqLwotICB2b2lkICAoKiBBdXRvUmVsb2FkV3JpdGVDYWxsYmFjaykgKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7IC8qITwgTFBUSU0gQXV0byBSZWxvYWQgV3JpdGUgQ2FsbGJhY2sgKi8KLSAgdm9pZCAgKCogRGlyZWN0aW9uVXBDYWxsYmFjaykgICAgIChzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAvKiE8IExQVElNIERpcmVjdGlvbiBVcCBDYWxsYmFjayAgICAgICovCi0gIHZvaWQgICgqIERpcmVjdGlvbkRvd25DYWxsYmFjaykgICAoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgLyohPCBMUFRJTSBEaXJlY3Rpb24gRG93biBDYWxsYmFjayAgICAqLworICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgICAgICAvKiE8IExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgICAgIC8qITwgTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrICAgICAgICAgICAgICAgKi8KKyAgdm9pZCAoKiBDb21wYXJlTWF0Y2hDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgLyohPCBDb21wYXJlIG1hdGNoIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAqLworICB2b2lkICgqIEF1dG9SZWxvYWRNYXRjaENhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAvKiE8IEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrICAgICAgICAgICAgICAgICAgICovCisgIHZvaWQgKCogVHJpZ2dlckNhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAgICAgICAgIC8qITwgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgICAgKi8KKyAgdm9pZCAoKiBDb21wYXJlV3JpdGVDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICAgICAqLworICB2b2lkICgqIEF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKShzdHJ1Y3QgX19MUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgICAvKiE8IEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICovCisgIHZvaWQgKCogRGlyZWN0aW9uVXBDYWxsYmFjaykoc3RydWN0IF9fTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsgICAgICAgIC8qITwgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICAgKi8KKyAgdm9pZCAoKiBEaXJlY3Rpb25Eb3duQ2FsbGJhY2spKHN0cnVjdCBfX0xQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7ICAgICAgLyohPCBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgICAgICAqLwogI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0KLX1MUFRJTV9IYW5kbGVUeXBlRGVmOworfSBMUFRJTV9IYW5kbGVUeXBlRGVmOwogCiAjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAvKioKQEAgLTE2NiwyOCArMTY1LDI2IEBACiAgICovCiB0eXBlZGVmIGVudW0KIHsKLSAgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgID0gMHgwMFUsICAgIC8qITwgTFBUSU0gTXNwSW5pdCBDYWxsYmFjayBJRCAgICAgICAgICAgKi8KLSAgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgID0gMHgwMVUsICAgIC8qITwgTFBUSU0gTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgKi8KLQotICBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCAgICAgPSAweDAyVSwgICAgLyohPCBMUFRJTSBDb21wYXJlIE1hdGNoIENhbGxiYWNrIElEICAgICAqLwotICBIQUxfTFBUSU1fQVVUT19SRUxPQURfTUFUQ0hfQ0JfSUQgPSAweDAzVSwgICAgLyohPCBMUFRJTSBBdXRvIFJlbG9hZCBNYXRjaCBDYWxsYmFjayBJRCAqLwotICBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCAgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBMUFRJTSBUcmlnZ2VyIENhbGxiYWNrIElEICAgICAgICAgICAqLwotICBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCAgICAgPSAweDA1VSwgICAgLyohPCBMUFRJTSBDb21wYXJlIFdyaXRlIENhbGxiYWNrIElEICAgICAqLwotICBIQUxfTFBUSU1fQVVUT19SRUxPQURfV1JJVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBMUFRJTSBBdXRvIFJlbG9hZCBXcml0ZSBDYWxsYmFjayBJRCAqLwotICBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEICAgICAgPSAweDA3VSwgICAgLyohPCBMUFRJTSBEaXJlY3Rpb24gVXAgQ2FsbGJhY2sgSUQgICAgICAqLwotICBIQUxfTFBUSU1fRElSRUNUSU9OX0RPV05fQ0JfSUQgICAgPSAweDA4VSwgICAgLyohPCBMUFRJTSBEaXJlY3Rpb24gRG93biBDYWxsYmFjayBJRCAgICAqLwotfUhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZjsKKyAgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgICAgICAgICAgPSAweDAwVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgPSAweDAxVSwgICAgLyohPCBMUFRJTSBCYXNlIE1zcCBEZUluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgICAgPSAweDAyVSwgICAgLyohPCBDb21wYXJlIG1hdGNoIENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgPSAweDAzVSwgICAgLyohPCBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjayBJRCAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgPSAweDA0VSwgICAgLyohPCBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayBJRCAgICAgKi8KKyAgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgPSAweDA1VSwgICAgLyohPCBDb21wYXJlIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrIElEICAgICAgKi8KKyAgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgPSAweDA2VSwgICAgLyohPCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRCAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCAgICAgPSAweDA3VSwgICAgLyohPCBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElEICAgICAgICAgKi8KKyAgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEICAgPSAweDA4VSwgICAgLyohPCBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQgICAgICAgKi8KK30gSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmOwogCiAvKioKLSAgKiBAYnJpZWYgIEhBTCBMUFRJTSBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24KKyAgKiBAYnJpZWYgIEhBTCBUSU0gQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCiAgICovCi10eXBlZGVmICB2b2lkICgqcExQVElNX0NhbGxiYWNrVHlwZURlZikoTFBUSU1fSGFuZGxlVHlwZURlZiAqIGhscHRpbSk7IC8qITwgcG9pbnRlciB0byB0aGUgTFBUSU0gY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgIHZvaWQgKCpwTFBUSU1fQ2FsbGJhY2tUeXBlRGVmKShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOyAgLyohPCBwb2ludGVyIHRvIHRoZSBMUFRJTSBjYWxsYmFjayBmdW5jdGlvbiAqLwogCiAjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLQogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIEV4cG9ydGVkIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0NvbnN0YW50cyBMUFRJTSBFeHBvcnRlZCBDb25zdGFudHMKQEAgLTE5NywzMyArMTk0LDMzIEBACiAvKiogQGRlZmdyb3VwIExQVElNX0Nsb2NrX1NvdXJjZSBMUFRJTSBDbG9jayBTb3VyY2UKICAgKiBAewogICAqLwotI2RlZmluZSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQyAgICAgICAgKCh1aW50MzJfdCkweDAwVSkKLSNkZWZpbmUgTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tTRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX0NLU0VMCisvKioKICAgKiBAfQogICAqLwogCiAvKiogQGRlZmdyb3VwIExQVElNX0Nsb2NrX1ByZXNjYWxlciBMUFRJTSBDbG9jayBQcmVzY2FsZXIKICAgKiBAewogICAqLwotI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMFUpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYxICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMiAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18wCiAjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY0ICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1BSRVNDXzEKLSNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjggICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpKExQVElNX0NGR1JfUFJFU0NfMCB8IExQVElNX0NGR1JfUFJFU0NfMSkpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY4ICAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18wIHwgTFBUSU1fQ0ZHUl9QUkVTQ18xKQogI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMTYgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQ18yCi0jZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVYzMiAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KShMUFRJTV9DRkdSX1BSRVNDXzAgfCBMUFRJTV9DRkdSX1BSRVNDXzIpKQotI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWNjQgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoTFBUSU1fQ0ZHUl9QUkVTQ18xIHwgTFBUSU1fQ0ZHUl9QUkVTQ18yKSkKLSNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCAgICAgICAgICAgICAgICAgICgodWludDMyX3QpTFBUSU1fQ0ZHUl9QUkVTQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgTFBUSU1fUFJFU0NBTEVSX0RJVjMyICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1BSRVNDXzAgfCBMUFRJTV9DRkdSX1BSRVNDXzIpCisjZGVmaW5lIExQVElNX1BSRVNDQUxFUl9ESVY2NCAgICAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9QUkVTQ18xIHwgTFBUSU1fQ0ZHUl9QUkVTQ18yKQorI2RlZmluZSBMUFRJTV9QUkVTQ0FMRVJfRElWMTI4ICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVTQwogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fT3V0cHV0X1BvbGFyaXR5IExQVElNIE91dHB1dCBQb2xhcml0eQogICAqIEB7CiAgICovCiAKLSNkZWZpbmUgTFBUSU1fT1VUUFVUUE9MQVJJVFlfSElHSCAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lIExQVElNX09VVFBVVFBPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9XQVZQT0wpCisjZGVmaW5lIExQVElNX09VVFBVVFBPTEFSSVRZX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBMUFRJTV9PVVRQVVRQT0xBUklUWV9MT1cgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wKIC8qKgogICAqIEB9CiAgICovCkBAIC0yMzEsMTAgKzIyOCwxMCBAQAogLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19TYW1wbGVfVGltZSBMUFRJTSBDbG9jayBTYW1wbGUgVGltZQogICAqIEB7CiAgICovCi0jZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgIExQVElNX0NGR1JfQ0tGTFRfMAotI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICBMUFRJTV9DRkdSX0NLRkxUXzEKLSNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUyAgICAgTFBUSU1fQ0ZHUl9DS0ZMVAorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTiAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfQ0tGTFRfMAorI2RlZmluZSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8xCisjZGVmaW5lIExQVElNX0NMT0NLU0FNUExFVElNRV84VFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX0NLRkxUCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjQyLDEwICsyMzksOSBAQAogLyoqIEBkZWZncm91cCBMUFRJTV9DbG9ja19Qb2xhcml0eSBMUFRJTSBDbG9jayBQb2xhcml0eQogICAqIEB7CiAgICovCi0KLSNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKLSNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8wCi0jZGVmaW5lIExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMQorI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lORyAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgTFBUSU1fQ0xPQ0tQT0xBUklUWV9GQUxMSU5HICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tQT0xfMAorI2RlZmluZSBMUFRJTV9DTE9DS1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8xCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjUzLDEzICsyNDksMTMgQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fVHJpZ2dlcl9Tb3VyY2UgTFBUSU0gVHJpZ2dlciBTb3VyY2UKICAgKiBAewogICAqLwotI2RlZmluZSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBGRkZGVSkKLSNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8wICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KUxQVElNX0NGR1JfVFJJR1NFTF8wKQorI2RlZmluZSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFICAgICAgICAgICAgICAgMHgwMDAwRkZGRlUKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8wICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIExQVElNX1RSSUdTT1VSQ0VfMSAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMAogI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzIgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzEKLSNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8zICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMSkKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV8zICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMCB8IExQVElNX0NGR1JfVFJJR1NFTF8xKQogI2RlZmluZSBMUFRJTV9UUklHU09VUkNFXzQgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzIKLSNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV81ICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpTFBUSU1fQ0ZHUl9UUklHU0VMXzAgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMikKKyNkZWZpbmUgTFBUSU1fVFJJR1NPVVJDRV81ICAgICAgICAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMCB8IExQVElNX0NGR1JfVFJJR1NFTF8yKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTI3Nyw3ICsyNzMsNyBAQAogLyoqIEBkZWZncm91cCBMUFRJTV9UcmlnZ2VyX1NhbXBsZV9UaW1lIExQVElNIFRyaWdnZXIgU2FtcGxlIFRpbWUKICAgKiBAewogICAqLwotI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV9ESVJFQ1RUUkFOU0lUSU9OICAweDAwMDAwMDAwVQogI2RlZmluZSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgICBMUFRJTV9DRkdSX1RSR0ZMVF8wCiAjZGVmaW5lIExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUyAgICAgIExQVElNX0NGR1JfVFJHRkxUXzEKICNkZWZpbmUgTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFQKQEAgLTI4OSw3ICsyODUsNyBAQAogICAqIEB7CiAgICovCiAKLSNkZWZpbmUgTFBUSU1fVVBEQVRFX0lNTUVESUFURSAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIExQVElNX1VQREFURV9JTU1FRElBVEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBMUFRJTV9VUERBVEVfRU5ET0ZQRVJJT0QgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9QUkVMT0FECiAvKioKICAgKiBAfQpAQCAtMjk5LDEzICsyOTUsMTMgQEAKICAgKiBAewogICAqLwogCi0jZGVmaW5lIExQVElNX0NPVU5URVJTT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBMUFRJTV9DT1VOVEVSU09VUkNFX0lOVEVSTkFMICAgICAgICAgICAgMHgwMDAwMDAwMFUKICNkZWZpbmUgTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCAgICAgICAgICAgIExQVElNX0NGR1JfQ09VTlRNT0RFCiAvKioKICAgKiBAfQogICAqLwotIAotLyoqIEBkZWZncm91cCBMUFRJTV9GbGFnX0RlZmluaXRpb24gTFBUSU0gRmxhZyBEZWZpbml0aW9uCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRmxhZ19EZWZpbml0aW9uIExQVElNIEZsYWdzIERlZmluaXRpb24KICAgKiBAewogICAqLwogCkBAIC0zMjMsNyArMzE5LDYgQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fSW50ZXJydXB0c19EZWZpbml0aW9uIExQVElNIEludGVycnVwdHMgRGVmaW5pdGlvbgogICAqIEB7CiAgICovCi0KICNkZWZpbmUgTFBUSU1fSVRfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfRE9XTklFCiAjZGVmaW5lIExQVElNX0lUX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fSUVSX1VQSUUKICNkZWZpbmUgTFBUSU1fSVRfQVJST0sgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9JRVJfQVJST0tJRQpAQCAtMzM5LDU0ICszMzQsNzkgQEAKICAgKiBAfQogICAqLwogCi0vKiBFeHBvcnRlZCBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRXhwb3J0ZWQgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfTWFjcm9zIExQVElNIEV4cG9ydGVkIE1hY3JvcwogICAqIEB7CiAgICovCiAKLS8qKiBAYnJpZWYgUmVzZXQgTFBUSU0gaGFuZGxlIHN0YXRlCisvKiogQGJyaWVmIFJlc2V0IExQVElNIGhhbmRsZSBzdGF0ZS4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCisjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlICAgICAgICAgICAgID0gSEFMX0xQVElNX1NUQVRFX1JFU0VUOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayAgID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyNlbHNlCiAjZGVmaW5lIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCiAvKioKLSAgKiBAYnJpZWYgIEVuYWJsZS9EaXNhYmxlIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSNkZWZpbmUgX19IQUxfTFBUSU1fRU5BQkxFKF9fSEFORExFX18pICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICAoTFBUSU1fQ1JfRU5BQkxFKSkKLSNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICB+KExQVElNX0NSX0VOQUJMRSkpCisjZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRShfX0hBTkRMRV9fKSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAoTFBUSU1fQ1JfRU5BQkxFKSkKIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIHBlcmlwaGVyYWwgaW4gQ29udGludW91cyBvciBpbiBzaW5nbGUgbW9kZS4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gRE1BIGhhbmRsZQorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQG5vdGUgICBQbGVhc2UgY2FsbCBAcmVmIEhBTF9MUFRJTV9HZXRTdGF0ZSgpIGFmdGVyIGEgY2FsbCB0byBfX0hBTF9MUFRJTV9ESVNBQkxFIHRvCisgICogICAgICAgICBjaGVjayBmb3IgVElNRU9VVC4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfTFBUSU1fRElTQUJMRShfX0hBTkRMRV9fKSAgIExQVElNX0Rpc2FibGUoX19IQU5ETEVfXykKKworLyoqCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gcGVyaXBoZXJhbCBpbiBDb250aW51b3VzIG1vZGUuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIExQVElNX0NSX0NOVFNUUlQpCi0jZGVmaW5lIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShfX0hBTkRMRV9fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgTFBUSU1fQ1JfU05HU1RSVCkKLSAKLSAgICAKIC8qKgotICAqIEBicmllZiAgV3JpdGVzIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGluIHRoZSBBdXRvcmVsb2FkIHJlZ2lzdGVyLgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIHBlcmlwaGVyYWwgaW4gc2luZ2xlIG1vZGUuCiAgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgX19WQUxVRV9fICBBdXRvcmVsb2FkIHZhbHVlCiAgICogQHJldHZhbCBOb25lCiAgICovCisjZGVmaW5lIF9fSEFMX0xQVElNX1NUQVJUX1NJTkdMRShfX0hBTkRMRV9fKSAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAgTFBUSU1fQ1JfU05HU1RSVCkKKworLyoqCisgICogQGJyaWVmICBXcml0ZSB0aGUgcGFzc2VkIHBhcmFtZXRlciBpbiB0aGUgQXV0b3JlbG9hZCByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBfX1ZBTFVFX18gQXV0b3JlbG9hZCB2YWx1ZQorICAqIEByZXR2YWwgTm9uZQorICAqIEBub3RlICAgVGhlIEFSUiByZWdpc3RlciBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBlbmFibGVkLgorICAqLwogI2RlZmluZSBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChfX0hBTkRMRV9fICwgX19WQUxVRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkFSUiA9ICAoX19WQUxVRV9fKSkKIAogLyoqCi0gICogQGJyaWVmICBXcml0ZXMgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaW4gdGhlIENvbXBhcmUgcmVnaXN0ZXIuCisgICogQGJyaWVmICBXcml0ZSB0aGUgcGFzc2VkIHBhcmFtZXRlciBpbiB0aGUgQ29tcGFyZSByZWdpc3Rlci4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBfX1ZBTFVFX18gIENvbXBhcmUgdmFsdWUKKyAgKiBAcGFyYW0gIF9fVkFMVUVfXyBDb21wYXJlIHZhbHVlCiAgICogQHJldHZhbCBOb25lCisgICogQG5vdGUgICBUaGUgQ01QIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGluc3RhbmNlIGlzIGVuYWJsZWQuCiAgICovCiAjZGVmaW5lIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKF9fSEFORExFX18gLCBfX1ZBTFVFX18pICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q01QID0gIChfX1ZBTFVFX18pKQogCiAvKioKLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTFBUSU0gZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIExQVElNIGZsYWcgaXMgc2V0IG9yIG5vdC4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBfX0ZMQUdfXyAgIExQVElNIGZsYWcgdG8gY2hlY2sKKyAgKiBAcGFyYW0gIF9fRkxBR19fIExQVElNIGZsYWcgdG8gY2hlY2sKICAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgRmxhZy4KICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgRmxhZy4KQEAgLTQwMCw5ICs0MjAsOSBAQAogI2RlZmluZSBfX0hBTF9MUFRJTV9HRVRfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgICAgICAgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJihfX0ZMQUdfXykpID09IChfX0ZMQUdfXykpCiAKIC8qKgotICAqIEBicmllZiAgQ2xlYXJzIHRoZSBzcGVjaWZpZWQgTFBUSU0gZmxhZy4KKyAgKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgTFBUSU0gZmxhZy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlLgotICAqIEBwYXJhbSAgX19GTEFHX18gICBMUFRJTSBmbGFnIHRvIGNsZWFyLgorICAqIEBwYXJhbSAgX19GTEFHX18gTFBUSU0gZmxhZyB0byBjbGVhci4KICAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9GTEFHX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgRmxhZy4KICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fRkxBR19VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgRmxhZy4KQEAgLTQxMywxMiArNDMzLDEyIEBACiAgICogICAgICAgICAgICBAYXJnIExQVElNX0ZMQUdfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggRmxhZy4KICAgKiBAcmV0dmFsIE5vbmUuCiAgICovCi0jZGVmaW5lIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pICAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiAgPSAoX19GTEFHX18pKQorI2RlZmluZSBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiAgPSAoX19GTEFHX18pKQogCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgc3BlY2lmaWVkIExQVElNIGludGVycnVwdC4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gICAgIExQVElNIGhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIExQVElNIGludGVycnVwdCB0byBzZXQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIExQVElNIGhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gTFBUSU0gaW50ZXJydXB0IHRvIHNldC4KICAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEludGVycnVwdC4KICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEludGVycnVwdC4KQEAgLTQyOCwxMyArNDQ4LDE0IEBACiAgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0FSUk0gICAgOiBBdXRvcmVsb2FkIG1hdGNoIEludGVycnVwdC4KICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQ01QTSAgICA6IENvbXBhcmUgbWF0Y2ggSW50ZXJydXB0LgogICAqIEByZXR2YWwgTm9uZS4KKyAgKiBAbm90ZSAgIFRoZSBMUFRJTSBpbnRlcnJ1cHRzIGNhbiBvbmx5IGJlIGVuYWJsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCiAgICovCi0jZGVmaW5lIF9fSEFMX0xQVElNX0VOQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgIHw9IChfX0lOVEVSUlVQVF9fKSkKKyNkZWZpbmUgX19IQUxfTFBUSU1fRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JRVIgIHw9IChfX0lOVEVSUlVQVF9fKSkKIAotIC8qKgorLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBzcGVjaWZpZWQgTFBUSU0gaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyAgICAgTFBUSU0gaGFuZGxlLgotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgTFBUSU0gaW50ZXJydXB0IHRvIHNldC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gTFBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBMUFRJTSBpbnRlcnJ1cHQgdG8gc2V0LgogICAqICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2Y6CiAgICogICAgICAgICAgICBAYXJnIExQVElNX0lUX0RPV04gICAgOiBDb3VudGVyIGRpcmVjdGlvbiBjaGFuZ2UgdXAgSW50ZXJydXB0LgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9VUCAgICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIGRvd24gdG8gdXAgSW50ZXJydXB0LgpAQCAtNDQ0LDEzICs0NjUsMTQgQEAKICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfQVJSTSAgICA6IEF1dG9yZWxvYWQgbWF0Y2ggSW50ZXJydXB0LgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQuCiAgICogQHJldHZhbCBOb25lLgorICAqIEBub3RlICAgVGhlIExQVElNIGludGVycnVwdHMgY2FuIG9ubHkgYmUgZGlzYWJsZWQgd2hlbiB0aGUgTFBUSU0gaW5zdGFuY2UgaXMgZGlzYWJsZWQuCiAgICovCi0jZGVmaW5lIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICAmPSAofihfX0lOVEVSUlVQVF9fKSkpCisjZGVmaW5lIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICAmPSAofihfX0lOVEVSUlVQVF9fKSkpCiAKLSAgICAvKioKLSAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgTFBUSU0gaW50ZXJydXB0IGlzIHNldCBvciBub3QuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fICAgICBMUFRJTSBoYW5kbGUuCi0gICogQHBhcmFtICBfX0lOVEVSUlVQVF9fICBMUFRJTSBpbnRlcnJ1cHQgdG8gY2hlY2suCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBMUFRJTSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBMUFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIExQVElNIGludGVycnVwdCB0byBjaGVjay4KICAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mOgogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9ET1dOICAgIDogQ291bnRlciBkaXJlY3Rpb24gY2hhbmdlIHVwIEludGVycnVwdC4KICAgKiAgICAgICAgICAgIEBhcmcgTFBUSU1fSVRfVVAgICAgICA6IENvdW50ZXIgZGlyZWN0aW9uIGNoYW5nZSBkb3duIHRvIHVwIEludGVycnVwdC4KQEAgLTQ2MSw3ICs0ODMsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBMUFRJTV9JVF9DTVBNICAgIDogQ29tcGFyZSBtYXRjaCBJbnRlcnJ1cHQuCiAgICogQHJldHZhbCBJbnRlcnJ1cHQgc3RhdHVzLgogICAqLwotICAgIAorCiAjZGVmaW5lIF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCiAKIC8qKgpAQCAtNDg5LDcgKzUxMSw3IEBACiAjZGVmaW5lIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9FVkVOVCgpICAgKEVYVEktPkVNUiAmPSB+KExQVElNX0VYVElfTElORV9XQUtFVVBUSU1FUl9FVkVOVCkpCiAKIC8qKgotICAqIEBicmllZiAgRW5hYmxlIGZhbGxpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyIGFzc29jaWF0ZWQgRXh0aSBsaW5lLiAKKyAgKiBAYnJpZWYgIEVuYWJsZSBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KICAgKiBAcmV0dmFsIE5vbmUuCiAgICovCiAjZGVmaW5lIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0ZBTExJTkdfRURHRSgpICAgKEVYVEktPkZUU1IgfD0gTFBUSU1fRVhUSV9MSU5FX1dBS0VVUFRJTUVSX0VWRU5UKQpAQCAtNTIyLDcgKzU0NCw2IEBACiAKIC8qKgogICAqIEBicmllZiAgRGlzYWJsZSByaXNpbmcgJiBmYWxsaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBhc3NvY2lhdGVkIEV4dGkgbGluZS4KLSAgKiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CiAgICogQHJldHZhbCBOb25lLgogICAqLwogI2RlZmluZSBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfUklTSU5HX0ZBTExJTkdfRURHRSgpIGRve19fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpO1wKQEAgLTU1MCwxMiArNTcxLDE2IEBACiAvKioKICAgKiBAfQogICAqLwotICAgCisKIC8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9ucyBMUFRJTSBFeHBvcnRlZCBGdW5jdGlvbnMKICAgKiBAewogICAqLwogCisvKiogQGFkZHRvZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMQorICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgKiBAeworICovCiAvKiBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0luaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKQEAgLTU2Myw3ICs1ODgsMTQgQEAKIC8qIE1TUCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIEhBTF9MUFRJTV9Nc3BJbml0KExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CiB2b2lkIEhBTF9MUFRJTV9Nc3BEZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qKgorICAqIEB9CisgICovCiAKKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCisgKiAgQGJyaWVmICAgU3RhcnQtU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zLgorICogQHsKKyAqLwogLyogU3RhcnQvU3RvcCBvcGVyYXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFdNIE1vZGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLwpAQCAtNjEyLDEyICs2NDQsMjYgQEAKIC8qIE5vbi1CbG9ja2luZyBtb2RlOiBJbnRlcnJ1cHQgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKKy8qKgorICAqIEB9CisgICovCiAKKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCisgKiAgQGJyaWVmICBSZWFkIG9wZXJhdGlvbiBmdW5jdGlvbnMuCisgKiBAeworICovCiAvKiBSZWFkaW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdWludDMyX3QgSEFMX0xQVElNX1JlYWRDb3VudGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSk7CiB1aW50MzJfdCBIQUxfTFBUSU1fUmVhZEF1dG9SZWxvYWQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKIHVpbnQzMl90IEhBTF9MUFRJTV9SZWFkQ29tcGFyZShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyoqCisgICogQH0KKyAgKi8KIAorLyoqIEBhZGR0b2dyb3VwIExQVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKyAqICBAYnJpZWYgIExQVElNIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMuCisgKiBAeworICovCiAvKiBMUFRJTSBJUlEgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCBIQUxfTFBUSU1fSVJRSGFuZGxlcihMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOwogCkBAIC02MzIsMTcgKzY3OCwyNyBAQAogCiAvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcExQVElNX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1VuUmVnaXN0ZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwaHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBMUFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHBodGltLCBIQUxfTFBUSU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCk7CiAjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKy8qKgorICAqIEB9CisgICovCiAKKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9Hcm91cDUKKyAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4KKyAqIEB7CisgKi8KIC8qIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQUxfTFBUSU1fU3RhdGVUeXBlRGVmIEhBTF9MUFRJTV9HZXRTdGF0ZShMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pOworLyoqCisgICogQH0KKyAgKi8KIAogLyoqCiAgICogQH0KICAgKi8KLSAgCisKIC8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVHlwZXMgTFBUSU0gUHJpdmF0ZSBUeXBlcwogICAqIEB7CkBAIC02NTAsMTYgKzcwNiwxNiBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9WYXJpYWJsZXMgTFBUSU0gUHJpdmF0ZSBWYXJpYWJsZXMKICAgKiBAewogICAqLwotICAKKwogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfQ29uc3RhbnRzIExQVElNIFByaXZhdGUgQ29uc3RhbnRzCkBAIC02NjgsOTQgKzcyNCw5NyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9NYWNyb3MgTFBUSU0gUHJpdmF0ZSBNYWNyb3MKICAgKiBAewogICAqLwotICAKLSNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfU09VUkNFKF9fU09VUkNFX18pICAgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQykpCi0JCQkJCQkJCQkJCQkJIAotI2RlZmluZSBJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgICAgICgoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMSAgKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYyICApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjQgICkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWOCAgKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxNiApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjMyICkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWNjQgKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxMjgpKQotI2RlZmluZSBJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVJESVYxKF9fUFJFU0NBTEVSX18pICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxKQkJCQkJCQkJCQkJCQkgCiAKLSNkZWZpbmUgSVNfTFBUSU1fT1VUUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAgICAoKChfX1BPTEFSSVRZX18pID09IExQVElNX09VVFBVVFBPTEFSSVRZX0xPVyApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX09VVFBVVFBPTEFSSVRZX0hJR0gpKQotCQkJCQkJCQkJCQkJCSAKLSNkZWZpbmUgSVNfTFBUSU1fQ0xPQ0tfU0FNUExFX1RJTUUoX19TQU1QTEVUSU1FX18pICAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04pIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzJUUkFOU0lUSU9OUykgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUykgICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUykpCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU09VUkNFX18pID09IExQVElNX0NMT0NLU09VUkNFX0FQQkNMT0NLX0xQT1NDKSkKIAotI2RlZmluZSBJU19MUFRJTV9DTE9DS19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgICAgICgoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkcpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcpKQogCi0jZGVmaW5lIElTX0xQVElNX1RSR19TT1VSQ0UoX19UUklHX18pICAgICAgICAgICAgICAgKCgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpIHx8IFwKLQkJCQkJCQkJCQkJCQkgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8wKSB8fCBcCi0JCQkJCQkJCQkJCQkJICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfMSkgfHwgXAotCQkJCQkJCQkJCQkJCSAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzIpIHx8IFwKLQkJCQkJCQkJCQkJCQkgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8zKSB8fCBcCi0JCQkJCQkJCQkJCQkJICgoX19UUklHX18pID09IExQVElNX1RSSUdTT1VSQ0VfNCkgfHwgXAotCQkJCQkJCQkJCQkJCSAoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFXzUpKQorI2RlZmluZSBJU19MUFRJTV9DTE9DS19QUkVTQ0FMRVIoX19QUkVTQ0FMRVJfXykgKCgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVYxICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMiAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjQgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY4ICApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMTYgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjMyICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QUkVTQ0FMRVJfXykgPT0gIExQVElNX1BSRVNDQUxFUl9ESVY2NCApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUFJFU0NBTEVSX18pID09ICBMUFRJTV9QUkVTQ0FMRVJfRElWMTI4KSkKIAotI2RlZmluZSBJU19MUFRJTV9FWFRfVFJHX1BPTEFSSVRZKF9fUE9MQVJfXykgICAgICAgICgoKF9fUE9MQVJfXykgPT0gTFBUSU1fQUNUSVZFRURHRV9SSVNJTkcgICAgICAgICApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSX18pID09IExQVElNX0FDVElWRUVER0VfRkFMTElORyAgICAgICAgKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUl9fKSA9PSBMUFRJTV9BQ1RJVkVFREdFX1JJU0lOR19GQUxMSU5HICkpCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1BSRVNDQUxFUkRJVjEoX19QUkVTQ0FMRVJfXykgKChfX1BSRVNDQUxFUl9fKSA9PSAgTFBUSU1fUFJFU0NBTEVSX0RJVjEpCiAKLSNkZWZpbmUgSVNfTFBUSU1fVFJJR19TQU1QTEVfVElNRShfX1NBTVBMRVRJTUVfXykgICAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9UUklHU0FNUExFVElNRV8yVFJBTlNJVElPTlMgICAgKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTEVUSU1FX18pID09IExQVElNX1RSSUdTQU1QTEVUSU1FXzRUUkFOU0lUSU9OUyAgICApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICkpCQkKKyNkZWZpbmUgSVNfTFBUSU1fT1VUUFVUX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICgoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fT1VUUFVUUE9MQVJJVFlfTE9XICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9PVVRQVVRQT0xBUklUWV9ISUdIKSkKIAotI2RlZmluZSBJU19MUFRJTV9VUERBVEVfTU9ERShfX01PREVfXykgICAgICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBMUFRJTV9VUERBVEVfSU1NRURJQVRFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IExQVElNX1VQREFURV9FTkRPRlBFUklPRCkpCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FX0RJUkVDVFRSQU5TSVRJT04pIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU0FNUExFVElNRV9fKSA9PSBMUFRJTV9DTE9DS1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TQU1QTEVUSU1FX18pID09IExQVElNX0NMT0NLU0FNUExFVElNRV80VFJBTlNJVElPTlMpICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fQ0xPQ0tTQU1QTEVUSU1FXzhUUkFOU0lUSU9OUykpCiAKLSNkZWZpbmUgSVNfTFBUSU1fQ09VTlRFUl9TT1VSQ0UoX19TT1VSQ0VfXykgICAgICAgICAoKChfX1NPVVJDRV9fKSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0lOVEVSTkFMKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisjZGVmaW5lIElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKF9fUE9MQVJJVFlfXykgICAoKChfX1BPTEFSSVRZX18pID09IExQVElNX0NMT0NLUE9MQVJJVFlfUklTSU5HKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19QT0xBUklUWV9fKSA9PSBMUFRJTV9DTE9DS1BPTEFSSVRZX0ZBTExJTkcpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gTFBUSU1fQ0xPQ0tQT0xBUklUWV9SSVNJTkdfRkFMTElORykpCiAKLSNkZWZpbmUgSVNfTFBUSU1fQVVUT1JFTE9BRChfX0FVVE9SRUxPQURfXykgICAgICAgICAoKF9fQVVUT1JFTE9BRF9fKSA8PSAweDAwMDBGRkZGVSkKKyNkZWZpbmUgSVNfTFBUSU1fVFJHX1NPVVJDRShfX1RSSUdfXykgICAgICAgICAgICgoKF9fVFJJR19fKSA9PSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8wKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8xKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8yKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV8zKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV80KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RSSUdfXykgPT0gTFBUSU1fVFJJR1NPVVJDRV81KSkKIAotI2RlZmluZSBJU19MUFRJTV9DT01QQVJFKF9fQ09NUEFSRV9fKSAgICAgICAgICAgICAgICgoX19DT01QQVJFX18pIDw9IDB4MDAwMEZGRkZVKQotICAKLSNkZWZpbmUgSVNfTFBUSU1fUEVSSU9EKFBFUklPRCkgICAgICAgICAgICAgICAoKFBFUklPRCkgPD0gMHgwMDAwRkZGRlUpCisjZGVmaW5lIElTX0xQVElNX0VYVF9UUkdfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAoKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HICAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfRkFMTElORyAgICAgICAgKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IExQVElNX0FDVElWRUVER0VfUklTSU5HX0ZBTExJTkcgKSkKIAotI2RlZmluZSBJU19MUFRJTV9QVUxTRShQVUxTRSkgICAgICAgICAgICAgICAgICgoUFVMU0UpIDw9IDB4MDAwMEZGRkZVKQorI2RlZmluZSBJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKF9fU0FNUExFVElNRV9fKSAoKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfRElSRUNUVFJBTlNJVElPTikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfMlRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfNFRSQU5TSVRJT05TICAgICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NBTVBMRVRJTUVfXykgPT0gTFBUSU1fVFJJR1NBTVBMRVRJTUVfOFRSQU5TSVRJT05TICAgICkpCisKKyNkZWZpbmUgSVNfTFBUSU1fVVBEQVRFX01PREUoX19NT0RFX18pICAgICAgICAgICgoKF9fTU9ERV9fKSA9PSBMUFRJTV9VUERBVEVfSU1NRURJQVRFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gTFBUSU1fVVBEQVRFX0VORE9GUEVSSU9EKSkKKworI2RlZmluZSBJU19MUFRJTV9DT1VOVEVSX1NPVVJDRShfX1NPVVJDRV9fKSAgICAgKCgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9JTlRFUk5BTCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19TT1VSQ0VfXykgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCisKKyNkZWZpbmUgSVNfTFBUSU1fQVVUT1JFTE9BRChfX0FVVE9SRUxPQURfXykgICAgICgoX19BVVRPUkVMT0FEX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9DT01QQVJFKF9fQ09NUEFSRV9fKSAgICAgICAgICAgKChfX0NPTVBBUkVfXykgPD0gMHgwMDAwRkZGRlVMKQorCisjZGVmaW5lIElTX0xQVElNX1BFUklPRChfX1BFUklPRF9fKSAgICAgICAgICAgICAoKF9fUEVSSU9EX18pIDw9IDB4MDAwMEZGRkZVTCkKKworI2RlZmluZSBJU19MUFRJTV9QVUxTRShfX1BVTFNFX18pICAgICAgICAgICAgICAgKChfX1BVTFNFX18pIDw9IDB4MDAwMEZGRkZVTCkKIAogLyoqCiAgICogQH0KLSAgKi8gCisgICovCiAKIC8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCiAgICogQHsKICAgKi8KLSAgCit2b2lkIExQVElNX0Rpc2FibGUoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKTsKIC8qKgogICAqIEB9CiAgICovCi0gIAotLyoqCi0gICogQH0KLSAgKi8gCiAKIC8qKgogICAqIEB9Ci0gICovIAotICAKKyAgKi8KKworI2VuZGlmIC8qIExQVElNMSAqLworLyoqCisgICogQH0KKyAgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9fU1RNMzJGN3h4X0hBTF9MUFRJTV9IICovCisjZW5kaWYgLyogU1RNMzJGN3h4X0hBTF9MUFRJTV9IICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9tbWMuaCBiL0luYy9zdG0zMmY3eHhfaGFsX21tYy5oCmluZGV4IDA4NTBiNmEuLjJkMzg3OGYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX21tYy5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX21tYy5oCkBAIC0xMiwxNCArMTIsMTYgQEAKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqLyAKIAogLyogRGVmaW5lIHRvIHByZXZlbnQgcmVjdXJzaXZlIGluY2x1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgX19TVE0zMkY3eHhfSEFMX01NQ19ICi0jZGVmaW5lIF9fU1RNMzJGN3h4X0hBTF9NTUNfSAorI2lmbmRlZiBTVE0zMkY3eHhfSEFMX01NQ19ICisjZGVmaW5lIFNUTTMyRjd4eF9IQUxfTU1DX0gKKworI2lmIGRlZmluZWQoU0RNTUMxKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKICBleHRlcm4gIkMiIHsKQEAgLTQ2LDE0ICs0OCwxNCBAQAogICAqLyAgIAogdHlwZWRlZiBlbnVtCiB7Ci0gIEhBTF9NTUNfU1RBVEVfUkVTRVQgICAgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwMFUpLCAgLyohPCBNTUMgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KLSAgSEFMX01NQ19TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDAxVSksICAvKiE8IE1NQyBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAqLwotICBIQUxfTU1DX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSwgIC8qITwgTU1DIFRpbWVvdXQgc3RhdGUgICAgICAgICAgICAgICAgICAgICovCi0gIEhBTF9NTUNfU1RBVEVfQlVTWSAgICAgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwM1UpLCAgLyohPCBNTUMgcHJvY2VzcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX01NQ19TVEFURV9QUk9HUkFNTUlORyAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDA0VSksICAvKiE8IE1NQyBQcm9ncmFtbWluZyBTdGF0ZSAgICAgICAgICAgICAgICAqLwotICBIQUxfTU1DX1NUQVRFX1JFQ0VJVklORyAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSwgIC8qITwgTU1DIFJlY2VpbnZpbmcgU3RhdGUgICAgICAgICAgICAgICAgICovCi0gIEhBTF9NTUNfU1RBVEVfVFJBTlNGRVIgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwNlUpLCAgLyohPCBNTUMgVHJhbnNmZXJ0IFN0YXRlICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX01NQ19TVEFURV9FUlJPUiAgICAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDBGVSkgICAvKiE8IE1NQyBpcyBpbiBlcnJvciBzdGF0ZSAgICAgICAgICAgICAgICAqLworICBIQUxfTU1DX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVSwgIC8qITwgTU1DIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgb3IgZGlzYWJsZWQgICovCisgIEhBTF9NTUNfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDFVLCAgLyohPCBNTUMgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX01NQ19TVEFURV9USU1FT1VUICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMlUsICAvKiE8IE1NQyBUaW1lb3V0IHN0YXRlICAgICAgICAgICAgICAgICAgICAqLworICBIQUxfTU1DX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzVSwgIC8qITwgTU1DIHByb2Nlc3Mgb25nb2luZyAgICAgICAgICAgICAgICAgICovCisgIEhBTF9NTUNfU1RBVEVfUFJPR1JBTU1JTkcgICAgICAgICAgICA9IDB4MDAwMDAwMDRVLCAgLyohPCBNTUMgUHJvZ3JhbW1pbmcgU3RhdGUgICAgICAgICAgICAgICAgKi8KKyAgSEFMX01NQ19TVEFURV9SRUNFSVZJTkcgICAgICAgICAgICAgID0gMHgwMDAwMDAwNVUsICAvKiE8IE1NQyBSZWNlaW52aW5nIFN0YXRlICAgICAgICAgICAgICAgICAqLworICBIQUxfTU1DX1NUQVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2VSwgIC8qITwgTU1DIFRyYW5zZmVydCBTdGF0ZSAgICAgICAgICAgICAgICAgICovCisgIEhBTF9NTUNfU1RBVEVfRVJST1IgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMEZVICAgLyohPCBNTUMgaXMgaW4gZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgKi8KIH1IQUxfTU1DX1N0YXRlVHlwZURlZjsKIC8qKiAKICAgKiBAfQpAQCAtNjIsMTggKzY0LDE3IEBACiAvKiogQGRlZmdyb3VwIE1NQ19FeHBvcnRlZF9UeXBlc19Hcm91cDIgTU1DIENhcmQgU3RhdGUgZW51bWVyYXRpb24gc3RydWN0dXJlCiAgICogQHsKICAgKi8gICAKLXR5cGVkZWYgZW51bQotewotICBIQUxfTU1DX0NBUkRfUkVBRFkgICAgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwMVUpLCAgLyohPCBDYXJkIHN0YXRlIGlzIHJlYWR5ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX01NQ19DQVJEX0lERU5USUZJQ0FUSU9OICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSwgIC8qITwgQ2FyZCBpcyBpbiBpZGVudGlmaWNhdGlvbiBzdGF0ZSAgICAgICAgICovCi0gIEhBTF9NTUNfQ0FSRF9TVEFOREJZICAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDAzVSksICAvKiE8IENhcmQgaXMgaW4gc3RhbmRieSBzdGF0ZSAgICAgICAgICAgICAgICAqLwotICBIQUxfTU1DX0NBUkRfVFJBTlNGRVIgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwNFUpLCAgLyohPCBDYXJkIGlzIGluIHRyYW5zZmVyIHN0YXRlICAgICAgICAgICAgICAgKi8gIAotICBIQUxfTU1DX0NBUkRfU0VORElORyAgICAgICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwNVUpLCAgLyohPCBDYXJkIGlzIHNlbmRpbmcgYW4gb3BlcmF0aW9uICAgICAgICAgICAgKi8KLSAgSEFMX01NQ19DQVJEX1JFQ0VJVklORyAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSwgIC8qITwgQ2FyZCBpcyByZWNlaXZpbmcgb3BlcmF0aW9uIGluZm9ybWF0aW9uICovCi0gIEhBTF9NTUNfQ0FSRF9QUk9HUkFNTUlORyAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDA3VSksICAvKiE8IENhcmQgaXMgaW4gcHJvZ3JhbW1pbmcgc3RhdGUgICAgICAgICAgICAqLwotICBIQUxfTU1DX0NBUkRfRElTQ09OTkVDVEVEICAgICAgICAgICA9ICgodWludDMyX3QpMHgwMDAwMDAwOFUpLCAgLyohPCBDYXJkIGlzIGRpc2Nvbm5lY3RlZCAgICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX01NQ19DQVJEX0VSUk9SICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwRkZVKSAgIC8qITwgQ2FyZCByZXNwb25zZSBFcnJvciAgICAgICAgICAgICAgICAgICAgICovCi19SEFMX01NQ19DYXJkU3RhdGVUeXBlRGVmOwordHlwZWRlZiB1aW50MzJfdCBIQUxfTU1DX0NhcmRTdGF0ZVR5cGVEZWY7CisKKyNkZWZpbmUgSEFMX01NQ19DQVJEX1JFQURZICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IENhcmQgc3RhdGUgaXMgcmVhZHkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfTU1DX0NBUkRfSURFTlRJRklDQVRJT04gMHgwMDAwMDAwMlUgIC8qITwgQ2FyZCBpcyBpbiBpZGVudGlmaWNhdGlvbiBzdGF0ZSAgICAgICAgICovCisjZGVmaW5lIEhBTF9NTUNfQ0FSRF9TVEFOREJZICAgICAgICAweDAwMDAwMDAzVSAgLyohPCBDYXJkIGlzIGluIHN0YW5kYnkgc3RhdGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX01NQ19DQVJEX1RSQU5TRkVSICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IENhcmQgaXMgaW4gdHJhbnNmZXIgc3RhdGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfTU1DX0NBUkRfU0VORElORyAgICAgICAgMHgwMDAwMDAwNVUgIC8qITwgQ2FyZCBpcyBzZW5kaW5nIGFuIG9wZXJhdGlvbiAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9NTUNfQ0FSRF9SRUNFSVZJTkcgICAgICAweDAwMDAwMDA2VSAgLyohPCBDYXJkIGlzIHJlY2VpdmluZyBvcGVyYXRpb24gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgSEFMX01NQ19DQVJEX1BST0dSQU1NSU5HICAgIDB4MDAwMDAwMDdVICAvKiE8IENhcmQgaXMgaW4gcHJvZ3JhbW1pbmcgc3RhdGUgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfTU1DX0NBUkRfRElTQ09OTkVDVEVEICAgMHgwMDAwMDAwOFUgIC8qITwgQ2FyZCBpcyBkaXNjb25uZWN0ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9NTUNfQ0FSRF9FUlJPUiAgICAgICAgICAweDAwMDAwMEZGVSAgLyohPCBDYXJkIHJlc3BvbnNlIEVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKiAKICAgKiBAfQogICAqLwpAQCAtMTE0LDIzICsxMTUsMjMgQEAKIHR5cGVkZWYgc3RydWN0CiAjZW5kaWYgLyogVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB7Ci0gIE1NQ19UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgIC8qITwgTU1DIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgICAgICAgICAgICovCisgIE1NQ19UeXBlRGVmICAgICAgICAgICAgICAgICAgKkluc3RhbmNlOyAgICAgICAgLyohPCBNTUMgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgKi8KICAgCi0gIE1NQ19Jbml0VHlwZURlZiAgICAgICAgICAgICAgIEluaXQ7ICAgICAgICAgICAgIC8qITwgTU1DIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisgIE1NQ19Jbml0VHlwZURlZiAgICAgICAgICAgICAgSW5pdDsgICAgICAgICAgICAgLyohPCBNTUMgcmVxdWlyZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgKi8KICAgCiAgIEhBTF9Mb2NrVHlwZURlZiAgICAgICAgICAgICAgTG9jazsgICAgICAgICAgICAgLyohPCBNTUMgbG9ja2luZyBvYmplY3QgICAgICAgICAgICAgICAgICAgKi8KICAgCi0gIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgKnBUeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIE1NQyBUeCB0cmFuc2ZlciBCdWZmZXIgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gTU1DIFR4IHRyYW5zZmVyIEJ1ZmZlciAgICAqLwogCiAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgVHhYZmVyU2l6ZTsgICAgICAgLyohPCBNTUMgVHggVHJhbnNmZXIgc2l6ZSAgICAgICAgICAgICAgICAgKi8KIAotICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICpwUnhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBNTUMgUnggdHJhbnNmZXIgQnVmZmVyICAgICovCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIE1NQyBSeCB0cmFuc2ZlciBCdWZmZXIgICAgKi8KIAogICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIFJ4WGZlclNpemU7ICAgICAgIC8qITwgTU1DIFJ4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICAgICovCiAgIAogICBfX0lPIHVpbnQzMl90ICAgICAgICAgICAgICAgIENvbnRleHQ7ICAgICAgICAgIC8qITwgTU1DIHRyYW5zZmVyIGNvbnRleHQgICAgICAgICAgICAgICAgICovCiAgCi0gIF9fSU8gSEFMX01NQ19TdGF0ZVR5cGVEZWYgICAgIFN0YXRlOyAgICAgICAgICAgIC8qITwgTU1DIGNhcmQgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gSEFMX01NQ19TdGF0ZVR5cGVEZWYgICAgU3RhdGU7ICAgICAgICAgICAgLyohPCBNTUMgY2FyZCBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgCiAgIF9fSU8gdWludDMyX3QgICAgICAgICAgICAgICAgRXJyb3JDb2RlOyAgICAgICAgLyohPCBNTUMgQ2FyZCBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgKi8gIAogIApAQCAtMTM4LDEzICsxMzksMTMgQEAKICAgCiAgIERNQV9IYW5kbGVUeXBlRGVmICAgICAgICAgICAgKmhkbWF0eDsgICAgICAgICAgLyohPCBNTUMgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgKi8KICAgCi0gIEhBTF9NTUNfQ2FyZEluZm9UeXBlRGVmICAgICAgIE1tY0NhcmQ7ICAgICAgICAgICAvKiE8IE1NQyBDYXJkIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAqLworICBIQUxfTU1DX0NhcmRJbmZvVHlwZURlZiAgICAgIE1tY0NhcmQ7ICAgICAgICAgIC8qITwgTU1DIENhcmQgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICovCiAKLSAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBDU0RbNF07ICAgICAgICAgICAvKiE8IE1NQyBjYXJkIHNwZWNpZmljIGRhdGEgdGFibGUgICAgICAgICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIENTRFs0VV07ICAgICAgICAgIC8qITwgTU1DIGNhcmQgc3BlY2lmaWMgZGF0YSB0YWJsZSAgICAgICAgICovCiAgIAotICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIENJRFs0XTsgICAgICAgICAgIC8qITwgTU1DIGNhcmQgaWRlbnRpZmljYXRpb24gbnVtYmVyIHRhYmxlICovCi0KLSAgI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBDSURbNFVdOyAgICAgICAgICAvKiE8IE1NQyBjYXJkIGlkZW50aWZpY2F0aW9uIG51bWJlciB0YWJsZSAqLworICAKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spICAgICAgICAgICAgICAgICAoc3RydWN0IF9fTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOwogICB2b2lkICgqIFJ4Q3BsdENhbGxiYWNrKSAgICAgICAgICAgICAgICAgKHN0cnVjdCBfX01NQ19IYW5kbGVUeXBlRGVmICpobW1jKTsKICAgdm9pZCAoKiBFcnJvckNhbGxiYWNrKSAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgX19NTUNfSGFuZGxlVHlwZURlZiAqaG1tYyk7CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgX19JTyB1aW50OF90ICBXcml0ZUJsb2NrUGFQYXJ0aWFsOyAgLyohPCBQYXJ0aWFsIGJsb2NrcyBmb3Igd3JpdGUgYWxsb3dlZCAgICAgICovCiAgIF9fSU8gdWludDhfdCAgUmVzZXJ2ZWQzOyAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBfX0lPIHVpbnQ4X3QgIENvbnRlbnRQcm90ZWN0QXBwbGk7ICAvKiE8IENvbnRlbnQgcHJvdGVjdGlvbiBhcHBsaWNhdGlvbiAgICAgICAgKi8KLSAgX19JTyB1aW50OF90ICBGaWxlRm9ybWF0R3JvdW9wOyAgICAgLyohPCBGaWxlIGZvcm1hdCBncm91cCAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDhfdCAgRmlsZUZvcm1hdEdyb3VwOyAgICAgIC8qITwgRmlsZSBmb3JtYXQgZ3JvdXAgICAgICAgICAgICAgICAgICAgICAqLwogICBfX0lPIHVpbnQ4X3QgIENvcHlGbGFnOyAgICAgICAgICAgICAvKiE8IENvcHkgZmxhZyAoT1RQKSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgX19JTyB1aW50OF90ICBQZXJtV3JQcm90ZWN0OyAgICAgICAgLyohPCBQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdGlvbiAgICAgICAgICAgICovCiAgIF9fSU8gdWludDhfdCAgVGVtcFdyUHJvdGVjdDsgICAgICAgIC8qITwgVGVtcG9yYXJ5IHdyaXRlIHByb3RlY3Rpb24gICAgICAgICAgICAqLwpAQCAtMjI3LDggKzIyOCw5IEBACiAvKiogCiAgICogQH0KICAgKi8KKwogI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKLS8qKiBAZGVmZ3JvdXAgTU1DX0V4cG9ydGVkX1R5cGVzX0dyb3VwNiBNTUMgQ2FsbGJhY2sgSUQgZW51bWVyYXRpb24gZGVmaW5pdGlvbgorLyoqIEBkZWZncm91cCBNTUNfRXhwb3J0ZWRfVHlwZXNfR3JvdXA2IE1NQyBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uIAogICAqIEB7CiAgICovCiB0eXBlZGVmIGVudW0KQEAgLTI0MSwxNSArMjQzLDE1IEBACiAgIEhBTF9NTUNfTVNQX0lOSVRfQ0JfSUQgICAgICAgICAgICAgICAgPSAweDEwVSwgIC8qITwgTU1DIE1zcEluaXQgQ2FsbGJhY2sgSUQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgSEFMX01NQ19NU1BfREVJTklUX0NCX0lEICAgICAgICAgICAgICA9IDB4MTFVICAgLyohPCBNTUMgTXNwRGVJbml0IENhbGxiYWNrIElEICAgICAgICAgICAgICAgICAgICAgICAqLwogfUhBTF9NTUNfQ2FsbGJhY2tJRFR5cGVEZWY7Ci0vKioKKy8qKiAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIE1NQ19FeHBvcnRlZF9UeXBlc19Hcm91cDcgTU1DIENhbGxiYWNrIHBvaW50ZXIgZGVmaW5pdGlvbgorLyoqIEBkZWZncm91cCBNTUNfRXhwb3J0ZWRfVHlwZXNfR3JvdXA3IE1NQyBDYWxsYmFjayBwb2ludGVyIGRlZmluaXRpb24gCiAgICogQHsKICAgKi8KIHR5cGVkZWYgdm9pZCAoKnBNTUNfQ2FsbGJhY2tUeXBlRGVmKSAgICAgICAgICAgKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKTsKLS8qKgorLyoqIAogICAqIEB9CiAgICovCiAjZW5kaWYKQEAgLTI2Miw4ICsyNjQsNyBAQAogICAqIEB7CiAgICovCiAKLSNkZWZpbmUgQkxPQ0tTSVpFICAgKCh1aW50MzJfdCk1MTJVKSAgICAgICAgIC8qITwgQmxvY2sgc2l6ZSBpcyA1MTIgYnl0ZXMgKi8KLSNkZWZpbmUgQ0FQQUNJVFkgICAgKCh1aW50MzJfdCkweDgwMDAwMDAwVSkgIC8qITwgMiBHIGJ5dGVzIGNvbnN0YW50ICAgICAgKi8KKyNkZWZpbmUgTU1DX0JMT0NLU0laRSAgICAgICAgICAgICAgNTEyVSAgLyohPCBCbG9jayBzaXplIGlzIDUxMiBieXRlcyAqLwogCiAvKiogQGRlZmdyb3VwIE1NQ19FeHBvcnRlZF9Db25zdGFuc3RzX0dyb3VwMSBNTUMgRXJyb3Igc3RhdHVzIGVudW1lcmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uIAogICAqIEB7CkBAIC0zMDQsNiArMzA1LDcgQEAKICNkZWZpbmUgSEFMX01NQ19FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgICAgU0RNTUNfRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvciB3aGVuIHRyYW5zZmVyIHByb2Nlc3MgaXMgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAogI2RlZmluZSBIQUxfTU1DX0VSUk9SX0RNQSAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19FUlJPUl9ETUEgICAgICAgICAgICAgICAgICAgICAvKiE8IEVycm9yIHdoaWxlIERNQSB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSEFMX01NQ19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgU0RNTUNfRVJST1JfVElNRU9VVCAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAjZGVmaW5lIEhBTF9NTUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgICAgICAgIFNETU1DX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICAgIC8qITwgSW52YWxpZCBjYWxsYmFjayBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2VuZGlmCkBAIC0zMTQsMTMgKzMxNiwxMyBAQAogLyoqIEBkZWZncm91cCBNTUNfRXhwb3J0ZWRfQ29uc3RhbnN0c19Hcm91cDIgTU1DIGNvbnRleHQgZW51bWVyYXRpb24KICAgKiBAewogICAqLyAKLSNkZWZpbmUgICBNTUNfQ09OVEVYVF9OT05FICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgIE1NQ19DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpICAvKiE8IFJlYWQgc2luZ2xlIGJsb2NrIG9wZXJhdGlvbiAgICAgICovCi0jZGVmaW5lICAgTU1DX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSyAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgIC8qITwgUmVhZCBtdWx0aXBsZSBibG9ja3Mgb3BlcmF0aW9uICAgKi8KLSNkZWZpbmUgICBNTUNfQ09OVEVYVF9XUklURV9TSU5HTEVfQkxPQ0sgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgLyohPCBXcml0ZSBzaW5nbGUgYmxvY2sgb3BlcmF0aW9uICAgICAqLwotI2RlZmluZSAgIE1NQ19DT05URVhUX1dSSVRFX01VTFRJUExFX0JMT0NLICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAvKiE8IFdyaXRlIG11bHRpcGxlIGJsb2NrcyBvcGVyYXRpb24gICovCi0jZGVmaW5lICAgTU1DX0NPTlRFWFRfSVQgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgIC8qITwgUHJvY2VzcyBpbiBJbnRlcnJ1cHQgbW9kZSAgICAgICAgKi8KLSNkZWZpbmUgICBNTUNfQ09OVEVYVF9ETUEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAgLyohPCBQcm9jZXNzIGluIERNQSBtb2RlICAgICAgICAgICAgICAqLyAgCisjZGVmaW5lICAgTU1DX0NPTlRFWFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgICBNTUNfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgLyohPCBSZWFkIHNpbmdsZSBibG9jayBvcGVyYXRpb24gICAgICAqLworI2RlZmluZSAgIE1NQ19DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0sgICAgICAgICAgICAgMHgwMDAwMDAwMlUgICAvKiE8IFJlYWQgbXVsdGlwbGUgYmxvY2tzIG9wZXJhdGlvbiAgICovCisjZGVmaW5lICAgTU1DX0NPTlRFWFRfV1JJVEVfU0lOR0xFX0JMT0NLICAgICAgICAgICAgICAweDAwMDAwMDEwVSAgIC8qITwgV3JpdGUgc2luZ2xlIGJsb2NrIG9wZXJhdGlvbiAgICAgKi8KKyNkZWZpbmUgICBNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSyAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgLyohPCBXcml0ZSBtdWx0aXBsZSBibG9ja3Mgb3BlcmF0aW9uICAqLworI2RlZmluZSAgIE1NQ19DT05URVhUX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAvKiE8IFByb2Nlc3MgaW4gSW50ZXJydXB0IG1vZGUgICAgICAgICovCisjZGVmaW5lICAgTU1DX0NPTlRFWFRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwVSAgIC8qITwgUHJvY2VzcyBpbiBETUEgbW9kZSAgICAgICAgICAgICAgKi8KIAogLyoqCiAgICogQH0KQEAgLTM0NCw4ICszNDYsOSBAQAogLyoqIEBkZWZncm91cCBNTUNfRXhwb3J0ZWRfQ29uc3RhbnN0c19Hcm91cDQgTU1DIE1lbW9yeSBDYXJkcwogICAqIEB7CiAgICovCi0jZGVmaW5lICBNTUNfSElHSF9WT0xUQUdFX0NBUkQgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lICBNTUNfRFVBTF9WT0xUQUdFX0NBUkQgICAgICgodWludDMyX3QpMHgwMDAwMDAwMVUpCisjZGVmaW5lICBNTUNfTE9XX0NBUEFDSVRZX0NBUkQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCBNTUMgQ2FyZCBDYXBhY2l0eSA8PTJHYnl0ZXMgICAqLworI2RlZmluZSAgTU1DX0hJR0hfQ0FQQUNJVFlfQ0FSRCAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgIC8qITwgTU1DIENhcmQgQ2FwYWNpdHkgPjJHYnl0ZXMgYW5kIDwyVGJ5dGVzICAgKi8KKwogLyoqCiAgICogQH0KICAgKi8KQEAgLTM5OSw4ICs0MDIsOCBAQAogIAogLyoqCiAgICogQGJyaWVmICBFbmFibGUgdGhlIE1NQyBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBNTUMgSGFuZGxlICAKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogTU1DIEhhbmRsZSAgCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC00MTAsNyArNDEzLDcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQKQEAgLTQzMCw4ICs0MzMsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgdGhlIE1NQyBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBNTUMgSGFuZGxlICAgCi0gICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU0RNTUMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBNTUMgSGFuZGxlICAgCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKQEAgLTQ0MSw3ICs0NDQsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBEQVRBQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzIGludGVycnVwdApAQCAtNDYxLDggKzQ2NCw4IEBACiAKIC8qKgogICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIE1NQyBmbGFnIGlzIHNldCBvciBub3QuIAotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBNTUMgSGFuZGxlICAgCi0gICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suIAorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogTU1DIEhhbmRsZSAgIAorICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQpAQCAtNDcyLDcgKzQ3NSw3IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvcgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MKQEAgLTQ5Miw4ICs0OTUsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIENsZWFyIHRoZSBNTUMncyBwZW5kaW5nIGZsYWdzLgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBNTUMgSGFuZGxlICAKLSAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gIAorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogTU1DIEhhbmRsZSAgCisgICogQHBhcmFtICBfX0ZMQUdfXzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiAgCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpCkBAIC01MDMsNyArNTA2LDcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpCi0gICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfU0RJT0lUOiAgIFNEIEkvTyBpbnRlcnJ1cHQgcmVjZWl2ZWQKICAgKiBAcmV0dmFsIE5vbmUKQEAgLTUxMiw4ICs1MTUsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBNTUMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIE1NQyBIYW5kbGUgICAKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiAKKyAgKiBAcGFyYW0gIF9fSEFORExFX186IE1NQyBIYW5kbGUgICAKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgU0RNTUMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKQEAgLTUyMyw3ICs1MjYsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBEQVRBQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzIGludGVycnVwdApAQCAtNTM3LDE0ICs1NDAsMTQgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfVFhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHRyYW5zbWl0IEZJRk8gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiByZWNlaXZlIEZJRk8gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdAotICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBTRCBJVCAoU0VUIG9yIFJFU0VUKS4KKyAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgTU1DIElUIChTRVQgb3IgUkVTRVQpLgogICAqLwogI2RlZmluZSBfX0hBTF9NTUNfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIF9fU0RNTUNfR0VUX0lUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UsIChfX0lOVEVSUlVQVF9fKSkKIAogLyoqCiAgICogQGJyaWVmICBDbGVhciB0aGUgTU1DJ3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gTU1DIEhhbmRsZQotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4gCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBNTUMgSGFuZGxlCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdApAQCAtNTU0LDcgKzU1NywxMiBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNETU1DX0RDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBEQVRBQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQkNLRU5EOiAgICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEZJRk9IRTogICBUcmFuc21pdCBGSUZPIEhhbGYgRW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYRklGT0hGOiAgIFJlY2VpdmUgRklGTyBIYWxmIEZ1bGwgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYRklGT0Y6ICAgIFJlY2VpdmUgRklGTyBmdWxsIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEZJRk9FOiAgICBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KQEAgLTU3Nyw2ICs1ODUsNyBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19EZUluaXQgKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKTsKIHZvaWQgSEFMX01NQ19Nc3BJbml0KE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKTsKIHZvaWQgSEFMX01NQ19Nc3BEZUluaXQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOworCiAvKioKICAgKiBAfQogICAqLwpAQCAtNjI0LDkgKzYzMyw5IEBACiAgICogQHsKICAgKi8KIEhBTF9NTUNfQ2FyZFN0YXRlVHlwZURlZiBIQUxfTU1DX0dldENhcmRTdGF0ZShNTUNfSGFuZGxlVHlwZURlZiAqaG1tYyk7Ci1IQUxfU3RhdHVzVHlwZURlZiAgICAgICAgSEFMX01NQ19HZXRDYXJkQ0lEKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhcmRDSURUeXBlRGVmICpwQ0lEKTsKLUhBTF9TdGF0dXNUeXBlRGVmICAgICAgICBIQUxfTU1DX0dldENhcmRDU0QoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMsIEhBTF9NTUNfQ2FyZENTRFR5cGVEZWYgKnBDU0QpOwotSEFMX1N0YXR1c1R5cGVEZWYgICAgICAgIEhBTF9NTUNfR2V0Q2FyZEluZm8oTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMsIEhBTF9NTUNfQ2FyZEluZm9UeXBlRGVmICpwQ2FyZEluZm8pOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19HZXRDYXJkQ0lEKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhcmRDSURUeXBlRGVmICpwQ0lEKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfR2V0Q2FyZENTRChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgSEFMX01NQ19DYXJkQ1NEVHlwZURlZiAqcENTRCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX0dldENhcmRJbmZvKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhcmRJbmZvVHlwZURlZiAqcENhcmRJbmZvKTsKIC8qKgogICAqIEB9CiAgICovCkBAIC03MjUsMTIgKzczNCwxMiBAQAogICAqIEB9CiAgICovCiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAorI2VuZGlmIC8qIFNETU1DMSAqLwogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfSEFMX01NQ19IICovIAorI2VuZGlmIC8qIFNUTTMyRjd4eF9IQUxfTU1DX0ggKi8gCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9wY2QuaCBiL0luYy9zdG0zMmY3eHhfaGFsX3BjZC5oCmluZGV4IDRhZmNmNDEuLjY1MGRmZDUgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX3BjZC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3BjZC5oCkBAIC05NiwxNiArOTYsMTYgQEAKIHR5cGVkZWYgc3RydWN0CiAjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB7Ci0gIFBDRF9UeXBlRGVmICAgICAgICAgICAgICpJbnN0YW5jZTsgICAvKiE8IFJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLSAgUENEX0luaXRUeXBlRGVmICAgICAgICAgSW5pdDsgICAgICAgIC8qITwgUENEIHJlcXVpcmVkIHBhcmFtZXRlcnMgICAgICAgICAgICAqLwotICBfX0lPIHVpbnQ4X3QgICAgICAgICAgICBVU0JfQWRkcmVzczsgLyohPCBVU0IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIElOX2VwWzE2XTsgICAvKiE8IElOIGVuZHBvaW50IHBhcmFtZXRlcnMgICAgICAgICAgICAgKi8KLSAgUENEX0VQVHlwZURlZiAgICAgICAgICAgT1VUX2VwWzE2XTsgIC8qITwgT1VUIGVuZHBvaW50IHBhcmFtZXRlcnMgICAgICAgICAgICAqLwotICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBQQ0QgcGVyaXBoZXJhbCBzdGF0dXMgICAgICAgICAgICAgICovCi0gIF9fSU8gUENEX1N0YXRlVHlwZURlZiAgIFN0YXRlOyAgICAgICAvKiE8IFBDRCBjb21tdW5pY2F0aW9uIHN0YXRlICAgICAgICAgICAgKi8KLSAgX19JTyAgdWludDMyX3QgICAgICAgICAgRXJyb3JDb2RlOyAgIC8qITwgUENEIEVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICB1aW50MzJfdCAgICAgICAgICAgICAgICBTZXR1cFsxMl07ICAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgICovCi0gIFBDRF9MUE1fU3RhdGVUeXBlRGVmICAgIExQTV9TdGF0ZTsgICAvKiE8IExQTSBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENEX1R5cGVEZWYgICAgICAgICAgICAgKkluc3RhbmNlOyAgIC8qITwgUmVnaXN0ZXIgYmFzZSBhZGRyZXNzICAgICAgICAgICAgICovCisgIFBDRF9Jbml0VHlwZURlZiAgICAgICAgIEluaXQ7ICAgICAgICAvKiE8IFBDRCByZXF1aXJlZCBwYXJhbWV0ZXJzICAgICAgICAgICAqLworICBfX0lPIHVpbnQ4X3QgICAgICAgICAgICBVU0JfQWRkcmVzczsgLyohPCBVU0IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgUENEX0VQVHlwZURlZiAgICAgICAgICAgSU5fZXBbMTZdOyAgIC8qITwgSU4gZW5kcG9pbnQgcGFyYW1ldGVycyAgICAgICAgICAgICovCisgIFBDRF9FUFR5cGVEZWYgICAgICAgICAgIE9VVF9lcFsxNl07ICAvKiE8IE9VVCBlbmRwb2ludCBwYXJhbWV0ZXJzICAgICAgICAgICAqLworICBIQUxfTG9ja1R5cGVEZWYgICAgICAgICBMb2NrOyAgICAgICAgLyohPCBQQ0QgcGVyaXBoZXJhbCBzdGF0dXMgICAgICAgICAgICAgKi8KKyAgX19JTyBQQ0RfU3RhdGVUeXBlRGVmICAgU3RhdGU7ICAgICAgIC8qITwgUENEIGNvbW11bmljYXRpb24gc3RhdGUgICAgICAgICAgICovCisgIF9fSU8gIHVpbnQzMl90ICAgICAgICAgIEVycm9yQ29kZTsgICAvKiE8IFBDRCBFcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAqLworICB1aW50MzJfdCAgICAgICAgICAgICAgICBTZXR1cFsxMl07ICAgLyohPCBTZXR1cCBwYWNrZXQgYnVmZmVyICAgICAgICAgICAgICAgKi8KKyAgUENEX0xQTV9TdGF0ZVR5cGVEZWYgICAgTFBNX1N0YXRlOyAgIC8qITwgTFBNIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIEJFU0w7CiAKIApAQCAtMTQ4LDkgKzE0OCw5IEBACiAvKiogQGRlZmdyb3VwIFBDRF9TcGVlZCBQQ0QgU3BlZWQKICAgKiBAewogICAqLwotI2RlZmluZSBQQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIDBVCi0jZGVmaW5lIFBDRF9TUEVFRF9ISUdIX0lOX0ZVTEwgICAgICAgMVUKLSNkZWZpbmUgUENEX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAyVQorI2RlZmluZSBQQ0RfU1BFRURfSElHSCAgICAgICAgICAgICAgIFVTQkRfSFNfU1BFRUQKKyNkZWZpbmUgUENEX1NQRUVEX0hJR0hfSU5fRlVMTCAgICAgICBVU0JEX0hTSU5GU19TUEVFRAorI2RlZmluZSBQQ0RfU1BFRURfRlVMTCAgICAgICAgICAgICAgIFVTQkRfRlNfU1BFRUQKIC8qKgogICAqIEB9CiAgICovCkBAIC0yMDcsMjAgKzIwNywyMCBAQAogI2RlZmluZSBfX0hBTF9VU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0dFVF9GTEFHKCkgICAgIEVYVEktPlBSICYgKFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfTElORSkKICNkZWZpbmUgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9DTEVBUl9GTEFHKCkgICBFWFRJLT5QUiA9IChVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0xJTkUpCiAKLSNkZWZpbmUgX19IQUxfVVNCX09UR19IU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIF9fSEFMX1VTQl9PVEdfSFNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPkZUU1IgJj0gfihVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0xJTkUpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgfD0gVVNCX09UR19IU19XQUtFVVBfRVhUSV9MSU5FOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgfD0gVVNCX09UR19IU19XQUtFVVBfRVhUSV9MSU5FOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQogI2RlZmluZSBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0VOQUJMRV9JVCgpICAgIEVYVEktPklNUiB8PSBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0xJTkUKICNkZWZpbmUgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9ESVNBQkxFX0lUKCkgICBFWFRJLT5JTVIgJj0gfihVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0xJTkUpCiAjZGVmaW5lIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfR0VUX0ZMQUcoKSAgICAgRVhUSS0+UFIgJiAoVVNCX09UR19GU19XQUtFVVBfRVhUSV9MSU5FKQogI2RlZmluZSBfX0hBTF9VU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0NMRUFSX0ZMQUcoKSAgIEVYVEktPlBSID0gVVNCX09UR19GU19XQUtFVVBfRVhUSV9MSU5FCiAKLSNkZWZpbmUgX19IQUxfVVNCX09UR19GU19XQUtFVVBfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIF9fSEFMX1VTQl9PVEdfRlNfV0FLRVVQX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPkZUU1IgJj0gfihVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0xJTkUpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgfD0gVVNCX09UR19GU19XQUtFVVBfRVhUSV9MSU5FOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEktPlJUU1IgfD0gVVNCX09UR19GU19XQUtFVVBfRVhUSV9MSU5FOyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQogI2VuZGlmIC8qIGRlZmluZWQgKFVTQl9PVEdfRlMpIHx8IGRlZmluZWQgKFVTQl9PVEdfSFMpICovCiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogICBIQUxfUENEX1NVU1BFTkRfQ0JfSUQgICAgICA9IDB4MDQsICAgICAgLyohPCBVU0IgUENEIFN1c3BlbmQgY2FsbGJhY2sgSUQgICAgICAqLwogICBIQUxfUENEX1JFU1VNRV9DQl9JRCAgICAgICA9IDB4MDUsICAgICAgLyohPCBVU0IgUENEIFJlc3VtZSBjYWxsYmFjayBJRCAgICAgICAqLwogICBIQUxfUENEX0NPTk5FQ1RfQ0JfSUQgICAgICA9IDB4MDYsICAgICAgLyohPCBVU0IgUENEIENvbm5lY3QgY2FsbGJhY2sgSUQgICAgICAqLwotICBIQUxfUENEX0RJU0NPTk5FQ1RfQ0JfSUQgID0gMHgwNywgICAgICAvKiE8IFVTQiBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRCAgICovCisgIEhBTF9QQ0RfRElTQ09OTkVDVF9DQl9JRCAgID0gMHgwNywgICAgICAvKiE8IFVTQiBQQ0QgRGlzY29ubmVjdCBjYWxsYmFjayBJRCAgICovCiAKICAgSEFMX1BDRF9NU1BJTklUX0NCX0lEICAgICAgPSAweDA4LCAgICAgIC8qITwgVVNCIFBDRCBNc3BJbml0IGNhbGxiYWNrIElEICAgICAgKi8KICAgSEFMX1BDRF9NU1BERUlOSVRfQ0JfSUQgICAgPSAweDA5ICAgICAgIC8qITwgVVNCIFBDRCBNc3BEZUluaXQgY2FsbGJhY2sgSUQgICAgKi8KQEAgLTM3MSwxNCArMzcxLDYgQEAKICAgKiBAewogICAqLwogI2lmIGRlZmluZWQgKFVTQl9PVEdfRlMpIHx8IGRlZmluZWQgKFVTQl9PVEdfSFMpCi0jZGVmaW5lIFVTQl9PVEdfRlNfV0FLRVVQX0VYVElfUklTSU5HX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOFUKLSNkZWZpbmUgVVNCX09UR19GU19XQUtFVVBfRVhUSV9GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDVQotI2RlZmluZSBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX1JJU0lOR19GQUxMSU5HX0VER0UgICAgICAgICAgICAgICAgICAgIDB4MTBVCi0KLSNkZWZpbmUgVVNCX09UR19IU19XQUtFVVBfRVhUSV9SSVNJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4VQotI2RlZmluZSBVU0JfT1RHX0hTX1dBS0VVUF9FWFRJX0ZBTExJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MENVCi0jZGVmaW5lIFVTQl9PVEdfSFNfV0FLRVVQX0VYVElfUklTSU5HX0ZBTExJTkdfRURHRSAgICAgICAgICAgICAgICAgICAgMHgxMFUKLQogI2RlZmluZSBVU0JfT1RHX0ZTX1dBS0VVUF9FWFRJX0xJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFVIDw8IDE4KSAgLyohPCBVU0IgRlMgRVhUSSBMaW5lIFdha2VVcCBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgVVNCX09UR19IU19XQUtFVVBfRVhUSV9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxVSA8PCAyMCkgIC8qITwgVVNCIEhTIEVYVEkgTGluZSBXYWtlVXAgSW50ZXJydXB0ICovCiAjZW5kaWYgLyogZGVmaW5lZCAoVVNCX09UR19GUykgfHwgZGVmaW5lZCAoVVNCX09UR19IUykgKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX3FzcGkuaCBiL0luYy9zdG0zMmY3eHhfaGFsX3FzcGkuaAppbmRleCA3OGRlNTc0Li44ZDdmNTIwIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9xc3BpLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfcXNwaS5oCkBAIC02LDIwICs2LDIwIEBACiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KICAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgICoKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKLSAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICovCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fU1RNMzJGN3h4X0hBTF9RU1BJX0gKLSNkZWZpbmUgX19TVE0zMkY3eHhfSEFMX1FTUElfSAorI2lmbmRlZiBTVE0zMkY3eHhfSEFMX1FTUElfSAorI2RlZmluZSBTVE0zMkY3eHhfSEFMX1FTUElfSAogCiAjaWZkZWYgX19jcGx1c3BsdXMKICBleHRlcm4gIkMiIHsKQEAgLTI4LDY0ICsyOCw1OCBAQAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsX2RlZi5oIgogCisjaWYgZGVmaW5lZChRVUFEU1BJKQorCiAvKiogQGFkZHRvZ3JvdXAgU1RNMzJGN3h4X0hBTF9Ecml2ZXIKICAgKiBAewogICAqLwogCiAvKiogQGFkZHRvZ3JvdXAgUVNQSQogICAqIEB7Ci0gICovIAorICAqLwogCi0vKiBFeHBvcnRlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKKy8qIEV4cG9ydGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfVHlwZXMgUVNQSSBFeHBvcnRlZCBUeXBlcwogICAqIEB7CiAgICovCi0gIAotLyoqIAotICAqIEBicmllZiAgUVNQSSBJbml0IHN0cnVjdHVyZSBkZWZpbml0aW9uICAKLSAgKi8KIAorLyoqCisgICogQGJyaWVmICBRU1BJIEluaXQgc3RydWN0dXJlIGRlZmluaXRpb24KKyAgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgIHVpbnQzMl90IENsb2NrUHJlc2NhbGVyOyAgICAgLyogU3BlY2lmaWVzIHRoZSBwcmVzY2FsZXIgZmFjdG9yIGZvciBnZW5lcmF0aW5nIGNsb2NrIGJhc2VkIG9uIHRoZSBBSEIgY2xvY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMjU1ICovIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI1NSAqLwogICB1aW50MzJfdCBGaWZvVGhyZXNob2xkOyAgICAgIC8qIFNwZWNpZmllcyB0aGUgdGhyZXNob2xkIG51bWJlciBvZiBieXRlcyBpbiB0aGUgRklGTyAodXNlZCBvbmx5IGluIGluZGlyZWN0IG1vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCAzMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB1aW50MzJfdCBTYW1wbGVTaGlmdGluZzsgICAgIC8qIFNwZWNpZmllcyB0aGUgU2FtcGxlIFNoaWZ0LiBUaGUgZGF0YSBpcyBzYW1wbGVkIDEvMiBjbG9jayBjeWNsZSBkZWxheSBsYXRlciB0byAKKyAgdWludDMyX3QgU2FtcGxlU2hpZnRpbmc7ICAgICAvKiBTcGVjaWZpZXMgdGhlIFNhbXBsZSBTaGlmdC4gVGhlIGRhdGEgaXMgc2FtcGxlZCAxLzIgY2xvY2sgY3ljbGUgZGVsYXkgbGF0ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlIGluIGFjY291bnQgZXh0ZXJuYWwgc2lnbmFsIGRlbGF5cy4gKEl0IHNob3VsZCBiZSBRU1BJX1NBTVBMRV9TSElGVElOR19OT05FIGluIEREUiBtb2RlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9TYW1wbGVTaGlmdGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB1aW50MzJfdCBGbGFzaFNpemU7ICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgRmxhc2ggU2l6ZS4gRmxhc2hTaXplKzEgaXMgZWZmZWN0aXZlbHkgdGhlIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgdG8gYWRkcmVzcyB0aGUgZmxhc2ggbWVtb3J5LiBUaGUgZmxhc2ggY2FwYWNpdHkgY2FuIGJlIHVwIHRvIDRHQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzc2VkIHVzaW5nIDMyIGJpdHMpIGluIGluZGlyZWN0IG1vZGUsIGJ1dCB0aGUgYWRkcmVzc2FibGUgc3BhY2UgaW4gCisgIHVpbnQzMl90IEZsYXNoU2l6ZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBGbGFzaCBTaXplLiBGbGFzaFNpemUrMSBpcyBlZmZlY3RpdmVseSB0aGUgbnVtYmVyIG9mIGFkZHJlc3MgYml0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGFkZHJlc3MgdGhlIGZsYXNoIG1lbW9yeS4gVGhlIGZsYXNoIGNhcGFjaXR5IGNhbiBiZSB1cCB0byA0R0IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzc2VkIHVzaW5nIDMyIGJpdHMpIGluIGluZGlyZWN0IG1vZGUsIGJ1dCB0aGUgYWRkcmVzc2FibGUgc3BhY2UgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnktbWFwcGVkIG1vZGUgaXMgbGltaXRlZCB0byAyNTZNQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDMxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHVpbnQzMl90IENoaXBTZWxlY3RIaWdoVGltZTsgLyogU3BlY2lmaWVzIHRoZSBDaGlwIFNlbGVjdCBIaWdoIFRpbWUuIENoaXBTZWxlY3RIaWdoVGltZSsxIGRlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIAorICB1aW50MzJfdCBDaGlwU2VsZWN0SGlnaFRpbWU7IC8qIFNwZWNpZmllcyB0aGUgQ2hpcCBTZWxlY3QgSGlnaCBUaW1lLiBDaGlwU2VsZWN0SGlnaFRpbWUrMSBkZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNsb2NrIGN5Y2xlcyB3aGljaCB0aGUgY2hpcCBzZWxlY3QgbXVzdCByZW1haW4gaGlnaCBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9DaGlwU2VsZWN0SGlnaFRpbWUgKi8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2hpcFNlbGVjdEhpZ2hUaW1lICovCiAgIHVpbnQzMl90IENsb2NrTW9kZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBDbG9jayBNb2RlLiBJdCBpbmRpY2F0ZXMgdGhlIGxldmVsIHRoYXQgY2xvY2sgdGFrZXMgYmV0d2VlbiBjb21tYW5kcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQ2xvY2tNb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgdWludDMyX3QgRmxhc2hJRDsgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIEZsYXNoIHdoaWNoIHdpbGwgYmUgdXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRmxhc2hfU2VsZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgdWludDMyX3QgRHVhbEZsYXNoOyAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIER1YWwgRmxhc2ggTW9kZSBTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9EdWFsRmxhc2hfTW9kZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX0R1YWxGbGFzaF9Nb2RlICovCiB9UVNQSV9Jbml0VHlwZURlZjsKIAotLyoqIAotICAqIEBicmllZiBIQUwgUVNQSSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24gIAotICAqLyAKKy8qKgorICAqIEBicmllZiBIQUwgUVNQSSBTdGF0ZSBzdHJ1Y3R1cmVzIGRlZmluaXRpb24KKyAgKi8KIHR5cGVkZWYgZW51bQogewogICBIQUxfUVNQSV9TVEFURV9SRVNFVCAgICAgICAgICAgICA9IDB4MDBVLCAgICAvKiE8IFBlcmlwaGVyYWwgbm90IGluaXRpYWxpemVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEhBTF9RU1BJX1NUQVRFX1JFQURZICAgICAgICAgICAgID0gMHgwMVUsICAgIC8qITwgUGVyaXBoZXJhbCBpbml0aWFsaXplZCBhbmQgcmVhZHkgZm9yIHVzZSAgICAgICAgICAgICAgKi8KLSAgSEFMX1FTUElfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBQZXJpcGhlcmFsIGluIGluZGlyZWN0IG1vZGUgYW5kIGJ1c3kgICAgICAgICAgICAgICAgICAqLyAKLSAgSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9UWCAgPSAweDEyVSwgICAgLyohPCBQZXJpcGhlcmFsIGluIGluZGlyZWN0IG1vZGUgd2l0aCB0cmFuc21pc3Npb24gb25nb2luZyAqLyAKKyAgSEFMX1FTUElfU1RBVEVfQlVTWSAgICAgICAgICAgICAgPSAweDAyVSwgICAgLyohPCBQZXJpcGhlcmFsIGluIGluZGlyZWN0IG1vZGUgYW5kIGJ1c3kgICAgICAgICAgICAgICAgICAqLworICBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYICA9IDB4MTJVLCAgICAvKiE8IFBlcmlwaGVyYWwgaW4gaW5kaXJlY3QgbW9kZSB3aXRoIHRyYW5zbWlzc2lvbiBvbmdvaW5nICovCiAgIEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlggID0gMHgyMlUsICAgIC8qITwgUGVyaXBoZXJhbCBpbiBpbmRpcmVjdCBtb2RlIHdpdGggcmVjZXB0aW9uIG9uZ29pbmcgICAgKi8KICAgSEFMX1FTUElfU1RBVEVfQlVTWV9BVVRPX1BPTExJTkcgPSAweDQyVSwgICAgLyohPCBQZXJpcGhlcmFsIGluIGF1dG8gcG9sbGluZyBtb2RlIG9uZ29pbmcgICAgICAgICAgICAgICAqLwogICBIQUxfUVNQSV9TVEFURV9CVVNZX01FTV9NQVBQRUQgICA9IDB4ODJVLCAgICAvKiE8IFBlcmlwaGVyYWwgaW4gbWVtb3J5IG1hcHBlZCBtb2RlIG9uZ29pbmcgICAgICAgICAgICAgICovCkBAIC05Myw5ICs4Nyw5IEBACiAgIEhBTF9RU1BJX1NUQVRFX0VSUk9SICAgICAgICAgICAgID0gMHgwNFUgICAgIC8qITwgUGVyaXBoZXJhbCBpbiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIH1IQUxfUVNQSV9TdGF0ZVR5cGVEZWY7CiAKLS8qKiAKLSAgKiBAYnJpZWYgIFFTUEkgSGFuZGxlIFN0cnVjdHVyZSBkZWZpbml0aW9uICAKLSAgKi8gIAorLyoqCisgICogQGJyaWVmICBRU1BJIEhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICAqLwogI2lmIChVU0VfSEFMX1FTUElfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiB0eXBlZGVmIHN0cnVjdCBfX1FTUElfSGFuZGxlVHlwZURlZgogI2Vsc2UKQEAgLTEzMiw4ICsxMjYsOCBAQAogI2VuZGlmCiB9UVNQSV9IYW5kbGVUeXBlRGVmOwogCi0vKiogCi0gICogQGJyaWVmICBRU1BJIENvbW1hbmQgc3RydWN0dXJlIGRlZmluaXRpb24gIAorLyoqCisgICogQGJyaWVmICBRU1BJIENvbW1hbmQgc3RydWN0dXJlIGRlZmluaXRpb24KICAgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xNTcsMjYgKzE1MSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9BbHRlcm5hdGVCeXRlc01vZGUgKi8KICAgdWludDMyX3QgRGF0YU1vZGU7ICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIERhdGEgTW9kZSAodXNlZCBmb3IgZHVtbXkgY3ljbGVzIGFuZCBkYXRhIHBoYXNlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRGF0YU1vZGUgKi8KLSAgdWludDMyX3QgTmJEYXRhOyAgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkYXRhIHRvIHRyYW5zZmVyLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAoMCBtZWFucyB1bmRlZmluZWQgbGVuZ3RoIAorICB1aW50MzJfdCBOYkRhdGE7ICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNmZXIuIChUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRkZGRkYgKDAgbWVhbnMgdW5kZWZpbmVkIGxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIGVuZCBvZiBtZW1vcnkpKi8KICAgdWludDMyX3QgRGRyTW9kZTsgICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIGRvdWJsZSBkYXRhIHJhdGUgbW9kZSBmb3IgYWRkcmVzcywgYWx0ZXJuYXRlIGJ5dGUgYW5kIGRhdGEgcGhhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRGRyTW9kZSAqLwotICB1aW50MzJfdCBEZHJIb2xkSGFsZkN5Y2xlOyAgIC8qIFNwZWNpZmllcyB0aGUgRERSIGhvbGQgaGFsZiBjeWNsZS4gSXQgZGVsYXlzIHRoZSBkYXRhIG91dHB1dCBieSBvbmUgaGFsZiBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2xvY2sgaW4gRERSIG1vZGUuCisgIHVpbnQzMl90IERkckhvbGRIYWxmQ3ljbGU7ICAgLyogU3BlY2lmaWVzIGlmIHRoZSBERFIgaG9sZCBpcyBlbmFibGVkLiBXaGVuIGVuYWJsZWQgaXQgZGVsYXlzIHRoZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGJ5IG9uZSBoYWxmIG9mIHN5c3RlbSBjbG9jayBpbiBERFIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfRGRySG9sZEhhbGZDeWNsZSAqLwotICB1aW50MzJfdCBTSU9PTW9kZTsgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBzZW5kIGluc3RydWN0aW9uIG9ubHkgb25jZSBtb2RlCisgIHVpbnQzMl90IFNJT09Nb2RlOyAgICAgICAgICAgLyogU3BlY2lmaWVzIHRoZSBzZW5kIGluc3RydWN0aW9uIG9ubHkgb25jZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX1NJT09Nb2RlICovCiB9UVNQSV9Db21tYW5kVHlwZURlZjsKIAotLyoqIAotICAqIEBicmllZiAgUVNQSSBBdXRvIFBvbGxpbmcgbW9kZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKy8qKgorICAqIEBicmllZiAgUVNQSSBBdXRvIFBvbGxpbmcgbW9kZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCiAgICovCiB0eXBlZGVmIHN0cnVjdAogewogICB1aW50MzJfdCBNYXRjaDsgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgdmFsdWUgdG8gYmUgY29tcGFyZWQgd2l0aCB0aGUgbWFza2VkIHN0YXR1cyByZWdpc3RlciB0byBnZXQgYSBtYXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGRkZGRiAqLwotICB1aW50MzJfdCBNYXNrOyAgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbWFzayB0byBiZSBhcHBsaWVkIHRvIHRoZSBzdGF0dXMgYnl0ZXMgcmVjZWl2ZWQuIAorICB1aW50MzJfdCBNYXNrOyAgICAgICAgICAgICAgIC8qIFNwZWNpZmllcyB0aGUgbWFzayB0byBiZSBhcHBsaWVkIHRvIHRoZSBzdGF0dXMgYnl0ZXMgcmVjZWl2ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDB4RkZGRkZGRkYgKi8KICAgdWludDMyX3QgSW50ZXJ2YWw7ICAgICAgICAgICAvKiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjbG9jayBjeWNsZXMgYmV0d2VlbiB0d28gcmVhZCBkdXJpbmcgYXV0b21hdGljIHBvbGxpbmcgcGhhc2VzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgdmFsdWUgYmV0d2VlbiAwIGFuZCAweEZGRkYgKi8KQEAgLTE4NywxNSArMTgxLDE1IEBACiAgIHVpbnQzMl90IEF1dG9tYXRpY1N0b3A7ICAgICAgLyogU3BlY2lmaWVzIGlmIGF1dG9tYXRpYyBwb2xsaW5nIGlzIHN0b3BwZWQgYWZ0ZXIgYSBtYXRjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFFTUElfQXV0b21hdGljU3RvcCAqLwogfVFTUElfQXV0b1BvbGxpbmdUeXBlRGVmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vKiogCi0gICogQGJyaWVmICBRU1BJIE1lbW9yeSBNYXBwZWQgbW9kZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICAKKworLyoqCisgICogQGJyaWVmICBRU1BJIE1lbW9yeSBNYXBwZWQgbW9kZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uCiAgICovCiB0eXBlZGVmIHN0cnVjdAogewogICB1aW50MzJfdCBUaW1lT3V0UGVyaW9kOyAgICAgIC8qIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNsb2NrIHRvIHdhaXQgd2hlbiB0aGUgRklGTyBpcyBmdWxsIGJlZm9yZSB0byByZWxlYXNlIHRoZSBjaGlwIHNlbGVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIGJldHdlZW4gMCBhbmQgMHhGRkZGICovCi0gIHVpbnQzMl90IFRpbWVPdXRBY3RpdmF0aW9uOyAgLyogU3BlY2lmaWVzIGlmIHRoZSB0aW1lIG91dCBjb3VudGVyIGlzIGVuYWJsZWQgdG8gcmVsZWFzZSB0aGUgY2hpcCBzZWxlY3QuIAorICB1aW50MzJfdCBUaW1lT3V0QWN0aXZhdGlvbjsgIC8qIFNwZWNpZmllcyBpZiB0aGUgdGltZW91dCBjb3VudGVyIGlzIGVuYWJsZWQgdG8gcmVsZWFzZSB0aGUgY2hpcCBzZWxlY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBRU1BJX1RpbWVPdXRBY3RpdmF0aW9uICovCiB9UVNQSV9NZW1vcnlNYXBwZWRUeXBlRGVmOwogCkBAIC0yMzMsNDEgKzIyNyw0MiBAQAogLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0NvbnN0YW50cyBRU1BJIEV4cG9ydGVkIENvbnN0YW50cwogICAqIEB7CiAgICovCisKIC8qKiBAZGVmZ3JvdXAgUVNQSV9FcnJvckNvZGUgUVNQSSBFcnJvciBDb2RlCiAgICogQHsKLSAgKi8gCi0jZGVmaW5lIEhBTF9RU1BJX0VSUk9SX05PTkUgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAvKiE8IE5vIGVycm9yICAgICAgICAgICAqLwotI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgLyohPCBUaW1lb3V0IGVycm9yICAgICAgKi8KLSNkZWZpbmUgSEFMX1FTUElfRVJST1JfVFJBTlNGRVIgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMlUpIC8qITwgVHJhbnNmZXIgZXJyb3IgICAgICovCi0jZGVmaW5lIEhBTF9RU1BJX0VSUk9SX0RNQSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAqLwotI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkgLyohPCBJbnZhbGlkIHBhcmFtZXRlcnMgZXJyb3IgKi8KKyAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9USU1FT1VUICAgICAgICAgIDB4MDAwMDAwMDFVIC8qITwgVGltZW91dCBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9RU1BJX0VSUk9SX1RSQU5TRkVSICAgICAgICAgMHgwMDAwMDAwMlUgLyohPCBUcmFuc2ZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1FTUElfRVJST1JfRE1BICAgICAgICAgICAgICAweDAwMDAwMDA0VSAvKiE8IERNQSB0cmFuc2ZlciBlcnJvciAgICAgICAqLworI2RlZmluZSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNICAgIDB4MDAwMDAwMDhVIC8qITwgSW52YWxpZCBwYXJhbWV0ZXJzIGVycm9yICovCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICNkZWZpbmUgSEFMX1FTUElfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAweDAwMDAwMDEwVSAvKiE8IEludmFsaWQgY2FsbGJhY2sgZXJyb3IgICAqLwogI2VuZGlmCiAvKioKICAgKiBAfQotICAqLyAKLSAgCisgICovCisKIC8qKiBAZGVmZ3JvdXAgUVNQSV9TYW1wbGVTaGlmdGluZyBRU1BJIFNhbXBsZSBTaGlmdGluZwogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAvKiE8Tm8gY2xvY2sgY3ljbGUgc2hpZnQgdG8gc2FtcGxlIGRhdGEqLwotI2RlZmluZSBRU1BJX1NBTVBMRV9TSElGVElOR19IQUxGQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfU1NISUZUKSAvKiE8MS8yIGNsb2NrIGN5Y2xlIHNoaWZ0IHRvIHNhbXBsZSBkYXRhKi8KKyNkZWZpbmUgUVNQSV9TQU1QTEVfU0hJRlRJTkdfTk9ORSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgIC8qITxObyBjbG9jayBjeWNsZSBzaGlmdCB0byBzYW1wbGUgZGF0YSovCisjZGVmaW5lIFFTUElfU0FNUExFX1NISUZUSU5HX0hBTEZDWUNMRSAoKHVpbnQzMl90KVFVQURTUElfQ1JfU1NISUZUKSAvKiE8MS8yIGNsb2NrIGN5Y2xlIHNoaWZ0IHRvIHNhbXBsZSBkYXRhKi8KIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfQ2hpcFNlbGVjdEhpZ2hUaW1lIFFTUEkgQ2hpcCBTZWxlY3QgSGlnaCBUaW1lCisvKiogQGRlZmdyb3VwIFFTUElfQ2hpcFNlbGVjdEhpZ2hUaW1lIFFTUEkgQ2hpcFNlbGVjdCBIaWdoIFRpbWUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV8xX0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCAxIGNsb2NrIGN5Y2xlIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV8yX0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMCkgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDIgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV8zX0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMSkgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDMgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV80X0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMCB8IFFVQURTUElfRENSX0NTSFRfMSkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDQgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV81X0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMikgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDUgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV82X0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMiB8IFFVQURTUElfRENSX0NTSFRfMCkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDYgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV83X0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMiB8IFFVQURTUElfRENSX0NTSFRfMSkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDcgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLwotI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV84X0NZQ0xFICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFQpICAgICAgICAgICAgICAgICAgICAgICAgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDggY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV8xX0NZQ0xFICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCAxIGNsb2NrIGN5Y2xlIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV8yX0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzApICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCAyIGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfM19DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8xKSAgICAgICAgICAgICAgICAgICAgICAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgMyBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzRfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMCB8IFFVQURTUElfRENSX0NTSFRfMSkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDQgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV81X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUXzIpICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA1IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KKyNkZWZpbmUgUVNQSV9DU19ISUdIX1RJTUVfNl9DWUNMRSAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ1NIVF8yIHwgUVVBRFNQSV9EQ1JfQ1NIVF8wKSAvKiE8bkNTIHN0YXkgaGlnaCBmb3IgYXQgbGVhc3QgNiBjbG9jayBjeWNsZXMgYmV0d2VlbiBjb21tYW5kcyovCisjZGVmaW5lIFFTUElfQ1NfSElHSF9USU1FXzdfQ1lDTEUgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NTSFRfMiB8IFFVQURTUElfRENSX0NTSFRfMSkgLyohPG5DUyBzdGF5IGhpZ2ggZm9yIGF0IGxlYXN0IDcgY2xvY2sgY3ljbGVzIGJldHdlZW4gY29tbWFuZHMqLworI2RlZmluZSBRU1BJX0NTX0hJR0hfVElNRV84X0NZQ0xFICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0RDUl9DU0hUKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxuQ1Mgc3RheSBoaWdoIGZvciBhdCBsZWFzdCA4IGNsb2NrIGN5Y2xlcyBiZXR3ZWVuIGNvbW1hbmRzKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0yNzUsNDUgKzI3MCw0NSBAQAogLyoqIEBkZWZncm91cCBRU1BJX0Nsb2NrTW9kZSBRU1BJIENsb2NrIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0NMT0NLX01PREVfMCAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgIC8qITxDbGsgc3RheXMgbG93IHdoaWxlIG5DUyBpcyByZWxlYXNlZCovCi0jZGVmaW5lIFFTUElfQ0xPQ0tfTU9ERV8zICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9EQ1JfQ0tNT0RFKSAvKiE8Q2xrIGdvZXMgaGlnaCB3aGlsZSBuQ1MgaXMgcmVsZWFzZWQqLworI2RlZmluZSBRU1BJX0NMT0NLX01PREVfMCAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgIC8qITxDbGsgc3RheXMgbG93IHdoaWxlIG5DUyBpcyByZWxlYXNlZCovCisjZGVmaW5lIFFTUElfQ0xPQ0tfTU9ERV8zICAgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfRENSX0NLTU9ERSkgLyohPENsayBnb2VzIGhpZ2ggd2hpbGUgbkNTIGlzIHJlbGVhc2VkKi8KIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiogQGRlZmdyb3VwIFFTUElfRmxhc2hfU2VsZWN0IFFTUEkgRmxhc2ggU2VsZWN0CiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9GTEFTSF9JRF8xICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQotI2RlZmluZSBRU1BJX0ZMQVNIX0lEXzIgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9GU0VMKQorI2RlZmluZSBRU1BJX0ZMQVNIX0lEXzEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgIC8qITxGTEFTSCAxIHNlbGVjdGVkKi8KKyNkZWZpbmUgUVNQSV9GTEFTSF9JRF8yICAgICAgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9GU0VMKSAvKiE8RkxBU0ggMiBzZWxlY3RlZCovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKLSAgLyoqIEBkZWZncm91cCBRU1BJX0R1YWxGbGFzaF9Nb2RlICBRU1BJIER1YWwgRmxhc2ggTW9kZQorICAvKiogQGRlZmdyb3VwIFFTUElfRHVhbEZsYXNoX01vZGUgUVNQSSBEdWFsIEZsYXNoIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0RVQUxGTEFTSF9FTkFCTEUgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfREZNKQotI2RlZmluZSBRU1BJX0RVQUxGTEFTSF9ESVNBQkxFICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAKKyNkZWZpbmUgUVNQSV9EVUFMRkxBU0hfRU5BQkxFICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DUl9ERk0pIC8qITxEdWFsLWZsYXNoIG1vZGUgZW5hYmxlZCovCisjZGVmaW5lIFFTUElfRFVBTEZMQVNIX0RJU0FCTEUgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8RHVhbC1mbGFzaCBtb2RlIGRpc2FibGVkKi8KIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc1NpemUgUVNQSSBBZGRyZXNzIFNpemUgCisvKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc1NpemUgUVNQSSBBZGRyZXNzIFNpemUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0FERFJFU1NfOF9CSVRTICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgICAgIC8qITw4LWJpdCBhZGRyZXNzKi8KKyNkZWZpbmUgUVNQSV9BRERSRVNTXzhfQklUUyAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITw4LWJpdCBhZGRyZXNzKi8KICNkZWZpbmUgUVNQSV9BRERSRVNTXzE2X0JJVFMgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQURTSVpFXzApIC8qITwxNi1iaXQgYWRkcmVzcyovCiAjZGVmaW5lIFFTUElfQUREUkVTU18yNF9CSVRTICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FEU0laRV8xKSAvKiE8MjQtYml0IGFkZHJlc3MqLwogI2RlZmluZSBRU1BJX0FERFJFU1NfMzJfQklUUyAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BRFNJWkUpICAgLyohPDMyLWJpdCBhZGRyZXNzKi8KIC8qKgogICAqIEB9Ci0gICovICAKKyAgKi8KIAogLyoqIEBkZWZncm91cCBRU1BJX0FsdGVybmF0ZUJ5dGVzU2l6ZSBRU1BJIEFsdGVybmF0ZSBCeXRlcyBTaXplCiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfOF9CSVRTICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgICAvKiE8OC1iaXQgYWx0ZXJuYXRlIGJ5dGVzKi8KKyNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfOF9CSVRTICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgIC8qITw4LWJpdCBhbHRlcm5hdGUgYnl0ZXMqLwogI2RlZmluZSBRU1BJX0FMVEVSTkFURV9CWVRFU18xNl9CSVRTICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BQlNJWkVfMCkgLyohPDE2LWJpdCBhbHRlcm5hdGUgYnl0ZXMqLwogI2RlZmluZSBRU1BJX0FMVEVSTkFURV9CWVRFU18yNF9CSVRTICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BQlNJWkVfMSkgLyohPDI0LWJpdCBhbHRlcm5hdGUgYnl0ZXMqLwogI2RlZmluZSBRU1BJX0FMVEVSTkFURV9CWVRFU18zMl9CSVRTICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BQlNJWkUpICAgLyohPDMyLWJpdCBhbHRlcm5hdGUgYnl0ZXMqLwpAQCAtMzI0LDcgKzMxOSw3IEBACiAvKiogQGRlZmdyb3VwIFFTUElfSW5zdHJ1Y3Rpb25Nb2RlIFFTUEkgSW5zdHJ1Y3Rpb24gTW9kZQogKiBAewogKi8KLSNkZWZpbmUgUVNQSV9JTlNUUlVDVElPTl9OT05FICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAgICAgIC8qITxObyBpbnN0cnVjdGlvbiovCisjZGVmaW5lIFFTUElfSU5TVFJVQ1RJT05fTk9ORSAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgIC8qITxObyBpbnN0cnVjdGlvbiovCiAjZGVmaW5lIFFTUElfSU5TVFJVQ1RJT05fMV9MSU5FICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0lNT0RFXzApIC8qITxJbnN0cnVjdGlvbiBvbiBhIHNpbmdsZSBsaW5lKi8KICNkZWZpbmUgUVNQSV9JTlNUUlVDVElPTl8yX0xJTkVTICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfSU1PREVfMSkgLyohPEluc3RydWN0aW9uIG9uIHR3byBsaW5lcyovCiAjZGVmaW5lIFFTUElfSU5TVFJVQ1RJT05fNF9MSU5FUyAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0lNT0RFKSAgIC8qITxJbnN0cnVjdGlvbiBvbiBmb3VyIGxpbmVzKi8KQEAgLTMzNSw1OCArMzMwLDU4IEBACiAvKiogQGRlZmdyb3VwIFFTUElfQWRkcmVzc01vZGUgUVNQSSBBZGRyZXNzIE1vZGUKICogQHsKICovCi0jZGVmaW5lIFFTUElfQUREUkVTU19OT05FICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPE5vIGFkZHJlc3MqLworI2RlZmluZSBRU1BJX0FERFJFU1NfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAgLyohPE5vIGFkZHJlc3MqLwogI2RlZmluZSBRU1BJX0FERFJFU1NfMV9MSU5FICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BRE1PREVfMCkgLyohPEFkZHJlc3Mgb24gYSBzaW5nbGUgbGluZSovCiAjZGVmaW5lIFFTUElfQUREUkVTU18yX0xJTkVTICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FETU9ERV8xKSAvKiE8QWRkcmVzcyBvbiB0d28gbGluZXMqLwogI2RlZmluZSBRU1BJX0FERFJFU1NfNF9MSU5FUyAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9BRE1PREUpICAgLyohPEFkZHJlc3Mgb24gZm91ciBsaW5lcyovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9BbHRlcm5hdGVCeXRlc01vZGUgIFFTUEkgQWx0ZXJuYXRlIEJ5dGVzIE1vZGUKLSogQHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKiogQGRlZmdyb3VwIFFTUElfQWx0ZXJuYXRlQnl0ZXNNb2RlIFFTUEkgQWx0ZXJuYXRlIEJ5dGVzIE1vZGUKKyogQHsKICovCi0jZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTX05PTkUgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAgLyohPE5vIGFsdGVybmF0ZSBieXRlcyovCisjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTX05PTkUgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAvKiE8Tm8gYWx0ZXJuYXRlIGJ5dGVzKi8KICNkZWZpbmUgUVNQSV9BTFRFUk5BVEVfQllURVNfMV9MSU5FICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfQUJNT0RFXzApIC8qITxBbHRlcm5hdGUgYnl0ZXMgb24gYSBzaW5nbGUgbGluZSovCiAjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTXzJfTElORVMgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FCTU9ERV8xKSAvKiE8QWx0ZXJuYXRlIGJ5dGVzIG9uIHR3byBsaW5lcyovCiAjZGVmaW5lIFFTUElfQUxURVJOQVRFX0JZVEVTXzRfTElORVMgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0FCTU9ERSkgICAvKiE8QWx0ZXJuYXRlIGJ5dGVzIG9uIGZvdXIgbGluZXMqLwogLyoqCiAgICogQH0KLSAgKi8gIAorICAqLwogCiAvKiogQGRlZmdyb3VwIFFTUElfRGF0YU1vZGUgUVNQSSBEYXRhIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0RBVEFfTk9ORSAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkwWDAwMDAwMDAwKSAgICAgICAgICAgLyohPE5vIGRhdGEqLworI2RlZmluZSBRU1BJX0RBVEFfTk9ORSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAgICAvKiE8Tm8gZGF0YSovCiAjZGVmaW5lIFFTUElfREFUQV8xX0xJTkUgICAgICAgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0RNT0RFXzApIC8qITxEYXRhIG9uIGEgc2luZ2xlIGxpbmUqLwogI2RlZmluZSBRU1BJX0RBVEFfMl9MSU5FUyAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ETU9ERV8xKSAvKiE8RGF0YSBvbiB0d28gbGluZXMqLwogI2RlZmluZSBRU1BJX0RBVEFfNF9MSU5FUyAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ETU9ERSkgICAvKiE8RGF0YSBvbiBmb3VyIGxpbmVzKi8KIC8qKgogICAqIEB9Ci0gICovICAKKyAgKi8KIAotLyoqIEBkZWZncm91cCBRU1BJX0Rkck1vZGUgUVNQSSBEZHIgTW9kZQorLyoqIEBkZWZncm91cCBRU1BJX0Rkck1vZGUgUVNQSSBERFIgTW9kZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfRERSX01PREVfRElTQUJMRSAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgLyohPERvdWJsZSBkYXRhIHJhdGUgbW9kZSBkaXNhYmxlZCovCi0jZGVmaW5lIFFTUElfRERSX01PREVfRU5BQkxFICAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ERFJNKSAvKiE8RG91YmxlIGRhdGEgcmF0ZSBtb2RlIGVuYWJsZWQqLworI2RlZmluZSBRU1BJX0REUl9NT0RFX0RJU0FCTEUgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgICAgICAvKiE8RG91YmxlIGRhdGEgcmF0ZSBtb2RlIGRpc2FibGVkKi8KKyNkZWZpbmUgUVNQSV9ERFJfTU9ERV9FTkFCTEUgICAgICAgICAgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfRERSTSkgLyohPERvdWJsZSBkYXRhIHJhdGUgbW9kZSBlbmFibGVkKi8KIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJIb2xkSGFsZkN5Y2xlIFFTUEkgRGRyIEhvbGRIYWxmQ3ljbGUKKy8qKiBAZGVmZ3JvdXAgUVNQSV9EZHJIb2xkSGFsZkN5Y2xlIFFTUEkgRERSIERhdGEgT3V0cHV0IERlbGF5CiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9ERFJfSEhDX0FOQUxPR19ERUxBWSAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAgLyohPERlbGF5IHRoZSBkYXRhIG91dHB1dCB1c2luZyBhbmFsb2cgZGVsYXkgaW4gRERSIG1vZGUqLwotI2RlZmluZSBRU1BJX0REUl9ISENfSEFMRl9DTEtfREVMQVkgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0RISEMpIC8qITxEZWxheSB0aGUgZGF0YSBvdXRwdXQgYnkgMS8yIGNsb2NrIGN5Y2xlIGluIEREUiBtb2RlKi8KKyNkZWZpbmUgUVNQSV9ERFJfSEhDX0FOQUxPR19ERUxBWSAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgLyohPERlbGF5IHRoZSBkYXRhIG91dHB1dCB1c2luZyBhbmFsb2cgZGVsYXkgaW4gRERSIG1vZGUqLworI2RlZmluZSBRU1BJX0REUl9ISENfSEFMRl9DTEtfREVMQVkgICAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9ESEhDKSAvKiE8RGVsYXkgdGhlIGRhdGEgb3V0cHV0IGJ5IG9uZSBoYWxmIG9mIHN5c3RlbSBjbG9jayBpbiBERFIgbW9kZSovCiAvKioKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfU0lPT01vZGUgUVNQSSBTSU9PIE1vZGUKKy8qKiBAZGVmZ3JvdXAgUVNQSV9TSU9PTW9kZSBRU1BJIFNlbmQgSW5zdHJ1Y3Rpb24gTW9kZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfU0lPT19JTlNUX0VWRVJZX0NNRCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAvKiE8U2VuZCBpbnN0cnVjdGlvbiBvbiBldmVyeSB0cmFuc2FjdGlvbiovCisjZGVmaW5lIFFTUElfU0lPT19JTlNUX0VWRVJZX0NNRCAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgIC8qITxTZW5kIGluc3RydWN0aW9uIG9uIGV2ZXJ5IHRyYW5zYWN0aW9uKi8KICNkZWZpbmUgUVNQSV9TSU9PX0lOU1RfT05MWV9GSVJTVF9DTUQgICgodWludDMyX3QpUVVBRFNQSV9DQ1JfU0lPTykgLyohPFNlbmQgaW5zdHJ1Y3Rpb24gb25seSBmb3IgdGhlIGZpcnN0IGNvbW1hbmQqLwogLyoqCiAgICogQH0KQEAgLTM5NSwzMSArMzkwLDMxIEBACiAvKiogQGRlZmdyb3VwIFFTUElfTWF0Y2hNb2RlIFFTUEkgTWF0Y2ggTW9kZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfTUFUQ0hfTU9ERV9BTkQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgICAvKiE8QU5EIG1hdGNoIG1vZGUgYmV0d2VlbiB1bm1hc2tlZCBiaXRzKi8KLSNkZWZpbmUgUVNQSV9NQVRDSF9NT0RFX09SICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NSX1BNTSkgLyohPE9SIG1hdGNoIG1vZGUgYmV0d2VlbiB1bm1hc2tlZCBiaXRzKi8KKyNkZWZpbmUgUVNQSV9NQVRDSF9NT0RFX0FORCAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgIC8qITxBTkQgbWF0Y2ggbW9kZSBiZXR3ZWVuIHVubWFza2VkIGJpdHMqLworI2RlZmluZSBRU1BJX01BVENIX01PREVfT1IgICAgICAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NSX1BNTSkgLyohPE9SIG1hdGNoIG1vZGUgYmV0d2VlbiB1bm1hc2tlZCBiaXRzKi8KIC8qKgogICAqIEB9Ci0gICovICAKKyAgKi8KIAogLyoqIEBkZWZncm91cCBRU1BJX0F1dG9tYXRpY1N0b3AgUVNQSSBBdXRvbWF0aWMgU3RvcAogICAqIEB7CiAgICovCi0jZGVmaW5lIFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkgICAgICAvKiE8QXV0b1BvbGxpbmcgc3RvcHMgb25seSB3aXRoIGFib3J0IG9yIFFTUEkgZGlzYWJsaW5nKi8KLSNkZWZpbmUgUVNQSV9BVVRPTUFUSUNfU1RPUF9FTkFCTEUgICAgICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfQVBNUykgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBtYXRjaCovCisjZGVmaW5lIFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIG9ubHkgd2l0aCBhYm9ydCBvciBRU1BJIGRpc2FibGluZyovCisjZGVmaW5lIFFTUElfQVVUT01BVElDX1NUT1BfRU5BQkxFICAgICAoKHVpbnQzMl90KVFVQURTUElfQ1JfQVBNUykgLyohPEF1dG9Qb2xsaW5nIHN0b3BzIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBtYXRjaCovCiAvKioKICAgKiBAfQotICAqLyAgCisgICovCiAKLS8qKiBAZGVmZ3JvdXAgUVNQSV9UaW1lT3V0QWN0aXZhdGlvbiBRU1BJIFRpbWVPdXQgQWN0aXZhdGlvbgorLyoqIEBkZWZncm91cCBRU1BJX1RpbWVPdXRBY3RpdmF0aW9uIFFTUEkgVGltZW91dCBBY3RpdmF0aW9uCiAgICogQHsKICAgKi8KLSNkZWZpbmUgUVNQSV9USU1FT1VUX0NPVU5URVJfRElTQUJMRSAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgIC8qITxUaW1lb3V0IGNvdW50ZXIgZGlzYWJsZWQsIG5DUyByZW1haW5zIGFjdGl2ZSovCi0jZGVmaW5lIFFTUElfVElNRU9VVF9DT1VOVEVSX0VOQUJMRSAgICAgICAgKCh1aW50MzJfdClRVUFEU1BJX0NSX1RDRU4pIC8qITxUaW1lb3V0IGNvdW50ZXIgZW5hYmxlZCwgbkNTIHJlbGVhc2VkIHdoZW4gdGltZW91dCBleHBpcmVzKi8KKyNkZWZpbmUgUVNQSV9USU1FT1VUX0NPVU5URVJfRElTQUJMRSAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAvKiE8VGltZW91dCBjb3VudGVyIGRpc2FibGVkLCBuQ1MgcmVtYWlucyBhY3RpdmUqLworI2RlZmluZSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9FTkFCTEUgICAgKCh1aW50MzJfdClRVUFEU1BJX0NSX1RDRU4pIC8qITxUaW1lb3V0IGNvdW50ZXIgZW5hYmxlZCwgbkNTIHJlbGVhc2VkIHdoZW4gdGltZW91dCBleHBpcmVzKi8KIC8qKgogICAqIEB9Ci0gICovICAKKyAgKi8KIAotLyoqIEBkZWZncm91cCBRU1BJX0ZsYWdzICBRU1BJIEZsYWdzCisvKiogQGRlZmdyb3VwIFFTUElfRmxhZ3MgUVNQSSBGbGFncwogICAqIEB7CiAgICovCiAjZGVmaW5lIFFTUElfRkxBR19CVVNZICAgICAgICAgICAgICAgICBRVUFEU1BJX1NSX0JVU1kgLyohPEJ1c3kgZmxhZzogb3BlcmF0aW9uIGlzIG9uZ29pbmcqLwpAQCAtNDMyLDI2ICs0MjcsMjcgQEAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfSW50ZXJydXB0cyAgUVNQSSBJbnRlcnJ1cHRzCisvKiogQGRlZmdyb3VwIFFTUElfSW50ZXJydXB0cyBRU1BJIEludGVycnVwdHMKICAgKiBAewotICAqLyAgCi0jZGVmaW5lIFFTUElfSVRfVE8gICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfVE9JRSAvKiE8SW50ZXJydXB0IG9uIHRoZSB0aW1lb3V0IGZsYWcqLwotI2RlZmluZSBRU1BJX0lUX1NNICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEU1BJX0NSX1NNSUUgLyohPEludGVycnVwdCBvbiB0aGUgc3RhdHVzIG1hdGNoIGZsYWcqLwotI2RlZmluZSBRU1BJX0lUX0ZUICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEU1BJX0NSX0ZUSUUgLyohPEludGVycnVwdCBvbiB0aGUgZmlmbyB0aHJlc2hvbGQgZmxhZyovCi0jZGVmaW5lIFFTUElfSVRfVEMgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURTUElfQ1JfVENJRSAvKiE8SW50ZXJydXB0IG9uIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBmbGFnKi8KLSNkZWZpbmUgUVNQSV9JVF9URSAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9URUlFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGVycm9yIGZsYWcqLworICAqLworI2RlZmluZSBRU1BJX0lUX1RPICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UT0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRpbWVvdXQgZmxhZyovCisjZGVmaW5lIFFTUElfSVRfU00gICAgICAgICAgICAgICAgICAgICBRVUFEU1BJX0NSX1NNSUUgLyohPEludGVycnVwdCBvbiB0aGUgc3RhdHVzIG1hdGNoIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX0ZUICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9GVElFIC8qITxJbnRlcnJ1cHQgb24gdGhlIGZpZm8gdGhyZXNob2xkIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX1RDICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9UQ0lFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcqLworI2RlZmluZSBRU1BJX0lUX1RFICAgICAgICAgICAgICAgICAgICAgUVVBRFNQSV9DUl9URUlFIC8qITxJbnRlcnJ1cHQgb24gdGhlIHRyYW5zZmVyIGVycm9yIGZsYWcqLwogLyoqCiAgICogQH0KICAgKi8KIAogLyoqIEBkZWZncm91cCBRU1BJX1RpbWVvdXRfZGVmaW5pdGlvbiBRU1BJIFRpbWVvdXQgZGVmaW5pdGlvbgorICAqIEBicmllZiBRU1BJIFRpbWVvdXQgZGVmaW5pdGlvbgogICAqIEB7Ci0gICovIAotI2RlZmluZSBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgKCh1aW50MzJfdCk1MDAwKS8qIDUgcyAqLworICAqLworI2RlZmluZSBIQUxfUVNQSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUgNTAwMFUgLyogNSBzICovCiAvKioKICAgKiBAfQotICAqLyAgCi0gICAgCisgICovCisKIC8qKgogICAqIEB9CiAgICovCkBAIC00NjAsOSArNDU2LDggQEAKIC8qKiBAZGVmZ3JvdXAgUVNQSV9FeHBvcnRlZF9NYWNyb3MgUVNQSSBFeHBvcnRlZCBNYWNyb3MKICAgKiBAewogICAqLwotCi0vKiogQGJyaWVmIFJlc2V0IFFTUEkgaGFuZGxlIHN0YXRlCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIFFTUEkgaGFuZGxlLgorLyoqIEBicmllZiBSZXNldCBRU1BJIGhhbmRsZSBzdGF0ZS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBRU1BJIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQpAQCAtNDc1LDIzICs0NzAsMjMgQEAKICNkZWZpbmUgX19IQUxfUVNQSV9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVTRVQpCiAjZW5kaWYKIAotLyoqIEBicmllZiAgRW5hYmxlIFFTUEkKLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKy8qKiBAYnJpZWYgIEVuYWJsZSB0aGUgUVNQSSBwZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCiAgICogQHJldHZhbCBOb25lCi0gICovIAorICAqLwogI2RlZmluZSBfX0hBTF9RU1BJX0VOQUJMRShfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9FTikKIAotLyoqIEBicmllZiAgRGlzYWJsZSBRU1BJCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisvKiogQGJyaWVmICBEaXNhYmxlIHRoZSBRU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfUVNQSV9ESVNBQkxFKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgIENMRUFSX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9FTikKIAotLyoqIEBicmllZiAgRW5hYmxlcyB0aGUgc3BlY2lmaWVkIFFTUEkgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFFTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBlbmFibGUuCisvKiogQGJyaWVmICBFbmFibGUgdGhlIHNwZWNpZmllZCBRU1BJIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGVuYWJsZS4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RPOiBRU1BJIFRpbWUgb3V0IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RPOiBRU1BJIFRpbWVvdXQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFFTUElfSVRfU006IFFTUEkgU3RhdHVzIG1hdGNoIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX0ZUOiBRU1BJIEZJRk8gdGhyZXNob2xkIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1RDOiBRU1BJIFRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdApAQCAtNTAxLDkgKzQ5Niw5IEBACiAjZGVmaW5lIF9fSEFMX1FTUElfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSLCAoX19JTlRFUlJVUFRfXykpCiAKIAotLyoqIEBicmllZiAgRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBRU1BJIGludGVycnVwdC4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBRU1BJIGludGVycnVwdCBzb3VyY2UgdG8gZGlzYWJsZS4KKy8qKiBAYnJpZWYgIERpc2FibGUgdGhlIHNwZWNpZmllZCBRU1BJIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gOiBzcGVjaWZpZXMgdGhlIFFTUEkgSGFuZGxlLgorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UTzogUVNQSSBUaW1lb3V0IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1NNOiBRU1BJIFN0YXR1cyBtYXRjaCBpbnRlcnJ1cHQKQEAgLTUxNCwzOSArNTA5LDM5IEBACiAgICovCiAjZGVmaW5lIF9fSEFMX1FTUElfRElTQUJMRV9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAgICBDTEVBUl9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lOVEVSUlVQVF9fKSkKIAotLyoqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBRU1BJIGludGVycnVwdCBzb3VyY2UgaXMgZW5hYmxlZC4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBRU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCisvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUVNQSSBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UTzogUVNQSSBUaW1lIG91dCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UTzogUVNQSSBUaW1lb3V0IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0lUX1NNOiBRU1BJIFN0YXR1cyBtYXRjaCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9GVDogUVNQSSBGSUZPIHRocmVzaG9sZCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9UQzogUVNQSSBUcmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9JVF9URTogUVNQSSBUcmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQKICAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoVFJVRSBvciBGQUxTRSkuCiAgICovCi0jZGVmaW5lIF9fSEFMX1FTUElfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoUkVBRF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IsIChfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKSAKKyNkZWZpbmUgX19IQUxfUVNQSV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIChSRUFEX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiwgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCiAKIC8qKgotICAqIEBicmllZiAgR2V0IHRoZSBzZWxlY3RlZCBRU1BJJ3MgZmxhZyBzdGF0dXMuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCi0gICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIFFTUEkgZmxhZyB0byBjaGVjay4KKyAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGVkIFFTUEkgZmxhZyBpcyBzZXQgb3Igbm90LgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBIYW5kbGUuCisgICogQHBhcmFtICBfX0ZMQUdfXyA6IHNwZWNpZmllcyB0aGUgUVNQSSBmbGFnIHRvIGNoZWNrLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19CVVNZOiBRU1BJIEJ1c3kgZmxhZwotICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVE86ICAgUVNQSSBUaW1lIG91dCBmbGFnCisgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19UTzogICBRU1BJIFRpbWVvdXQgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfU006ICAgUVNQSSBTdGF0dXMgbWF0Y2ggZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfRlQ6ICAgUVNQSSBGSUZPIHRocmVzaG9sZCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19UQzogICBRU1BJIFRyYW5zZmVyIGNvbXBsZXRlIGZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgUVNQSV9GTEFHX1RFOiAgIFFTUEkgVHJhbnNmZXIgZXJyb3IgZmxhZwogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2RlZmluZSBfX0hBTF9RU1BJX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgKFJFQURfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSLCAoX19GTEFHX18pKSAhPSAwKQorI2RlZmluZSBfX0hBTF9RU1BJX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAgICAgICAgICAgKChSRUFEX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5TUiwgKF9fRkxBR19fKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCiAKIC8qKiBAYnJpZWYgIENsZWFycyB0aGUgc3BlY2lmaWVkIFFTUEkncyBmbGFnIHN0YXR1cy4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KLSAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgUVNQSSBjbGVhciByZWdpc3RlciBmbGFnIHRoYXQgbmVlZHMgdG8gYmUgc2V0CisgICogQHBhcmFtICBfX0hBTkRMRV9fIDogc3BlY2lmaWVzIHRoZSBRU1BJIEhhbmRsZS4KKyAgKiBAcGFyYW0gIF9fRkxBR19fIDogc3BlY2lmaWVzIHRoZSBRU1BJIGNsZWFyIHJlZ2lzdGVyIGZsYWcgdGhhdCBuZWVkcyB0byBiZSBzZXQKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVE86IFFTUEkgVGltZSBvdXQgZmxhZworICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVE86IFFTUEkgVGltZW91dCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIFFTUElfRkxBR19TTTogUVNQSSBTdGF0dXMgbWF0Y2ggZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEM6IFFTUEkgVHJhbnNmZXIgY29tcGxldGUgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZMQUdfVEU6IFFTUEkgVHJhbnNmZXIgZXJyb3IgZmxhZwpAQCAtNTU2LDcgKzU1MSw3IEBACiAvKioKICAgKiBAfQogICAqLwotICAKKwogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9ucwogICAqIEB7CkBAIC01NzYsNyArNTcxLDcgQEAKIAogLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMgogICAqIEB7Ci0gICovICAKKyAgKi8KIC8qIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBRU1BJIElSUSBoYW5kbGVyIG1ldGhvZCAqLwogdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX0lSUUhhbmRsZXIoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CkBAIC01OTcsMTMgKzU5Miw3IEBACiAKIC8qIFFTUEkgbWVtb3J5LW1hcHBlZCBtb2RlICovCiBIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfTWVtb3J5TWFwcGVkKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIFFTUElfQ29tbWFuZFR5cGVEZWYgKmNtZCwgUVNQSV9NZW1vcnlNYXBwZWRUeXBlRGVmICpjZmcpOwotLyoqCi0gICogQH0KLSAgKi8KIAotLyoqIEBhZGR0b2dyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMwotICAqIEB7Ci0gICovICAKIC8qIENhbGxiYWNrIGZ1bmN0aW9ucyBpbiBub24tYmxvY2tpbmcgbW9kZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkICAgICAgICAgICAgICAgICAgSEFMX1FTUElfRXJyb3JDYWxsYmFjayAgICAgICAgKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpOwogdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX0Fib3J0Q3BsdENhbGxiYWNrICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKQEAgLTYzMSw5ICs2MjAsOSBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQKKy8qKiBAYWRkdG9ncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMKICAgKiBAewotICAqLyAgCisgICovCiAvKiBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFMX1FTUElfU3RhdGVUeXBlRGVmIEhBTF9RU1BJX0dldFN0YXRlICAgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CiB1aW50MzJfdCAgICAgICAgICAgICAgSEFMX1FTUElfR2V0RXJyb3IgICAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKTsKQEAgLTY0Miw2ICs2MzEsNyBAQAogdm9pZCAgICAgICAgICAgICAgICAgIEhBTF9RU1BJX1NldFRpbWVvdXQgICAgICAoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDMyX3QgVGltZW91dCk7CiBIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfU2V0Rmlmb1RocmVzaG9sZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBUaHJlc2hvbGQpOwogdWludDMyX3QgICAgICAgICAgICAgIEhBTF9RU1BJX0dldEZpZm9UaHJlc2hvbGQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSk7CitIQUxfU3RhdHVzVHlwZURlZiAgICAgSEFMX1FTUElfU2V0Rmxhc2hJRCAgICAgIChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFzaElEKTsKIC8qKgogICAqIEB9CiAgICovCkBAIC02NDksMTYxICs2MzksMTAwIEBACiAvKioKICAgKiBAfQogICAqLworLyogRW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgUVNQSV9Qcml2YXRlX01hY3JvcyBRU1BJIFByaXZhdGUgTWFjcm9zCiAgICogQHsKICAgKi8KLS8qKiBAZGVmZ3JvdXAgUVNQSV9DbG9ja1ByZXNjYWxlciBRU1BJIENsb2NrIFByZXNjYWxlcgotICAqIEB7Ci0gICovIAotI2RlZmluZSBJU19RU1BJX0NMT0NLX1BSRVNDQUxFUihQUkVTQ0FMRVIpICAoKFBSRVNDQUxFUikgPD0gMHhGRikKKyNkZWZpbmUgSVNfUVNQSV9DTE9DS19QUkVTQ0FMRVIoUFJFU0NBTEVSKSAoKFBSRVNDQUxFUikgPD0gMHhGRlUpCisKKyNkZWZpbmUgSVNfUVNQSV9GSUZPX1RIUkVTSE9MRChUSFIpICAgICAgICAoKChUSFIpID4gMFUpICYmICgoVEhSKSA8PSAzMlUpKQorCisjZGVmaW5lIElTX1FTUElfU1NISUZUKFNTSElGVCkgICAgICAgICAgICAgKCgoU1NISUZUKSA9PSBRU1BJX1NBTVBMRV9TSElGVElOR19OT05FKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1NISUZUKSA9PSBRU1BJX1NBTVBMRV9TSElGVElOR19IQUxGQ1lDTEUpKQorCisjZGVmaW5lIElTX1FTUElfRkxBU0hfU0laRShGU0laRSkgICAgICAgICAgKCgoRlNJWkUpIDw9IDMxVSkpCisKKyNkZWZpbmUgSVNfUVNQSV9DU19ISUdIX1RJTUUoQ1NIVElNRSkgICAgICAoKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV8xX0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfMl9DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzNfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV80X0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfNV9DWUNMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzZfQ1lDTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV83X0NZQ0xFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfOF9DWUNMRSkpCisKKyNkZWZpbmUgSVNfUVNQSV9DTE9DS19NT0RFKENMS01PREUpICAgICAgICAoKChDTEtNT0RFKSA9PSBRU1BJX0NMT0NLX01PREVfMCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENMS01PREUpID09IFFTUElfQ0xPQ0tfTU9ERV8zKSkKKworI2RlZmluZSBJU19RU1BJX0ZMQVNIX0lEKEZMQVNIX0lEKSAgICAgICAgICgoKEZMQVNIX0lEKSA9PSBRU1BJX0ZMQVNIX0lEXzEpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGTEFTSF9JRCkgPT0gUVNQSV9GTEFTSF9JRF8yKSkKKworI2RlZmluZSBJU19RU1BJX0RVQUxfRkxBU0hfTU9ERShNT0RFKSAgICAgICgoKE1PREUpID09IFFTUElfRFVBTEZMQVNIX0VOQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfRFVBTEZMQVNIX0RJU0FCTEUpKQorCisjZGVmaW5lIElTX1FTUElfSU5TVFJVQ1RJT04oSU5TVFJVQ1RJT04pICAgKChJTlNUUlVDVElPTikgPD0gMHhGRlUpCisKKyNkZWZpbmUgSVNfUVNQSV9BRERSRVNTX1NJWkUoQUREUl9TSVpFKSAgICAoKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU184X0JJVFMpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfMTZfQklUUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzI0X0JJVFMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU18zMl9CSVRTKSkKKworI2RlZmluZSBJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKFNJWkUpICgoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzhfQklUUykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18xNl9CSVRTKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMjRfQklUUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzMyX0JJVFMpKQorCisjZGVmaW5lIElTX1FTUElfRFVNTVlfQ1lDTEVTKERDWSkgICAgICAgICAgKChEQ1kpIDw9IDMxVSkKKworI2RlZmluZSBJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoTU9ERSkgICAgICgoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fMV9MSU5FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fMl9MSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9BRERSRVNTX01PREUoTU9ERSkgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfTk9ORSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU18xX0xJTkUpICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BRERSRVNTXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FERFJFU1NfNF9MSU5FUykpCisKKyNkZWZpbmUgSVNfUVNQSV9BTFRFUk5BVEVfQllURVNfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMV9MSU5FKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzJfTElORVMpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU180X0xJTkVTKSkKKworI2RlZmluZSBJU19RU1BJX0RBVEFfTU9ERShNT0RFKSAgICAgICAgICAgICgoKE1PREUpID09IFFTUElfREFUQV9OT05FKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9EQVRBXzFfTElORSkgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfMl9MSU5FUykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfREFUQV80X0xJTkVTKSkKKworI2RlZmluZSBJU19RU1BJX0REUl9NT0RFKEREUl9NT0RFKSAgICAgICAgICgoKEREUl9NT0RFKSA9PSBRU1BJX0REUl9NT0RFX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERFJfTU9ERSkgPT0gUVNQSV9ERFJfTU9ERV9FTkFCTEUpKQorCisjZGVmaW5lIElTX1FTUElfRERSX0hIQyhERFJfSEhDKSAgICAgICAgICAgKCgoRERSX0hIQykgPT0gUVNQSV9ERFJfSEhDX0FOQUxPR19ERUxBWSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEREUl9ISEMpID09IFFTUElfRERSX0hIQ19IQUxGX0NMS19ERUxBWSkpCisKKyNkZWZpbmUgSVNfUVNQSV9TSU9PX01PREUoU0lPT19NT0RFKSAgICAgICAoKChTSU9PX01PREUpID09IFFTUElfU0lPT19JTlNUX0VWRVJZX0NNRCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJT09fTU9ERSkgPT0gUVNQSV9TSU9PX0lOU1RfT05MWV9GSVJTVF9DTUQpKQorCisjZGVmaW5lIElTX1FTUElfSU5URVJWQUwoSU5URVJWQUwpICAgICAgICAgKChJTlRFUlZBTCkgPD0gUVVBRFNQSV9QSVJfSU5URVJWQUwpCisKKyNkZWZpbmUgSVNfUVNQSV9TVEFUVVNfQllURVNfU0laRShTSVpFKSAgICAoKChTSVpFKSA+PSAxVSkgJiYgKChTSVpFKSA8PSA0VSkpCisKKyNkZWZpbmUgSVNfUVNQSV9NQVRDSF9NT0RFKE1PREUpICAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX01BVENIX01PREVfQU5EKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9NQVRDSF9NT0RFX09SKSkKKworI2RlZmluZSBJU19RU1BJX0FVVE9NQVRJQ19TVE9QKEFQTVMpICAgICAgICgoKEFQTVMpID09IFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFQTVMpID09IFFTUElfQVVUT01BVElDX1NUT1BfRU5BQkxFKSkKKworI2RlZmluZSBJU19RU1BJX1RJTUVPVVRfQUNUSVZBVElPTihUQ0VOKSAgICgoKFRDRU4pID09IFFTUElfVElNRU9VVF9DT1VOVEVSX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUQ0VOKSA9PSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9FTkFCTEUpKQorCisjZGVmaW5lIElTX1FTUElfVElNRU9VVF9QRVJJT0QoUEVSSU9EKSAgICAgKChQRVJJT0QpIDw9IDB4RkZGRlUpCiAvKioKLSAgKiBAfQotICAqLwotCi0vKiogQGRlZmdyb3VwIFFTUElfRmlmb1RocmVzaG9sZCAgUVNQSSBGaWZvIFRocmVzaG9sZCAKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX0ZJRk9fVEhSRVNIT0xEKFRIUikgICAgICAgICAoKChUSFIpID4gMCkgJiYgKChUSFIpIDw9IDMyKSkKLS8qKgotICAqIEB9Ci0gICovCi0gIAotI2RlZmluZSBJU19RU1BJX1NTSElGVChTU0hJRlQpICAgICAgICAgICAgICAoKChTU0hJRlQpID09IFFTUElfU0FNUExFX1NISUZUSU5HX05PTkUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU1NISUZUKSA9PSBRU1BJX1NBTVBMRV9TSElGVElOR19IQUxGQ1lDTEUpKSAKLQotLyoqIEBkZWZncm91cCBRU1BJX0ZsYXNoU2l6ZSBRU1BJIEZsYXNoIFNpemUKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX0ZMQVNIX1NJWkUoRlNJWkUpICAgICAgICAgICAoKChGU0laRSkgPD0gMzEpKQotLyoqCi0gICogQH0KLSAgKi8KLSAgCi0jZGVmaW5lIElTX1FTUElfQ1NfSElHSF9USU1FKENTSFRJTUUpICAgICAgICgoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzFfQ1lDTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfMl9DWUNMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV8zX0NZQ0xFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzRfQ1lDTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfNV9DWUNMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDU0hUSU1FKSA9PSBRU1BJX0NTX0hJR0hfVElNRV82X0NZQ0xFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENTSFRJTUUpID09IFFTUElfQ1NfSElHSF9USU1FXzdfQ1lDTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1NIVElNRSkgPT0gUVNQSV9DU19ISUdIX1RJTUVfOF9DWUNMRSkpICAgCi0KLSNkZWZpbmUgSVNfUVNQSV9DTE9DS19NT0RFKENMS01PREUpICAgICAgICAgKCgoQ0xLTU9ERSkgPT0gUVNQSV9DTE9DS19NT0RFXzApIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0xLTU9ERSkgPT0gUVNQSV9DTE9DS19NT0RFXzMpKQotCi0jZGVmaW5lIElTX1FTUElfRkxBU0hfSUQoRkxBKSAgICAoKChGTEEpID09IFFTUElfRkxBU0hfSURfMSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBKSA9PSBRU1BJX0ZMQVNIX0lEXzIpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgSVNfUVNQSV9EVUFMX0ZMQVNIX01PREUoTU9ERSkgICAgKCgoTU9ERSkgPT0gUVNQSV9EVUFMRkxBU0hfRU5BQkxFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfRFVBTEZMQVNIX0RJU0FCTEUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAotLyoqIEBkZWZncm91cCBRU1BJX0luc3RydWN0aW9uIFFTUEkgSW5zdHJ1Y3Rpb24KLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX0lOU1RSVUNUSU9OKElOU1RSVUNUSU9OKSAgICAoKElOU1RSVUNUSU9OKSA8PSAweEZGKSAKLS8qKgotICAqIEB9Ci0gICovIAotCi0jZGVmaW5lIElTX1FTUElfQUREUkVTU19TSVpFKEFERFJfU0laRSkgICAgICgoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzhfQklUUykgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQUREUl9TSVpFKSA9PSBRU1BJX0FERFJFU1NfMTZfQklUUykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBRERSX1NJWkUpID09IFFTUElfQUREUkVTU18yNF9CSVRTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFERFJfU0laRSkgPT0gUVNQSV9BRERSRVNTXzMyX0JJVFMpKQotCi0jZGVmaW5lIElTX1FTUElfQUxURVJOQVRFX0JZVEVTX1NJWkUoU0laRSkgICgoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzhfQklUUykgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMTZfQklUUykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU18yNF9CSVRTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzMyX0JJVFMpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotLyoqIEBkZWZncm91cCBRU1BJX0R1bW15Q3ljbGVzIFFTUEkgRHVtbXkgQ3ljbGVzCi0gICogQHsKLSAgKi8KLSNkZWZpbmUgSVNfUVNQSV9EVU1NWV9DWUNMRVMoRENZKSAgICAgICAgICAgKChEQ1kpIDw9IDMxKSAKLS8qKgotICAqIEB9Ci0gICovCi0KLSNkZWZpbmUgSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKE1PREUpICAgICAgKCgoTU9ERSkgPT0gUVNQSV9JTlNUUlVDVElPTl9OT05FKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfSU5TVFJVQ1RJT05fMV9MSU5FKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0lOU1RSVUNUSU9OXzJfTElORVMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9JTlNUUlVDVElPTl80X0xJTkVTKSkgIAotCi0jZGVmaW5lIElTX1FTUElfQUREUkVTU19NT0RFKE1PREUpICAgICAgICAgICgoKE1PREUpID09IFFTUElfQUREUkVTU19OT05FKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU18xX0xJTkUpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU18yX0xJTkVTKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUREUkVTU180X0xJTkVTKSkKLQotI2RlZmluZSBJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKE1PREUpICAoKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU19OT05FKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfQUxURVJOQVRFX0JZVEVTXzFfTElORSkgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gUVNQSV9BTFRFUk5BVEVfQllURVNfMl9MSU5FUykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0FMVEVSTkFURV9CWVRFU180X0xJTkVTKSkKLQotI2RlZmluZSBJU19RU1BJX0RBVEFfTU9ERShNT0RFKSAgICAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX0RBVEFfTk9ORSkgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfMV9MSU5FKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfMl9MSU5FUykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBRU1BJX0RBVEFfNF9MSU5FUykpCi0KLSNkZWZpbmUgSVNfUVNQSV9ERFJfTU9ERShERFJfTU9ERSkgICAgICAgICAgKCgoRERSX01PREUpID09IFFTUElfRERSX01PREVfRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChERFJfTU9ERSkgPT0gUVNQSV9ERFJfTU9ERV9FTkFCTEUpKQotCi0jZGVmaW5lIElTX1FTUElfRERSX0hIQyhERFJfSEhDKSAgICAgICAgICAgICgoKEREUl9ISEMpID09IFFTUElfRERSX0hIQ19BTkFMT0dfREVMQVkpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRERSX0hIQykgPT0gUVNQSV9ERFJfSEhDX0hBTEZfQ0xLX0RFTEFZKSkKLQotI2RlZmluZSBJU19RU1BJX1NJT09fTU9ERShTSU9PX01PREUpICAgICAgKCgoU0lPT19NT0RFKSA9PSBRU1BJX1NJT09fSU5TVF9FVkVSWV9DTUQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0lPT19NT0RFKSA9PSBRU1BJX1NJT09fSU5TVF9PTkxZX0ZJUlNUX0NNRCkpCi0KLS8qKiBAZGVmZ3JvdXAgUVNQSV9JbnRlcnZhbCBRU1BJIEludGVydmFsIAotICAqIEB7Ci0gICovCi0jZGVmaW5lIElTX1FTUElfSU5URVJWQUwoSU5URVJWQUwpICAgICAgICAoKElOVEVSVkFMKSA8PSBRVUFEU1BJX1BJUl9JTlRFUlZBTCkgCi0vKioKLSAgKiBAfQotICAqLwotCi0vKiogQGRlZmdyb3VwIFFTUElfU3RhdHVzQnl0ZXNTaXplIFFTUEkgU3RhdHVzIEJ5dGVzIFNpemUKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX1NUQVRVU19CWVRFU19TSVpFKFNJWkUpICAgKCgoU0laRSkgPj0gMSkgJiYgKChTSVpFKSA8PSA0KSkgCi0vKioKLSAgKiBAfQotICAqLwotI2RlZmluZSBJU19RU1BJX01BVENIX01PREUoTU9ERSkgICAgICAgICAgICAoKChNT0RFKSA9PSBRU1BJX01BVENIX01PREVfQU5EKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFFTUElfTUFUQ0hfTU9ERV9PUikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIElTX1FTUElfQVVUT01BVElDX1NUT1AoQVBNUykgICAgICAgICgoKEFQTVMpID09IFFTUElfQVVUT01BVElDX1NUT1BfRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBUE1TKSA9PSBRU1BJX0FVVE9NQVRJQ19TVE9QX0VOQUJMRSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSNkZWZpbmUgSVNfUVNQSV9USU1FT1VUX0FDVElWQVRJT04oVENFTikgICAgKCgoVENFTikgPT0gUVNQSV9USU1FT1VUX0NPVU5URVJfRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUQ0VOKSA9PSBRU1BJX1RJTUVPVVRfQ09VTlRFUl9FTkFCTEUpKSAKLQotLyoqIEBkZWZncm91cCBRU1BJX1RpbWVPdXRQZXJpb2QgIFFTUEkgVGltZU91dCBQZXJpb2QKLSAgKiBAewotICAqLwotI2RlZmluZSBJU19RU1BJX1RJTUVPVVRfUEVSSU9EKFBFUklPRCkgICAgICAoKFBFUklPRCkgPD0gMHhGRkZGKSAKLS8qKgotICAqIEB9Ci0gICovCi0KLSNkZWZpbmUgSVNfUVNQSV9HRVRfRkxBRyhGTEFHKSAgICAgICAgICAgICAgKCgoRkxBRykgPT0gUVNQSV9GTEFHX0JVU1kpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUVNQSV9GTEFHX1RPKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUVNQSV9GTEFHX1NNKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUVNQSV9GTEFHX0ZUKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUVNQSV9GTEFHX1RDKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRkxBRykgPT0gUVNQSV9GTEFHX1RFKSkgICAgCi0KLSNkZWZpbmUgSVNfUVNQSV9JVChJVCkgICAgICAgICAgICAgICAgICAgICAgKCgoKElUKSAmICh1aW50MzJfdCkweEZGRTBGRkZGVSkgPT0gMHgwMDAwMDAwMFUpICYmICgoSVQpICE9IDB4MDAwMDAwMDBVKSkKLS8qKgotICAqIEB9Ci0gICovCi0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGRlZmdyb3VwIFFTUElfUHJpdmF0ZV9GdW5jdGlvbnMgUVNQSSBQcml2YXRlIEZ1bmN0aW9ucwotICAqIEB7Ci0gICovCisqIEB9CisqLworLyogRW5kIG9mIHByaXZhdGUgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoqCiAgICogQH0KQEAgLTgxMSwxNiArNzQwLDE0IEBACiAKIC8qKgogICAqIEB9Ci0gICovIAorICAqLwogCi0vKioKLSAgKiBAfQotICAqLyAKLSAgCisjZW5kaWYgLyogZGVmaW5lZChRVUFEU1BJKSB8fCBkZWZpbmVkKFFVQURTUEkxKSB8fCBkZWZpbmVkKFFVQURTUEkyKSAqLworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfSEFMX1FTUElfSCAqLworI2VuZGlmIC8qIFNUTTMyRjd4eF9IQUxfUVNQSV9IICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9zYWkuaCBiL0luYy9zdG0zMmY3eHhfaGFsX3NhaS5oCmluZGV4IDVlMzg0YjkuLjNhMzIwOTYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX3NhaS5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3NhaS5oCkBAIC05Nyw5ICs5NywxMCBAQAogICB1aW50MzJfdCBBdWRpb0ZyZXF1ZW5jeTsgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgYXVkaW8gZnJlcXVlbmN5IHNhbXBsaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgU0FJX0F1ZGlvX0ZyZXF1ZW5jeSAqLwogCi0gIHVpbnQzMl90IE1ja2RpdjsgICAgICAgICAgICAgIC8qITwgU3BlY2lmaWVzIHRoZSBtYXN0ZXIgY2xvY2sgZGl2aWRlciwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgaWYgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GcmVxdWVuY3kgdGhlIHVzZXIgY2hvaWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxNSAqLworICB1aW50MzJfdCBNY2tkaXY7ICAgICAgICAgICAgICAvKiE8IFNwZWNpZmllcyB0aGUgbWFzdGVyIGNsb2NrIGRpdmlkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIE1pbl9EYXRhID0gMCBhbmQgTWF4X0RhdGEgPSAxNS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAbm90ZSBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgaWYgQXVkaW9GcmVxdWVuY3kgaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FJX0FVRElPX0ZSRVFVRU5DWV9NQ0tESVYgb3RoZXJ3aXNlIGl0IGlzIGludGVybmFsbHkgY29tcHV0ZWQuICovCiAKICAgdWludDMyX3QgTW9ub1N0ZXJlb01vZGU7ICAgICAgLyohPCBTcGVjaWZpZXMgaWYgdGhlIG1vbm8gb3Igc3RlcmVvIG1vZGUgaXMgc2VsZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBTQUlfTW9ub19TdGVyZW9fTW9kZSAqLwpAQCAtODQxLDcgKzg0Miw3IEBACiAjZGVmaW5lIElTX1NBSV9CTE9DS19GU19ERUZJTklUSU9OKERFRklOSVRJT04pICgoKERFRklOSVRJT04pID09IFNBSV9GU19TVEFSVEZSQU1FKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKERFRklOSVRJT04pID09IFNBSV9GU19DSEFOTkVMX0lERU5USUZJQ0FUSU9OKSkKIAotI2RlZmluZSBJU19TQUlfQkxPQ0tfTUFTVEVSX0RJVklERVIoRElWSURFUikgKChESVZJREVSKSA8PSAxNSkKKyNkZWZpbmUgSVNfU0FJX0JMT0NLX01BU1RFUl9ESVZJREVSKERJVklERVIpICgoRElWSURFUikgPD0gMTVVKQogCiAjZGVmaW5lIElTX1NBSV9CTE9DS19GUkFNRV9MRU5HVEgoTEVOR1RIKSAoKDggPD0gKExFTkdUSCkpICYmICgoTEVOR1RIKSA8PSAyNTYpKQogCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9zZC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfc2QuaAppbmRleCBkMDJlMzhlLi4zMDVmODNhIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9zZC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3NkLmgKQEAgLTEyLDE5ICsxMiwyMSBAQAogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICovIAogCiAvKiBEZWZpbmUgdG8gcHJldmVudCByZWN1cnNpdmUgaW5jbHVzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBfX1NUTTMyRjd4eF9IQUxfU0RfSAotI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfU0RfSAorI2lmbmRlZiBTVE0zMkY3eHhfSEFMX1NEX0gKKyNkZWZpbmUgU1RNMzJGN3h4X0hBTF9TRF9ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwogIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKFNETU1DMSkKKwogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfbGxfc2RtbWMuaCIKIApAQCAtNDcsMTQgKzQ5LDE0IEBACiAgICovICAgCiB0eXBlZGVmIGVudW0KIHsKLSAgSEFMX1NEX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSwgIC8qITwgU0Qgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KLSAgSEFMX1NEX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSwgIC8qITwgU0QgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KLSAgSEFMX1NEX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDJVKSwgIC8qITwgU0QgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX1NEX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDNVKSwgIC8qITwgU0QgcHJvY2VzcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX1NEX1NUQVRFX1BST0dSQU1NSU5HICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKSwgIC8qITwgU0QgUHJvZ3JhbW1pbmcgU3RhdGUgICAgICAgICAgICAgICAgKi8KLSAgSEFMX1NEX1NUQVRFX1JFQ0VJVklORyAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSwgIC8qITwgU0QgUmVjZWludmluZyBTdGF0ZSAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX1NEX1NUQVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSwgIC8qITwgU0QgVHJhbnNmZXJ0IFN0YXRlICAgICAgICAgICAgICAgICAgKi8KLSAgSEFMX1NEX1NUQVRFX0VSUk9SICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMEZVKSAgIC8qITwgU0QgaXMgaW4gZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX1JFU0VUICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwVSwgIC8qITwgU0Qgbm90IHlldCBpbml0aWFsaXplZCBvciBkaXNhYmxlZCAgKi8KKyAgSEFMX1NEX1NUQVRFX1JFQURZICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxVSwgIC8qITwgU0QgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IGZvciB1c2UgICAgKi8KKyAgSEFMX1NEX1NUQVRFX1RJTUVPVVQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyVSwgIC8qITwgU0QgVGltZW91dCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX0JVU1kgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzVSwgIC8qITwgU0QgcHJvY2VzcyBvbmdvaW5nICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX1BST0dSQU1NSU5HICAgICAgICAgICAgPSAweDAwMDAwMDA0VSwgIC8qITwgU0QgUHJvZ3JhbW1pbmcgU3RhdGUgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX1JFQ0VJVklORyAgICAgICAgICAgICAgPSAweDAwMDAwMDA1VSwgIC8qITwgU0QgUmVjZWl2aW5nIFN0YXRlICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX1RSQU5TRkVSICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2VSwgIC8qITwgU0QgVHJhbnNmZXJ0IFN0YXRlICAgICAgICAgICAgICAgICAgKi8KKyAgSEFMX1NEX1NUQVRFX0VSUk9SICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBGVSAgIC8qITwgU0QgaXMgaW4gZXJyb3Igc3RhdGUgICAgICAgICAgICAgICAgKi8KIH1IQUxfU0RfU3RhdGVUeXBlRGVmOwogLyoqIAogICAqIEB9CkBAIC02MywxOCArNjUsMTcgQEAKIC8qKiBAZGVmZ3JvdXAgU0RfRXhwb3J0ZWRfVHlwZXNfR3JvdXAyIFNEIENhcmQgU3RhdGUgZW51bWVyYXRpb24gc3RydWN0dXJlCiAgICogQHsKICAgKi8gICAKLXR5cGVkZWYgZW51bQotewotICBIQUxfU0RfQ0FSRF9SRUFEWSAgICAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDAxVSksICAvKiE8IENhcmQgc3RhdGUgaXMgcmVhZHkgICAgICAgICAgICAgICAgICAgICAqLwotICBIQUxfU0RfQ0FSRF9JREVOVElGSUNBVElPTiAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDAyVSksICAvKiE8IENhcmQgaXMgaW4gaWRlbnRpZmljYXRpb24gc3RhdGUgICAgICAgICAqLwotICBIQUxfU0RfQ0FSRF9TVEFOREJZICAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDAzVSksICAvKiE8IENhcmQgaXMgaW4gc3RhbmRieSBzdGF0ZSAgICAgICAgICAgICAgICAqLwotICBIQUxfU0RfQ0FSRF9UUkFOU0ZFUiAgICAgICAgICAgICAgID0gKCh1aW50MzJfdCkweDAwMDAwMDA0VSksICAvKiE8IENhcmQgaXMgaW4gdHJhbnNmZXIgc3RhdGUgICAgICAgICAgICAgICAqLyAgCi0gIEhBTF9TRF9DQVJEX1NFTkRJTkcgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDVVKSwgIC8qITwgQ2FyZCBpcyBzZW5kaW5nIGFuIG9wZXJhdGlvbiAgICAgICAgICAgICovCi0gIEhBTF9TRF9DQVJEX1JFQ0VJVklORyAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDZVKSwgIC8qITwgQ2FyZCBpcyByZWNlaXZpbmcgb3BlcmF0aW9uIGluZm9ybWF0aW9uICovCi0gIEhBTF9TRF9DQVJEX1BST0dSQU1NSU5HICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDdVKSwgIC8qITwgQ2FyZCBpcyBpbiBwcm9ncmFtbWluZyBzdGF0ZSAgICAgICAgICAgICovCi0gIEhBTF9TRF9DQVJEX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSwgIC8qITwgQ2FyZCBpcyBkaXNjb25uZWN0ZWQgICAgICAgICAgICAgICAgICAgICovCi0gIEhBTF9TRF9DQVJEX0VSUk9SICAgICAgICAgICAgICAgICAgPSAoKHVpbnQzMl90KTB4MDAwMDAwRkZVKSAgIC8qITwgQ2FyZCByZXNwb25zZSBFcnJvciAgICAgICAgICAgICAgICAgICAgICovCi19SEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWY7Cit0eXBlZGVmIHVpbnQzMl90IEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmOworCisjZGVmaW5lIEhBTF9TRF9DQVJEX1JFQURZICAgICAgICAgIDB4MDAwMDAwMDFVICAvKiE8IENhcmQgc3RhdGUgaXMgcmVhZHkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU0RfQ0FSRF9JREVOVElGSUNBVElPTiAweDAwMDAwMDAyVSAgLyohPCBDYXJkIGlzIGluIGlkZW50aWZpY2F0aW9uIHN0YXRlICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NEX0NBUkRfU1RBTkRCWSAgICAgICAgMHgwMDAwMDAwM1UgIC8qITwgQ2FyZCBpcyBpbiBzdGFuZGJ5IHN0YXRlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBTF9TRF9DQVJEX1RSQU5TRkVSICAgICAgIDB4MDAwMDAwMDRVICAvKiE8IENhcmQgaXMgaW4gdHJhbnNmZXIgc3RhdGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU0RfQ0FSRF9TRU5ESU5HICAgICAgICAweDAwMDAwMDA1VSAgLyohPCBDYXJkIGlzIHNlbmRpbmcgYW4gb3BlcmF0aW9uICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NEX0NBUkRfUkVDRUlWSU5HICAgICAgMHgwMDAwMDAwNlUgIC8qITwgQ2FyZCBpcyByZWNlaXZpbmcgb3BlcmF0aW9uIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEhBTF9TRF9DQVJEX1BST0dSQU1NSU5HICAgIDB4MDAwMDAwMDdVICAvKiE8IENhcmQgaXMgaW4gcHJvZ3JhbW1pbmcgc3RhdGUgICAgICAgICAgICAqLworI2RlZmluZSBIQUxfU0RfQ0FSRF9ESVNDT05ORUNURUQgICAweDAwMDAwMDA4VSAgLyohPCBDYXJkIGlzIGRpc2Nvbm5lY3RlZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFMX1NEX0NBUkRfRVJST1IgICAgICAgICAgMHgwMDAwMDBGRlUgIC8qITwgQ2FyZCByZXNwb25zZSBFcnJvciAgICAgICAgICAgICAgICAgICAgICovCiAvKiogCiAgICogQH0KICAgKi8KQEAgLTExMSw3ICsxMTIsMTEgQEAKIC8qKiAKICAgKiBAYnJpZWYgIFNEIGhhbmRsZSBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgogICAqLyAKKyNpZiBkZWZpbmVkIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogdHlwZWRlZiBzdHJ1Y3QgX19TRF9IYW5kbGVUeXBlRGVmCisjZWxzZQordHlwZWRlZiBzdHJ1Y3QKKyNlbmRpZiAvKiBVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogewogICBTRF9UeXBlRGVmICAgICAgICAgICAgICAgICAgICpJbnN0YW5jZTsgICAgICAgIC8qITwgU0QgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyAgICAgICAgICAgKi8KICAgCkBAIC0xMTksMTEgKzEyNCwxMSBAQAogICAKICAgSEFMX0xvY2tUeXBlRGVmICAgICAgICAgICAgICBMb2NrOyAgICAgICAgICAgICAvKiE8IFNEIGxvY2tpbmcgb2JqZWN0ICAgICAgICAgICAgICAgICAgICovCiAgIAotICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICpwVHhCdWZmUHRyOyAgICAgIC8qITwgUG9pbnRlciB0byBTRCBUeCB0cmFuc2ZlciBCdWZmZXIgICAgKi8KKyAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAqcFR4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gU0QgVHggdHJhbnNmZXIgQnVmZmVyICAgICovCiAKICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBUeFhmZXJTaXplOyAgICAgICAvKiE8IFNEIFR4IFRyYW5zZmVyIHNpemUgICAgICAgICAgICAgICAgICovCiAKLSAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAqcFJ4QnVmZlB0cjsgICAgICAvKiE8IFBvaW50ZXIgdG8gU0QgUnggdHJhbnNmZXIgQnVmZmVyICAgICovCisgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgKnBSeEJ1ZmZQdHI7ICAgICAgLyohPCBQb2ludGVyIHRvIFNEIFJ4IHRyYW5zZmVyIEJ1ZmZlciAgICAqLwogCiAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgUnhYZmVyU2l6ZTsgICAgICAgLyohPCBTRCBSeCBUcmFuc2ZlciBzaXplICAgICAgICAgICAgICAgICAqLwogICAKQEAgLTEzMyw5ICsxMzgsOSBAQAogICAKICAgX19JTyB1aW50MzJfdCAgICAgICAgICAgICAgICBFcnJvckNvZGU7ICAgICAgICAvKiE8IFNEIENhcmQgRXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICovICAKICAKLSAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICAgICAqaGRtYXJ4OyAgICAgICAgICAvKiE8IFNEIFJ4IERNQSBoYW5kbGUgcGFyYW1ldGVycyAgICAgICAgICovCi0gIAogICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICpoZG1hdHg7ICAgICAgICAgIC8qITwgU0QgVHggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgKi8KKworICBETUFfSGFuZGxlVHlwZURlZiAgICAgICAgICAgICpoZG1hcng7ICAgICAgICAgIC8qITwgU0QgUnggRE1BIGhhbmRsZSBwYXJhbWV0ZXJzICAgICAgICAgKi8KICAgCiAgIEhBTF9TRF9DYXJkSW5mb1R5cGVEZWYgICAgICAgU2RDYXJkOyAgICAgICAgICAgLyohPCBTRCBDYXJkIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAqLwogICAKQEAgLTE0Myw3ICsxNDgsNyBAQAogICAKICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBDSURbNF07ICAgICAgICAgICAvKiE8IFNEIGNhcmQgaWRlbnRpZmljYXRpb24gbnVtYmVyIHRhYmxlICovCiAgIAotI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgIHZvaWQgKCogVHhDcGx0Q2FsbGJhY2spICAgICAgICAgICAgICAgICAoc3RydWN0IF9fU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKICAgdm9pZCAoKiBSeENwbHRDYWxsYmFjaykgICAgICAgICAgICAgICAgIChzdHJ1Y3QgX19TRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogICB2b2lkICgqIEVycm9yQ2FsbGJhY2spICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfX1NEX0hhbmRsZVR5cGVEZWYgKmhzZCk7CkBAIC0xNTEsNyArMTU2LDcgQEAKIAogICB2b2lkICgqIE1zcEluaXRDYWxsYmFjaykgICAgICAgICAgICAgICAgKHN0cnVjdCBfX1NEX0hhbmRsZVR5cGVEZWYgKmhzZCk7CiAgIHZvaWQgKCogTXNwRGVJbml0Q2FsbGJhY2spICAgICAgICAgICAgICAoc3RydWN0IF9fU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKLSNlbmRpZiAgCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIH1TRF9IYW5kbGVUeXBlRGVmOwogCiAvKiogCkBAIC0xOTIsNyArMTk3LDcgQEAKICAgX19JTyB1aW50OF90ICBXcml0ZUJsb2NrUGFQYXJ0aWFsOyAgLyohPCBQYXJ0aWFsIGJsb2NrcyBmb3Igd3JpdGUgYWxsb3dlZCAgICAgICovCiAgIF9fSU8gdWludDhfdCAgUmVzZXJ2ZWQzOyAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBfX0lPIHVpbnQ4X3QgIENvbnRlbnRQcm90ZWN0QXBwbGk7ICAvKiE8IENvbnRlbnQgcHJvdGVjdGlvbiBhcHBsaWNhdGlvbiAgICAgICAgKi8KLSAgX19JTyB1aW50OF90ICBGaWxlRm9ybWF0R3JvdW9wOyAgICAgLyohPCBGaWxlIGZvcm1hdCBncm91cCAgICAgICAgICAgICAgICAgICAgICovCisgIF9fSU8gdWludDhfdCAgRmlsZUZvcm1hdEdyb3VwOyAgICAgIC8qITwgRmlsZSBmb3JtYXQgZ3JvdXAgICAgICAgICAgICAgICAgICAgICAqLwogICBfX0lPIHVpbnQ4X3QgIENvcHlGbGFnOyAgICAgICAgICAgICAvKiE8IENvcHkgZmxhZyAoT1RQKSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgX19JTyB1aW50OF90ICBQZXJtV3JQcm90ZWN0OyAgICAgICAgLyohPCBQZXJtYW5lbnQgd3JpdGUgcHJvdGVjdGlvbiAgICAgICAgICAgICovCiAgIF9fSU8gdWludDhfdCAgVGVtcFdyUHJvdGVjdDsgICAgICAgIC8qITwgVGVtcG9yYXJ5IHdyaXRlIHByb3RlY3Rpb24gICAgICAgICAgICAqLwpAQCAtMjAwLDcgKzIwNSw2IEBACiAgIF9fSU8gdWludDhfdCAgRUNDOyAgICAgICAgICAgICAgICAgIC8qITwgRUNDIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBfX0lPIHVpbnQ4X3QgIENTRF9DUkM7ICAgICAgICAgICAgICAvKiE8IENTRCBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgX19JTyB1aW50OF90ICBSZXNlcnZlZDQ7ICAgICAgICAgICAgLyohPCBBbHdheXMgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIAogfUhBTF9TRF9DYXJkQ1NEVHlwZURlZjsKIC8qKiAKICAgKiBAfQpAQCAtMjQ4LDcgKzI1Miw3IEBACiAgICogQH0KICAgKi8KIAotI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAvKiogQGRlZmdyb3VwIFNEX0V4cG9ydGVkX1R5cGVzX0dyb3VwNyBTRCBDYWxsYmFjayBJRCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uIAogICAqIEB7CiAgICovCkBAIC0yNzMsNyArMjc3LDcgQEAKIC8qKiAKICAgKiBAfQogICAqLwotI2VuZGlmCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIC8qKiAKICAgKiBAfQogICAqLwpAQCAtMjgzLDcgKzI4Nyw3IEBACiAgICogQHsKICAgKi8KIAotI2RlZmluZSBCTE9DS1NJWkUgICAoKHVpbnQzMl90KTUxMlUpIC8qITwgQmxvY2sgc2l6ZSBpcyA1MTIgYnl0ZXMgKi8KKyNkZWZpbmUgQkxPQ0tTSVpFICAgNTEyVSAvKiE8IEJsb2NrIHNpemUgaXMgNTEyIGJ5dGVzICovCiAKIC8qKiBAZGVmZ3JvdXAgU0RfRXhwb3J0ZWRfQ29uc3RhbnN0c19Hcm91cDEgU0QgRXJyb3Igc3RhdHVzIGVudW1lcmF0aW9uIFN0cnVjdHVyZSBkZWZpbml0aW9uIAogICAqIEB7CkBAIC0zMjUsMTAgKzMyOSw5IEBACiAjZGVmaW5lIEhBTF9TRF9FUlJPUl9ETUEgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfRVJST1JfRE1BICAgICAgICAgICAgICAgICAgICAgLyohPCBFcnJvciB3aGlsZSBETUEgdHJhbnNmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBTF9TRF9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgU0RNTUNfRVJST1JfVElNRU9VVCAgICAgICAgICAgICAgICAgLyohPCBUaW1lb3V0IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogI2RlZmluZSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAgICAgICAgIFNETU1DX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICAgIC8qITwgSW52YWxpZCBjYWxsYmFjayBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogLyoqIAogICAqIEB9CiAgICovCkBAIC0zMzYsMTMgKzMzOSwxMyBAQAogLyoqIEBkZWZncm91cCBTRF9FeHBvcnRlZF9Db25zdGFuc3RzX0dyb3VwMiBTRCBjb250ZXh0IGVudW1lcmF0aW9uCiAgICogQHsKICAgKi8gCi0jZGVmaW5lICAgU0RfQ09OVEVYVF9OT05FICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgLyohPCBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgIFNEX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0sgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkgIC8qITwgUmVhZCBzaW5nbGUgYmxvY2sgb3BlcmF0aW9uICAgICAgKi8KLSNkZWZpbmUgICBTRF9DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0sgICgodWludDMyX3QpMHgwMDAwMDAwMlUpICAvKiE8IFJlYWQgbXVsdGlwbGUgYmxvY2tzIG9wZXJhdGlvbiAgICovCi0jZGVmaW5lICAgU0RfQ09OVEVYVF9XUklURV9TSU5HTEVfQkxPQ0sgICAoKHVpbnQzMl90KTB4MDAwMDAwMTBVKSAgLyohPCBXcml0ZSBzaW5nbGUgYmxvY2sgb3BlcmF0aW9uICAgICAqLwotI2RlZmluZSAgIFNEX0NPTlRFWFRfV1JJVEVfTVVMVElQTEVfQkxPQ0sgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgIC8qITwgV3JpdGUgbXVsdGlwbGUgYmxvY2tzIG9wZXJhdGlvbiAgKi8KLSNkZWZpbmUgICBTRF9DT05URVhUX0lUICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOFUpICAvKiE8IFByb2Nlc3MgaW4gSW50ZXJydXB0IG1vZGUgICAgICAgICovCi0jZGVmaW5lICAgU0RfQ09OVEVYVF9ETUEgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwODBVKSAgLyohPCBQcm9jZXNzIGluIERNQSBtb2RlICAgICAgICAgICAgICAqLyAgCisjZGVmaW5lIFNEX0NPTlRFWFRfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgIC8qITwgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVICAgLyohPCBSZWFkIHNpbmdsZSBibG9jayBvcGVyYXRpb24gICAgICAqLworI2RlZmluZSBTRF9DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0sgICAgICAgICAgICAgMHgwMDAwMDAwMlUgICAvKiE8IFJlYWQgbXVsdGlwbGUgYmxvY2tzIG9wZXJhdGlvbiAgICovCisjZGVmaW5lIFNEX0NPTlRFWFRfV1JJVEVfU0lOR0xFX0JMT0NLICAgICAgICAgICAgICAweDAwMDAwMDEwVSAgIC8qITwgV3JpdGUgc2luZ2xlIGJsb2NrIG9wZXJhdGlvbiAgICAgKi8KKyNkZWZpbmUgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSyAgICAgICAgICAgIDB4MDAwMDAwMjBVICAgLyohPCBXcml0ZSBtdWx0aXBsZSBibG9ja3Mgb3BlcmF0aW9uICAqLworI2RlZmluZSBTRF9DT05URVhUX0lUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAvKiE8IFByb2Nlc3MgaW4gSW50ZXJydXB0IG1vZGUgICAgICAgICovCisjZGVmaW5lIFNEX0NPTlRFWFRfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwVSAgIC8qITwgUHJvY2VzcyBpbiBETUEgbW9kZSAgICAgICAgICAgICAgKi8KIAogLyoqCiAgICogQH0KQEAgLTM1MSw5ICszNTQsOSBAQAogLyoqIEBkZWZncm91cCBTRF9FeHBvcnRlZF9Db25zdGFuc3RzX0dyb3VwMyBTRCBTdXBwb3J0ZWQgTWVtb3J5IENhcmRzCiAgICogQHsKICAgKi8KLSNkZWZpbmUgQ0FSRF9TRFNDICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKLSNkZWZpbmUgQ0FSRF9TREhDX1NEWEMgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAxVSkKLSNkZWZpbmUgQ0FSRF9TRUNVUkVEICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAzVSkKKyNkZWZpbmUgQ0FSRF9TRFNDICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgIC8qITwgU0QgU3RhbmRhcmQgQ2FwYWNpdHkgPDJHbyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FSRF9TREhDX1NEWEMgICAgICAgICAgICAgMHgwMDAwMDAwMVUgIC8qITwgU0QgSGlnaCBDYXBhY2l0eSA8MzJHbywgU0QgRXh0ZW5kZWQgQ2FwYWNpdHkgPDJUbyAgKi8KKyNkZWZpbmUgQ0FSRF9TRUNVUkVEICAgICAgICAgICAgICAgMHgwMDAwMDAwM1UKICAgICAKIC8qKgogICAqIEB9CkBAIC0zNjIsOCArMzY1LDggQEAKIC8qKiBAZGVmZ3JvdXAgU0RfRXhwb3J0ZWRfQ29uc3RhbnN0c19Hcm91cDQgU0QgU3VwcG9ydGVkIFZlcnNpb24KICAgKiBAewogICAqLwotI2RlZmluZSBDQVJEX1YxX1ggICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQotI2RlZmluZSBDQVJEX1YyX1ggICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKQorI2RlZmluZSBDQVJEX1YxX1ggICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQorI2RlZmluZSBDQVJEX1YyX1ggICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQogLyoqCiAgICogQH0KICAgKi8KQEAgLTM4MSw3ICszODQsNyBAQAogICAqIEBwYXJhbSAgX19IQU5ETEVfXyA6IFNEIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogI2RlZmluZSBfX0hBTF9TRF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRVNFVDsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICBcCkBAIC0zODksNyArMzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCiAjZWxzZQogI2RlZmluZSBfX0hBTF9TRF9SRVNFVF9IQU5ETEVfU1RBVEUoX19IQU5ETEVfXykgICAgICAgICAgICgoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFU0VUKQotI2VuZGlmCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIHRoZSBTRCBkZXZpY2UuCkBAIC00MTcsOCArNDIwLDggQEAKICAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIHRoZSBTRCBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBTRCBIYW5kbGUgIAotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBTRCBIYW5kbGUgIAorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXzogc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RDUkNGQUlMOiBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdApAQCAtNDI4LDcgKzQzMSw3IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpIGludGVycnVwdAotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURBQ1Q6ICAgQ29tbWFuZCB0cmFuc2ZlciBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0CkBAIC00NDEsMTUgKzQ0NCwxNSBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWEZJRk9FOiAgUmVjZWl2ZSBGSUZPIGVtcHR5IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gdHJhbnNtaXQgRklGTyBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTyBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfU0RJT0lUOiAgIFNEIEkvTyBpbnRlcnJ1cHQgcmVjZWl2ZWQgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRElPIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfU0RfRU5BQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIF9fU0RNTUNfRU5BQkxFX0lUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UsIChfX0lOVEVSUlVQVF9fKSkKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTRCBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19IQU5ETEVfXyBTRCBIYW5kbGUgICAKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KKyAgKiBAcGFyYW0gIF9fSEFORExFX186IFNEIEhhbmRsZSAgIAorICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXzogc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBkaXNhYmxlZC4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC00NTksNyArNDYyLDcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQKQEAgLTQ3MiwxNSArNDc1LDE1IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYRklGT0U6ICBSZWNlaXZlIEZJRk8gZW1wdHkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gcmVjZWl2ZSBGSUZPIGludGVycnVwdAotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQgICAKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdCAgIAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9TRF9ESVNBQkxFX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pIF9fU0RNTUNfRElTQUJMRV9JVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLCAoX19JTlRFUlJVUFRfXykpCiAKIC8qKgogICAqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNEIGZsYWcgaXMgc2V0IG9yIG5vdC4gCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIFNEIEhhbmRsZSAgIAotICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiAKKyAgKiBAcGFyYW0gIF9fSEFORExFX186IFNEIEhhbmRsZSAgIAorICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQpAQCAtNDkwLDcgKzQ5Myw3IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvcgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MKQEAgLTUwMywxNSArNTA2LDE1IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTwotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkCiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFNEIEZMQUcgKFNFVCBvciBSRVNFVCkuCiAgICovCiAjZGVmaW5lIF9fSEFMX1NEX0dFVF9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSBfX1NETU1DX0dFVF9GTEFHKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UsIChfX0ZMQUdfXykpCiAKIC8qKgogICAqIEBicmllZiAgQ2xlYXIgdGhlIFNEJ3MgcGVuZGluZyBmbGFncy4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gU0QgSGFuZGxlICAKLSAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gIAorICAqIEBwYXJhbSAgX19IQU5ETEVfXzogU0QgSGFuZGxlICAKKyAgKiBAcGFyYW0gIF9fRkxBR19fOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuICAKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkKQEAgLTUyMSwxNyArNTI0LDE3IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvcgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkCiAgICogQHJldHZhbCBOb25lCiAgICovCiAjZGVmaW5lIF9fSEFMX1NEX0NMRUFSX0ZMQUcoX19IQU5ETEVfXywgX19GTEFHX18pIF9fU0RNTUNfQ0xFQVJfRkxBRygoX19IQU5ETEVfXyktPkluc3RhbmNlLCAoX19GTEFHX18pKQogCiAvKioKICAgKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTRCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KLSAgKiBAcGFyYW0gIF9fSEFORExFX18gU0QgSGFuZGxlICAgCi0gICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgU0RNTUMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBTRCBIYW5kbGUgICAKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgU0RNTUMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKQEAgLTU0MSw3ICs1NDQsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBEQVRBQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzIGludGVycnVwdApAQCAtNTU0LDE1ICs1NTcsMTUgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfVFhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHRyYW5zbWl0IEZJRk8gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiByZWNlaXZlIEZJRk8gaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0RJTyBpbnRlcnJ1cHQgcmVjZWl2ZWQgaW50ZXJydXB0CiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFNEIElUIChTRVQgb3IgUkVTRVQpLgogICAqLwogI2RlZmluZSBfX0hBTF9TRF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgX19TRE1NQ19HRVRfSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZSwgKF9fSU5URVJSVVBUX18pKQogCiAvKioKICAgKiBAYnJpZWYgIENsZWFyIHRoZSBTRCdzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuCi0gICogQHBhcmFtICBfX0hBTkRMRV9fIFNEIEhhbmRsZQotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4gCisgICogQHBhcmFtICBfX0hBTkRMRV9fOiBTRCBIYW5kbGUKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiAKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC01NzIsOCArNTc1LDggQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRE1NQ19EQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRElPIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfU0RfQ0xFQVJfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgX19TRE1NQ19DTEVBUl9JVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLCAoX19JTlRFUlJVUFRfXykpCkBAIC02MjEsMTEgKzYyNCwxMiBAQAogdm9pZCBIQUxfU0RfRXJyb3JDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogdm9pZCBIQUxfU0RfQWJvcnRDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogCi0jaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKIC8qIFNEIGNhbGxiYWNrIHJlZ2lzdGVyaW5nL3VucmVnaXN0ZXJpbmcgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9SZWdpc3RlckNhbGxiYWNrICAoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCBIQUxfU0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJZCwgcFNEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX1VuUmVnaXN0ZXJDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QsIEhBTF9TRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisKIC8qKgogICAqIEB9CiAgICovCkBAIC03NDUsMTIgKzc0OSwxMyBAQAogICAqIEB9CiAgICovCiAKKyNlbmRpZiAvKiBTRE1NQzEgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfSEFMX1NEX0ggKi8gCisjZW5kaWYgLyogU1RNMzJGN3h4X0hBTF9TRF9IICovIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfc21hcnRjYXJkLmggYi9JbmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuaAppbmRleCA2ZDBhZTAxLi5jMTRjNTg0IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuaApAQCAtNTI0LDE1ICs1MjQsMTUgQEAKICAgKi8KICNpZiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMQogI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQ7ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcEluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPk1zcERlSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCiAjZWxzZQogI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPmdTdGF0ZSA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVTRVQ7ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5nU3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFU0VUOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRVNFVDsgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMFUpCiAjZW5kaWYgLypVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgICovCiAKQEAgLTU0MCwxMSArNTQwLDExIEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgU01BUlRDQVJEIEhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0ZMVVNIX0RSUkVHSVNURVIoX19IQU5ETEVfXykgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFNNQVJUQ0FSRF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKLSAgICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCi0gICAgICB9IHdoaWxlKDBVKQorI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgICAgICAgICAgICAgICAgICAgICBcCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgU01BUlRDQVJEX1JYREFUQV9GTFVTSF9SRVFVRVNUKTsgXAorICAgIFNFVF9CSVQoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+UlFSLCBTTUFSVENBUkRfVFhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCisgIH0gd2hpbGUoMFUpCiAKIC8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgU01BUlRDQVJEIHBlbmRpbmcgZmxhZy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgpAQCAtNjY3LDcgKzY2Nyw4IEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgU01BUlRDQVJEX0lUX0VSUiAgICBFcnJvciBpbnRlcnJ1cHQoZnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgogICAqLwotI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgodWludDMyX3QpMHgwMVUgPDwgKCgoX19JTlRFUlJVUFRfXykgJiBTTUFSVENBUkRfSVNSX01BU0spPj4gU01BUlRDQVJEX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVQoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SVNSXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9JU1JfTUFTSyk+PiBTTUFSVENBUkRfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKIAogLyoqIEBicmllZiAgQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNtYXJ0Q2FyZCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCkBAIC02ODUsOCArNjg2LDggQEAKICAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgX19JTlRFUlJVUFRfXyAoU0VUIG9yIFJFU0VUKS4KICAgKi8KICNkZWZpbmUgX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0UoX19IQU5ETEVfXywgX19JTlRFUlJVUFRfXykgKCgoKCgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAweDAxVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKChfX0lOVEVSUlVQVF9fKSAmIFNNQVJUQ0FSRF9DUl9NQVNLKSA+PiBTTUFSVENBUkRfQ1JfUE9TKSA9PSAweDAyVSk/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzKSkgJiAoKHVpbnQzMl90KTB4MDFVIDw8ICgoKHVpbnQxNl90KShfX0lOVEVSUlVQVF9fKSkgJiBTTUFSVENBUkRfSVRfTUFTSykpKSAgIT0gMFUpID8gU0VUIDogUkVTRVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoKF9fSU5URVJSVVBUX18pICYgU01BUlRDQVJEX0NSX01BU0spID4+IFNNQVJUQ0FSRF9DUl9QT1MpID09IDB4MDJVKT8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgU01BUlRDQVJEX0lUX01BU0spKSkgICE9IDBVKSA/IFNFVCA6IFJFU0VUKQogCiAvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFNNQVJUQ0FSRCBJU1IgZmxhZywgaW4gc2V0dGluZyB0aGUgcHJvcGVyIElDUiByZWdpc3RlciBmbGFnLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCkBAIC03MjYsNyArNzI3LDggQEAKICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBTTUFSVENBUkQgSGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2RlZmluZSBfX0hBTF9TTUFSVENBUkRfT05FX0JJVF9TQU1QTEVfRElTQUJMRShfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IzICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKKyNkZWZpbmUgX19IQUxfU01BUlRDQVJEX09ORV9CSVRfU0FNUExFX0RJU0FCTEUoX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSM1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjNfT05FQklUKSkKIAogLyoqIEBicmllZiAgRW5hYmxlIHRoZSBVU0FSVCBhc3NvY2lhdGVkIHRvIHRoZSBTTUFSVENBUkQgSGFuZGxlLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFNNQVJUQ0FSRCBIYW5kbGUuCkBAIC03NTgsOCArNzYwLDggQEAKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMSkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDFfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQxQ0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTc3NSwxMiArNzc3LDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMikgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQyX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUMkNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03OTYsMTIgKzc5OCwxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDMpICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUM19TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VU0FSVDNDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODE3LDEyICs4MTksMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7IFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQ2KSAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDZfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUNl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQ2Q0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTgzOCw3ICs4NDAsNyBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gU01BUlRDQVJEX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtOTA1LDcgKzkwNyw4IEBACiAgICogQHBhcmFtIF9fQ1BPTF9fIFNNQVJUQ0FSRCBmcmFtZSBwb2xhcml0eS4KICAgKiBAcmV0dmFsIFNFVCAoX19DUE9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NQT0xfXyBpcyBpbnZhbGlkKQogICAqLwotI2RlZmluZSBJU19TTUFSVENBUkRfUE9MQVJJVFkoX19DUE9MX18pICgoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfTE9XKSB8fCAoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCkpCisjZGVmaW5lIElTX1NNQVJUQ0FSRF9QT0xBUklUWShfX0NQT0xfXykgKCgoX19DUE9MX18pID09IFNNQVJUQ0FSRF9QT0xBUklUWV9MT1cpXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fQ1BPTF9fKSA9PSBTTUFSVENBUkRfUE9MQVJJVFlfSElHSCkpCiAKIC8qKiBAYnJpZWYgRW5zdXJlIHRoYXQgU01BUlRDQVJEIGZyYW1lIHBoYXNlIGlzIHZhbGlkLgogICAqIEBwYXJhbSBfX0NQSEFfXyBTTUFSVENBUkQgZnJhbWUgcGhhc2UuCkBAIC0xMDM0LDggKzEwMzcsMTAgQEAKIAogI2lmIChVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKIC8qIENhbGxiYWNrcyBSZWdpc3Rlci9VblJlZ2lzdGVyIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVW5SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1NNQVJUQ0FSRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKICNlbmRpZiAvKiBVU0VfSEFMX1NNQVJUQ0FSRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIAogLyoqCkBAIC0xMDQ3LDggKzEwNTIsMTAgQEAKICAgKiBAewogICAqLwogCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0X0lUKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXRfRE1BKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSk7CmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmRfZXguaCBiL0luYy9zdG0zMmY3eHhfaGFsX3NtYXJ0Y2FyZF9leC5oCmluZGV4IDA2MWIwZjQuLmRkYWUxYjYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX3NtYXJ0Y2FyZF9leC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3NtYXJ0Y2FyZF9leC5oCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKEhBTF9JU19CSVRfQ0xSKChfX0hBTkRMRV9fKS0+QWR2YW5jZWRJbml0LkFkdkZlYXR1cmVJbml0LCBTTUFSVENBUkRfQURWRkVBVFVSRV9UWENPTVBMRVRJT04pKSAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgKF9fSEFORExFX18pLT5BZHZhbmNlZEluaXQuVHhDb21wbGV0aW9uSW5kaWNhdGlvbiA9IFNNQVJUQ0FSRF9UQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19IQU5ETEVfXyktPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uID0gU01BUlRDQVJEX1RDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjQzLDE1ICsyNDMsNiBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAYWRkdG9ncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCi0gICogQHsKLSAgKi8KLQotLyogUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gICogQH0KLSAgKi8KIAogLyoqCiAgICogQH0KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX3RpbS5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfdGltLmgKaW5kZXggMWEzYjUwYS4uYzc3ZTk5YyAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfdGltLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfdGltLmgKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0VuY29kZXJfTW9kZSAqLwogCiAgIHVpbnQzMl90IElDMVBvbGFyaXR5OyAgIC8qITwgU3BlY2lmaWVzIHRoZSBhY3RpdmUgZWRnZSBvZiB0aGUgaW5wdXQgc2lnbmFsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfUG9sYXJpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9FbmNvZGVyX0lucHV0X1BvbGFyaXR5ICovCiAKICAgdWludDMyX3QgSUMxU2VsZWN0aW9uOyAgLyohPCBTcGVjaWZpZXMgdGhlIGlucHV0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MCBhbmQgTWF4X0RhdGEgPSAweEYgKi8KIAogICB1aW50MzJfdCBJQzJQb2xhcml0eTsgICAvKiE8IFNwZWNpZmllcyB0aGUgYWN0aXZlIGVkZ2Ugb2YgdGhlIGlucHV0IHNpZ25hbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9JbnB1dF9DYXB0dXJlX1BvbGFyaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fRW5jb2Rlcl9JbnB1dF9Qb2xhcml0eSAqLwogCiAgIHVpbnQzMl90IElDMlNlbGVjdGlvbjsgIC8qITwgU3BlY2lmaWVzIHRoZSBpbnB1dC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uICovCkBAIC0yMzUsNyArMjM1LDEyIEBACiAgIHVpbnQzMl90ICBNYXN0ZXJPdXRwdXRUcmlnZ2VyMjsgIC8qITwgVHJpZ2dlciBvdXRwdXQyIChUUkdPMikgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBUSU1fTWFzdGVyX01vZGVfU2VsZWN0aW9uXzIgKi8KICAgdWludDMyX3QgIE1hc3RlclNsYXZlTW9kZTsgICAgICAgLyohPCBNYXN0ZXIvc2xhdmUgbW9kZSBzZWxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFRJTV9NYXN0ZXJfU2xhdmVfTW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgVElNX01hc3Rlcl9TbGF2ZV9Nb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG5vdGUgV2hlbiB0aGUgTWFzdGVyL3NsYXZlIG1vZGUgaXMgZW5hYmxlZCwgdGhlIGVmZmVjdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGV2ZW50IG9uIHRoZSB0cmlnZ2VyIGlucHV0IChUUkdJKSBpcyBkZWxheWVkIHRvIGFsbG93IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0IHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWVyIGFuZCBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGF2ZXMgKHRocm91Z2ggVFJHTykuIEl0IGlzIG5vdCBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aW1lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiBtb2RlLiAqLwogfSBUSU1fTWFzdGVyQ29uZmlnVHlwZURlZjsKIAogLyoqCkBAIC01MTgsNiArNTIzLDE1IEBACiAgICogQH0KICAgKi8KIAorLyoqIEBkZWZncm91cCBUSU1fVXBkYXRlX0ludGVycnVwdF9GbGFnX1JlbWFwIFRJTSBVcGRhdGUgSW50ZXJydXB0IEZsYWcgUmVtYXAKKyAgKiBAeworICAqLworI2RlZmluZSBUSU1fVUlGUkVNQVBfRElTQUJMRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyByZW1hcCBkaXNhYmxlZCAqLworI2RlZmluZSBUSU1fVUlGUkVNQVBfRU5BQkxFICAgICAgICAgICAgICAgIFRJTV9DUjFfVUlGUkVNQVAgICAgICAgICAgICAgICAgICAgICAvKiE8IFVwZGF0ZSBpbnRlcnJ1cHQgZmxhZyByZW1hcCBlbmFibGVkICovCisvKioKKyAgKiBAfQorICAqLworCiAvKiogQGRlZmdyb3VwIFRJTV9DbG9ja0RpdmlzaW9uIFRJTSBDbG9jayBEaXZpc2lvbgogICAqIEB7CiAgICovCkBAIC02MTEsNiArNjI1LDE1IEBACiAgICogQH0KICAgKi8KIAorLyoqIEBkZWZncm91cCBUSU1fRW5jb2Rlcl9JbnB1dF9Qb2xhcml0eSBUSU0gRW5jb2RlciBJbnB1dCBQb2xhcml0eQorICAqIEB7CisgICovCisjZGVmaW5lICBUSU1fRU5DT0RFUklOUFVUUE9MQVJJVFlfUklTSU5HICAgVElNX0lOUFVUQ0hBTk5FTFBPTEFSSVRZX1JJU0lORyAgICAgIC8qITwgRW5jb2RlciBpbnB1dCB3aXRoIHJpc2luZyBlZGdlIHBvbGFyaXR5ICAqLworI2RlZmluZSAgVElNX0VOQ09ERVJJTlBVVFBPTEFSSVRZX0ZBTExJTkcgIFRJTV9JTlBVVENIQU5ORUxQT0xBUklUWV9GQUxMSU5HICAgICAvKiE8IEVuY29kZXIgaW5wdXQgd2l0aCBmYWxsaW5nIGVkZ2UgcG9sYXJpdHkgKi8KKy8qKgorICAqIEB9CisgICovCisKIC8qKiBAZGVmZ3JvdXAgVElNX0lucHV0X0NhcHR1cmVfU2VsZWN0aW9uIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbgogICAqIEB7CiAgICovCkBAIC0xMTE5LDE1ICsxMTQyLDE1IEBACiAgICogQHJldHZhbCBOb25lCiAgICovCiAjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFKF9fSEFORExFX18pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hFX01BU0spID09IDBVTCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4TkVfTUFTSykgPT0gMFVMKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gfihUSU1fQ1IxX0NFTik7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisgIGRvIHsgXAorICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeEVfTUFTSykgPT0gMFVMKSBcCisgICAgeyBcCisgICAgICBpZigoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeE5FX01BU0spID09IDBVTCkgXAorICAgICAgeyBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSAmPSB+KFRJTV9DUjFfQ0VOKTsgXAorICAgICAgfSBcCisgICAgfSBcCisgIH0gd2hpbGUoMCkKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBUSU0gbWFpbiBPdXRwdXQuCkBAIC0xMTM2LDE1ICsxMTU5LDE1IEBACiAgICogQG5vdGUgVGhlIE1haW4gT3V0cHV0IEVuYWJsZSBvZiBhIHRpbWVyIGluc3RhbmNlIGlzIGRpc2FibGVkIG9ubHkgaWYgYWxsIHRoZSBDQ3ggYW5kIENDeE4gY2hhbm5lbHMgaGF2ZSBiZWVuIGRpc2FibGVkCiAgICovCiAjZGVmaW5lIF9fSEFMX1RJTV9NT0VfRElTQUJMRShfX0hBTkRMRV9fKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBkbyB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICYgVElNX0NDRVJfQ0N4RV9NQVNLKSA9PSAwVUwpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJiBUSU1fQ0NFUl9DQ3hORV9NQVNLKSA9PSAwVUwpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgJj0gfihUSU1fQkRUUl9NT0UpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisgIGRvIHsgXAorICAgIGlmICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeEVfTUFTSykgPT0gMFVMKSBcCisgICAgeyBcCisgICAgICBpZigoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmIFRJTV9DQ0VSX0NDeE5FX01BU0spID09IDBVTCkgXAorICAgICAgeyBcCisgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkJEVFIgJj0gfihUSU1fQkRUUl9NT0UpOyBcCisgICAgICB9IFwKKyAgICB9IFwKKyAgfSB3aGlsZSgwKQogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFRJTSBtYWluIE91dHB1dC4KQEAgLTEyNzksNyArMTMwMiw4IEBACiAgICogICAgICAgICAgICBAYXJnIFRJTV9JVF9CUkVBSzogQnJlYWsgaW50ZXJydXB0CiAgICogQHJldHZhbCBUaGUgc3RhdGUgb2YgVElNX0lUIChTRVQgb3IgUkVTRVQpLgogICAqLwotI2RlZmluZSBfX0hBTF9USU1fR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5ESUVSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIF9fSEFMX1RJTV9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkRJRVIgJiAoX19JTlRFUlJVUFRfXykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAoX19JTlRFUlJVUFRfXykpID8gU0VUIDogUkVTRVQpCiAKIC8qKiBAYnJpZWYgQ2xlYXIgdGhlIFRJTSBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlCkBAIC0xMjk4LDYgKzEzMjIsMzEgQEAKICNkZWZpbmUgX19IQUxfVElNX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICAgICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlNSID0gfihfX0lOVEVSUlVQVF9fKSkKIAogLyoqCisgICogQGJyaWVmICBGb3JjZSBhIGNvbnRpbnVvdXMgY29weSBvZiB0aGUgdXBkYXRlIGludGVycnVwdCBmbGFnIChVSUYpIGludG8gdGhlIHRpbWVyIGNvdW50ZXIgcmVnaXN0ZXIgKGJpdCAzMSkuCisgICogQG5vdGUgVGhpcyBhbGxvd3MgYm90aCB0aGUgY291bnRlciB2YWx1ZSBhbmQgYSBwb3RlbnRpYWwgcm9sbC1vdmVyIGNvbmRpdGlvbiBzaWduYWxsZWQgYnkgdGhlIFVJRkNQWSBmbGFnIHRvIGJlIHJlYWQgaW4gYW4gYXRvbWljIHdheS4KKyAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KKyAgKiBAcmV0dmFsIE5vbmUKK21vZGUuCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9VSUZSRU1BUF9FTkFCTEUoX19IQU5ETEVfXykgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgfD0gVElNX0NSMV9VSUZSRU1BUCkpCisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgcmVtYXBwaW5nLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorbW9kZS4KKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX1VJRlJFTUFQX0RJU0FCTEUoX19IQU5ETEVfXykgICAgKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gflRJTV9DUjFfVUlGUkVNQVApKQorCisvKioKKyAgKiBAYnJpZWYgIEdldCB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgY29weSBzdGF0dXMuCisgICogQHBhcmFtICBfX0NPVU5URVJfXyBDb3VudGVyIHZhbHVlLgorICAqIEByZXR2YWwgVGhlIHN0YXRlIG9mIFVJRkNQWSAoVFJVRSBvciBGQUxTRSkuCittb2RlLgorICAqLworI2RlZmluZSBfX0hBTF9USU1fR0VUX1VJRkNQWShfX0NPVU5URVJfXykgICAgKCgoX19DT1VOVEVSX18pICYgKFRJTV9DTlRfVUlGQ1BZKSkgPT0gKFRJTV9DTlRfVUlGQ1BZKSkKKworLyoqCiAgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIFRJTSBDb3VudGVyIGlzIHVzZWQgYXMgZG93bmNvdW50ZXIuCiAgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCiAgICogQHJldHZhbCBGYWxzZSAoQ291bnRlciB1c2VkIGFzIHVwY291bnRlcikgb3IgVHJ1ZSAoQ291bnRlciB1c2VkIGFzIGRvd25jb3VudGVyKQpAQCAtMTMxNiw2ICsxMzY1LDggQEAKIAogLyoqCiAgICogQGJyaWVmICBTZXQgdGhlIFRJTSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlIG9uIHJ1bnRpbWUuCisgICogTm90ZSBQbGVhc2UgY2hlY2sgaWYgdGhlIGJpdCAzMSBvZiBDTlQgcmVnaXN0ZXIgaXMgdXNlZCBhcyBVSUYgY29weSBvciBub3QsIHRoaXMgbWF5IGFmZmVjdCB0aGUgY291bnRlciByYW5nZSBpbiBjYXNlIG9mIDMyIGJpdHMgY291bnRlciBUSU0gaW5zdGFuY2UuCisgICogICAgICBCaXQgMzEgb2YgQ05UIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHVzaW5nIF9fSEFMX1RJTV9VSUZSRU1BUF9FTkFCTEUoKS9fX0hBTF9USU1fVUlGUkVNQVBfRElTQUJMRSgpIG1hY3Jvcy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gVElNIGhhbmRsZS4KICAgKiBAcGFyYW0gIF9fQ09VTlRFUl9fIHNwZWNpZmllcyB0aGUgQ291bnRlciByZWdpc3RlciBuZXcgdmFsdWUuCiAgICogQHJldHZhbCBOb25lCkBAIC0xMzI3LDggKzEzNzgsNyBAQAogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgogICAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgY291bnRlciByZWdpc3RlciAoVElNeF9DTlQpCiAgICovCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfQ09VTlRFUihfX0hBTkRMRV9fKSBcCi0gICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q05UKQorI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPVU5URVIoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DTlQpCiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lIHdpdGhvdXQgY2FsbGluZyBhbm90aGVyIHRpbWUgYW55IEluaXQgZnVuY3Rpb24uCkBAIC0xMzM3LDE4ICsxMzg3LDE3IEBACiAgICogQHJldHZhbCBOb25lCiAgICovCiAjZGVmaW5lIF9fSEFMX1RJTV9TRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fLCBfX0FVVE9SRUxPQURfXykgXAotICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkFSUiA9IChfX0FVVE9SRUxPQURfXyk7ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluaXQuUGVyaW9kID0gKF9fQVVUT1JFTE9BRF9fKTsgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSID0gKF9fQVVUT1JFTE9BRF9fKTsgIFwKKyAgICAoX19IQU5ETEVfXyktPkluaXQuUGVyaW9kID0gKF9fQVVUT1JFTE9BRF9fKTsgICAgXAorICB9IHdoaWxlKDApCiAKIC8qKgogICAqIEBicmllZiAgR2V0IHRoZSBUSU0gQXV0b3JlbG9hZCBSZWdpc3RlciB2YWx1ZSBvbiBydW50aW1lLgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgogICAqIEByZXR2YWwgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZSBvZiB0aGUgdGltZXIgYXV0by1yZWxvYWQgcmVnaXN0ZXIoVElNeF9BUlIpCiAgICovCi0jZGVmaW5lIF9fSEFMX1RJTV9HRVRfQVVUT1JFTE9BRChfX0hBTkRMRV9fKSBcCi0gICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+QVJSKQorI2RlZmluZSBfX0hBTF9USU1fR0VUX0FVVE9SRUxPQUQoX19IQU5ETEVfXykgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5BUlIpCiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBUSU0gQ2xvY2sgRGl2aXNpb24gdmFsdWUgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIGFueSBJbml0IGZ1bmN0aW9uLgpAQCAtMTM2MSwxMSArMTQxMCwxMSBAQAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9USU1fU0VUX0NMT0NLRElWSVNJT04oX19IQU5ETEVfXywgX19DS0RfXykgXAotICAgICAgICAgICAgICAgICAgICAgICAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICY9ICh+VElNX0NSMV9DS0QpOyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0NLRF9fKTsgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Jbml0LkNsb2NrRGl2aXNpb24gPSAoX19DS0RfXyk7ICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDApCisgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJj0gKH5USU1fQ1IxX0NLRCk7ICBcCisgICAgKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIHw9IChfX0NLRF9fKTsgICAgICAgXAorICAgIChfX0hBTkRMRV9fKS0+SW5pdC5DbG9ja0RpdmlzaW9uID0gKF9fQ0tEX18pOyAgIFwKKyAgfSB3aGlsZSgwKQogCiAvKioKICAgKiBAYnJpZWYgIEdldCB0aGUgVElNIENsb2NrIERpdmlzaW9uIHZhbHVlIG9uIHJ1bnRpbWUuCkBAIC0xMzc1LDggKzE0MjQsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyOiB0RFRTPTIqdENLX0lOVAogICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0xPQ0tESVZJU0lPTl9ESVY0OiB0RFRTPTQqdENLX0lOVAogICAqLwotI2RlZmluZSBfX0hBTF9USU1fR0VUX0NMT0NLRElWSVNJT04oX19IQU5ETEVfXykgIFwKLSAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgJiBUSU1fQ1IxX0NLRCkKKyNkZWZpbmUgX19IQUxfVElNX0dFVF9DTE9DS0RJVklTSU9OKF9fSEFORExFX18pICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxICYgVElNX0NSMV9DS0QpCiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZSB3aXRob3V0IGNhbGxpbmcgYW5vdGhlciB0aW1lIEhBTF9USU1fSUNfQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9uLgpAQCAtMTM5NiwxMCArMTQ0NCwxMCBAQAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9USU1fU0VUX0lDUFJFU0NBTEVSKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0lDUFNDX18pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NFVF9JQ1BSRVNDQUxFUlZBTFVFKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fSUNQU0NfXykpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoMCkKKyAgZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSU1fUkVTRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgXAorICAgIFRJTV9TRVRfSUNQUkVTQ0FMRVJWQUxVRSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXyksIChfX0lDUFNDX18pKTsgXAorICB9IHdoaWxlKDApCiAKIC8qKgogICAqIEBicmllZiAgR2V0IHRoZSBUSU0gSW5wdXQgQ2FwdHVyZSBwcmVzY2FsZXIgb24gcnVudGltZS4KQEAgLTE0MzcsMTIgKzE0ODUsMTIgQEAKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfVElNX1NFVF9DT01QQVJFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0NPTVBBUkVfXykgXAotKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjEgPSAoX19DT01QQVJFX18pKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIgPSAoX19DT01QQVJFX18pKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjMgPSAoX19DT01QQVJFX18pKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjQgPSAoX19DT01QQVJFX18pKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUgPSAoX19DT01QQVJFX18pKSA6XAotICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I2ID0gKF9fQ09NUEFSRV9fKSkpCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIgPSAoX19DT01QQVJFX18pKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMyA9IChfX0NPTVBBUkVfXykpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0ID0gKF9fQ09NUEFSRV9fKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUgPSAoX19DT01QQVJFX18pKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYgPSAoX19DT01QQVJFX18pKSkKIAogLyoqCiAgICogQGJyaWVmICBHZXQgdGhlIFRJTSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgb24gcnVudGltZS4KQEAgLTE0NTgsMTIgKzE1MDYsMTIgQEAKICAgKiBAcmV0dmFsIDE2LWJpdCBvciAzMi1iaXQgdmFsdWUgb2YgdGhlIGNhcHR1cmUvY29tcGFyZSByZWdpc3RlciAoVElNeF9DQ1J5KQogICAqLwogI2RlZmluZSBfX0hBTF9USU1fR0VUX0NPTVBBUkUoX19IQU5ETEVfXywgX19DSEFOTkVMX18pIFwKLSgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IxKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIpIDpcCi0gKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMykgOlwKLSAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1I0KSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUpIDpcCi0gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjYpKQorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSMSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjIpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ1IzKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNCkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDUjUpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NSNikpCiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KQEAgLTE0NzksMTIgKzE1MjcsMTIgQEAKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hQUkVMT0FEKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICBcCi0gICAgICAgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxUEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyUEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzUEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0UEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1UEUpIDpcCi0gICAgICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNlBFKSkKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzFQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IFRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzNQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IFRJTV9DQ01SMl9PQzRQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzUpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzIHw9IFRJTV9DQ01SM19PQzVQRSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M2UEUpKQogCiAvKioKICAgKiBAYnJpZWYgIFJlc2V0IHRoZSBUSU0gT3V0cHV0IGNvbXBhcmUgcHJlbG9hZC4KQEAgLTE1MDAsMTIgKzE1NDgsNjIgQEAKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfVElNX0RJU0FCTEVfT0N4UFJFTE9BRChfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgICAgXAotICAgICAgICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfT0MxUEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSAodWludDE2X3QpflRJTV9DQ01SMV9PQzJQRSkgOlwKLSAgICAgICAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX09DM1BFKSA6XAotICAgICAgICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNCkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjJfT0M0UEUpIDpcCi0gICAgICAgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzVQRSkgOlwKLSAgICAgICAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSAodWludDE2X3QpflRJTV9DQ01SM19PQzZQRSkpCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMVBFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gflRJTV9DQ01SMV9PQzJQRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0MzUEUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSB+VElNX0NDTVIyX09DNFBFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfNSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgJj0gflRJTV9DQ01SM19PQzVQRSkgOlwKKyAgICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNlBFKSkKKworLyoqCisgICogQGJyaWVmICBFbmFibGUgZmFzdCBtb2RlIGZvciBhIGdpdmVuIGNoYW5uZWwuCisgICogQHBhcmFtICBfX0hBTkRMRV9fIFRJTSBoYW5kbGUuCisgICogQHBhcmFtICBfX0NIQU5ORUxfXyBUSU0gQ2hhbm5lbHMgdG8gYmUgY29uZmlndXJlZC4KKyAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMzogVElNIENoYW5uZWwgMyBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF80OiBUSU0gQ2hhbm5lbCA0IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzU6IFRJTSBDaGFubmVsIDUgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNjogVElNIENoYW5uZWwgNiBzZWxlY3RlZAorICAqIEBub3RlICBXaGVuIGZhc3QgbW9kZSBpcyBlbmFibGVkIGFuIGFjdGl2ZSBlZGdlIG9uIHRoZSB0cmlnZ2VyIGlucHV0IGFjdHMKKyAgKiAgICAgICAgbGlrZSBhIGNvbXBhcmUgbWF0Y2ggb24gQ0N4IG91dHB1dC4gRGVsYXkgdG8gc2FtcGxlIHRoZSB0cmlnZ2VyCisgICogICAgICAgIGlucHV0IGFuZCB0byBhY3RpdmF0ZSBDQ3ggb3V0cHV0IGlzIHJlZHVjZWQgdG8gMyBjbG9jayBjeWNsZXMuCisgICogQG5vdGUgIEZhc3QgbW9kZSBhY3RzIG9ubHkgaWYgdGhlIGNoYW5uZWwgaXMgY29uZmlndXJlZCBpbiBQV00xIG9yIFBXTTIgbW9kZS4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KKyNkZWZpbmUgX19IQUxfVElNX0VOQUJMRV9PQ3hGQVNUKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSAgICBcCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MxRkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSBUSU1fQ0NNUjFfT0MyRkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0MzRkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF80KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSBUSU1fQ0NNUjJfT0M0RkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyB8PSBUSU1fQ0NNUjNfT0M1RkUpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjMgfD0gVElNX0NDTVIzX09DNkZFKSkKKworLyoqCisgICogQGJyaWVmICBEaXNhYmxlIGZhc3QgbW9kZSBmb3IgYSBnaXZlbiBjaGFubmVsLgorICAqIEBwYXJhbSAgX19IQU5ETEVfXyBUSU0gaGFuZGxlLgorICAqIEBwYXJhbSAgX19DSEFOTkVMX18gVElNIENoYW5uZWxzIHRvIGJlIGNvbmZpZ3VyZWQuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfMTogVElNIENoYW5uZWwgMSBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8yOiBUSU0gQ2hhbm5lbCAyIHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzM6IFRJTSBDaGFubmVsIDMgc2VsZWN0ZWQKKyAgKiAgICAgICAgICAgIEBhcmcgVElNX0NIQU5ORUxfNDogVElNIENoYW5uZWwgNCBzZWxlY3RlZAorICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF81OiBUSU0gQ2hhbm5lbCA1IHNlbGVjdGVkCisgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzY6IFRJTSBDaGFubmVsIDYgc2VsZWN0ZWQKKyAgKiBAbm90ZSAgV2hlbiBmYXN0IG1vZGUgaXMgZGlzYWJsZWQgQ0N4IG91dHB1dCBiZWhhdmVzIG5vcm1hbGx5IGRlcGVuZGluZworICAqICAgICAgICBvbiBjb3VudGVyIGFuZCBDQ1J4IHZhbHVlcyBldmVuIHdoZW4gdGhlIHRyaWdnZXIgaXMgT04uIFRoZSBtaW5pbXVtCisgICogICAgICAgIGRlbGF5IHRvIGFjdGl2YXRlIENDeCBvdXRwdXQgd2hlbiBhbiBhY3RpdmUgZWRnZSBvY2N1cnMgb24gdGhlCisgICogICAgICAgIHRyaWdnZXIgaW5wdXQgaXMgNSBjbG9jayBjeWNsZXMuCisgICogQHJldHZhbCBOb25lCisgICovCisjZGVmaW5lIF9fSEFMX1RJTV9ESVNBQkxFX09DeEZBU1QoX19IQU5ETEVfXywgX19DSEFOTkVMX18pICAgIFwKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfT0MxRkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX09DMkZFKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9PQzNGRSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzQpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9IH5USU1fQ0NNUjJfT0M0RkUpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF81KSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMyAmPSB+VElNX0NDTVIzX09DNUZFKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIzICY9IH5USU1fQ0NNUjNfT0M2RkUpKQogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgVXBkYXRlIFJlcXVlc3QgU291cmNlIChVUlMpIGJpdCBvZiB0aGUgVElNeF9DUjEgcmVnaXN0ZXIuCkBAIC0xNTE1LDggKzE2MTMsNyBAQAogICAqICAgICAgICBlbmFibGVkKQogICAqIEByZXR2YWwgTm9uZQogICAqLwotI2RlZmluZSBfX0hBTF9USU1fVVJTX0VOQUJMRShfX0hBTkRMRV9fKSBcCi0gICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMXw9IFRJTV9DUjFfVVJTKQorI2RlZmluZSBfX0hBTF9USU1fVVJTX0VOQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMXw9IFRJTV9DUjFfVVJTKQogCiAvKioKICAgKiBAYnJpZWYgIFJlc2V0IHRoZSBVcGRhdGUgUmVxdWVzdCBTb3VyY2UgKFVSUykgYml0IG9mIHRoZSBUSU14X0NSMSByZWdpc3Rlci4KQEAgLTE1MjksOCArMTYyNiw3IEBACiAgICogICAgICAgICAgIF8gVXBkYXRlIGdlbmVyYXRpb24gdGhyb3VnaCB0aGUgc2xhdmUgbW9kZSBjb250cm9sbGVyCiAgICogQHJldHZhbCBOb25lCiAgICovCi0jZGVmaW5lIF9fSEFMX1RJTV9VUlNfRElTQUJMRShfX0hBTkRMRV9fKSBcCi0gICAgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxJj1+VElNX0NSMV9VUlMpCisjZGVmaW5lIF9fSEFMX1RJTV9VUlNfRElTQUJMRShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMSY9flRJTV9DUjFfVVJTKQogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgVElNIENhcHR1cmUgeCBpbnB1dCBwb2xhcml0eSBvbiBydW50aW1lLgpAQCAtMTU0OCwxMCArMTY0NCwxMCBAQAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9USU1fU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXywgX19QT0xBUklUWV9fKSAgICBcCi0gICAgICAgIGRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBUSU1fUkVTRVRfQ0FQVFVSRVBPTEFSSVRZKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSk7ICAgICAgICAgICAgICAgXAotICAgICAgICAgIFRJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKChfX0hBTkRMRV9fKSwgKF9fQ0hBTk5FTF9fKSwgKF9fUE9MQVJJVFlfXykpOyBcCi0gICAgICAgIH13aGlsZSgwKQorICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVElNX1JFU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXykpOyAgICAgICAgICAgICAgIFwKKyAgICBUSU1fU0VUX0NBUFRVUkVQT0xBUklUWSgoX19IQU5ETEVfXyksIChfX0NIQU5ORUxfXyksIChfX1BPTEFSSVRZX18pKTsgXAorICB9d2hpbGUoMCkKIAogLyoqCiAgICogQH0KQEAgLTE1NzksMjkgKzE2NzUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DTEVBUklOUFVUU09VUkNFX0VUUikpCiAKICNpZiBkZWZpbmVkKFRJTV9BRjFfQktJTkUpJiZkZWZpbmVkKFRJTV9BRjJfQktJTkUpCi0jZGVmaW5lIElTX1RJTV9ETUFfQkFTRShfX0JBU0VfXykgKCgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMSkgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1NNQ1IpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0RJRVIpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1NSKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0VHUikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIxKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIyKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDRVIpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NOVCkgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1BTQykgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0FSUikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1JDUikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjEpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjIpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjMpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjQpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0JEVFIpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX09SKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIzKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjUpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjYpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0FGMSkgICB8fCBcCisjZGVmaW5lIElTX1RJTV9ETUFfQkFTRShfX0JBU0VfXykgKCgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMSkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DUjIpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfU01DUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0RJRVIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9TUikgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfRUdSKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDTVIxKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ01SMikgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NFUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NOVCkgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9QU0MpICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQVJSKSAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX1JDUikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ1IxKSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSMikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjMpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ1I0KSAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQkRUUikgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX09SKSAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9DQ01SMykgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQ0NSNSkgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NDUjYpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQkFTRV9fKSA9PSBUSU1fRE1BQkFTRV9BRjEpICAgIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0JBU0VfXykgPT0gVElNX0RNQUJBU0VfQUYyKSkKICNlbHNlCiAjZGVmaW5lIElTX1RJTV9ETUFfQkFTRShfX0JBU0VfXykgKCgoX19CQVNFX18pID09IFRJTV9ETUFCQVNFX0NSMSkgICB8fCBcCkBAIC0xNjM2LDYgKzE3MzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTU9ERV9fKSA9PSBUSU1fQ09VTlRFUk1PREVfQ0VOVEVSQUxJR05FRDIpICB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19NT0RFX18pID09IFRJTV9DT1VOVEVSTU9ERV9DRU5URVJBTElHTkVEMykpCiAKKyNkZWZpbmUgSVNfVElNX1VJRlJFTUFQX01PREUoX19NT0RFX18pICAgICAoKChfX01PREVfXykgPT0gVElNX1VJRlJFTUFQX0RJU0FCTEUpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01PREVfXykgPT0gVElNX1VJRlJFTUFQX0VOQUxFKSkKKwogI2RlZmluZSBJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoX19ESVZfXykgICgoKF9fRElWX18pID09IFRJTV9DTE9DS0RJVklTSU9OX0RJVjEpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX0RJVl9fKSA9PSBUSU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19ESVZfXykgPT0gVElNX0NMT0NLRElWSVNJT05fRElWNCkpCkBAIC0xNjU4LDYgKzE3NTcsOSBAQAogI2RlZmluZSBJU19USU1fT0NOSURMRV9TVEFURShfX1NUQVRFX18pICAgICgoKF9fU1RBVEVfXykgPT0gVElNX09DTklETEVTVEFURV9TRVQpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1NUQVRFX18pID09IFRJTV9PQ05JRExFU1RBVEVfUkVTRVQpKQogCisjZGVmaW5lIElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoX19QT0xBUklUWV9fKSAgICgoKF9fUE9MQVJJVFlfXykgPT0gVElNX0VOQ09ERVJJTlBVVFBPTEFSSVRZX1JJU0lORykgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0VOQ09ERVJJTlBVVFBPTEFSSVRZX0ZBTExJTkcpKQorCiAjZGVmaW5lIElTX1RJTV9JQ19QT0xBUklUWShfX1BPTEFSSVRZX18pICAgKCgoX19QT0xBUklUWV9fKSA9PSBUSU1fSUNQT0xBUklUWV9SSVNJTkcpICAgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fUE9MQVJJVFlfXykgPT0gVElNX0lDUE9MQVJJVFlfRkFMTElORykgIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1BPTEFSSVRZX18pID09IFRJTV9JQ1BPTEFSSVRZX0JPVEhFREdFKSkKQEAgLTE4NzYsMjggKzE5NzgsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fVFJJR0dFUl9fKSA9PSBUSU1fU0xBVkVNT0RFX0NPTUJJTkVEX1JFU0VUVFJJR0dFUikpCiAKICNkZWZpbmUgVElNX1NFVF9JQ1BSRVNDQUxFUlZBTFVFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX0lDUFNDX18pIFwKLSgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSAoX19JQ1BTQ19fKSkgOlwKLSAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSB8PSAoKF9fSUNQU0NfXykgPDwgOFUpKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IChfX0lDUFNDX18pKSA6XAotICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiB8PSAoKF9fSUNQU0NfXykgPDwgOFUpKSkKKyAgKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxIHw9IChfX0lDUFNDX18pKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgfD0gKChfX0lDUFNDX18pIDw8IDhVKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9IChfX0lDUFNDX18pKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyIHw9ICgoX19JQ1BTQ19fKSA8PCA4VSkpKQogCiAjZGVmaW5lIFRJTV9SRVNFVF9JQ1BSRVNDQUxFUlZBTFVFKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fKSBcCi0oKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjEgJj0gKHVpbnQxNl90KX5USU1fQ0NNUjFfSUMxUFNDKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9ICh1aW50MTZfdCl+VElNX0NDTVIxX0lDMlBTQykgOlwKLSAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMiAmPSAodWludDE2X3QpflRJTV9DQ01SMl9JQzNQU0MpIDpcCi0gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIyICY9ICh1aW50MTZfdCl+VElNX0NDTVIyX0lDNFBTQykpCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ01SMSAmPSB+VElNX0NDTVIxX0lDMVBTQykgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDTVIxICY9IH5USU1fQ0NNUjFfSUMyUFNDKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzNQU0MpIDpcCisgICAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NNUjIgJj0gflRJTV9DQ01SMl9JQzRQU0MpKQogCiAjZGVmaW5lIFRJTV9TRVRfQ0FQVFVSRVBPTEFSSVRZKF9fSEFORExFX18sIF9fQ0hBTk5FTF9fLCBfX1BPTEFSSVRZX18pIFwKLSgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9IChfX1BPTEFSSVRZX18pKSA6XAotICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzIpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKChfX1BPTEFSSVRZX18pIDw8IDRVKSkgOlwKLSAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8zKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9ICgoX19QT0xBUklUWV9fKSA8PCA4VSkpIDpcCi0gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKCgoX19QT0xBUklUWV9fKSA8PCAxMlUpKSkpCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8xKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSIHw9IChfX1BPTEFSSVRZX18pKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMikgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgNFUpKSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiB8PSAoKF9fUE9MQVJJVFlfXykgPDwgOFUpKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgfD0gKCgoX19QT0xBUklUWV9fKSA8PCAxMlUpKSkpCiAKICNkZWZpbmUgVElNX1JFU0VUX0NBUFRVUkVQT0xBUklUWShfX0hBTkRMRV9fLCBfX0NIQU5ORUxfXykgXAotKCgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzEpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gKHVpbnQxNl90KX4oVElNX0NDRVJfQ0MxUCB8IFRJTV9DQ0VSX0NDMU5QKSkgOlwKLSAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDMlAgfCBUSU1fQ0NFUl9DQzJOUCkpIDpcCi0gKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMykgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSAodWludDE2X3QpfihUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKSA6XAotICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9ICh1aW50MTZfdCl+KFRJTV9DQ0VSX0NDNFAgfCBUSU1fQ0NFUl9DQzROUCkpKQorICAoKChfX0NIQU5ORUxfXykgPT0gVElNX0NIQU5ORUxfMSkgPyAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0NFUiAmPSB+KFRJTV9DQ0VSX0NDMVAgfCBUSU1fQ0NFUl9DQzFOUCkpIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBUSU1fQ0hBTk5FTF8yKSA/ICgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DQ0VSICY9IH4oVElNX0NDRVJfQ0MyUCB8IFRJTV9DQ0VSX0NDMk5QKSkgOlwKKyAgICgoX19DSEFOTkVMX18pID09IFRJTV9DSEFOTkVMXzMpID8gKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzNQIHwgVElNX0NDRVJfQ0MzTlApKSA6XAorICAgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNDRVIgJj0gfihUSU1fQ0NFUl9DQzRQIHwgVElNX0NDRVJfQ0M0TlApKSkKIAogLyoqCiAgICogQH0KQEAgLTIwMzUsNyArMjEzNyw4IEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0b3BfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOwogLyogTm9uLUJsb2NraW5nIG1vZGU6IERNQSAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwgdWludDMyX3QgKnBEYXRhMiwgdWludDE2X3QgTGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwsIHVpbnQzMl90ICpwRGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRGF0YTIsIHVpbnQxNl90IExlbmd0aCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpOwogLyoqCiAgICogQH0KQEAgLTIwNTksMTcgKzIxNjIsMTkgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT0NfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX09DX0luaXRUeXBlRGVmICpzQ29uZmlnLCB1aW50MzJfdCBDaGFubmVsKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUFdNX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9PQ19Jbml0VHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0lDX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9JQ19Jbml0VHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgQ2hhbm5lbCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09uZVB1bHNlX0NvbmZpZ0NoYW5uZWwoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgIHVpbnQzMl90IElucHV0Q2hhbm5lbCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqc0NsZWFySW5wdXRDb25maWcsIHVpbnQzMl90IENoYW5uZWwpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9PbmVQdWxzZV9Db25maWdDaGFubmVsKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fT25lUHVsc2VfSW5pdFR5cGVEZWYgKnNDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgIHVpbnQzMl90IElucHV0Q2hhbm5lbCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9DbGVhcklucHV0Q29uZmlnVHlwZURlZiAqc0NsZWFySW5wdXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ2hhbm5lbCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQ2xvY2tDb25maWdUeXBlRGVmICpzQ2xvY2tTb3VyY2VDb25maWcpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9Db25maWdUSTFJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgVEkxX1NlbGVjdGlvbik7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1NsYXZlQ29uZmlnU3luY2hybyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9Xcml0ZVN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfV3JpdGVTdG9wKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJ1cnN0QmFzZUFkZHJlc3MsIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjLCB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9ETUFCdXJzdF9SZWFkU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RSZXF1ZXN0U3JjKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fR2VuZXJhdGVFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgRXZlbnRTb3VyY2UpOwogdWludDMyX3QgSEFMX1RJTV9SZWFkQ2FwdHVyZWRWYWx1ZShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CkBAIC0yMDk1LDcgKzIyMDAsOCBAQAogCiAvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIChVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjayhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgSEFMX1RJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVElNX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fVW5SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOwogI2VuZGlmIC8qIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCkBAIC0yMTI1LDggKzIyMzEsOCBAQAogCiAvKiBQcml2YXRlIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCi0qIEB7Ci0qLworICAqIEB7CisgICovCiB2b2lkIFRJTV9CYXNlX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX0Jhc2VfSW5pdFR5cGVEZWYgKlN0cnVjdHVyZSk7CiB2b2lkIFRJTV9USTFfU2V0Q29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1aW50MzJfdCBUSU1fSUNQb2xhcml0eSwgdWludDMyX3QgVElNX0lDU2VsZWN0aW9uLCB1aW50MzJfdCBUSU1fSUNGaWx0ZXIpOwogdm9pZCBUSU1fT0MyX1NldENvbmZpZyhUSU1fVHlwZURlZiAqVElNeCwgVElNX09DX0luaXRUeXBlRGVmICpPQ19Db25maWcpOwpAQCAtMjE0NSw4ICsyMjUxLDggQEAKICNlbmRpZiAvKiBVU0VfSEFMX1RJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KIAogLyoqCi0qIEB9Ci0qLworICAqIEB9CisgICovCiAvKiBFbmQgb2YgcHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKioKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX3RpbV9leC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfdGltX2V4LmgKaW5kZXggZjA0MzRjMi4uMjg5N2FjYSAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfdGltX2V4LmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfdGltX2V4LmgKQEAgLTIwMSw5ICsyMDEsOSBAQAogICAqLwogCiAvKiogQGFkZHRvZ3JvdXAgVElNRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgVGltZXIgSGFsbCBTZW5zb3IgZnVuY3Rpb25zCi0gKiBAewotICovCisgICogIEBicmllZiAgICBUaW1lciBIYWxsIFNlbnNvciBmdW5jdGlvbnMKKyAgKiBAeworICAqLwogLyogIFRpbWVyIEhhbGwgU2Vuc29yIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0luaXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9IYWxsU2Vuc29yX0luaXRUeXBlRGVmICpzQ29uZmlnKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9IYWxsU2Vuc29yX0RlSW5pdChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSk7CkBAIC0yMjUsOSArMjI1LDkgQEAKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucwotICogQHsKLSAqLworICAqICBAYnJpZWYgICBUaW1lciBDb21wbGVtZW50YXJ5IE91dHB1dCBDb21wYXJlIGZ1bmN0aW9ucworICAqIEB7CisgICovCiAvKiAgVGltZXIgQ29tcGxlbWVudGFyeSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQmxvY2tpbmcgbW9kZTogUG9sbGluZyAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X09DTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CkBAIC0yNDUsOSArMjQ1LDkgQEAKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgUFdNIGZ1bmN0aW9ucwotICogQHsKLSAqLworICAqICBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBQV00gZnVuY3Rpb25zCisgICogQHsKKyAgKi8KIC8qICBUaW1lciBDb21wbGVtZW50YXJ5IFBXTSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUFdNTl9TdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCk7CkBAIC0yNjQsOSArMjY0LDkgQEAKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIFRJTUV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgRXh0ZW5kZWQgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRpbWVyIENvbXBsZW1lbnRhcnkgT25lIFB1bHNlIGZ1bmN0aW9ucwotICogQHsKLSAqLworICAqICBAYnJpZWYgICAgVGltZXIgQ29tcGxlbWVudGFyeSBPbmUgUHVsc2UgZnVuY3Rpb25zCisgICogQHsKKyAgKi8KIC8qICBUaW1lciBDb21wbGVtZW50YXJ5IE9uZSBQdWxzZSBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBCbG9ja2luZyBtb2RlOiBQb2xsaW5nICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfT25lUHVsc2VOX1N0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBPdXRwdXRDaGFubmVsKTsKQEAgLTI4MCwxNyArMjgwLDIzIEBACiAgICovCiAKIC8qKiBAYWRkdG9ncm91cCBUSU1FeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwotICogQHsKLSAqLworICAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucworICAqIEB7CisgICovCiAvKiBFeHRlbmRlZCBDb250cm9sIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwgdWludDMyX3QgIENvbW11dGF0aW9uU291cmNlKTsKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9NYXN0ZXJDb25maWdTeW5jaHJvbml6YXRpb24oVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIFRJTV9NYXN0ZXJDb25maWdUeXBlRGVmICpzTWFzdGVyQ29uZmlnKTsKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdCcmVha0RlYWRUaW1lKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0NvbW11dEV2ZW50X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X01hc3RlckNvbmZpZ1N5bmNocm9uaXphdGlvbihUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX01hc3RlckNvbmZpZ1R5cGVEZWYgKnNNYXN0ZXJDb25maWcpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fQnJlYWtEZWFkVGltZUNvbmZpZ1R5cGVEZWYgKnNCcmVha0RlYWRUaW1lQ29uZmlnKTsKICNpZiBkZWZpbmVkKFRJTV9CUkVBS19JTlBVVF9TVVBQT1JUKQotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrSW5wdXQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IEJyZWFrSW5wdXQsIFRJTUV4X0JyZWFrSW5wdXRDb25maWdUeXBlRGVmICpzQnJlYWtJbnB1dENvbmZpZyk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQnJlYWtJbnB1dChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnJlYWtJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUV4X0JyZWFrSW5wdXRDb25maWdUeXBlRGVmICpzQnJlYWtJbnB1dENvbmZpZyk7CiAjZW5kaWYgLyogVElNX0JSRUFLX0lOUFVUX1NVUFBPUlQgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Hcm91cENoYW5uZWw1KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVscyk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfUmVtYXBDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IFJlbWFwKTsKQEAgLTMyNyw3ICszMzMsNyBAQAogLyogRW5kIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogUHJpdmF0ZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAZGVmZ3JvdXAgVElNRXhfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIEV4dGVuZGVkIFByaXZhdGUgRnVuY3Rpb25zCisvKiogQGFkZHRvZ3JvdXAgVElNRXhfUHJpdmF0ZV9GdW5jdGlvbnMgVElNRXggUHJpdmF0ZSBGdW5jdGlvbnMKICAgKiBAewogICAqLwogdm9pZCBUSU1FeF9ETUFDb21tdXRhdGlvbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfdWFydC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfdWFydC5oCmluZGV4IDY4OTA5MmQuLmViMTg2ZDYgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfaGFsX3VhcnQuaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF91YXJ0LmgKQEAgLTEyNSw4ICsxMjUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgdmFsdWUgb2YgQHJlZiBVQVJUX01TQl9GaXJzdC4gKi8KIH0gVUFSVF9BZHZGZWF0dXJlSW5pdFR5cGVEZWY7CiAKLQotCiAvKioKICAgKiBAYnJpZWYgSEFMIFVBUlQgU3RhdGUgZGVmaW5pdGlvbgogICAqIEBub3RlICBIQUwgVUFSVCBTdGF0ZSB2YWx1ZSBpcyBhIGNvbWJpbmF0aW9uIG9mIDIgZGlmZmVyZW50IHN1YnN0YXRlczogZ1N0YXRlIGFuZCBSeFN0YXRlIChzZWUgQHJlZiBVQVJUX1N0YXRlX0RlZmluaXRpb24pLgpAQCAtMjA2LDEwICsyMDQsOSBAQAogCiAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICBNYXNrOyAgICAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBSeCBSRFIgcmVnaXN0ZXIgbWFzayAgICAgICAgICAqLwogCisgIHZvaWQgKCpSeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBSeCBJUlEgaGFuZGxlciAqLwogCi0gIHZvaWQgKCpSeElTUikoc3RydWN0IF9fVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7IC8qITwgRnVuY3Rpb24gcG9pbnRlciBvbiBSeCBJUlEgaGFuZGxlciAgICovCi0KLSAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFR4IElSUSBoYW5kbGVyICAgKi8KKyAgdm9pZCAoKlR4SVNSKShzdHJ1Y3QgX19VQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsgLyohPCBGdW5jdGlvbiBwb2ludGVyIG9uIFR4IElSUSBoYW5kbGVyICovCiAKICAgRE1BX0hhbmRsZVR5cGVEZWYgICAgICAgICpoZG1hdHg7ICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIFR4IERNQSBIYW5kbGUgcGFyYW1ldGVycyAgICAgICovCiAKQEAgLTMxMyw4ICszMTAsMTAgQEAKICNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX0ZFICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA0VSkgICAgLyohPCBGcmFtZSBlcnJvciAgICAgICAgICAgICAqLwogI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfT1JFICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgICAvKiE8IE92ZXJydW4gZXJyb3IgICAgICAgICAgICovCiAjZGVmaW5lICBIQUxfVUFSVF9FUlJPUl9ETUEgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAxMFUpICAgIC8qITwgRE1BIHRyYW5zZmVyIGVycm9yICAgICAgKi8KKyNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX1JUTyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgICAgLyohPCBSZWNlaXZlciBUaW1lb3V0IGVycm9yICAqLworCiAjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSNkZWZpbmUgIEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0sgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkgICAgLyohPCBJbnZhbGlkIENhbGxiYWNrIGVycm9yICAqLworI2RlZmluZSAgSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICovCiAjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogLyoqCiAgICogQH0KQEAgLTQwMCwxMSArMzk5LDExIEBACiAgICogQH0KICAgKi8KIAotLyoqIEBkZWZncm91cCBVQVJUX1JlY2VpdmVyX1RpbWVPdXQgVUFSVCBSZWNlaXZlciBUaW1lT3V0CisvKiogQGRlZmdyb3VwIFVBUlRfUmVjZWl2ZXJfVGltZW91dCBVQVJUIFJlY2VpdmVyIFRpbWVvdXQKICAgKiBAewogICAqLwotI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZGlzYWJsZSAqLwotI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRU5BQkxFICAgICAgICBVU0FSVF9DUjJfUlRPRU4gICAgICAgICAgICAgLyohPCBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZW5hYmxlICAqLworI2RlZmluZSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IFVBUlQgUmVjZWl2ZXIgVGltZW91dCBkaXNhYmxlICovCisjZGVmaW5lIFVBUlRfUkVDRUlWRVJfVElNRU9VVF9FTkFCTEUgICAgICAgIFVTQVJUX0NSMl9SVE9FTiAgICAgICAgICAgIC8qITwgVUFSVCBSZWNlaXZlciBUaW1lb3V0IGVuYWJsZSAgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC01NjIsNiArNTYxLDE3IEBACiAvKioKICAgKiBAfQogICAqLworI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9TdG9wX01vZGVfRW5hYmxlICAgVUFSVCBBZHZhbmNlZCBGZWF0dXJlIFN0b3AgTW9kZSBFbmFibGUKKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX0FEVkZFQVRVUkVfU1RPUE1PREVfRElTQUJMRSAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFVBUlQgc3RvcCBtb2RlIGRpc2FibGUgKi8KKyNkZWZpbmUgVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0VOQUJMRSAgICAgVVNBUlRfQ1IxX1VFU00gICAgICAgICAgLyohPCBVQVJUIHN0b3AgbW9kZSBlbmFibGUgICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAKIC8qKiBAZGVmZ3JvdXAgVUFSVF9NdXRlX01vZGUgICBVQVJUIEFkdmFuY2VkIEZlYXR1cmUgTXV0ZSBNb2RlIEVuYWJsZQogICAqIEB7CkBAIC01NzksNiArNTg5LDE4IEBACiAvKioKICAgKiBAfQogICAqLworI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisKKy8qKiBAZGVmZ3JvdXAgVUFSVF9XYWtlVXBfZnJvbV9TdG9wX1NlbGVjdGlvbiAgIFVBUlQgV2FrZVVwIEZyb20gU3RvcCBTZWxlY3Rpb24KKyAgKiBAeworICAqLworI2RlZmluZSBVQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IFVBUlQgd2FrZS11cCBvbiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVBUlRfV0FLRVVQX09OX1NUQVJUQklUICAgICAgICAgICAgIFVTQVJUX0NSM19XVVNfMSAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIG9uIHN0YXJ0IGJpdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkgICAgVVNBUlRfQ1IzX1dVUyAgICAgICAgICAgLyohPCBVQVJUIHdha2UtdXAgb24gcmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBvciBSWEZJRk8gaXMgbm90IGVtcHR5ICovCisvKioKKyAgKiBAfQorICAqLworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAKIC8qKiBAZGVmZ3JvdXAgVUFSVF9Ecml2ZXJFbmFibGVfUG9sYXJpdHkgICAgICBVQVJUIERyaXZlckVuYWJsZSBQb2xhcml0eQogICAqIEB7CkBAIC02MjYsMTMgKzY0OCwyMCBAQAogICAqICAgICAgICAgICAtIDB4WFhYWCAgOiBGbGFnIG1hc2sgaW4gdGhlIElTUiByZWdpc3RlcgogICAqIEB7CiAgICovCisjaWYgZGVmaW5lZChVU0FSVF9JU1JfUkVBQ0spCisjZGVmaW5lIFVBUlRfRkxBR19SRUFDSyAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SRUFDSyAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAgKi8KKyNlbmRpZiAvKiBVU0FSVF9JU1JfUkVBQ0sgKi8KICNkZWZpbmUgVUFSVF9GTEFHX1RFQUNLICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1RFQUNLICAgICAgICAgLyohPCBVQVJUIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAqLworI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisjZGVmaW5lIFVBUlRfRkxBR19XVUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9XVUYgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGZsYWcgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogI2RlZmluZSBVQVJUX0ZMQUdfUldVICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUldVICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgd2FrZS11cCBmcm9tIG11dGUgbW9kZSBmbGFnICovCiAjZGVmaW5lIFVBUlRfRkxBR19TQktGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9TQktGICAgICAgICAgIC8qITwgVUFSVCBzZW5kIGJyZWFrIGZsYWcgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9GTEFHX0NNRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NNRiAgICAgICAgICAgLyohPCBVQVJUIGNoYXJhY3RlciBtYXRjaCBmbGFnICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBVQVJUX0ZMQUdfQlVTWSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQlVTWSAgICAgICAgICAvKiE8IFVBUlQgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIFVBUlRfRkxBR19BQlJGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9BQlJGICAgICAgICAgIC8qITwgVUFSVCBhdXRvIEJhdWQgcmF0ZSBmbGFnICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9GTEFHX0FCUkUgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0FCUkUgICAgICAgICAgLyohPCBVQVJUIGF1dG8gQmF1ZCByYXRlIGVycm9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBVQVJUX0ZMQUdfUlRPRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlRPRiAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBmbGFnICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIFVBUlRfRkxBR19DVFMgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9DVFMgICAgICAgICAgIC8qITwgVUFSVCBjbGVhciB0byBzZW5kIGZsYWcgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9GTEFHX0NUU0lGICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NUU0lGICAgICAgICAgLyohPCBVQVJUIGNsZWFyIHRvIHNlbmQgaW50ZXJydXB0IGZsYWcgICAgICAgICAqLwogI2RlZmluZSBVQVJUX0ZMQUdfTEJERiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfTEJERiAgICAgICAgICAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICAgICAgICAgICAgICovCkBAIC02NzQsNiArNzAzLDEwIEBACiAjZGVmaW5lIFVBUlRfSVRfTEJEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDg0NlUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgTElOIGJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHRpb24gICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9JVF9DVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTZBVSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCBDVFMgaW50ZXJydXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBVQVJUX0lUX0NNICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMkVVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGNoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKyNkZWZpbmUgVUFSVF9JVF9XVUYgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDc2VSAgICAgICAgICAgICAgICAgIC8qITwgVUFSVCB3YWtlLXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdGlvbiAgICAgICAqLworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCisjZGVmaW5lIFVBUlRfSVRfUlRPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIzQVUgICAgICAgICAgICAgICAgICAvKiE8IFVBUlQgcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHRpb24gICAgICAgICAgICAgKi8KIAogI2RlZmluZSBVQVJUX0lUX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjBVICAgICAgICAgICAgICAgICAgLyohPCBVQVJUIGVycm9yIGludGVycnVwdGlvbiAgICAgICAgICovCiAKQEAgLTY4OSwxMyArNzIyLDE3IEBACiAgICovCiAjZGVmaW5lIFVBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICovCiAjZGVmaW5lIFVBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICovCi0jZGVmaW5lIFVBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgKi8KKyNkZWZpbmUgVUFSVF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9MQkRGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgLyohPCBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcgICAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9DVFNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgLyohPCBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcgICAgICAgICAgKi8KICNkZWZpbmUgVUFSVF9DTEVBUl9DTUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9DTUNGICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZyAgICAgICAgKi8KKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorI2RlZmluZSBVQVJUX0NMRUFSX1dVRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1dVQ0YgICAgICAgICAgICAvKiE8IFdha2UgVXAgZnJvbSBzdG9wIG1vZGUgQ2xlYXIgRmxhZyAqLworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCisjZGVmaW5lIFVBUlRfQ0xFQVJfUlRPRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgIC8qITwgVUFSVCByZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcgICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtNzM0LDkgKzc3MSw5IEBACiAgICovCiAjZGVmaW5lIF9fSEFMX1VBUlRfRkxVU0hfRFJSRUdJU1RFUihfX0hBTkRMRV9fKSAgXAogICBkb3sgICAgICAgICAgICAgICAgXAotICAgICAgU0VUX0JJVCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5SUVIsIFVBUlRfUlhEQVRBX0ZMVVNIX1JFUVVFU1QpOyBcCi0gICAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKLSAgICB9ICB3aGlsZSgwVSkKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9SWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgICBTRVRfQklUKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPlJRUiwgVUFSVF9UWERBVEFfRkxVU0hfUkVRVUVTVCk7IFwKKyAgfSAgd2hpbGUoMFUpCiAKIC8qKiBAYnJpZWYgIENsZWFyIHRoZSBzcGVjaWZpZWQgVUFSVCBwZW5kaW5nIGZsYWcuCiAgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCkBAIC03NDgsOSArNzg1LDEzIEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9PUkVGICAgICBPdmVycnVuIEVycm9yIENsZWFyIEZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZworICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfUlRPRiAgICAgUmVjZWl2ZXIgVGltZW91dCBjbGVhciBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9MQkRGICAgICBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NUU0YgICAgIENUUyBJbnRlcnJ1cHQgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfQ01GICAgICAgQ2hhcmFjdGVyIE1hdGNoIENsZWFyIEZsYWcKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfV1VGICAgICAgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBDbGVhciBGbGFnCisjZW5kaWYKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfVUFSVF9DTEVBUl9GTEFHKF9fSEFORExFX18sIF9fRkxBR19fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+SUNSID0gKF9fRkxBR19fKSkKQEAgLTc5MCw3ICs4MzEsMTMgQEAKICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KICAgKiBAcGFyYW0gIF9fRkxBR19fIHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4KICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyNpZiBkZWZpbmVkKFVTQVJUX0lTUl9SRUFDSykKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUkVBQ0sgUmVjZWl2ZSBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZworI2VuZGlmCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RFQUNLIFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCisgICNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19XVUYgICBXYWtlIHVwIGZyb20gc3RvcCBtb2RlIGZsYWcKKyAjZW5kaWYKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUldVICAgUmVjZWl2ZXIgd2FrZSB1cCBmbGFnIChpZiB0aGUgVUFSVCBpbiBtdXRlIG1vZGUpCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1NCS0YgIFNlbmQgQnJlYWsgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19DTUYgICBDaGFyYWN0ZXIgbWF0Y2ggZmxhZwpAQCAtODAyLDYgKzg0OSw3IEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX1RYRSAgIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19UQyAgICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfUlRPRiAgUmVjZWl2ZXIgVGltZW91dCBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9GTEFHX0lETEUgIElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfRkxBR19PUkUgICBPdmVycnVuIEVycm9yIGZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0ZMQUdfTkUgICAgTm9pc2UgRXJyb3IgZmxhZwpAQCAtODE1LDEyICs4NjMsMTYgQEAKICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCBzb3VyY2UgdG8gZW5hYmxlLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1dVRiAgIFdha2V1cCBmcm9tIHN0b3AgbW9kZSBpbnRlcnJ1cHQKKyNlbmRpZgogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ00gICAgQ2hhcmFjdGVyIG1hdGNoIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfQ1RTICAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0xCRCAgIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UWEUgICBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVEMgICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlhORSAgUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JUTyAgIFJlY2VpdmUgVGltZW91dCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0lETEUgIElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9FUlIgICBFcnJvciBpbnRlcnJ1cHQgKGZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikKQEAgLTgzNSwxMiArODg3LDE2IEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVUFSVCBIYW5kbGUuCiAgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGRpc2FibGUuCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfV1VGICAgV2FrZXVwIGZyb20gc3RvcCBtb2RlIGludGVycnVwdAorI2VuZGlmCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DTSAgICBDaGFyYWN0ZXIgbWF0Y2ggaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9DVFMgICBDVFMgY2hhbmdlIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfTEJEICAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RYRSAgIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9UQyAgICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SWE5FICBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUlRPICAgUmVjZWl2ZSBUaW1lb3V0IGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfSURMRSAgSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1BFICAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0VSUiAgIEVycm9yIGludGVycnVwdCAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQpAQCAtODU0LDM3ICs5MTAsNDYgQEAKICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KICAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gc3BlY2lmaWVzIHRoZSBVQVJUIGludGVycnVwdCB0byBjaGVjay4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisjZW5kaWYKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgIENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NUUyAgIENUUyBjaGFuZ2UgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9MQkQgICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCiAgICovCi0jZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUiAmICgxVSA8PCAoKF9fSU5URVJSVVBUX18pPj4gOFUpKSkgIT0gUkVTRVQpID8gU0VUIDogUkVTRVQpCisjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoMVUgPDwgKChfX0lOVEVSUlVQVF9fKT4+IDhVKSkpICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQogCiAvKiogQGJyaWVmICBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVBUlQgSGFuZGxlLgogICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9XVUYgICBXYWtldXAgZnJvbSBzdG9wIG1vZGUgaW50ZXJydXB0CisjZW5kaWYKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NNICAgIENoYXJhY3RlciBtYXRjaCBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX0NUUyAgIENUUyBjaGFuZ2UgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9MQkQgICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfVFhFICAgVHJhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1RDICAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0lUX1JYTkUgIFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9SVE8gICBSZWNlaXZlIFRpbWVvdXQgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9JVF9JRExFICBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfUEUgICAgUGFyaXR5IEVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfSVRfRVJSICAgRXJyb3IgaW50ZXJydXB0IChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpCiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCiAgICovCiAjZGVmaW5lIF9fSEFMX1VBUlRfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoKCgoKHVpbnQ4X3QpKF9fSU5URVJSVVBUX18pKSA+PiA1VSkgPT0gMVUpID8gKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IxIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gNVUpID09IDJVKSA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKDFVIDw8ICgoKHVpbnQxNl90KShfX0lOVEVSUlVQVF9fKSkgJiBVQVJUX0lUX01BU0spKSkgICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDVVKSA9PSAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMykpICYgKDFVIDw8ICgoKHVpbnQxNl90KShfX0lOVEVSUlVQVF9fKSkgJiBVQVJUX0lUX01BU0spKSkgICE9IFJFU0VUKSA/IFNFVCA6IFJFU0VUKQogCiAvKiogQGJyaWVmICBDbGVhciB0aGUgc3BlY2lmaWVkIFVBUlQgSVNSIGZsYWcsIGluIHNldHRpbmcgdGhlIHByb3BlciBJQ1IgcmVnaXN0ZXIgZmxhZy4KICAgKiBAcGFyYW0gIF9fSEFORExFX18gc3BlY2lmaWVzIHRoZSBVQVJUIEhhbmRsZS4KQEAgLTg5NiwxMCArOTYxLDE0IEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9ORUYgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfT1JFRiAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVBUlRfQ0xFQVJfSURMRUYgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9SVE9GICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVUFSVF9DTEVBUl9UQ0YgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0xCREYgICBMSU4gQnJlYWsgRGV0ZWN0aW9uIENsZWFyIEZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NUU0YgICBDVFMgSW50ZXJydXB0IENsZWFyIEZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX0NNRiAgICBDaGFyYWN0ZXIgTWF0Y2ggQ2xlYXIgRmxhZworICAjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX0NMRUFSX1dVRiAgICBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIENsZWFyIEZsYWcKKyNlbmRpZgogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX0hBTF9VQVJUX0NMRUFSX0lUKF9fSEFORExFX18sIF9fSVRfQ0xFQVJfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9ICh1aW50MzJfdCkoX19JVF9DTEVBUl9fKSkKQEAgLTEwODMsMTAgKzExNTIsMTAgQEAKICAgKiBAcmV0dmFsIFNFVCAoX19DT05UUk9MX18gaXMgdmFsaWQpIG9yIFJFU0VUIChfX0NPTlRST0xfXyBpcyBpbnZhbGlkKQogICAqLwogI2RlZmluZSBJU19VQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChfX0NPTlRST0xfXylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9OT05FKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFMpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9DVFMpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fQ09OVFJPTF9fKSA9PSBVQVJUX0hXQ09OVFJPTF9SVFNfQ1RTKSkKKyAgKCgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX05PTkUpIHx8IFwKKyAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX1JUUykgIHx8IFwKKyAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX0NUUykgIHx8IFwKKyAgICgoX19DT05UUk9MX18pID09IFVBUlRfSFdDT05UUk9MX1JUU19DVFMpKQogCiAvKioKICAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBjb21tdW5pY2F0aW9uIG1vZGUgaXMgdmFsaWQuCkBAIC0xMTM0LDggKzEyMDMsMTUgQEAKICAgKiBAcGFyYW0gX19USU1FT1VUX18gVUFSVCByZWNlaXZlciB0aW1lb3V0IHNldHRpbmcuCiAgICogQHJldHZhbCBTRVQgKF9fVElNRU9VVF9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19USU1FT1VUX18gaXMgaW52YWxpZCkKICAgKi8KLSNkZWZpbmUgSVNfVUFSVF9SRUNFSVZFUl9USU1FT1VUKF9fVElNRU9VVF9fKSAoKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0RJU0FCTEUpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpCisjZGVmaW5lIElTX1VBUlRfUkVDRUlWRVJfVElNRU9VVChfX1RJTUVPVVRfXykgICgoKF9fVElNRU9VVF9fKSA9PSBVQVJUX1JFQ0VJVkVSX1RJTUVPVVRfRElTQUJMRSkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1RJTUVPVVRfXykgPT0gVUFSVF9SRUNFSVZFUl9USU1FT1VUX0VOQUJMRSkpCisKKy8qKiBAYnJpZWYgIENoZWNrIHRoZSByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEBub3RlICAgVGhlIG1heGltdW0gVUFSVCByZWNlaXZlciB0aW1lb3V0IHZhbHVlIGlzIDB4RkZGRkZGLgorICAqIEBwYXJhbSAgX19USU1FT1VUVkFMVUVfXyByZWNlaXZlciB0aW1lb3V0IHZhbHVlLgorICAqIEByZXR2YWwgVGVzdCByZXN1bHQgKFRSVUUgb3IgRkFMU0UpCisgICovCisjZGVmaW5lIElTX1VBUlRfUkVDRUlWRVJfVElNRU9VVF9WQUxVRShfX1RJTUVPVVRWQUxVRV9fKSAgKChfX1RJTUVPVVRWQUxVRV9fKSA8PSAweEZGRkZGRlUpCiAKIC8qKgogICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIExJTiBzdGF0ZSBpcyB2YWxpZC4KQEAgLTEyNzUsNiArMTM1MSwxNiBAQAogI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfTVNCRklSU1QoX19NU0JGSVJTVF9fKSAoKChfX01TQkZJUlNUX18pID09IFVBUlRfQURWRkVBVFVSRV9NU0JGSVJTVF9ESVNBQkxFKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fTVNCRklSU1RfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01TQkZJUlNUX0VOQUJMRSkpCiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgc3RvcCBtb2RlIHN0YXRlIGlzIHZhbGlkLgorICAqIEBwYXJhbSBfX1NUT1BNT0RFX18gVUFSVCBzdG9wIG1vZGUgc3RhdGUuCisgICogQHJldHZhbCBTRVQgKF9fU1RPUE1PREVfXyBpcyB2YWxpZCkgb3IgUkVTRVQgKF9fU1RPUE1PREVfXyBpcyBpbnZhbGlkKQorICAqLworI2RlZmluZSBJU19VQVJUX0FEVkZFQVRVUkVfU1RPUE1PREUoX19TVE9QTU9ERV9fKSAoKChfX1NUT1BNT0RFX18pID09IFVBUlRfQURWRkVBVFVSRV9TVE9QTU9ERV9ESVNBQkxFKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fU1RPUE1PREVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX1NUT1BNT0RFX0VOQUJMRSkpCisKKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogLyoqCiAgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgbXV0ZSBtb2RlIHN0YXRlIGlzIHZhbGlkLgogICAqIEBwYXJhbSBfX01VVEVfXyBVQVJUIG11dGUgbW9kZSBzdGF0ZS4KQEAgLTEyODIsNiArMTM2OCwxNyBAQAogICAqLwogI2RlZmluZSBJU19VQVJUX01VVEVfTU9ERShfX01VVEVfXykgICAgICAgKCgoX19NVVRFX18pID09IFVBUlRfQURWRkVBVFVSRV9NVVRFTU9ERV9ESVNBQkxFKSB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX01VVEVfXykgPT0gVUFSVF9BRFZGRUFUVVJFX01VVEVNT0RFX0VOQUJMRSkpCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKworLyoqCisgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVBUlQgd2FrZS11cCBzZWxlY3Rpb24gaXMgdmFsaWQuCisgICogQHBhcmFtIF9fV0FLRV9fIFVBUlQgd2FrZS11cCBzZWxlY3Rpb24uCisgICogQHJldHZhbCBTRVQgKF9fV0FLRV9fIGlzIHZhbGlkKSBvciBSRVNFVCAoX19XQUtFX18gaXMgaW52YWxpZCkKKyAgKi8KKyNkZWZpbmUgSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKF9fV0FLRV9fKSAoKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fQUREUkVTUykgICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fU1RBUlRCSVQpICAgICAgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfX1dBS0VfXykgPT0gVUFSVF9XQUtFVVBfT05fUkVBRERBVEFfTk9ORU1QVFkpKQorI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAKIC8qKgogICAqIEBicmllZiBFbnN1cmUgdGhhdCBVQVJUIGRyaXZlciBlbmFibGUgcG9sYXJpdHkgaXMgdmFsaWQuCkBAIC0xMzIwLDcgKzE0MTcsOCBAQAogCiAvKiBDYWxsYmFja3MgUmVnaXN0ZXIvVW5SZWdpc3RlciBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIChVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWdpc3RlckNhbGxiYWNrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIEhBTF9VQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBVQVJUX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX1VuUmVnaXN0ZXJDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKTsKICNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKQEAgLTEzNjksNiArMTQ2NywxMCBAQAogICAqLwogCiAvKiBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhBTF9VQVJUX1JlY2VpdmVyVGltZW91dF9Db25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgVGltZW91dFZhbHVlKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Rpc2FibGVSZWNlaXZlclRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MSU5fU2VuZEJyZWFrKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0Rpc2FibGVNdXRlTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKQEAgLTE0MDUsNyArMTUwNyw4IEBACiAjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9TZXRDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CiBIQUxfU3RhdHVzVHlwZURlZiBVQVJUX0NoZWNrSWRsZVN0YXRlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOwotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CiB2b2lkIFVBUlRfQWR2RmVhdHVyZUNvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKIAogLyoqCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF91YXJ0X2V4LmggYi9JbmMvc3RtMzJmN3h4X2hhbF91YXJ0X2V4LmgKaW5kZXggMzkxNzAxNi4uZTk5ZDhkNiAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfdWFydF9leC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3VhcnRfZXguaApAQCAtNDEsNyArNDEsMjQgQEAKICAgKiBAewogICAqLwogCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKy8qKgorICAqIEBicmllZiAgVUFSVCB3YWtlIHVwIGZyb20gc3RvcCBtb2RlIHBhcmFtZXRlcnMKKyAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHVpbnQzMl90IFdha2VVcEV2ZW50OyAgICAgICAgLyohPCBTcGVjaWZpZXMgd2hpY2ggZXZlbnQgd2lsbCBhY3RpdmF0ZSB0aGUgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcgKFdVRikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRfV2FrZVVwX2Zyb21fU3RvcF9TZWxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gVUFSVF9XQUtFVVBfT05fQUREUkVTUywgdGhlIHR3byBvdGhlciBmaWVsZHMgYmVsb3cgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHVwLiAqLwogCisgIHVpbnQxNl90IEFkZHJlc3NMZW5ndGg7ICAgICAgLyohPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgYWRkcmVzcyBpcyA0IG9yIDctYml0IGxvbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYSB2YWx1ZSBvZiBAcmVmIFVBUlRFeF9XYWtlVXBfQWRkcmVzc19MZW5ndGguICAqLworCisgIHVpbnQ4X3QgQWRkcmVzczsgICAgICAgICAgICAgLyohPCBVQVJUL1VTQVJUIG5vZGUgYWRkcmVzcyAoNy1iaXQgbG9uZyBtYXgpLiAqLworfSBVQVJUX1dha2VVcFR5cGVEZWY7CisKKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTU0LDkgKzcxLDkgQEAKIC8qKiBAZGVmZ3JvdXAgVUFSVEV4X1dvcmRfTGVuZ3RoIFVBUlRFeCBXb3JkIExlbmd0aAogICAqIEB7CiAgICovCi0jZGVmaW5lIFVBUlRfV09SRExFTkdUSF83QiAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9NMSAgIC8qITwgNy1iaXQgbG9uZyBVQVJUIGZyYW1lICovCi0jZGVmaW5lIFVBUlRfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgIC8qITwgOC1iaXQgbG9uZyBVQVJUIGZyYW1lICovCi0jZGVmaW5lIFVBUlRfV09SRExFTkdUSF85QiAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMV9NMCAgIC8qITwgOS1iaXQgbG9uZyBVQVJUIGZyYW1lICovCisjZGVmaW5lIFVBUlRfV09SRExFTkdUSF83QiAgICAgICAgICBVU0FSVF9DUjFfTTEgICAvKiE8IDctYml0IGxvbmcgVUFSVCBmcmFtZSAqLworI2RlZmluZSBVQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgMHgwMDAwMDAwMFUgICAgLyohPCA4LWJpdCBsb25nIFVBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVUFSVF9XT1JETEVOR1RIXzlCICAgICAgICAgIFVTQVJUX0NSMV9NMCAgIC8qITwgOS1iaXQgbG9uZyBVQVJUIGZyYW1lICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtNjQsMTMgKzgxLDEyIEBACiAvKiogQGRlZmdyb3VwIFVBUlRFeF9XYWtlVXBfQWRkcmVzc19MZW5ndGggVUFSVEV4IFdha2VVcCBBZGRyZXNzIExlbmd0aAogICAqIEB7CiAgICovCi0jZGVmaW5lIFVBUlRfQUREUkVTU19ERVRFQ1RfNEIgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCA0LWJpdCBsb25nIHdha2UtdXAgYWRkcmVzcyAqLwotI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzdCICAgICAgICAgICAgICBVU0FSVF9DUjJfQURETTcgIC8qITwgNy1iaXQgbG9uZyB3YWtlLXVwIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVF9BRERSRVNTX0RFVEVDVF80QiAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPCA0LWJpdCBsb25nIHdha2UtdXAgYWRkcmVzcyAqLworI2RlZmluZSBVQVJUX0FERFJFU1NfREVURUNUXzdCICAgICAgVVNBUlRfQ1IyX0FERE03ICAvKiE8IDctYml0IGxvbmcgd2FrZS11cCBhZGRyZXNzICovCiAvKioKICAgKiBAfQogICAqLwogCi0KIC8qKgogICAqIEB9CiAgICovCkBAIC04Niw3ICsxMDIsOCBAQAogICAqLwogCiAvKiBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JTNDg1RXhfSW5pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBQb2xhcml0eSwgdWludDMyX3QgQXNzZXJ0aW9uVGltZSwgdWludDMyX3QgRGVhc3NlcnRpb25UaW1lKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SUzQ4NUV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgUG9sYXJpdHksIHVpbnQzMl90IEFzc2VydGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlYXNzZXJ0aW9uVGltZSk7CiAKIC8qKgogICAqIEB9CkBAIC05Niw2ICsxMTMsMTAgQEAKICAgKiBAewogICAqLwogCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKK3ZvaWQgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KTsKKworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAKIC8qKgogICAqIEB9CkBAIC0xMDYsOCArMTI3LDIwIEBACiAgICovCiAKIC8qIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJURXhfU3RvcE1vZGVXYWtlVXBTb3VyY2VDb25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgVUFSVF9XYWtlVXBUeXBlRGVmIFdha2VVcFNlbGVjdGlvbik7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZVN0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CisKKyNlbmRpZi8qIFVTQVJUX0NSMV9VRVNNICovCisjaWYgZGVmaW5lZChVU0FSVF9DUjNfVUNFU00pCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUNsb2NrU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCk7CitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVDbG9ja1N0b3BNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpOworCisjZW5kaWYgLyogVVNBUlRfQ1IzX1VDRVNNICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTXVsdGlQcm9jZXNzb3JFeF9BZGRyZXNzTGVuZ3RoX1NldChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50MzJfdCBBZGRyZXNzTGVuZ3RoKTsKIAorCiAvKioKICAgKiBAfQogICAqLwpAQCAtMTI2LDEyICsxNTksMTIgQEAKICAgKiBAcGFyYW0gIF9fQ0xPQ0tTT1VSQ0VfXyBvdXRwdXQgdmFyaWFibGUuCiAgICogQHJldHZhbCBVQVJUIGNsb2NraW5nIHNvdXJjZSwgd3JpdHRlbiBpbiBfX0NMT0NLU09VUkNFX18uCiAgICovCi0jZGVmaW5lIFVBUlRfR0VUQ0xPQ0tTT1VSQ0UoX19IQU5ETEVfXyxfX0NMT0NLU09VUkNFX18pIFwKKyNkZWZpbmUgVUFSVF9HRVRDTE9DS1NPVVJDRShfX0hBTkRMRV9fLF9fQ0xPQ0tTT1VSQ0VfXykgICAgICAgXAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDEpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUMUNMS1NPVVJDRV9QQ0xLMjogICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNDcsMTIgKzE4MCwxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDIpICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VU0FSVDJDTEtTT1VSQ0VfUENMSzE6ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTY4LDEyICsyMDEsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQzKSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQzQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4OSwxMiArMjIyLDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVBUlQ0KSAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VBUlQ0X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VBUlQ0Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMTAsMTIgKzI0MywxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDUpICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUNV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VQVJUNUNMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjMxLDEyICsyNjQsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQ2KSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQ2X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQ2X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQ2Q0xLU09VUkNFX1BDTEsyOiAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI1MiwxMiArMjg1LDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVQVJUNykgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VBUlQ3X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VBUlQ3X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VBUlQ3Q0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNzMsMTIgKzMwNiwxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVUFSVDgpICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUOF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VQVJUOF9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VQVJUOENMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjk0LDcgKzMyNyw3IEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzEzLDQ0ICszNDYsNDQgQEAKICAgKi8KICNkZWZpbmUgVUFSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDFGRlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVQVJUX1dPUkRMRU5HVEhfOEIpICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF84QikgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMEZGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVBUlRfV09SRExFTkdUSF83QikgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVUFSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzdCKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwN0ZVIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDNGVSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAwMFU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlKDBVKQorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDAwMFU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlKDBVKQogCiAvKioKICAgKiBAYnJpZWYgRW5zdXJlIHRoYXQgVUFSVCBmcmFtZSBsZW5ndGggaXMgdmFsaWQuCkBAIC0zNjksNyArNDAyLDYgQEAKICNkZWZpbmUgSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChfX0FERFJFU1NfXykgKCgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfNEIpIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX19BRERSRVNTX18pID09IFVBUlRfQUREUkVTU19ERVRFQ1RfN0IpKQogCi0KIC8qKgogICAqIEB9CiAgICovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2hhbF91c2FydC5oIGIvSW5jL3N0bTMyZjd4eF9oYWxfdXNhcnQuaAppbmRleCA5ZjYxNWYzLi40NzA3ZGZkIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF91c2FydC5oCisrKyBiL0luYy9zdG0zMmY3eHhfaGFsX3VzYXJ0LmgKQEAgLTIwOSw2ICsyMDksNyBAQAogI2lmIChVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogI2RlZmluZSBIQUxfVVNBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSyAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgICAvKiE8IEludmFsaWQgQ2FsbGJhY2sgZXJyb3IgICAgKi8KICNlbmRpZiAvKiBVU0VfSEFMX1VTQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLworI2RlZmluZSAgSEFMX1VTQVJUX0VSUk9SX1JUTyAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgICAgLyohPCBSZWNlaXZlciBUaW1lb3V0IGVycm9yICAqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTMwNCw5ICszMDUsMTEgQEAKICAgKiAgICAgICAgICAgLSAweFhYWFggIDogRmxhZyBtYXNrIGluIHRoZSBJU1IgcmVnaXN0ZXIKICAgKiBAewogICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JFQUNLICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAvKiE8IFVTQVJUIHJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX1RFQUNLICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX0JVU1kgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfQlVTWSAgICAgICAgICAvKiE8IFVTQVJUIGJ1c3kgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX1RYRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVFhFICAgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgICAgICAqLworI2RlZmluZSBVU0FSVF9GTEFHX1JUT0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlRPRiAgICAgICAgICAvKiE8IFVTQVJUIHJlY2VpdmVyIHRpbWVvdXQgZmxhZyAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX1RDICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEMgICAgICAgICAgICAvKiE8IFVTQVJUIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX1JYTkUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUlhORSAgICAgICAgICAvKiE8IFVTQVJUIHJlYWQgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgICAgICAgICAqLwogI2RlZmluZSBVU0FSVF9GTEFHX0lETEUgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfSURMRSAgICAgICAgICAvKiE8IFVTQVJUIGlkbGUgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzQ4LDEwICszNTEsMTEgQEAKICAgKi8KICNkZWZpbmUgVVNBUlRfQ0xFQVJfUEVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUEVDRiAgICAgICAgICAgIC8qITwgUGFyaXR5IEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICAgKi8KICNkZWZpbmUgVVNBUlRfQ0xFQVJfRkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfRkVDRiAgICAgICAgICAgIC8qITwgRnJhbWluZyBFcnJvciBDbGVhciBGbGFnICAgICAgICAgICAgKi8KLSNkZWZpbmUgVVNBUlRfQ0xFQVJfTkVGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9ORUYgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgLyohPCBOb2lzZSBFcnJvciBkZXRlY3RlZCBDbGVhciBGbGFnICAgICAqLwogI2RlZmluZSBVU0FSVF9DTEVBUl9PUkVGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgLyohPCBPdmVyUnVuIEVycm9yIENsZWFyIEZsYWcgICAgICAgICAgICAqLwogI2RlZmluZSBVU0FSVF9DTEVBUl9JRExFRiAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgLyohPCBJRExFIGxpbmUgZGV0ZWN0ZWQgQ2xlYXIgRmxhZyAgICAgICAqLwogI2RlZmluZSBVU0FSVF9DTEVBUl9UQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gQ29tcGxldGUgQ2xlYXIgRmxhZyAgICAqLworI2RlZmluZSBVU0FSVF9DTEVBUl9SVE9GICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9SVE9DRiAgICAgICAgICAgLyohPCBVU0FSVCByZWNlaXZlciB0aW1lb3V0IGNsZWFyIGZsYWcgICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMzgzLDEwICszODcsMTAgQEAKICAgKi8KICNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICNkZWZpbmUgX19IQUxfVVNBUlRfUkVTRVRfSEFORExFX1NUQVRFKF9fSEFORExFX18pICBkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQ7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBOVUxMOyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKDBVKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPlN0YXRlID0gSEFMX1VTQVJUX1NUQVRFX1JFU0VUOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX0hBTkRMRV9fKS0+TXNwSW5pdENhbGxiYWNrID0gTlVMTDsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fSEFORExFX18pLT5Nc3BEZUluaXRDYWxsYmFjayA9IE5VTEw7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwVSkKICNlbHNlCiAjZGVmaW5lIF9fSEFMX1VTQVJUX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSAgKChfX0hBTkRMRV9fKS0+U3RhdGUgPSBIQUxfVVNBUlRfU1RBVEVfUkVTRVQpCiAjZW5kaWYgLyogVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KQEAgLTM5NSwxMSArMzk5LDEzIEBACiAgICogQHBhcmFtICBfX0hBTkRMRV9fIHNwZWNpZmllcyB0aGUgVVNBUlQgSGFuZGxlCiAgICogQHBhcmFtICBfX0ZMQUdfXyBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suCiAgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SRUFDSyBSZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19URUFDSyBUcmFuc21pdCBlbmFibGUgYWNrbm93bGVkZ2UgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfQlVTWSAgQnVzeSBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19UWEUgICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1RDICAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19SWE5FICBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX1JUT0YgIFJlY2VpdmVyIFRpbWVvdXQgZmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0ZMQUdfSURMRSAgSWRsZSBMaW5lIGRldGVjdGlvbiBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfRkxBR19PUkUgICBPdmVyUnVuIEVycm9yIGZsYWcKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9GTEFHX05FICAgIE5vaXNlIEVycm9yIGZsYWcKQEAgLTQxOSw2ICs0MjUsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX09SRUYgICAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGICAgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKKyAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9DTEVBUl9SVE9GICAgICBSZWNlaXZlciBUaW1lb3V0IGNsZWFyIGZsYWcKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19IQUxfVVNBUlRfQ0xFQVJfRkxBRyhfX0hBTkRMRV9fLCBfX0ZMQUdfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklDUiA9IChfX0ZMQUdfXykpCkBAIC01MDIsNyArNTA5LDggQEAKICAgKiAgICAgICAgICAgIEBhcmcgQHJlZiBVU0FSVF9JVF9QRSAgICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0CiAgICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIF9fSU5URVJSVVBUX18gKFNFVCBvciBSRVNFVCkuCiAgICovCi0jZGVmaW5lIF9fSEFMX1VTQVJUX0dFVF9JVChfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKCgoX19IQU5ETEVfXyktPkluc3RhbmNlLT5JU1IgJiAoKHVpbnQzMl90KTB4MDFVIDw8ICgoKF9fSU5URVJSVVBUX18pICYgVVNBUlRfSVNSX01BU0spPj4gVVNBUlRfSVNSX1BPUykpKSAhPSAwVSkgPyBTRVQgOiBSRVNFVCkKKyNkZWZpbmUgX19IQUxfVVNBUlRfR0VUX0lUKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPklTUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKCh1aW50MzJfdCkweDAxVSA8PCAoKChfX0lOVEVSUlVQVF9fKSAmIFVTQVJUX0lTUl9NQVNLKT4+IFVTQVJUX0lTUl9QT1MpKSkgIT0gMFUpID8gU0VUIDogUkVTRVQpCiAKIC8qKiBAYnJpZWYgIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIGlzIGVuYWJsZWQgb3Igbm90LgogICAqIEBwYXJhbSAgX19IQU5ETEVfXyBzcGVjaWZpZXMgdGhlIFVTQVJUIEhhbmRsZS4KQEAgLTUxOSw4ICs1MjcsOCBAQAogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChTRVQgb3IgUkVTRVQpLgogICAqLwogI2RlZmluZSBfX0hBTF9VU0FSVF9HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKCgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDB4MDVVKSA9PSAweDAxVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjEgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKCh1aW50OF90KShfX0lOVEVSUlVQVF9fKSkgPj4gMHgwNVUpID09IDB4MDJVKSA/IChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSMiA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgweDAxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgVVNBUlRfSVRfTUFTSykpKSAgIT0gMFUpID8gU0VUIDogUkVTRVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCgodWludDhfdCkoX19JTlRFUlJVUFRfXykpID4+IDB4MDVVKSA9PSAweDAyVSkgPyAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjIgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUjMpKSAmICgweDAxVSA8PCAoKCh1aW50MTZfdCkoX19JTlRFUlJVUFRfXykpICYgVVNBUlRfSVRfTUFTSykpKSAgIT0gMFUpID8gU0VUIDogUkVTRVQpCiAKIAogLyoqIEBicmllZiAgQ2xlYXIgdGhlIHNwZWNpZmllZCBVU0FSVCBJU1IgZmxhZywgaW4gc2V0dGluZyB0aGUgcHJvcGVyIElDUiByZWdpc3RlciBmbGFnLgpAQCAtNTMzLDYgKzU0MSw3IEBACiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfTkVGICAgICAgTm9pc2UgZGV0ZWN0ZWQgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX09SRUYgICAgIE92ZXJydW4gRXJyb3IgQ2xlYXIgRmxhZwogICAqICAgICAgICAgICAgQGFyZyBAcmVmIFVTQVJUX0NMRUFSX0lETEVGICAgIElETEUgbGluZSBkZXRlY3RlZCBDbGVhciBGbGFnCisgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfUlRPRiAgICAgUmVjZWl2ZXIgdGltZW91dCBjbGVhciBmbGFnCiAgICogICAgICAgICAgICBAYXJnIEByZWYgVVNBUlRfQ0xFQVJfVENGICAgICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIENsZWFyIEZsYWcKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KQEAgLTU5OCw4ICs2MDcsOCBAQAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQxKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMV9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQxX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VU0FSVDFDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjE1LDEyICs2MjQsMTIgQEAKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDsgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBlbHNlIGlmKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UgPT0gVVNBUlQyKSAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDJfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUMl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2FzZSBSQ0NfVVNBUlQyQ0xLU09VUkNFX1BDTEsxOiAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoX19DTE9DS1NPVVJDRV9fKSA9IFVTQVJUX0NMT0NLU09VUkNFX1BDTEsxOyAgICAgICAgIFwKICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTYzNiwxMiArNjQ1LDEyIEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSBpZigoX19IQU5ETEVfXyktPkluc3RhbmNlID09IFVTQVJUMykgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQzX1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzd2l0Y2goX19IQUxfUkNDX0dFVF9VU0FSVDNfU09VUkNFKCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNhc2UgUkNDX1VTQVJUM0NMS1NPVVJDRV9QQ0xLMTogICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9QQ0xLMTsgICAgICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02NTcsMTIgKzY2NiwxMiBAQAogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOyAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGVsc2UgaWYoKF9fSEFORExFX18pLT5JbnN0YW5jZSA9PSBVU0FSVDYpICAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHN3aXRjaChfX0hBTF9SQ0NfR0VUX1VTQVJUNl9TT1VSQ0UoKSkgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3dpdGNoKF9fSEFMX1JDQ19HRVRfVVNBUlQ2X1NPVVJDRSgpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBjYXNlIFJDQ19VU0FSVDZDTEtTT1VSQ0VfUENMSzI6ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChfX0NMT0NLU09VUkNFX18pID0gVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI7ICAgICAgICAgXAogICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjc4LDcgKzY4Nyw3IEBACiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKF9fQ0xPQ0tTT1VSQ0VfXykgPSBVU0FSVF9DTE9DS1NPVVJDRV9VTkRFRklORUQ7ICAgICBcCiAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03ODksNyArNzk4LDggQEAKIAogLyogQ2FsbGJhY2tzIFJlZ2lzdGVyL1VuUmVnaXN0ZXIgZnVuY3Rpb25zICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiAoVVNFX0hBTF9VU0FSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBVU0FSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjayk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVW5SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpOwogI2VuZGlmIC8qIFVTRV9IQUxfVVNBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKQEAgLTgwNCwxMyArODE0LDE2IEBACiAvKiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfSVQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTaXplKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdF9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50MTZfdCBTaXplKTsKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpOwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKTsKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpOwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX0RNQVBhdXNlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BUmVzdW1lKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCk7CiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfRE1BU3RvcChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9oYWxfdXNhcnRfZXguaCBiL0luYy9zdG0zMmY3eHhfaGFsX3VzYXJ0X2V4LmgKaW5kZXggZThkYzlhOS4uNDdhYmJmNCAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9oYWxfdXNhcnRfZXguaAorKysgYi9JbmMvc3RtMzJmN3h4X2hhbF91c2FydF9leC5oCkBAIC00NiwxNCArNDYsMTMgQEAKICAgKiBAewogICAqLwogI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzdCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTEpICAgLyohPCA3LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCi0jZGVmaW5lIFVTQVJUX1dPUkRMRU5HVEhfOEIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAvKiE8IDgtYml0IGxvbmcgVVNBUlQgZnJhbWUgKi8KKyNkZWZpbmUgVVNBUlRfV09SRExFTkdUSF84QiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwVSkgICAgICAgICAgICAgIC8qITwgOC1iaXQgbG9uZyBVU0FSVCBmcmFtZSAqLwogI2RlZmluZSBVU0FSVF9XT1JETEVOR1RIXzlCICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClVU0FSVF9DUjFfTTApICAgLyohPCA5LWJpdCBsb25nIFVTQVJUIGZyYW1lICovCiAvKioKICAgKiBAfQogICAqLwogCiAKLQogLyoqCiAgICogQH0KICAgKi8KQEAgLTc0LDQ1ICs3Myw0NCBAQAogICAqLwogI2RlZmluZSBVU0FSVF9NQVNLX0NPTVBVVEFUSU9OKF9fSEFORExFX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzlCKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMUZGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDBGRlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVsc2UgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5Xb3JkTGVuZ3RoID09IFVTQVJUX1dPUkRMRU5HVEhfOEIpICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF84QikgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoX19IQU5ETEVfXyktPkluaXQuUGFyaXR5ID09IFVTQVJUX1BBUklUWV9OT05FKSAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwRkZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDdGVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZWxzZSBpZiAoKF9fSEFORExFX18pLT5Jbml0LldvcmRMZW5ndGggPT0gVVNBUlRfV09SRExFTkdUSF83QikgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoKF9fSEFORExFX18pLT5Jbml0LlBhcml0eSA9PSBVU0FSVF9QQVJJVFlfTk9ORSkgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoX19IQU5ETEVfXyktPkluaXQuV29yZExlbmd0aCA9PSBVU0FSVF9XT1JETEVOR1RIXzdCKSAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChfX0hBTkRMRV9fKS0+SW5pdC5QYXJpdHkgPT0gVVNBUlRfUEFSSVRZX05PTkUpICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIChfX0hBTkRMRV9fKS0+TWFzayA9IDB4MDA3RlU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwM0ZVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKF9fSEFORExFX18pLT5NYXNrID0gMHgwMDAwVTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUoMFUpCi0KKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX19IQU5ETEVfXyktPk1hc2sgPSAweDAwMDBVOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSgwVSkKIAogLyoqCiAgICogQGJyaWVmIEVuc3VyZSB0aGF0IFVTQVJUIGZyYW1lIGxlbmd0aCBpcyB2YWxpZC4KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfaGFsX3d3ZGcuaCBiL0luYy9zdG0zMmY3eHhfaGFsX3d3ZGcuaAppbmRleCBmNmNjYjRlLi5jMGNlOGU0IDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2hhbF93d2RnLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9oYWxfd3dkZy5oCkBAIC0yMiw3ICsyMiw3IEBACiAjZGVmaW5lIFNUTTMyRjd4eF9IQUxfV1dER19ICiAKICNpZmRlZiBfX2NwbHVzcGx1cwotIGV4dGVybiAiQyIgeworZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTg5LDEyICs4OSwxMiBAQAogewogICBIQUxfV1dER19FV0lfQ0JfSUQgICAgICAgICAgPSAweDAwdSwgICAgLyohPCBXV0RHIEVXSSBjYWxsYmFjayBJRCAqLwogICBIQUxfV1dER19NU1BJTklUX0NCX0lEICAgICAgPSAweDAxdSwgICAgLyohPCBXV0RHIE1zcEluaXQgY2FsbGJhY2sgSUQgKi8KLX1IQUxfV1dER19DYWxsYmFja0lEVHlwZURlZjsKK30gSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWY7CiAKIC8qKgogICAqIEBicmllZiAgSEFMIFdXREcgQ2FsbGJhY2sgcG9pbnRlciBkZWZpbml0aW9uCiAgICovCi10eXBlZGVmIHZvaWQgKCpwV1dER19DYWxsYmFja1R5cGVEZWYpKFdXREdfSGFuZGxlVHlwZURlZiAqIGhwcHApOyAvKiE8IHBvaW50ZXIgdG8gYSBXV0RHIGNvbW1vbiBjYWxsYmFjayBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgdm9pZCAoKnBXV0RHX0NhbGxiYWNrVHlwZURlZikoV1dER19IYW5kbGVUeXBlRGVmICpocHBwKTsgIC8qITwgcG9pbnRlciB0byBhIFdXREcgY29tbW9uIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwogCiAjZW5kaWYKIC8qKgpAQCAtMjM5LDcgKzIzOSw4IEBACiAgICogICAgICAgICAgICBAYXJnIFdXREdfSVRfRVdJOiBFYXJseSBXYWtldXAgSW50ZXJydXB0CiAgICogQHJldHZhbCBzdGF0ZSBvZiBfX0lOVEVSUlVQVF9fIChUUlVFIG9yIEZBTFNFKS4KICAgKi8KLSNkZWZpbmUgX19IQUxfV1dER19HRVRfSVRfU09VUkNFKF9fSEFORExFX18sIF9fSU5URVJSVVBUX18pICgoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q0ZSICYgKF9fSU5URVJSVVBUX18pKSA9PSAoX19JTlRFUlJVUFRfXykpCisjZGVmaW5lIF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShfX0hBTkRMRV9fLCBfX0lOVEVSUlVQVF9fKSAoKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNGUlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoX19JTlRFUlJVUFRfXykpID09IChfX0lOVEVSUlVQVF9fKSkKIAogLyoqCiAgICogQH0KQEAgLTI5NCw2ICsyOTUsNiBAQAogfQogI2VuZGlmCiAKLSNlbmRpZiAvKiBfX1NUTTMyRjd4eF9IQUxfV1dER19IICovCisjZW5kaWYgLyogU1RNMzJGN3h4X0hBTF9XV0RHX0ggKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfbGxfYWRjLmggYi9JbmMvc3RtMzJmN3h4X2xsX2FkYy5oCmluZGV4IGU4NTdiNTYuLjc3ZjBlYTIgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfbGxfYWRjLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9sbF9hZGMuaApAQCAtMjU1LDExICsyNTUsMTEgQEAKICNkZWZpbmUgQURDX1RSX0hUX0JJVE9GRlNFVF9QT1MgICAgICAgICAgICAoMTZVKSAvKiBWYWx1ZSBlcXVpdmFsZW50IHRvIFBPU0lUSU9OX1ZBTChBRENfVFJfSFQpICovCiAvKiBBREMgaW50ZXJuYWwgY2hhbm5lbHMgcmVsYXRlZCBkZWZpbml0aW9ucyAqLwogLyogSW50ZXJuYWwgdm9sdGFnZSByZWZlcmVuY2UgVnJlZkludCAqLwotI2RlZmluZSBWUkVGSU5UX0NBTF9BRERSICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkYwRjQ0QSkpICAvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgVlJFRklOVF9DQUw6IFZyZWZJbnQgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBWUkVGSU5UX0NBTF9BRERSICAgICAgICAgICAgICAgICAgIFZSRUZJTlRfQ0FMX0FERFJfQ01TSVMgICAgICAvKiBJbnRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZSwgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgVlJFRklOVF9DQUw6IFZyZWZJbnQgQURDIHJhdyBkYXRhIGFjcXVpcmVkIGF0IHRlbXBlcmF0dXJlIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLwogI2RlZmluZSBWUkVGSU5UX0NBTF9WUkVGICAgICAgICAgICAgICAgICAgICggMzMwMFUpICAgICAgICAgICAgICAgICAgICAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2YWx1ZSB3aXRoIHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gKHRvbGVyYW5jZTogKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KIC8qIFRlbXBlcmF0dXJlIHNlbnNvciAqLwotI2RlZmluZSBURU1QU0VOU09SX0NBTDFfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkYwRjQ0QykpICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyRjcsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLwotI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgICgodWludDE2X3QqKSAoMHgxRkYwRjQ0RSkpICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDI6IE9uIFNUTTMyRjcsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTEwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDFfQUREUiAgICAgICAgICAgICAgIFRFTVBTRU5TT1JfQ0FMMV9BRERSX0NNU0lTICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDE6IE9uIFNUTTMyRjcsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgIDMwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLworI2RlZmluZSBURU1QU0VOU09SX0NBTDJfQUREUiAgICAgICAgICAgICAgIFRFTVBTRU5TT1JfQ0FMMl9BRERSX0NNU0lTICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIFRTX0NBTDI6IE9uIFNUTTMyRjcsIHRlbXBlcmF0dXJlIHNlbnNvciBBREMgcmF3IGRhdGEgYWNxdWlyZWQgYXQgdGVtcGVyYXR1cmUgMTEwIERlZ0MgKHRvbGVyYW5jZTogKy01IERlZ0MpLCBWcmVmKyA9IDMuMyBWICh0b2xlcmFuY2U6ICstMTAgbVYpLiAqLwogI2RlZmluZSBURU1QU0VOU09SX0NBTDFfVEVNUCAgICAgICAgICAgICAgICgoIGludDMyX3QpICAgMzApICAgICAgICAgICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDFfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLwogI2RlZmluZSBURU1QU0VOU09SX0NBTDJfVEVNUCAgICAgICAgICAgICAgICgoIGludDMyX3QpICAxMTApICAgICAgICAgICAvKiBJbnRlcm5hbCB0ZW1wZXJhdHVyZSBzZW5zb3IsIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRlbXBlcmF0dXJlIHNlbnNvciBoYXMgYmVlbiBjYWxpYnJhdGVkIGluIHByb2R1Y3Rpb24gZm9yIGRhdGEgaW50byBURU1QU0VOU09SX0NBTDJfQUREUiAodG9sZXJhbmNlOiArLTUgRGVnQykgKHVuaXQ6IERlZ0MpLiAqLwogI2RlZmluZSBURU1QU0VOU09SX0NBTF9WUkVGQU5BTE9HICAgICAgICAgICggMzMwMFUpICAgICAgICAgICAgICAgICAgICAvKiBBbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKFZyZWYrKSB2b2x0YWdlIHdpdGggd2hpY2ggdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBiZWVuIGNhbGlicmF0ZWQgaW4gcHJvZHVjdGlvbiAoKy0xMCBtVikgKHVuaXQ6IG1WKS4gKi8KZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfbGxfbHB0aW0uaCBiL0luYy9zdG0zMmY3eHhfbGxfbHB0aW0uaAppbmRleCAzOTVlMDBiLi4wM2JhYTkxIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2xsX2xwdGltLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9sbF9scHRpbS5oCkBAIC0xOCw4ICsxOCw4IEBACiAgICovCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fU1RNMzJGN3h4X0xMX0xQVElNX0gKLSNkZWZpbmUgX19TVE0zMkY3eHhfTExfTFBUSU1fSAorI2lmbmRlZiBTVE0zMkY3eHhfTExfTFBUSU1fSAorI2RlZmluZSBTVE0zMkY3eHhfTExfTFBUSU1fSAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewpAQCAtMzEsOCArMzEsOSBAQAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9MTF9Ecml2ZXIKICAgKiBAewogICAqLwotI2lmIGRlZmluZWQgKExQVElNMSkgCi0JCisKKyNpZiBkZWZpbmVkIChMUFRJTTEpCisKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTEwgTFBUSU0KICAgKiBAewogICAqLwpAQCAtMTI3LDggKzEyOCw4IEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09QRVJBVElOR19NT0RFIE9wZXJhdGluZyBNb2RlCiAgICogQHsKICAgKi8KLSNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfQ09OVElOVU9VUyAgICBMUFRJTV9DUl9DTlRTVFJUICAgICAgIC8qITxMUCBUaW1lciBzdGFydHMgaW4gY29udGludW91cyBtb2RlKi8KLSNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVCAgICAgICBMUFRJTV9DUl9TTkdTVFJUICAgICAgIC8qITxMUCBUaWxtZXIgc3RhcnRzIGluIHNpbmdsZSBtb2RlKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfQ09OVElOVU9VUyAgICBMUFRJTV9DUl9DTlRTVFJUIC8qITxMUCBUaW1lciBzdGFydHMgaW4gY29udGludW91cyBtb2RlKi8KKyNkZWZpbmUgTExfTFBUSU1fT1BFUkFUSU5HX01PREVfT05FU0hPVCAgICAgICBMUFRJTV9DUl9TTkdTVFJUIC8qITxMUCBUaWxtZXIgc3RhcnRzIGluIHNpbmdsZSBtb2RlKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0xMzYsOCArMTM3LDggQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfVVBEQVRFX01PREUgVXBkYXRlIE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBMTF9MUFRJTV9VUERBVEVfTU9ERV9JTU1FRElBVEUgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxQcmVsb2FkIGlzIGRpc2FibGVkOiByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBBUEIgYnVzIHdyaXRlIGFjY2VzcyovCi0jZGVmaW5lIExMX0xQVElNX1VQREFURV9NT0RFX0VORE9GUEVSSU9EICAgICAgTFBUSU1fQ0ZHUl9QUkVMT0FEICAgICAgLyohPHByZWxvYWQgaXMgZW5hYmxlZDogcmVnaXN0ZXJzIGFyZSB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgTFBUSU0gcGVyaW9kKi8KKyNkZWZpbmUgTExfTFBUSU1fVVBEQVRFX01PREVfSU1NRURJQVRFICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgLyohPFByZWxvYWQgaXMgZGlzYWJsZWQ6IHJlZ2lzdGVycyBhcmUgdXBkYXRlZCBhZnRlciBlYWNoIEFQQiBidXMgd3JpdGUgYWNjZXNzKi8KKyNkZWZpbmUgTExfTFBUSU1fVVBEQVRFX01PREVfRU5ET0ZQRVJJT0QgICAgICBMUFRJTV9DRkdSX1BSRUxPQUQgLyohPHByZWxvYWQgaXMgZW5hYmxlZDogcmVnaXN0ZXJzIGFyZSB1cGRhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgTFBUSU0gcGVyaW9kKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0xNDUsOCArMTQ2LDggQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ09VTlRFUl9NT0RFIENvdW50ZXIgTW9kZQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX0NPVU5URVJfTU9ERV9JTlRFUk5BTCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvbGxvd2luZyBlYWNoIGludGVybmFsIGNsb2NrIHB1bHNlKi8KLSNkZWZpbmUgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0VYVEVSTkFMICAgICAgICBMUFRJTV9DRkdSX0NPVU5UTU9ERSAgICAvKiE8VGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9sbG93aW5nIGVhY2ggdmFsaWQgY2xvY2sgcHVsc2Ugb24gdGhlIExQVElNIGV4dGVybmFsIElucHV0MSovCisjZGVmaW5lIExMX0xQVElNX0NPVU5URVJfTU9ERV9JTlRFUk5BTCAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgLyohPFRoZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGZvbGxvd2luZyBlYWNoIGludGVybmFsIGNsb2NrIHB1bHNlKi8KKyNkZWZpbmUgTExfTFBUSU1fQ09VTlRFUl9NT0RFX0VYVEVSTkFMICAgICAgICBMUFRJTV9DRkdSX0NPVU5UTU9ERSAvKiE8VGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZm9sbG93aW5nIGVhY2ggdmFsaWQgY2xvY2sgcHVsc2Ugb24gdGhlIExQVElNIGV4dGVybmFsIElucHV0MSovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMTU0LDggKzE1NSw4IEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX09VVFBVVF9XQVZFRk9STSBPdXRwdXQgV2F2ZWZvcm0gVHlwZQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00gICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPExQVElNICBnZW5lcmF0ZXMgZWl0aGVyIGEgUFdNIHdhdmVmb3JtIG9yIGEgT25lIHB1bHNlIHdhdmVmb3JtIGRlcGVuZGluZyBvbiBjaG9zZW4gb3BlcmF0aW5nIG1vZGUgQ09OVElOT1VTIG9yIFNJTkdMRSovCi0jZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFICAgICAgTFBUSU1fQ0ZHUl9XQVZFICAgICAgICAgLyohPExQVElNICBnZW5lcmF0ZXMgYSBTZXQgT25jZSB3YXZlZm9ybSovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00gICAgICAgICAgMHgwMDAwMDAwMFUgICAgIC8qITxMUFRJTSAgZ2VuZXJhdGVzIGVpdGhlciBhIFBXTSB3YXZlZm9ybSBvciBhIE9uZSBwdWxzZSB3YXZlZm9ybSBkZXBlbmRpbmcgb24gY2hvc2VuIG9wZXJhdGluZyBtb2RlIENPTlRJTk9VUyBvciBTSU5HTEUqLworI2RlZmluZSBMTF9MUFRJTV9PVVRQVVRfV0FWRUZPUk1fU0VUT05DRSAgICAgIExQVElNX0NGR1JfV0FWRSAvKiE8TFBUSU0gIGdlbmVyYXRlcyBhIFNldCBPbmNlIHdhdmVmb3JtKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0xNjMsOCArMTY0LDggQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfT1VUUFVUX1BPTEFSSVRZIE91dHB1dCBQb2xhcml0eQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgIC8qITxUaGUgTFBUSU0gb3V0cHV0IHJlZmxlY3RzIHRoZSBjb21wYXJlIHJlc3VsdHMgYmV0d2VlbiBMUFRJTXhfQVJSIGFuZCBMUFRJTXhfQ01QIHJlZ2lzdGVycyovCi0jZGVmaW5lIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wgICAgICAgIC8qITxUaGUgTFBUSU0gb3V0cHV0IHJlZmxlY3RzIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wYXJlIHJlc3VsdHMgYmV0d2VlbiBMUFRJTXhfQVJSIGFuZCBMUFRJTXhfQ01QIHJlZ2lzdGVycyovCisjZGVmaW5lIExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPFRoZSBMUFRJTSBvdXRwdXQgcmVmbGVjdHMgdGhlIGNvbXBhcmUgcmVzdWx0cyBiZXR3ZWVuIExQVElNeF9BUlIgYW5kIExQVElNeF9DTVAgcmVnaXN0ZXJzKi8KKyNkZWZpbmUgTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UgICAgICBMUFRJTV9DRkdSX1dBVlBPTCAgICAgICAvKiE8VGhlIExQVElNIG91dHB1dCByZWZsZWN0cyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcGFyZSByZXN1bHRzIGJldHdlZW4gTFBUSU14X0FSUiBhbmQgTFBUSU14X0NNUCByZWdpc3RlcnMqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTE4NywxNCArMTg4LDE0IEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfU09VUkNFIFRyaWdnZXIgU291cmNlCiAgICogQHsKICAgKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfR1BJTyAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFRJTXhfRVRSIGlucHV0Ki8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1BICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBBbGFybSBBKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBBbGFybSBCKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDVEFNUDEgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzEgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMCkgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBUYW1wZXIgMSovCi0jZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ1RBTVAyICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDIqLwotI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMyAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMiB8IExQVElNX0NGR1JfVFJJR1NFTF8wKSAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIFRhbXBlciAzKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfQ09NUDEgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9UUklHU0VMXzIgfCBMUFRJTV9DRkdSX1RSSUdTRUxfMSkgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIENPTVAxIG91dHB1dCovCi0jZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX0NPTVAyICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9HUElPICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBUSU14X0VUUiBpbnB1dCovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfU09VUkNFX1JUQ0FMQVJNQSAgICAgICAgTFBUSU1fQ0ZHUl9UUklHU0VMXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPEV4dGVybmFsIGlucHV0IHRyaWdnZXIgaXMgY29ubmVjdGVkIHRvIFJUQyBBbGFybSBBKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19TT1VSQ0VfUlRDQUxBUk1CICAgICAgICBMUFRJTV9DRkdSX1RSSUdTRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8RXh0ZXJuYWwgaW5wdXQgdHJpZ2dlciBpcyBjb25uZWN0ZWQgdG8gUlRDIEFsYXJtIEIqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMSAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMSB8IExQVElNX0NGR1JfVFJJR1NFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDEqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMiAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDIqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9SVENUQU1QMyAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMiB8IExQVElNX0NGR1JfVFJJR1NFTF8wKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBSVEMgVGFtcGVyIDMqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMSAgICAgICAgICAgIChMUFRJTV9DRkdSX1RSSUdTRUxfMiB8IExQVElNX0NGR1JfVFJJR1NFTF8xKSAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBDT01QMSBvdXRwdXQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1NPVVJDRV9DT01QMiAgICAgICAgICAgIExQVElNX0NGR1JfVFJJR1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITxFeHRlcm5hbCBpbnB1dCB0cmlnZ2VyIGlzIGNvbm5lY3RlZCB0byBDT01QMiBvdXRwdXQqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTIwMiwxMCArMjAzLDEwIEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfRklMVEVSIFRyaWdnZXIgRmlsdGVyCiAgICogQHsKICAgKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfTk9ORSAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8QW55IHRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJpZ2dlciovCi0jZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzIgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMCAgICAgLyohPFRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgMiBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyaWdnZXIqLwotI2RlZmluZSBMTF9MUFRJTV9UUklHX0ZJTFRFUl80ICAgICAgICAgICAgICAgIExQVElNX0NGR1JfVFJHRkxUXzEgICAgIC8qITxUcmlnZ2VyIGFjdGl2ZSBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDQgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmlnZ2VyKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19GSUxURVJfOCAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1RSR0ZMVCAgICAgICAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSX05PTkUgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAvKiE8QW55IHRyaWdnZXIgYWN0aXZlIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzIgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMCAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCAyIGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzQgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFRfMSAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA0IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCisjZGVmaW5lIExMX0xQVElNX1RSSUdfRklMVEVSXzggICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9UUkdGTFQgICAvKiE8VHJpZ2dlciBhY3RpdmUgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJpZ2dlciovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjEzLDkgKzIxNCw5IEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX1RSSUdfUE9MQVJJVFkgVHJpZ2dlciBQb2xhcml0eQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX1RSSUdfUE9MQVJJVFlfUklTSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9UUklHRU5fMCAgICAvKiE8TFBUSU0gY291bnRlciBzdGFydHMgd2hlbiBhIHJpc2luZyBlZGdlIGlzIGRldGVjdGVkKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9GQUxMSU5HICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8xICAgIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KLSNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkdfRkFMTElORyBMUFRJTV9DRkdSX1RSSUdFTiAgICAgIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgcmlzaW5nIG9yIGEgZmFsbGluZyBlZGdlIGlzIGRldGVjdGVkKi8KKyNkZWZpbmUgTExfTFBUSU1fVFJJR19QT0xBUklUWV9SSVNJTkcgICAgICAgICBMUFRJTV9DRkdSX1RSSUdFTl8wIC8qITxMUFRJTSBjb3VudGVyIHN0YXJ0cyB3aGVuIGEgcmlzaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgIExQVElNX0NGR1JfVFJJR0VOXzEgLyohPExQVElNIGNvdW50ZXIgc3RhcnRzIHdoZW4gYSBmYWxsaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLworI2RlZmluZSBMTF9MUFRJTV9UUklHX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HIExQVElNX0NGR1JfVFJJR0VOICAgLyohPExQVElNIGNvdW50ZXIgc3RhcnRzIHdoZW4gYSByaXNpbmcgb3IgYSBmYWxsaW5nIGVkZ2UgaXMgZGV0ZWN0ZWQqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTIyMyw4ICsyMjQsOCBAQAogLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FQ19DTEtfU09VUkNFIENsb2NrIFNvdXJjZQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX0NMS19TT1VSQ0VfSU5URVJOQUwgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPExQVElNIGlzIGNsb2NrZWQgYnkgaW50ZXJuYWwgY2xvY2sgc291cmNlIChBUEIgY2xvY2sgb3IgYW55IG9mIHRoZSBlbWJlZGRlZCBvc2NpbGxhdG9ycykqLwotI2RlZmluZSBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMICAgICAgICAgIExQVElNX0NGR1JfQ0tTRUwgICAgICAgIC8qITxMUFRJTSBpcyBjbG9ja2VkIGJ5IGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSB0aHJvdWdoIHRoZSBMUFRJTSBleHRlcm5hbCBJbnB1dDEqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgLyohPExQVElNIGlzIGNsb2NrZWQgYnkgaW50ZXJuYWwgY2xvY2sgc291cmNlIChBUEIgY2xvY2sgb3IgYW55IG9mIHRoZSBlbWJlZGRlZCBvc2NpbGxhdG9ycykqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfU09VUkNFX0VYVEVSTkFMICAgICAgICAgIExQVElNX0NGR1JfQ0tTRUwgLyohPExQVElNIGlzIGNsb2NrZWQgYnkgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlIHRocm91Z2ggdGhlIExQVElNIGV4dGVybmFsIElucHV0MSovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjMyLDEwICsyMzMsMTAgQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfQ0xLX0ZJTFRFUiBDbG9jayBGaWx0ZXIKICAgKiBAewogICAqLwotI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSX05PTkUgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITxBbnkgZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJhbnNpdGlvbiovCi0jZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfMiAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wICAgICAgLyohPEV4dGVybmFsIGNsb2NrIHNpZ25hbCBsZXZlbCBjaGFuZ2UgbXVzdCBiZSBzdGFibGUgZm9yIGF0IGxlYXN0IDIgY2xvY2sgcGVyaW9kcyBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhcyB2YWxpZCB0cmFuc2l0aW9uKi8KLSNkZWZpbmUgTExfTFBUSU1fQ0xLX0ZJTFRFUl80ICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX0NLRkxUXzEgICAgICAvKiE8RXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBtdXN0IGJlIHN0YWJsZSBmb3IgYXQgbGVhc3QgNCBjbG9jayBwZXJpb2RzIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGFzIHZhbGlkIHRyYW5zaXRpb24qLwotI2RlZmluZSBMTF9MUFRJTV9DTEtfRklMVEVSXzggICAgICAgICAgICAgICAgIExQVElNX0NGR1JfQ0tGTFQgICAgICAgIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfTk9ORSAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITxBbnkgZXh0ZXJuYWwgY2xvY2sgc2lnbmFsIGxldmVsIGNoYW5nZSBpcyBjb25zaWRlcmVkIGFzIGEgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfMiAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8wIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCAyIGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfNCAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVF8xIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA0IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCisjZGVmaW5lIExMX0xQVElNX0NMS19GSUxURVJfOCAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9DS0ZMVCAgIC8qITxFeHRlcm5hbCBjbG9jayBzaWduYWwgbGV2ZWwgY2hhbmdlIG11c3QgYmUgc3RhYmxlIGZvciBhdCBsZWFzdCA4IGNsb2NrIHBlcmlvZHMgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgYXMgdmFsaWQgdHJhbnNpdGlvbiovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjQzLDkgKzI0NCw5IEBACiAvKiogQGRlZmdyb3VwIExQVElNX0xMX0VDX0NMS19QT0xBUklUWSBDbG9jayBQb2xhcml0eQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUaGUgcmlzaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KLSNkZWZpbmUgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX0ZBTExJTkcgICAgICAgICBMUFRJTV9DRkdSX0NLUE9MXzAgICAgICAvKiE8IFRoZSBmYWxsaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KLSNkZWZpbmUgTExfTFBUSU1fQ0xLX1BPTEFSSVRZX1JJU0lOR19GQUxMSU5HICBMUFRJTV9DRkdSX0NLUE9MXzEgICAgICAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCisjZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgVGhlIHJpc2luZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0NMS19QT0xBUklUWV9GQUxMSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8wIC8qITwgVGhlIGZhbGxpbmcgZWRnZSBpcyB0aGUgYWN0aXZlIGVkZ2UgdXNlZCBmb3IgY291bnRpbmcqLworI2RlZmluZSBMTF9MUFRJTV9DTEtfUE9MQVJJVFlfUklTSU5HX0ZBTExJTkcgIExQVElNX0NGR1JfQ0tQT0xfMSAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjUzLDE0ICsyNTQsMTMgQEAKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUNfRU5DT0RFUl9NT0RFIEVuY29kZXIgTW9kZQogICAqIEB7CiAgICovCi0jZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBUaGUgcmlzaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KLSNkZWZpbmUgTExfTFBUSU1fRU5DT0RFUl9NT0RFX0ZBTExJTkcgICAgICAgICBMUFRJTV9DRkdSX0NLUE9MXzAgICAgICAvKiE8IFRoZSBmYWxsaW5nIGVkZ2UgaXMgdGhlIGFjdGl2ZSBlZGdlIHVzZWQgZm9yIGNvdW50aW5nKi8KLSNkZWZpbmUgTExfTFBUSU1fRU5DT0RFUl9NT0RFX1JJU0lOR19GQUxMSU5HICBMUFRJTV9DRkdSX0NLUE9MXzEgICAgICAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCisjZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9SSVNJTkcgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgVGhlIHJpc2luZyBlZGdlIGlzIHRoZSBhY3RpdmUgZWRnZSB1c2VkIGZvciBjb3VudGluZyovCisjZGVmaW5lIExMX0xQVElNX0VOQ09ERVJfTU9ERV9GQUxMSU5HICAgICAgICAgTFBUSU1fQ0ZHUl9DS1BPTF8wIC8qITwgVGhlIGZhbGxpbmcgZWRnZSBpcyB0aGUgYWN0aXZlIGVkZ2UgdXNlZCBmb3IgY291bnRpbmcqLworI2RlZmluZSBMTF9MUFRJTV9FTkNPREVSX01PREVfUklTSU5HX0ZBTExJTkcgIExQVElNX0NGR1JfQ0tQT0xfMSAvKiE8IEJvdGggZWRnZXMgYXJlIGFjdGl2ZSBlZGdlcyovCiAvKioKICAgKiBAfQogICAqLwogCi0gIAogLyoqCiAgICogQH0KICAgKi8KQEAgLTI4MSw3ICsyODEsNyBAQAogICAqIEBwYXJhbSAgX19WQUxVRV9fIFZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIHJlZ2lzdGVyCiAgICogQHJldHZhbCBOb25lCiAgICovCi0jZGVmaW5lIExMX0xQVElNX1dyaXRlUmVnKF9fSU5TVEFOQ0VfXywgX19SRUdfXywgX19WQUxVRV9fKSBXUklURV9SRUcoX19JTlNUQU5DRV9fLT5fX1JFR19fLCAoX19WQUxVRV9fKSkKKyNkZWZpbmUgTExfTFBUSU1fV3JpdGVSZWcoX19JTlNUQU5DRV9fLCBfX1JFR19fLCBfX1ZBTFVFX18pIFdSSVRFX1JFRygoX19JTlNUQU5DRV9fKS0+X19SRUdfXywgKF9fVkFMVUVfXykpCiAKIC8qKgogICAqIEBicmllZiAgUmVhZCBhIHZhbHVlIGluIExQVElNIHJlZ2lzdGVyCkBAIC0yODksNyArMjg5LDcgQEAKICAgKiBAcGFyYW0gIF9fUkVHX18gUmVnaXN0ZXIgdG8gYmUgcmVhZAogICAqIEByZXR2YWwgUmVnaXN0ZXIgdmFsdWUKICAgKi8KLSNkZWZpbmUgTExfTFBUSU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKF9fSU5TVEFOQ0VfXy0+X19SRUdfXykKKyNkZWZpbmUgTExfTFBUSU1fUmVhZFJlZyhfX0lOU1RBTkNFX18sIF9fUkVHX18pIFJFQURfUkVHKChfX0lOU1RBTkNFX18pLT5fX1JFR19fKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTI5OCwxMiArMjk4LDI1IEBACiAgICogQH0KICAgKi8KIAotCiAvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FeHBvcnRlZF9GdW5jdGlvbnMgTFBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCiAgICogQHsKICAgKi8KIAorI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQorLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucworICAqIEB7CisgICovCisKK0Vycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmICpMUFRJTXgpOwordm9pZCBMTF9MUFRJTV9TdHJ1Y3RJbml0KExMX0xQVElNX0luaXRUeXBlRGVmICpMUFRJTV9Jbml0U3RydWN0KTsKK0Vycm9yU3RhdHVzIExMX0xQVElNX0luaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14LCBMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCk7Cit2b2lkIExMX0xQVElNX0Rpc2FibGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KTsKKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogVVNFX0ZVTExfTExfRFJJVkVSICovCisKIC8qKiBAZGVmZ3JvdXAgTFBUSU1fTExfRUZfTFBUSU1fQ29uZmlndXJhdGlvbiBMUFRJTSBDb25maWd1cmF0aW9uCiAgICogQHsKICAgKi8KQEAgLTMyMiwxNyArMzM1LDYgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBEaXNhYmxlIHRoZSBMUFRJTSBpbnN0YW5jZQotICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fRGlzYWJsZQotICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQotICAqIEByZXR2YWwgTm9uZQotICAqLwotX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfTFBUSU1fRGlzYWJsZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCi17Ci0gIENMRUFSX0JJVChMUFRJTXgtPkNSLCBMUFRJTV9DUl9FTkFCTEUpOwotfQotCi0vKioKICAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBlbmFibGVkLgogICAqIEBybXRvbGwgQ1IgICAgICAgICAgIEVOQUJMRSAgICAgICAgTExfTFBUSU1fSXNFbmFibGVkCiAgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCkBAIC0zNDAsNyArMzQyLDcgQEAKICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewotICByZXR1cm4gKFJFQURfQklUKExQVElNeC0+Q1IsIExQVElNX0NSX0VOQUJMRSkgPT0gKExQVElNX0NSX0VOQUJMRSkpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5DUiwgTFBUSU1fQ1JfRU5BQkxFKSA9PSBMUFRJTV9DUl9FTkFCTEUpID8gMVVMIDogMFVMKSk7CiB9CiAKIC8qKgpAQCAtMzYxLDcgKzM2Myw2IEBACiAgIE1PRElGWV9SRUcoTFBUSU14LT5DUiwgTFBUSU1fQ1JfQ05UU1RSVCB8IExQVElNX0NSX1NOR1NUUlQsIE9wZXJhdGluZ01vZGUpOwogfQogCi0KIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBMUFRJTSByZWdpc3RlcnMgdXBkYXRlIG1vZGUgKGVuYWJsZS9kaXNhYmxlIHJlZ2lzdGVyIHByZWxvYWQpCiAgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBMUFRJTSBpbnN0YW5jZSBpcyBkaXNhYmxlZC4KQEAgLTM5NSw3ICszOTYsNyBAQAogICAqIEBub3RlIFRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGNvbnRlbnQgbXVzdCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGlzIGVuYWJsZWQKICAgKiBAbm90ZSBBZnRlciBhIHdyaXRlIHRvIHRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGEgbmV3IHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKICAgKiAgICAgICBzYW1lIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwcmV2aW91cyB3cml0ZSBvcGVyYXRpb24KLSAgKiAgICAgICBpcyBjb21wbGV0ZWQuIEFueSBzdWNjZXNzaXZlIHdyaXRlIGJlZm9yZSAgdGhlIEFSUk9LIGZsYWcgYmUgc2V0LCB3aWxsCisgICogICAgICAgaXMgY29tcGxldGVkLiBBbnkgc3VjY2Vzc2l2ZSB3cml0ZSBiZWZvcmUgIHRoZSBBUlJPSyBmbGFnIGlzIHNldCwgd2lsbAogICAqICAgICAgIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHRzLgogICAqIEBub3RlIGF1dG9yZWxvYWQgdmFsdWUgYmUgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHRoZSBjb21wYXJlIHZhbHVlLgogICAqIEBybXRvbGwgQVJSICAgICAgICAgIEFSUiAgICAgICAgICAgTExfTFBUSU1fU2V0QXV0b1JlbG9hZApAQCAtNDIzLDcgKzQyNCw3IEBACiAgICogQGJyaWVmICBTZXQgdGhlIGNvbXBhcmUgdmFsdWUKICAgKiBAbm90ZSBBZnRlciBhIHdyaXRlIHRvIHRoZSBMUFRJTXhfQ01QIHJlZ2lzdGVyIGEgbmV3IHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKICAgKiAgICAgICBzYW1lIHJlZ2lzdGVyIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwcmV2aW91cyB3cml0ZSBvcGVyYXRpb24KLSAgKiAgICAgICBpcyBjb21wbGV0ZWQuIEFueSBzdWNjZXNzaXZlIHdyaXRlIGJlZm9yZSB0aGUgQ01QT0sgZmxhZyBiZSBzZXQsIHdpbGwKKyAgKiAgICAgICBpcyBjb21wbGV0ZWQuIEFueSBzdWNjZXNzaXZlIHdyaXRlIGJlZm9yZSB0aGUgQ01QT0sgZmxhZyBpcyBzZXQsIHdpbGwKICAgKiAgICAgICBsZWFkIHRvIHVucHJlZGljdGFibGUgcmVzdWx0cy4KICAgKiBAcm10b2xsIENNUCAgICAgICAgICBDTVAgICAgICAgICAgIExMX0xQVElNX1NldENvbXBhcmUKICAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKQEAgLTYwOSw3ICs2MTAsNiBAQAogICByZXR1cm4gKHVpbnQzMl90KShSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfUFJFU0MpKTsKIH0KIAotCiAvKioKICAgKiBAfQogICAqLwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkVGltZW91dChMUFRJTV9UeXBlRGVmICpMUFRJTXgpCiB7Ci0gIHJldHVybiAoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX1RJTU9VVCkgPT0gKExQVElNX0NGR1JfVElNT1VUKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfVElNT1VUKSA9PSBMUFRJTV9DRkdSX1RJTU9VVCkgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC05MjAsNyArOTIwLDcgQEAKICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRFbmNvZGVyTW9kZShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCiB7Ci0gIHJldHVybiAoUkVBRF9CSVQoTFBUSU14LT5DRkdSLCBMUFRJTV9DRkdSX0VOQykgPT0gKExQVElNX0NGR1JfRU5DKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPkNGR1IsIExQVElNX0NGR1JfRU5DKSA9PSBMUFRJTV9DRkdSX0VOQykgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC05NTAsNyArOTUwLDcgQEAKICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QTShMUFRJTV9UeXBlRGVmICpMUFRJTXgpCiB7Ci0gIHJldHVybiAoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9DTVBNKSA9PSAoTFBUSU1fSVNSX0NNUE0pKTsKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQ01QTSkgPT0gTFBUSU1fSVNSX0NNUE0pID8gMVVMIDogMFVMKSk7CiB9CiAKIC8qKgpAQCAtOTcyLDcgKzk3Miw3IEBACiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewotICByZXR1cm4gKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfQVJSTSkgPT0gKExQVElNX0lTUl9BUlJNKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0FSUk0pID09IExQVElNX0lTUl9BUlJNKSA/IDFVTCA6IDBVTCkpOwogfQogCiAvKioKQEAgLTk5NCw3ICs5OTQsNyBAQAogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19FWFRUUklHKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0VYVFRSSUcpID09IChMUFRJTV9JU1JfRVhUVFJJRykpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9FWFRUUklHKSA9PSBMUFRJTV9JU1JfRVhUVFJJRykgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMDA5LDE0ICsxMDA5LDE0IEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgSW5mb3JtcyBhcHBsaWNhdGlvbiB3aGV0aGVyIHRoZSBBUEIgYnVzIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU14X0NNUCByZWdpc3RlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkOyBJZiBzbywgYSBuZXcgb25lIGNhbiBiZSBpbml0aWF0ZWQuCisgICogQGJyaWVmICBJbmZvcm1zIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIEFQQiBidXMgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTXhfQ01QIHJlZ2lzdGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuIElmIHNvLCBhIG5ldyBvbmUgY2FuIGJlIGluaXRpYXRlZC4KICAgKiBAcm10b2xsIElTUiAgICAgICAgICBDTVBPSyAgICAgICAgIExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBPSwogICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQogICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19DTVBPSyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCiB7Ci0gIHJldHVybiAoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9DTVBPSykgPT0gKExQVElNX0lTUl9DTVBPSykpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9DTVBPSykgPT0gTFBUSU1fSVNSX0NNUE9LKSA/IDFVTCA6IDBVTCkpOwogfQogCiAvKioKQEAgLTEwMzEsMTQgKzEwMzEsMTQgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBJbmZvcm1zIGFwcGxpY2F0aW9uIHdoZXRoZXIgdGhlIEFQQiBidXMgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTXhfQVJSIHJlZ2lzdGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQ7IElmIHNvLCBhIG5ldyBvbmUgY2FuIGJlIGluaXRpYXRlZC4KKyAgKiBAYnJpZWYgIEluZm9ybXMgYXBwbGljYXRpb24gd2hldGhlciB0aGUgQVBCIGJ1cyB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNeF9BUlIgcmVnaXN0ZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gSWYgc28sIGEgbmV3IG9uZSBjYW4gYmUgaW5pdGlhdGVkLgogICAqIEBybXRvbGwgSVNSICAgICAgICAgIEFSUk9LICAgICAgICAgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk9LCiAgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCiAgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0FSUk9LKSA9PSAoTFBUSU1fSVNSX0FSUk9LKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0FSUk9LKSA9PSBMUFRJTV9JU1JfQVJST0spID8gMVVMIDogMFVMKSk7CiB9CiAKIC8qKgpAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewotICByZXR1cm4gKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfVVApID09IChMUFRJTV9JU1JfVVApKTsKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SVNSLCBMUFRJTV9JU1JfVVApID09IExQVElNX0lTUl9VUCkgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMDgyLDcgKzEwODIsNyBAQAogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzQWN0aXZlRmxhZ19ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklTUiwgTFBUSU1fSVNSX0RPV04pID09IChMUFRJTV9JU1JfRE9XTikpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JU1IsIExQVElNX0lTUl9ET1dOKSA9PSBMUFRJTV9JU1JfRE9XTikgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMTIzLDcgKzExMjMsNyBAQAogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE0oTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewotICByZXR1cm4gKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQ01QTUlFKSA9PSAoTFBUSU1fSUVSX0NNUE1JRSkpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBNSUUpID09IExQVElNX0lFUl9DTVBNSUUpID8gMVVMIDogMFVMKSk7CiB9CiAKIC8qKgpAQCAtMTE1Niw3ICsxMTU2LDcgQEAKICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9BUlJNKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk1JRSkgPT0gKExQVElNX0lFUl9BUlJNSUUpKTsKKyAgcmV0dXJuICgoKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfQVJSTUlFKSA9PSBMUFRJTV9JRVJfQVJSTUlFKSA/IDFVTCA6IDBVTCkpOwogfQogCiAvKioKQEAgLTExODksNyArMTE4OSw3IEBACiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfRVhUVFJJRyhMUFRJTV9UeXBlRGVmICpMUFRJTXgpCiB7Ci0gIHJldHVybiAoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9FWFRUUklHSUUpID09IChMUFRJTV9JRVJfRVhUVFJJR0lFKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0VYVFRSSUdJRSkgPT0gTFBUSU1fSUVSX0VYVFRSSUdJRSkgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMjIyLDcgKzEyMjIsNyBAQAogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0NNUE9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0NNUE9LSUUpID09IChMUFRJTV9JRVJfQ01QT0tJRSkpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9DTVBPS0lFKSA9PSBMUFRJTV9JRVJfQ01QT0tJRSkgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMjUxLDExICsxMjUxLDExIEBACiAgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZWQgaW50ZXJydXB0IChBUlJPS0lFKSBpcyBlbmFibGVkLgogICAqIEBybXRvbGwgSUVSICAgICAgICAgIEFSUk9LSUUgICAgICAgTExfTFBUSU1fSXNFbmFibGVkSVRfQVJST0sKICAgKiBAcGFyYW0gIExQVElNeCBMb3ctUG93ZXIgVGltZXIgaW5zdGFuY2UKLSAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCgxIG9yIDApLgogICAqLwogX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX0xQVElNX0lzRW5hYmxlZElUX0FSUk9LKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0FSUk9LSUUpID09IChMUFRJTV9JRVJfQVJST0tJRSkpOworICByZXR1cm4gKCgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9BUlJPS0lFKSA9PSBMUFRJTV9JRVJfQVJST0tJRSkgPyAxVUwgOiAwVUwpKTsKIH0KIAogLyoqCkBAIC0xMjg0LDExICsxMjg0LDExIEBACiAgICogQGJyaWVmICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGlyZWN0aW9uIGNoYW5nZSB0byB1cCBpbnRlcnJ1cHQgKFVQSUUpIGlzIGVuYWJsZWQuCiAgICogQHJtdG9sbCBJRVIgICAgICAgICAgVVBJRSAgICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9VUAogICAqIEBwYXJhbSAgTFBUSU14IExvdy1Qb3dlciBUaW1lciBpbnN0YW5jZQotICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0KDEgb3IgMCkuCiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfTFBUSU1fSXNFbmFibGVkSVRfVVAoTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewotICByZXR1cm4gKFJFQURfQklUKExQVElNeC0+SUVSLCBMUFRJTV9JRVJfVVBJRSkgPT0gKExQVElNX0lFUl9VUElFKSk7CisgIHJldHVybiAoKChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX1VQSUUpID09IExQVElNX0lFUl9VUElFKSA/IDFVTCA6IDBVTCkpOwogfQogCiAvKioKQEAgLTEzMTcsMzAgKzEzMTcsMTcgQEAKICAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkaXJlY3Rpb24gY2hhbmdlIHRvIGRvd24gaW50ZXJydXB0IChET1dOSUUpIGlzIGVuYWJsZWQuCiAgICogQHJtdG9sbCBJRVIgICAgICAgICAgRE9XTklFICAgICAgICBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9ET1dOCiAgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCi0gICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQoMSBvciAwKS4KICAgKi8KIF9fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9MUFRJTV9Jc0VuYWJsZWRJVF9ET1dOKExQVElNX1R5cGVEZWYgKkxQVElNeCkKIHsKLSAgcmV0dXJuIChSRUFEX0JJVChMUFRJTXgtPklFUiwgTFBUSU1fSUVSX0RPV05JRSkgPT0gKExQVElNX0lFUl9ET1dOSUUpKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoTFBUSU14LT5JRVIsIExQVElNX0lFUl9ET1dOSUUpID09IExQVElNX0lFUl9ET1dOSUUpID8gMVVMIDogMFVMKTsKIH0KIAogLyoqCiAgICogQH0KICAgKi8KIAotI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQotLyoqIEBkZWZncm91cCBMUFRJTV9MTF9FRl9Jbml0IEluaXRpYWxpc2F0aW9uIGFuZCBkZWluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucwotICAqIEB7Ci0gICovCi0KLUVycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmICpMUFRJTXgpOwotdm9pZCBMTF9MUFRJTV9TdHJ1Y3RJbml0KExMX0xQVElNX0luaXRUeXBlRGVmICpMUFRJTV9Jbml0U3RydWN0KTsKLUVycm9yU3RhdHVzIExMX0xQVElNX0luaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14LCBMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCk7Ci0vKioKLSAgKiBAfQotICAqLwotI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLwotCiAvKioKICAgKiBAfQogICAqLwpAQCAtMTM1OSw2ICsxMzQ2LDYgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfTExfTFBUSU1fSCAqLworI2VuZGlmIC8qIFNUTTMyRjd4eF9MTF9MUFRJTV9IICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2xsX3NkbW1jLmggYi9JbmMvc3RtMzJmN3h4X2xsX3NkbW1jLmgKaW5kZXggNGUzODY5OC4uYWEwZDBlZSAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9sbF9zZG1tYy5oCisrKyBiL0luYy9zdG0zMmY3eHhfbGxfc2RtbWMuaApAQCAtMTIsMTkgKzEyLDIxIEBACiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKi8gCiAKIC8qIERlZmluZSB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBpbmNsdXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIF9fU1RNMzJGN3h4X0xMX1NETU1DX0gKLSNkZWZpbmUgX19TVE0zMkY3eHhfTExfU0RNTUNfSAorI2lmbmRlZiBTVE0zMkY3eHhfTExfU0RNTUNfSAorI2RlZmluZSBTVE0zMkY3eHhfTExfU0RNTUNfSAogCiAjaWZkZWYgX19jcGx1c3BsdXMKICBleHRlcm4gIkMiIHsKICNlbmRpZgogCisjaWYgZGVmaW5lZChTRE1NQzEpCisKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2hhbF9kZWYuaCIKIApAQCAtMTI3LDIwNSArMTI5LDIwNiBAQAogLyoqIEBkZWZncm91cCBTRE1NQ19MTF9FeHBvcnRlZF9Db25zdGFudHMgU0RNTUNfTEwgRXhwb3J0ZWQgQ29uc3RhbnRzCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfTk9ORSAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpICAgLyohPCBObyBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0NNRF9DUkNfRkFJTCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDFVKSAgIC8qITwgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoYnV0IENSQyBjaGVjayBmYWlsZWQpICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9EQVRBX0NSQ19GQUlMICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAyVSkgICAvKiE8IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQ01EX1JTUF9USU1FT1VUICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwNFUpICAgLyohPCBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0RBVEFfVElNRU9VVCAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKSAgIC8qITwgRGF0YSB0aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9UWF9VTkRFUlJVTiAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDEwVSkgICAvKiE8IFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfUlhfT1ZFUlJVTiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAyMFUpICAgLyohPCBSZWNlaXZlIEZJRk8gb3ZlcnJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0FERFJfTUlTQUxJR05FRCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwNDBVKSAgIC8qITwgTWlzYWxpZ25lZCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9CTE9DS19MRU5fRVJSICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDgwVSkgICAvKiE8IFRyYW5zZmVycmVkIGJsb2NrIGxlbmd0aCBpcyBub3QgYWxsb3dlZCBmb3IgdGhlIGNhcmQgb3IgdGhlIAorI2RlZmluZSBTRE1NQ19FUlJPUl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAvKiE8IE5vIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQ01EX0NSQ19GQUlMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgLyohPCBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChidXQgQ1JDIGNoZWNrIGZhaWxlZCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0RBVEFfQ1JDX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVICAgIC8qITwgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9DTURfUlNQX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VSAgICAvKiE8IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfREFUQV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUgICAgLyohPCBEYXRhIHRpbWVvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX1RYX1VOREVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBVICAgIC8qITwgVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9SWF9PVkVSUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwVSAgICAvKiE8IFJlY2VpdmUgRklGTyBvdmVycnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQUREUl9NSVNBTElHTkVEICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MFUgICAgLyohPCBNaXNhbGlnbmVkIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0JMT0NLX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBVICAgIC8qITwgVHJhbnNmZXJyZWQgYmxvY2sgbGVuZ3RoIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgY2FyZCBvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgZG9lcyBub3QgbWF0Y2ggdGhlIGJsb2NrIGxlbmd0aCAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0VSQVNFX1NFUV9FUlIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAxMDBVKSAgIC8qITwgQW4gZXJyb3IgaW4gdGhlIHNlcXVlbmNlIG9mIGVyYXNlIGNvbW1hbmQgb2NjdXJzICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9CQURfRVJBU0VfUEFSQU0gICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMjAwVSkgICAvKiE8IEFuIGludmFsaWQgc2VsZWN0aW9uIGZvciBlcmFzZSBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfV1JJVEVfUFJPVF9WSU9MQVRJT04gICAgICgodWludDMyX3QpMHgwMDAwMDQwMFUpICAgLyohPCBBdHRlbXB0IHRvIHByb2dyYW0gYSB3cml0ZSBwcm90ZWN0IGJsb2NrICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0xPQ0tfVU5MT0NLX0ZBSUxFRCAgICAgICAoKHVpbnQzMl90KTB4MDAwMDA4MDBVKSAgIC8qITwgU2VxdWVuY2Ugb3IgcGFzc3dvcmQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQgaW4gdW5sb2NrIAorI2RlZmluZSBTRE1NQ19FUlJPUl9FUkFTRV9TRVFfRVJSICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwVSAgICAvKiE8IEFuIGVycm9yIGluIHRoZSBzZXF1ZW5jZSBvZiBlcmFzZSBjb21tYW5kIG9jY3VycyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQkFEX0VSQVNFX1BBUkFNICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMFUgICAgLyohPCBBbiBpbnZhbGlkIHNlbGVjdGlvbiBmb3IgZXJhc2UgZ3JvdXBzICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX1dSSVRFX1BST1RfVklPTEFUSU9OICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBVICAgIC8qITwgQXR0ZW1wdCB0byBwcm9ncmFtIGEgd3JpdGUgcHJvdGVjdCBibG9jayAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9MT0NLX1VOTE9DS19GQUlMRUQgICAgICAgICAgICAgICAgICAweDAwMDAwODAwVSAgICAvKiE8IFNlcXVlbmNlIG9yIHBhc3N3b3JkIGVycm9yIGhhcyBiZWVuIGRldGVjdGVkIGluIHVubG9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgb3IgaWYgdGhlcmUgd2FzIGFuIGF0dGVtcHQgdG8gYWNjZXNzIGEgbG9ja2VkIGNhcmQgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQ09NX0NSQ19GQUlMRUQgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMTAwMFUpICAgLyohPCBDUkMgY2hlY2sgb2YgdGhlIHByZXZpb3VzIGNvbW1hbmQgZmFpbGVkICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0lMTEVHQUxfQ01EICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDIwMDBVKSAgIC8qITwgQ29tbWFuZCBpcyBub3QgbGVnYWwgZm9yIHRoZSBjYXJkIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9DQVJEX0VDQ19GQUlMRUQgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwVSkgICAvKiE8IENhcmQgaW50ZXJuYWwgRUNDIHdhcyBhcHBsaWVkIGJ1dCBmYWlsZWQgdG8gY29ycmVjdCB0aGUgZGF0YSAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQ0NfRVJSICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwODAwMFUpICAgLyohPCBJbnRlcm5hbCBjYXJkIGNvbnRyb2xsZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0dFTkVSQUxfVU5LTk9XTl9FUlIgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDBVKSAgIC8qITwgR2VuZXJhbCBvciB1bmtub3duIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9TVFJFQU1fUkVBRF9VTkRFUlJVTiAgICAgKCh1aW50MzJfdCkweDAwMDIwMDAwVSkgICAvKiE8IFRoZSBjYXJkIGNvdWxkIG5vdCBzdXN0YWluIGRhdGEgcmVhZGluZyBpbiBzdHJlYW0gcm1vZGUgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfU1RSRUFNX1dSSVRFX09WRVJSVU4gICAgICgodWludDMyX3QpMHgwMDA0MDAwMFUpICAgLyohPCBUaGUgY2FyZCBjb3VsZCBub3Qgc3VzdGFpbiBkYXRhIHByb2dyYW1taW5nIGluIHN0cmVhbSBtb2RlICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0NJRF9DU0RfT1ZFUldSSVRFICAgICAgICAoKHVpbnQzMl90KTB4MDAwODAwMDBVKSAgIC8qITwgQ0lEL0NTRCBvdmVyd3JpdGUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9XUF9FUkFTRV9TS0lQICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMTAwMDAwVSkgICAvKiE8IE9ubHkgcGFydGlhbCBhZGRyZXNzIHNwYWNlIHdhcyBlcmFzZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQ0FSRF9FQ0NfRElTQUJMRUQgICAgICAgICgodWludDMyX3QpMHgwMDIwMDAwMFUpICAgLyohPCBDb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkIHdpdGhvdXQgdXNpbmcgaW50ZXJuYWwgRUNDICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0VSQVNFX1JFU0VUICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDA0MDAwMDBVKSAgIC8qITwgRXJhc2Ugc2VxdWVuY2Ugd2FzIGNsZWFyZWQgYmVmb3JlIGV4ZWN1dGluZyBiZWNhdXNlIGFuIG91dCAKKyNkZWZpbmUgU0RNTUNfRVJST1JfQ09NX0NSQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMFUgICAgLyohPCBDUkMgY2hlY2sgb2YgdGhlIHByZXZpb3VzIGNvbW1hbmQgZmFpbGVkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0lMTEVHQUxfQ01EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVICAgIC8qITwgQ29tbWFuZCBpcyBub3QgbGVnYWwgZm9yIHRoZSBjYXJkIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9DQVJEX0VDQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwVSAgICAvKiE8IENhcmQgaW50ZXJuYWwgRUNDIHdhcyBhcHBsaWVkIGJ1dCBmYWlsZWQgdG8gY29ycmVjdCB0aGUgZGF0YSAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQ0NfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMFUgICAgLyohPCBJbnRlcm5hbCBjYXJkIGNvbnRyb2xsZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0dFTkVSQUxfVU5LTk9XTl9FUlIgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVICAgIC8qITwgR2VuZXJhbCBvciB1bmtub3duIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9TVFJFQU1fUkVBRF9VTkRFUlJVTiAgICAgICAgICAgICAgICAweDAwMDIwMDAwVSAgICAvKiE8IFRoZSBjYXJkIGNvdWxkIG5vdCBzdXN0YWluIGRhdGEgcmVhZGluZyBpbiBzdHJlYW0gcm1vZGUgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfU1RSRUFNX1dSSVRFX09WRVJSVU4gICAgICAgICAgICAgICAgMHgwMDA0MDAwMFUgICAgLyohPCBUaGUgY2FyZCBjb3VsZCBub3Qgc3VzdGFpbiBkYXRhIHByb2dyYW1taW5nIGluIHN0cmVhbSBtb2RlICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0NJRF9DU0RfT1ZFUldSSVRFICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBVICAgIC8qITwgQ0lEL0NTRCBvdmVyd3JpdGUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9XUF9FUkFTRV9TS0lQICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwVSAgICAvKiE8IE9ubHkgcGFydGlhbCBhZGRyZXNzIHNwYWNlIHdhcyBlcmFzZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQ0FSRF9FQ0NfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMFUgICAgLyohPCBDb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkIHdpdGhvdXQgdXNpbmcgaW50ZXJuYWwgRUNDICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0VSQVNFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVICAgIC8qITwgRXJhc2Ugc2VxdWVuY2Ugd2FzIGNsZWFyZWQgYmVmb3JlIGV4ZWN1dGluZyBiZWNhdXNlIGFuIG91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGVyYXNlIHNlcXVlbmNlIGNvbW1hbmQgd2FzIHJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQUtFX1NFUV9FUlIgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDgwMDAwMFUpICAgLyohPCBFcnJvciBpbiBzZXF1ZW5jZSBvZiBhdXRoZW50aWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0lOVkFMSURfVk9MVFJBTkdFICAgICAgICAoKHVpbnQzMl90KTB4MDEwMDAwMDBVKSAgIC8qITwgRXJyb3IgaW4gY2FzZSBvZiBpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9BRERSX09VVF9PRl9SQU5HRSAgICAgICAgKCh1aW50MzJfdCkweDAyMDAwMDAwVSkgICAvKiE8IEVycm9yIHdoZW4gYWRkcmVzc2VkIGJsb2NrIGlzIG91dCBvZiByYW5nZSAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfUkVRVUVTVF9OT1RfQVBQTElDQUJMRSAgICgodWludDMyX3QpMHgwNDAwMDAwMFUpICAgLyohPCBFcnJvciB3aGVuIGNvbW1hbmQgcmVxdWVzdCBpcyBub3QgYXBwbGljYWJsZSAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAoKHVpbnQzMl90KTB4MDgwMDAwMDBVKSAgIC8qITwgdGhlIHVzZWQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFICAgICAgKCh1aW50MzJfdCkweDEwMDAwMDAwVSkgICAvKiE8IEVycm9yIHdoZW4gZmVhdHVyZSBpcyBub3QgaW5zdXBwb3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgyMDAwMDAwMFUpICAgLyohPCBFcnJvciB3aGVuIHRyYW5zZmVyIHByb2Nlc3MgaXMgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0VSUk9SX0RNQSAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4NDAwMDAwMDBVKSAgIC8qITwgRXJyb3Igd2hpbGUgRE1BIHRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDgwMDAwMDAwVSkgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQUtFX1NFUV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMFUgICAgLyohPCBFcnJvciBpbiBzZXF1ZW5jZSBvZiBhdXRoZW50aWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0lOVkFMSURfVk9MVFJBTkdFICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBVICAgIC8qITwgRXJyb3IgaW4gY2FzZSBvZiBpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9BRERSX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwVSAgICAvKiE8IEVycm9yIHdoZW4gYWRkcmVzc2VkIGJsb2NrIGlzIG91dCBvZiByYW5nZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfUkVRVUVTVF9OT1RfQVBQTElDQUJMRSAgICAgICAgICAgICAgMHgwNDAwMDAwMFUgICAgLyohPCBFcnJvciB3aGVuIGNvbW1hbmQgcmVxdWVzdCBpcyBub3QgYXBwbGljYWJsZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBVICAgIC8qITwgdGhlIHVzZWQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFICAgICAgICAgICAgICAgICAweDEwMDAwMDAwVSAgICAvKiE8IEVycm9yIHdoZW4gZmVhdHVyZSBpcyBub3QgaW5zdXBwb3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfRVJST1JfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMFUgICAgLyohPCBFcnJvciB3aGVuIHRyYW5zZmVyIHByb2Nlc3MgaXMgYnVzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0VSUk9SX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBVICAgIC8qITwgRXJyb3Igd2hpbGUgRE1BIHRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwVSAgICAvKiE8IFRpbWVvdXQgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogLyoqIAogICAqIEBicmllZiBTRE1NQyBDb21tYW5kcyBJbmRleCAKICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0dPX0lETEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkwVSkgICAvKiE8IFJlc2V0cyB0aGUgU0QgbWVtb3J5IGNhcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFTkRfT1BfQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkxVSkgICAvKiE8IFNlbmRzIGhvc3QgY2FwYWNpdHkgc3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgYWN0aXZhdGVzIHRoZSBjYXJkJ3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0FMTF9TRU5EX0NJRCAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyVSkgICAvKiE8IEFza3MgYW55IGNhcmQgY29ubmVjdGVkIHRvIHRoZSBob3N0IHRvIHNlbmQgdGhlIENJRCBudW1iZXJzIG9uIHRoZSBDTUQgbGluZS4gICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFVF9SRUxfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkzVSkgICAvKiE8IEFza3MgdGhlIGNhcmQgdG8gcHVibGlzaCBhIG5ldyByZWxhdGl2ZSBhZGRyZXNzIChSQ0EpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFVF9EU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk0VSkgICAvKiE8IFByb2dyYW1zIHRoZSBEU1Igb2YgYWxsIGNhcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NETU1DX1NFTl9PUF9DT05EICAgICAgICAgICAgICAgICAgICgodWludDhfdCk1VSkgICAvKiE8IFNlbmRzIGhvc3QgY2FwYWNpdHkgc3VwcG9ydCBpbmZvcm1hdGlvbiAoSENTKSBhbmQgYXNrcyB0aGUgYWNjZXNzZWQgY2FyZCB0byBzZW5kIGl0cyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nIGNvbmRpdGlvbiByZWdpc3RlciAoT0NSKSBjb250ZW50IGluIHRoZSByZXNwb25zZSBvbiB0aGUgQ01EIGxpbmUuICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0hTX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk2VSkgICAvKiE8IENoZWNrcyBzd2l0Y2hhYmxlIGZ1bmN0aW9uIChtb2RlIDApIGFuZCBzd2l0Y2ggY2FyZCBmdW5jdGlvbiAobW9kZSAxKS4gICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFTF9ERVNFTF9DQVJEICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk3VSkgICAvKiE8IFNlbGVjdHMgdGhlIGNhcmQgYnkgaXRzIG93biByZWxhdGl2ZSBhZGRyZXNzIGFuZCBnZXRzIGRlc2VsZWN0ZWQgYnkgYW55IG90aGVyIGFkZHJlc3MgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0hTX1NFTkRfRVhUX0NTRCAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk4VSkgICAvKiE8IFNlbmRzIFNEIE1lbW9yeSBDYXJkIGludGVyZmFjZSBjb25kaXRpb24sIHdoaWNoIGluY2x1ZGVzIGhvc3Qgc3VwcGx5IHZvbHRhZ2UgaW5mb3JtYXRpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhc2tzIHRoZSBjYXJkIHdoZXRoZXIgY2FyZCBzdXBwb3J0cyB2b2x0YWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRU5EX0NTRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpOVUpICAgLyohPCBBZGRyZXNzZWQgY2FyZCBzZW5kcyBpdHMgY2FyZCBzcGVjaWZpYyBkYXRhIChDU0QpIG9uIHRoZSBDTUQgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRU5EX0NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTBVKSAgLyohPCBBZGRyZXNzZWQgY2FyZCBzZW5kcyBpdHMgY2FyZCBpZGVudGlmaWNhdGlvbiAoQ0lEKSBvbiB0aGUgQ01EIGxpbmUuICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9SRUFEX0RBVF9VTlRJTF9TVE9QICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTFVKSAgLyohPCBTRCBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TVE9QX1RSQU5TTUlTU0lPTiAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTJVKSAgLyohPCBGb3JjZXMgdGhlIGNhcmQgdG8gc3RvcCB0cmFuc21pc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRU5EX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTNVKSAgLyohPCBBZGRyZXNzZWQgY2FyZCBzZW5kcyBpdHMgc3RhdHVzIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9IU19CVVNURVNUX1JFQUQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTRVKSAgLyohPCBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9HT19JTkFDVElWRV9TVEFURSAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTVVKSAgLyohPCBTZW5kcyBhbiBhZGRyZXNzZWQgY2FyZCBpbnRvIHRoZSBpbmFjdGl2ZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRVRfQkxPQ0tMRU4gICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTZVKSAgLyohPCBTZXRzIHRoZSBibG9jayBsZW5ndGggKGluIGJ5dGVzIGZvciBTRFNDKSBmb3IgYWxsIGZvbGxvd2luZyBibG9jayBjb21tYW5kcyAKKyNkZWZpbmUgU0RNTUNfQ01EX0dPX0lETEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwVSAgICAvKiE8IFJlc2V0cyB0aGUgU0QgbWVtb3J5IGNhcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NFTkRfT1BfQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSAgICAvKiE8IFNlbmRzIGhvc3QgY2FwYWNpdHkgc3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgYWN0aXZhdGVzIHRoZSBjYXJkJ3MgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0FMTF9TRU5EX0NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyVSAgICAvKiE8IEFza3MgYW55IGNhcmQgY29ubmVjdGVkIHRvIHRoZSBob3N0IHRvIHNlbmQgdGhlIENJRCBudW1iZXJzIG9uIHRoZSBDTUQgbGluZS4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NFVF9SRUxfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzVSAgICAvKiE8IEFza3MgdGhlIGNhcmQgdG8gcHVibGlzaCBhIG5ldyByZWxhdGl2ZSBhZGRyZXNzIChSQ0EpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NFVF9EU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0VSAgICAvKiE8IFByb2dyYW1zIHRoZSBEU1Igb2YgYWxsIGNhcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NETU1DX1NFTl9PUF9DT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1VSAgICAvKiE8IFNlbmRzIGhvc3QgY2FwYWNpdHkgc3VwcG9ydCBpbmZvcm1hdGlvbiAoSENTKSBhbmQgYXNrcyB0aGUgYWNjZXNzZWQgY2FyZCB0byBzZW5kIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nIGNvbmRpdGlvbiByZWdpc3RlciAoT0NSKSBjb250ZW50IGluIHRoZSByZXNwb25zZSBvbiB0aGUgQ01EIGxpbmUuICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfSFNfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDZVICAgIC8qITwgQ2hlY2tzIHN3aXRjaGFibGUgZnVuY3Rpb24gKG1vZGUgMCkgYW5kIHN3aXRjaCBjYXJkIGZ1bmN0aW9uIChtb2RlIDEpLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0VMX0RFU0VMX0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDdVICAgIC8qITwgU2VsZWN0cyB0aGUgY2FyZCBieSBpdHMgb3duIHJlbGF0aXZlIGFkZHJlc3MgYW5kIGdldHMgZGVzZWxlY3RlZCBieSBhbnkgb3RoZXIgYWRkcmVzcyAgICAqLworI2RlZmluZSBTRE1NQ19DTURfSFNfU0VORF9FWFRfQ1NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDhVICAgIC8qITwgU2VuZHMgU0QgTWVtb3J5IENhcmQgaW50ZXJmYWNlIGNvbmRpdGlvbiwgd2hpY2ggaW5jbHVkZXMgaG9zdCBzdXBwbHkgdm9sdGFnZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFza3MgdGhlIGNhcmQgd2hldGhlciBjYXJkIHN1cHBvcnRzIHZvbHRhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0VORF9DU0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDlVICAgIC8qITwgQWRkcmVzc2VkIGNhcmQgc2VuZHMgaXRzIGNhcmQgc3BlY2lmaWMgZGF0YSAoQ1NEKSBvbiB0aGUgQ01EIGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0VORF9DSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwVSAgIC8qITwgQWRkcmVzc2VkIGNhcmQgc2VuZHMgaXRzIGNhcmQgaWRlbnRpZmljYXRpb24gKENJRCkgb24gdGhlIENNRCBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfUkVBRF9EQVRfVU5USUxfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExVSAgIC8qITwgU0QgY2FyZCBkb2Vzbid0IHN1cHBvcnQgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU1RPUF9UUkFOU01JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyVSAgIC8qITwgRm9yY2VzIHRoZSBjYXJkIHRvIHN0b3AgdHJhbnNtaXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0VORF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzVSAgIC8qITwgQWRkcmVzc2VkIGNhcmQgc2VuZHMgaXRzIHN0YXR1cyByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfSFNfQlVTVEVTVF9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0VSAgIC8qITwgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfR09fSU5BQ1RJVkVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1VSAgIC8qITwgU2VuZHMgYW4gYWRkcmVzc2VkIGNhcmQgaW50byB0aGUgaW5hY3RpdmUgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0VUX0JMT0NLTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2VSAgIC8qITwgU2V0cyB0aGUgYmxvY2sgbGVuZ3RoIChpbiBieXRlcyBmb3IgU0RTQykgZm9yIGFsbCBmb2xsb3dpbmcgYmxvY2sgY29tbWFuZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkLCB3cml0ZSwgbG9jaykuIERlZmF1bHQgYmxvY2sgbGVuZ3RoIGlzIGZpeGVkIHRvIDUxMiBCeXRlcy4gTm90IGVmZmVjdGl2ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTREhTIGFuZCBTRFhDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1JFQURfU0lOR0xFX0JMT0NLICAgICAgICAgICAgICAgICAgICgodWludDhfdCkxN1UpICAvKiE8IFJlYWRzIHNpbmdsZSBibG9jayBvZiBzaXplIHNlbGVjdGVkIGJ5IFNFVF9CTE9DS0xFTiBpbiBjYXNlIG9mIFNEU0MsIGFuZCBhIGJsb2NrIG9mIAorI2RlZmluZSBTRE1NQ19DTURfUkVBRF9TSU5HTEVfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3VSAgIC8qITwgUmVhZHMgc2luZ2xlIGJsb2NrIG9mIHNpemUgc2VsZWN0ZWQgYnkgU0VUX0JMT0NLTEVOIGluIGNhc2Ugb2YgU0RTQywgYW5kIGEgYmxvY2sgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIDUxMiBieXRlcyBpbiBjYXNlIG9mIFNESEMgYW5kIFNEWEMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1JFQURfTVVMVF9CTE9DSyAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkxOFUpICAvKiE8IENvbnRpbnVvdXNseSB0cmFuc2ZlcnMgZGF0YSBibG9ja3MgZnJvbSBjYXJkIHRvIGhvc3QgdW50aWwgaW50ZXJydXB0ZWQgYnkgCisjZGVmaW5lIFNETU1DX0NNRF9SRUFEX01VTFRfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMThVICAgLyohPCBDb250aW51b3VzbHkgdHJhbnNmZXJzIGRhdGEgYmxvY2tzIGZyb20gY2FyZCB0byBob3N0IHVudGlsIGludGVycnVwdGVkIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9QX1RSQU5TTUlTU0lPTiBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9IU19CVVNURVNUX1dSSVRFICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTlVKSAgLyohPCA2NCBieXRlcyB0dW5pbmcgcGF0dGVybiBpcyBzZW50IGZvciBTRFI1MCBhbmQgU0RSMTA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9XUklURV9EQVRfVU5USUxfU1RPUCAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMjBVKSAgLyohPCBTcGVlZCBjbGFzcyBjb250cm9sIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRVRfQkxPQ0tfQ09VTlQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMjNVKSAgLyohPCBTcGVjaWZ5IGJsb2NrIGNvdW50IGZvciBDTUQxOCBhbmQgQ01EMjUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9XUklURV9TSU5HTEVfQkxPQ0sgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMjRVKSAgLyohPCBXcml0ZXMgc2luZ2xlIGJsb2NrIG9mIHNpemUgc2VsZWN0ZWQgYnkgU0VUX0JMT0NLTEVOIGluIGNhc2Ugb2YgU0RTQywgYW5kIGEgYmxvY2sgb2YgCisjZGVmaW5lIFNETU1DX0NNRF9IU19CVVNURVNUX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTlVICAgLyohPCA2NCBieXRlcyB0dW5pbmcgcGF0dGVybiBpcyBzZW50IGZvciBTRFI1MCBhbmQgU0RSMTA0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9XUklURV9EQVRfVU5USUxfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMjBVICAgLyohPCBTcGVlZCBjbGFzcyBjb250cm9sIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9TRVRfQkxPQ0tfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjNVICAgLyohPCBTcGVjaWZ5IGJsb2NrIGNvdW50IGZvciBDTUQxOCBhbmQgQ01EMjUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9XUklURV9TSU5HTEVfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjRVICAgLyohPCBXcml0ZXMgc2luZ2xlIGJsb2NrIG9mIHNpemUgc2VsZWN0ZWQgYnkgU0VUX0JMT0NLTEVOIGluIGNhc2Ugb2YgU0RTQywgYW5kIGEgYmxvY2sgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIDUxMiBieXRlcyBpbiBjYXNlIG9mIFNESEMgYW5kIFNEWEMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1dSSVRFX01VTFRfQkxPQ0sgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyNVUpICAvKiE8IENvbnRpbnVvdXNseSB3cml0ZXMgYmxvY2tzIG9mIGRhdGEgdW50aWwgYSBTVE9QX1RSQU5TTUlTU0lPTiBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1BST0dfQ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyNlUpICAvKiE8IFJlc2VydmVkIGZvciBtYW51ZmFjdHVyZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1BST0dfQ1NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyN1UpICAvKiE8IFByb2dyYW1taW5nIG9mIHRoZSBwcm9ncmFtbWFibGUgYml0cyBvZiB0aGUgQ1NELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFVF9XUklURV9QUk9UICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyOFUpICAvKiE8IFNldHMgdGhlIHdyaXRlIHByb3RlY3Rpb24gYml0IG9mIHRoZSBhZGRyZXNzZWQgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0NMUl9XUklURV9QUk9UICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkyOVUpICAvKiE8IENsZWFycyB0aGUgd3JpdGUgcHJvdGVjdGlvbiBiaXQgb2YgdGhlIGFkZHJlc3NlZCBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NFTkRfV1JJVEVfUFJPVCAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkzMFUpICAvKiE8IEFza3MgdGhlIGNhcmQgdG8gc2VuZCB0aGUgc3RhdHVzIG9mIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9TVEFSVCAgICAgICAgICAgICAgICAgICgodWludDhfdCkzMlUpICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdyaXRlIGJsb2NrIHRvIGJlIGVyYXNlZC4gKEZvciBTRCBjYXJkIG9ubHkpLiAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9FTkQgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkzM1UpICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3Qgd3JpdGUgYmxvY2sgb2YgdGhlIGNvbnRpbnVvdXMgcmFuZ2UgdG8gYmUgZXJhc2VkLiAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0VSQVNFX0dSUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkzNVUpICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdyaXRlIGJsb2NrIHRvIGJlIGVyYXNlZC4gUmVzZXJ2ZWQgZm9yIGVhY2ggY29tbWFuZCAKKyNkZWZpbmUgU0RNTUNfQ01EX1dSSVRFX01VTFRfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNVUgICAvKiE8IENvbnRpbnVvdXNseSB3cml0ZXMgYmxvY2tzIG9mIGRhdGEgdW50aWwgYSBTVE9QX1RSQU5TTUlTU0lPTiBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1BST0dfQ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNlUgICAvKiE8IFJlc2VydmVkIGZvciBtYW51ZmFjdHVyZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1BST0dfQ1NEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyN1UgICAvKiE8IFByb2dyYW1taW5nIG9mIHRoZSBwcm9ncmFtbWFibGUgYml0cyBvZiB0aGUgQ1NELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NFVF9XUklURV9QUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOFUgICAvKiE8IFNldHMgdGhlIHdyaXRlIHByb3RlY3Rpb24gYml0IG9mIHRoZSBhZGRyZXNzZWQgZ3JvdXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0NMUl9XUklURV9QUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOVUgICAvKiE8IENsZWFycyB0aGUgd3JpdGUgcHJvdGVjdGlvbiBiaXQgb2YgdGhlIGFkZHJlc3NlZCBncm91cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NFTkRfV1JJVEVfUFJPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMFUgICAvKiE8IEFza3MgdGhlIGNhcmQgdG8gc2VuZCB0aGUgc3RhdHVzIG9mIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMlUgICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdyaXRlIGJsb2NrIHRvIGJlIGVyYXNlZC4gKEZvciBTRCBjYXJkIG9ubHkpLiAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzM1UgICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3Qgd3JpdGUgYmxvY2sgb2YgdGhlIGNvbnRpbnVvdXMgcmFuZ2UgdG8gYmUgZXJhc2VkLiAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0VSQVNFX0dSUF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNVUgICAvKiE8IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdyaXRlIGJsb2NrIHRvIGJlIGVyYXNlZC4gUmVzZXJ2ZWQgZm9yIGVhY2ggY29tbWFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIHNldCBieSBzd2l0Y2ggZnVuY3Rpb24gY29tbWFuZCAoQ01ENikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19DTURfRVJBU0VfR1JQX0VORCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTM2VSkgIC8qITwgU2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCB3cml0ZSBibG9jayBvZiB0aGUgY29udGludW91cyByYW5nZSB0byBiZSBlcmFzZWQuIAorI2RlZmluZSBTRE1NQ19DTURfRVJBU0VfR1JQX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2VSAgIC8qITwgU2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCB3cml0ZSBibG9jayBvZiB0aGUgY29udGludW91cyByYW5nZSB0byBiZSBlcmFzZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBmb3IgZWFjaCBjb21tYW5kIHN5c3RlbSBzZXQgYnkgc3dpdGNoIGZ1bmN0aW9uIGNvbW1hbmQgKENNRDYpLiAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMzhVKSAgLyohPCBSZXNlcnZlZCBmb3IgU0Qgc2VjdXJpdHkgYXBwbGljYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9GQVNUX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMzlVKSAgLyohPCBTRCBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBpdCAoUmVzZXJ2ZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9HT19JUlFfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNDBVKSAgLyohPCBTRCBjYXJkIGRvZXNuJ3Qgc3VwcG9ydCBpdCAoUmVzZXJ2ZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9MT0NLX1VOTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNDJVKSAgLyohPCBTZXRzL3Jlc2V0cyB0aGUgcGFzc3dvcmQgb3IgbG9jay91bmxvY2sgdGhlIGNhcmQuIFRoZSBzaXplIG9mIHRoZSBkYXRhIGJsb2NrIGlzIHNldCBieSAKKyNkZWZpbmUgU0RNTUNfQ01EX0VSQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOFUgICAvKiE8IFJlc2VydmVkIGZvciBTRCBzZWN1cml0eSBhcHBsaWNhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0ZBU1RfSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOVUgICAvKiE8IFNEIGNhcmQgZG9lc24ndCBzdXBwb3J0IGl0IChSZXNlcnZlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0dPX0lSUV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MFUgICAvKiE8IFNEIGNhcmQgZG9lc24ndCBzdXBwb3J0IGl0IChSZXNlcnZlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfQ01EX0xPQ0tfVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MlUgICAvKiE8IFNldHMvcmVzZXRzIHRoZSBwYXNzd29yZCBvciBsb2NrL3VubG9jayB0aGUgY2FyZC4gVGhlIHNpemUgb2YgdGhlIGRhdGEgYmxvY2sgaXMgc2V0IGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgU0VUX0JMT0NLX0xFTiBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9BUFBfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNTVVKSAgLyohPCBJbmRpY2F0ZXMgdG8gdGhlIGNhcmQgdGhhdCB0aGUgbmV4dCBjb21tYW5kIGlzIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIGNvbW1hbmQgcmF0aGVyIAorI2RlZmluZSBTRE1NQ19DTURfQVBQX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1VSAgIC8qITwgSW5kaWNhdGVzIHRvIHRoZSBjYXJkIHRoYXQgdGhlIG5leHQgY29tbWFuZCBpcyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb21tYW5kIHJhdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBhIHN0YW5kYXJkIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19DTURfR0VOX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTU2VSkgIC8qITwgVXNlZCBlaXRoZXIgdG8gdHJhbnNmZXIgYSBkYXRhIGJsb2NrIHRvIHRoZSBjYXJkIG9yIHRvIGdldCBhIGRhdGEgYmxvY2sgZnJvbSB0aGUgY2FyZCAKKyNkZWZpbmUgU0RNTUNfQ01EX0dFTl9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NlUgICAvKiE8IFVzZWQgZWl0aGVyIHRvIHRyYW5zZmVyIGEgZGF0YSBibG9jayB0byB0aGUgY2FyZCBvciB0byBnZXQgYSBkYXRhIGJsb2NrIGZyb20gdGhlIGNhcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZW5lcmFsIHB1cnBvc2UvYXBwbGljYXRpb24gc3BlY2lmaWMgY29tbWFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX05PX0NNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCk2NFUpICAvKiE8IE5vIGNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisjZGVmaW5lIFNETU1DX0NNRF9OT19DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjRVICAgLyohPCBObyBjb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIC8qKiAKICAgKiBAYnJpZWYgRm9sbG93aW5nIGNvbW1hbmRzIGFyZSBTRCBDYXJkIFNwZWNpZmljIGNvbW1hbmRzLgogICAqICAgICAgICBTRE1NQ19BUFBfQ01EIHNob3VsZCBiZSBzZW50IGJlZm9yZSBzZW5kaW5nIHRoZXNlIGNvbW1hbmRzLiAKICAgKi8KLSNkZWZpbmUgU0RNTUNfQ01EX0FQUF9TRF9TRVRfQlVTV0lEVEggICAgICAgICAgICAgICAgICgodWludDhfdCk2VSkgICAvKiE8IChBQ01ENikgRGVmaW5lcyB0aGUgZGF0YSBidXMgd2lkdGggdG8gYmUgdXNlZCBmb3IgZGF0YSB0cmFuc2Zlci4gVGhlIGFsbG93ZWQgZGF0YSBidXMgCisjZGVmaW5lIFNETU1DX0NNRF9BUFBfU0RfU0VUX0JVU1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgNlUgICAgLyohPCAoQUNNRDYpIERlZmluZXMgdGhlIGRhdGEgYnVzIHdpZHRoIHRvIGJlIHVzZWQgZm9yIGRhdGEgdHJhbnNmZXIuIFRoZSBhbGxvd2VkIGRhdGEgYnVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIGFyZSBnaXZlbiBpbiBTQ1IgcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpMTNVKSAgLyohPCAoQUNNRDEzKSBTZW5kcyB0aGUgU0Qgc3RhdHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VORF9OVU1fV1JJVEVfQkxPQ0tTICAgICAgICAoKHVpbnQ4X3QpMjJVKSAgLyohPCAoQUNNRDIyKSBTZW5kcyB0aGUgbnVtYmVyIG9mIHRoZSB3cml0dGVuICh3aXRob3V0IGVycm9ycykgd3JpdGUgYmxvY2tzLiBSZXNwb25kcyB3aXRoIAorI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzVSAgIC8qITwgKEFDTUQxMykgU2VuZHMgdGhlIFNEIHN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX1NFTkRfTlVNX1dSSVRFX0JMT0NLUyAgICAgICAgICAgICAgICAgIDIyVSAgIC8qITwgKEFDTUQyMikgU2VuZHMgdGhlIG51bWJlciBvZiB0aGUgd3JpdHRlbiAod2l0aG91dCBlcnJvcnMpIHdyaXRlIGJsb2Nrcy4gUmVzcG9uZHMgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzJiaXQrQ1JDIGRhdGEgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX09QX0NPTkQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTQxVSkgIC8qITwgKEFDTUQ0MSkgU2VuZHMgaG9zdCBjYXBhY2l0eSBzdXBwb3J0IGluZm9ybWF0aW9uIChIQ1MpIGFuZCBhc2tzIHRoZSBhY2Nlc3NlZCBjYXJkIHRvIAorI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX09QX0NPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxVSAgIC8qITwgKEFDTUQ0MSkgU2VuZHMgaG9zdCBjYXBhY2l0eSBzdXBwb3J0IGluZm9ybWF0aW9uIChIQ1MpIGFuZCBhc2tzIHRoZSBhY2Nlc3NlZCBjYXJkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kIGl0cyBvcGVyYXRpbmcgY29uZGl0aW9uIHJlZ2lzdGVyIChPQ1IpIGNvbnRlbnQgaW4gdGhlIHJlc3BvbnNlIG9uIHRoZSBDTUQgbGluZS4gICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VUX0NMUl9DQVJEX0RFVEVDVCAgICAgICAgICAoKHVpbnQ4X3QpNDJVKSAgLyohPCAoQUNNRDQyKSBDb25uZWN0L0Rpc2Nvbm5lY3QgdGhlIDUwIEtPaG0gcHVsbC11cCByZXNpc3RvciBvbiBDRC9EQVQzIChwaW4gMSkgb2YgdGhlIGNhcmQgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VORF9TQ1IgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNTFVKSAgLyohPCBSZWFkcyB0aGUgU0QgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0NSKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRE1NQ19SV19ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNTJVKSAgLyohPCBGb3IgU0QgSS9PIGNhcmQgb25seSwgcmVzZXJ2ZWQgZm9yIHNlY3VyaXR5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRE1NQ19SV19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNTNVKSAgLyohPCBGb3IgU0QgSS9PIGNhcmQgb25seSwgcmVzZXJ2ZWQgZm9yIHNlY3VyaXR5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VUX0NMUl9DQVJEX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgNDJVICAgLyohPCAoQUNNRDQyKSBDb25uZWN0L0Rpc2Nvbm5lY3QgdGhlIDUwIEtPaG0gcHVsbC11cCByZXNpc3RvciBvbiBDRC9EQVQzIChwaW4gMSkgb2YgdGhlIGNhcmQgICovCisjZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VORF9TQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTFVICAgLyohPCBSZWFkcyB0aGUgU0QgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0NSKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9TRE1NQ19SV19ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTJVICAgLyohPCBGb3IgU0QgSS9PIGNhcmQgb25seSwgcmVzZXJ2ZWQgZm9yIHNlY3VyaXR5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNETU1DX0NNRF9TRE1NQ19SV19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTNVICAgLyohPCBGb3IgU0QgSS9PIGNhcmQgb25seSwgcmVzZXJ2ZWQgZm9yIHNlY3VyaXR5IHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIC8qKiAKICAgKiBAYnJpZWYgRm9sbG93aW5nIGNvbW1hbmRzIGFyZSBTRCBDYXJkIFNwZWNpZmljIHNlY3VyaXR5IGNvbW1hbmRzLgogICAqICAgICAgICBTRE1NQ19DTURfQVBQX0NNRCBzaG91bGQgYmUgc2VudCBiZWZvcmUgc2VuZGluZyB0aGVzZSBjb21tYW5kcy4gCiAgICovCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfR0VUX01LQiAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNDNVKQotI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX0dFVF9NSUQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KTQ0VSkKLSNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRVRfQ0VSX1JOMSAgICAgICAgICAgICAgICAgICgodWludDhfdCk0NVUpCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfR0VUX0NFUl9STjIgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpNDZVKQotI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX1NFVF9DRVJfUkVTMiAgICAgICAgICAgICAgICAgKCh1aW50OF90KTQ3VSkKLSNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9HRVRfQ0VSX1JFUzEgICAgICAgICAgICAgICAgICgodWludDhfdCk0OFUpCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfU0VDVVJFX1JFQURfTVVMVElQTEVfQkxPQ0sgICAoKHVpbnQ4X3QpMThVKQotI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX1NFQ1VSRV9XUklURV9NVUxUSVBMRV9CTE9DSyAgKCh1aW50OF90KTI1VSkKLSNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRUNVUkVfRVJBU0UgICAgICAgICAgICAgICAgICgodWludDhfdCkzOFUpCi0jZGVmaW5lIFNETU1DX0NNRF9TRF9BUFBfQ0hBTkdFX1NFQ1VSRV9BUkVBICAgICAgICAgICAoKHVpbnQ4X3QpNDlVKQotI2RlZmluZSBTRE1NQ19DTURfU0RfQVBQX1NFQ1VSRV9XUklURV9NS0IgICAgICAgICAgICAgKCh1aW50OF90KTQ4VSkKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9HRVRfTUtCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0M1UKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9HRVRfTUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NFUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRVRfQ0VSX1JOMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NVUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9HRVRfQ0VSX1JOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NlUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRVRfQ0VSX1JFUzIgICAgICAgICAgICAgICAgICAgICAgICAgICA0N1UKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9HRVRfQ0VSX1JFUzEgICAgICAgICAgICAgICAgICAgICAgICAgICA0OFUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRUNVUkVfUkVBRF9NVUxUSVBMRV9CTE9DSyAgICAgICAgICAgICAxOFUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRUNVUkVfV1JJVEVfTVVMVElQTEVfQkxPQ0sgICAgICAgICAgICAyNVUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRUNVUkVfRVJBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAzOFUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9DSEFOR0VfU0VDVVJFX0FSRUEgICAgICAgICAgICAgICAgICAgICA0OVUKKyNkZWZpbmUgU0RNTUNfQ01EX1NEX0FQUF9TRUNVUkVfV1JJVEVfTUtCICAgICAgICAgICAgICAgICAgICAgICA0OFUKIAogLyoqIAogICAqIEBicmllZiAgTWFza3MgZm9yIGVycm9ycyBDYXJkIFN0YXR1cyBSMSAoT0NSIFJlZ2lzdGVyKSAKICAgKi8KLSNkZWZpbmUgU0RNTUNfT0NSX0FERFJfT1VUX09GX1JBTkdFICAgICAgICAoKHVpbnQzMl90KTB4ODAwMDAwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfQUREUl9NSVNBTElHTkVEICAgICAgICAgICgodWludDMyX3QpMHg0MDAwMDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9CTE9DS19MRU5fRVJSICAgICAgICAgICAgKCh1aW50MzJfdCkweDIwMDAwMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX0VSQVNFX1NFUV9FUlIgICAgICAgICAgICAoKHVpbnQzMl90KTB4MTAwMDAwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfQkFEX0VSQVNFX1BBUkFNICAgICAgICAgICgodWludDMyX3QpMHgwODAwMDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9XUklURV9QUk9UX1ZJT0xBVElPTiAgICAgKCh1aW50MzJfdCkweDA0MDAwMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX0xPQ0tfVU5MT0NLX0ZBSUxFRCAgICAgICAoKHVpbnQzMl90KTB4MDEwMDAwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfQ09NX0NSQ19GQUlMRUQgICAgICAgICAgICgodWludDMyX3QpMHgwMDgwMDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9JTExFR0FMX0NNRCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwNDAwMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX0NBUkRfRUNDX0ZBSUxFRCAgICAgICAgICAoKHVpbnQzMl90KTB4MDAyMDAwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfQ0NfRVJST1IgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDEwMDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9HRU5FUkFMX1VOS05PV05fRVJST1IgICAgKCh1aW50MzJfdCkweDAwMDgwMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX1NUUkVBTV9SRUFEX1VOREVSUlVOICAgICAoKHVpbnQzMl90KTB4MDAwNDAwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfU1RSRUFNX1dSSVRFX09WRVJSVU4gICAgICgodWludDMyX3QpMHgwMDAyMDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9DSURfQ1NEX09WRVJXUklURSAgICAgICAgKCh1aW50MzJfdCkweDAwMDEwMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX1dQX0VSQVNFX1NLSVAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKQotI2RlZmluZSBTRE1NQ19PQ1JfQ0FSRF9FQ0NfRElTQUJMRUQgICAgICAgICgodWludDMyX3QpMHgwMDAwNDAwMFUpCi0jZGVmaW5lIFNETU1DX09DUl9FUkFTRV9SRVNFVCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAyMDAwVSkKLSNkZWZpbmUgU0RNTUNfT0NSX0FLRV9TRVFfRVJST1IgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDhVKQotI2RlZmluZSBTRE1NQ19PQ1JfRVJST1JCSVRTICAgICAgICAgICAgICAgICgodWludDMyX3QpMHhGREZGRTAwOFUpCisjZGVmaW5lIFNETU1DX09DUl9BRERSX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfQUREUl9NSVNBTElHTkVEICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX0JMT0NLX0xFTl9FUlIgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDBVCisjZGVmaW5lIFNETU1DX09DUl9FUkFTRV9TRVFfRVJSICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfQkFEX0VSQVNFX1BBUkFNICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX1dSSVRFX1BST1RfVklPTEFUSU9OICAgICAgICAgICAgICAgIDB4MDQwMDAwMDBVCisjZGVmaW5lIFNETU1DX09DUl9MT0NLX1VOTE9DS19GQUlMRUQgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfQ09NX0NSQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX0lMTEVHQUxfQ01EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDBVCisjZGVmaW5lIFNETU1DX09DUl9DQVJEX0VDQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfQ0NfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX0dFTkVSQUxfVU5LTk9XTl9FUlJPUiAgICAgICAgICAgICAgIDB4MDAwODAwMDBVCisjZGVmaW5lIFNETU1DX09DUl9TVFJFQU1fUkVBRF9VTkRFUlJVTiAgICAgICAgICAgICAgICAweDAwMDQwMDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfU1RSRUFNX1dSSVRFX09WRVJSVU4gICAgICAgICAgICAgICAgMHgwMDAyMDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX0NJRF9DU0RfT1ZFUldSSVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBVCisjZGVmaW5lIFNETU1DX09DUl9XUF9FUkFTRV9TS0lQICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVQorI2RlZmluZSBTRE1NQ19PQ1JfQ0FSRF9FQ0NfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMFUKKyNkZWZpbmUgU0RNTUNfT0NSX0VSQVNFX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBVCisjZGVmaW5lIFNETU1DX09DUl9BS0VfU0VRX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4VQorI2RlZmluZSBTRE1NQ19PQ1JfRVJST1JCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGREZGRTAwOFUKIAogLyoqIAogICAqIEBicmllZiAgTWFza3MgZm9yIFI2IFJlc3BvbnNlIAogICAqLwotI2RlZmluZSBTRE1NQ19SNl9HRU5FUkFMX1VOS05PV05fRVJST1IgICAgICgodWludDMyX3QpMHgwMDAwMjAwMFUpCi0jZGVmaW5lIFNETU1DX1I2X0lMTEVHQUxfQ01EICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDA0MDAwVSkKLSNkZWZpbmUgU0RNTUNfUjZfQ09NX0NSQ19GQUlMRUQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDgwMDBVKQorI2RlZmluZSBTRE1NQ19SNl9HRU5FUkFMX1VOS05PV05fRVJST1IgICAgICAgICAgICAgICAgMHgwMDAwMjAwMFUKKyNkZWZpbmUgU0RNTUNfUjZfSUxMRUdBTF9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDBVCisjZGVmaW5lIFNETU1DX1I2X0NPTV9DUkNfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwVQogCi0jZGVmaW5lIFNETU1DX1ZPTFRBR0VfV0lORE9XX1NEICAgICAgICAgICAgKCh1aW50MzJfdCkweDgwMTAwMDAwVSkKLSNkZWZpbmUgU0RNTUNfSElHSF9DQVBBQ0lUWSAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4NDAwMDAwMDBVKQotI2RlZmluZSBTRE1NQ19TVERfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lIFNETU1DX0NIRUNLX1BBVFRFUk4gICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMUFBVSkKKyNkZWZpbmUgU0RNTUNfVk9MVEFHRV9XSU5ET1dfU0QgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMDAwMDBVCisjZGVmaW5lIFNETU1DX0hJR0hfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwVQorI2RlZmluZSBTRE1NQ19TVERfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKKyNkZWZpbmUgU0RNTUNfQ0hFQ0tfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxQUFVCisjZGVmaW5lIFNEX1NXSVRDSF8xXzhWX0NBUEFDSVRZICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwVQogCi0jZGVmaW5lIFNETU1DX01BWF9WT0xUX1RSSUFMICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBGRkZGVSkKKyNkZWZpbmUgU0RNTUNfTUFYX1ZPTFRfVFJJQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZVCiAKLSNkZWZpbmUgU0RNTUNfTUFYX1RSSUFMICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMEZGRkZVKQorI2RlZmluZSBTRE1NQ19NQVhfVFJJQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRlUKIAotI2RlZmluZSBTRE1NQ19BTExaRVJPICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNETU1DX0FMTFpFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogCi0jZGVmaW5lIFNETU1DX1dJREVfQlVTX1NVUFBPUlQgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDQwMDAwVSkKLSNkZWZpbmUgU0RNTUNfU0lOR0xFX0JVU19TVVBQT1JUICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMTAwMDBVKQotI2RlZmluZSBTRE1NQ19DQVJEX0xPQ0tFRCAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMjAwMDAwMFUpCisjZGVmaW5lIFNETU1DX1dJREVfQlVTX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwVQorI2RlZmluZSBTRE1NQ19TSU5HTEVfQlVTX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMFUKKyNkZWZpbmUgU0RNTUNfQ0FSRF9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVCiAKLSNkZWZpbmUgU0RNTUNfREFUQVRJTUVPVVQgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkZGRkZVKQorI2RlZmluZSBTRE1NQ19EQVRBVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRlUKIAotI2RlZmluZSBTRE1NQ18wVE83QklUUyAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDBGRlUpCi0jZGVmaW5lIFNETU1DXzhUTzE1QklUUyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDBGRjAwVSkKLSNkZWZpbmUgU0RNTUNfMTZUTzIzQklUUyAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDBGRjAwMDBVKQotI2RlZmluZSBTRE1NQ18yNFRPMzFCSVRTICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHhGRjAwMDAwMFUpCi0jZGVmaW5lIFNETU1DX01BWF9EQVRBX0xFTkdUSCAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAxRkZGRkZGVSkKKyNkZWZpbmUgU0RNTUNfMFRPN0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZVCisjZGVmaW5lIFNETU1DXzhUTzE1QklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwVQorI2RlZmluZSBTRE1NQ18xNlRPMjNCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMFUKKyNkZWZpbmUgU0RNTUNfMjRUTzMxQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDBVCisjZGVmaW5lIFNETU1DX01BWF9EQVRBX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxRkZGRkZGVQogCi0jZGVmaW5lIFNETU1DX0hBTEZGSUZPICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkKLSNkZWZpbmUgU0RNTUNfSEFMRkZJRk9CWVRFUyAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMjBVKQorI2RlZmluZSBTRE1NQ19IQUxGRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUKKyNkZWZpbmUgU0RNTUNfSEFMRkZJRk9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBVCiAKIC8qKiAKICAgKiBAYnJpZWYgIENvbW1hbmQgQ2xhc3Mgc3VwcG9ydGVkCiAgICovCi0jZGVmaW5lIFNETU1DX0NDQ0NfRVJBU0UgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDIwVSkKKyNkZWZpbmUgU0RNTUNfQ0NDQ19FUkFTRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFUKIAotI2RlZmluZSBTRE1NQ19DTURUSU1FT1VUICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpNTAwMFUpICAgICAgICAvKiBDb21tYW5kIHNlbmQgYW5kIHJlc3BvbnNlIHRpbWVvdXQgKi8KLSNkZWZpbmUgU0RNTUNfTUFYRVJBU0VUSU1FT1VUICAgICAgICAgICAgICAoKHVpbnQzMl90KTYzMDAwVSkgICAgICAgLyogTWF4IGVyYXNlIFRpbWVvdXQgNjMgcyAgICAgICAgICAgICovCi0KKyNkZWZpbmUgU0RNTUNfQ01EVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgNTAwMFUgICAgICAgICAvKiBDb21tYW5kIHNlbmQgYW5kIHJlc3BvbnNlIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0RNTUNfTUFYRVJBU0VUSU1FT1VUICAgICAgICAgICAgICAgICAgNjMwMDBVICAgICAgICAvKiBNYXggZXJhc2UgVGltZW91dCA2MyBzICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0RNTUNfU1RPUFRSQU5TRkVSVElNRU9VVCAgICAgICAgICAgICAgMTAwMDAwMDAwVSAgICAvKiBUaW1lb3V0IGZvciBTVE9QIFRSQU5TTUlTU0lPTiBjb21tYW5kICovCiAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfQ2xvY2tfRWRnZSBDbG9jayBFZGdlCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfQ0xPQ0tfRURHRV9SSVNJTkcgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTRE1NQ19DTE9DS19FREdFX1JJU0lORyAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCiAjZGVmaW5lIFNETU1DX0NMT0NLX0VER0VfRkFMTElORyAgICAgICAgICAgICAgU0RNTUNfQ0xLQ1JfTkVHRURHRQogCiAjZGVmaW5lIElTX1NETU1DX0NMT0NLX0VER0UoRURHRSkgKCgoRURHRSkgPT0gU0RNTUNfQ0xPQ0tfRURHRV9SSVNJTkcpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBTRE1NQ19DTE9DS19FREdFX0ZBTExJTkcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFREdFKSA9PSBTRE1NQ19DTE9DS19FREdFX0ZBTExJTkcpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTMzMywxMSArMzM2LDExIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX0Nsb2NrX0J5cGFzcyBDbG9jayBCeXBhc3MKICAgKiBAewogICAqLwotI2RlZmluZSBTRE1NQ19DTE9DS19CWVBBU1NfRElTQUJMRSAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTRE1NQ19DTE9DS19CWVBBU1NfRElTQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19DTE9DS19CWVBBU1NfRU5BQkxFICAgICAgICAgICAgICBTRE1NQ19DTEtDUl9CWVBBU1MgICAKIAogI2RlZmluZSBJU19TRE1NQ19DTE9DS19CWVBBU1MoQllQQVNTKSAoKChCWVBBU1MpID09IFNETU1DX0NMT0NLX0JZUEFTU19ESVNBQkxFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJZUEFTUykgPT0gU0RNTUNfQ0xPQ0tfQllQQVNTX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCWVBBU1MpID09IFNETU1DX0NMT0NLX0JZUEFTU19FTkFCTEUpKQogLyoqCiAgICogQH0KICAgKi8gCkBAIC0zNDUsMTEgKzM0OCwxMSBAQAogLyoqIEBkZWZncm91cCBTRE1NQ19MTF9DbG9ja19Qb3dlcl9TYXZlIENsb2NrIFBvd2VyIFNhdmluZwogICAqIEB7CiAgICovCi0jZGVmaW5lIFNETU1DX0NMT0NLX1BPV0VSX1NBVkVfRElTQUJMRSAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNETU1DX0NMT0NLX1BPV0VSX1NBVkVfRElTQUJMRSAgICAgICAgIDB4MDAwMDAwMDBVCiAjZGVmaW5lIFNETU1DX0NMT0NLX1BPV0VSX1NBVkVfRU5BQkxFICAgICAgICAgIFNETU1DX0NMS0NSX1BXUlNBVgogCiAjZGVmaW5lIElTX1NETU1DX0NMT0NLX1BPV0VSX1NBVkUoU0FWRSkgKCgoU0FWRSkgPT0gU0RNTUNfQ0xPQ0tfUE9XRVJfU0FWRV9ESVNBQkxFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0FWRSkgPT0gU0RNTUNfQ0xPQ0tfUE9XRVJfU0FWRV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTQVZFKSA9PSBTRE1NQ19DTE9DS19QT1dFUl9TQVZFX0VOQUJMRSkpCiAvKioKICAgKiBAfQogICAqLwpAQCAtMzU3LDEzICszNjAsMTMgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfQnVzX1dpZGUgQnVzIFdpZHRoCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfQlVTX1dJREVfMUIgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgU0RNTUNfQlVTX1dJREVfMUIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKICNkZWZpbmUgU0RNTUNfQlVTX1dJREVfNEIgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfQ0xLQ1JfV0lEQlVTXzAKICNkZWZpbmUgU0RNTUNfQlVTX1dJREVfOEIgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfQ0xLQ1JfV0lEQlVTXzEKIAogI2RlZmluZSBJU19TRE1NQ19CVVNfV0lERShXSURFKSAoKChXSURFKSA9PSBTRE1NQ19CVVNfV0lERV8xQikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSURFKSA9PSBTRE1NQ19CVVNfV0lERV80QikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSURFKSA9PSBTRE1NQ19CVVNfV0lERV84QikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXSURFKSA9PSBTRE1NQ19CVVNfV0lERV80QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0lERSkgPT0gU0RNTUNfQlVTX1dJREVfOEIpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTM3MSwxMSArMzc0LDExIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX0hhcmR3YXJlX0Zsb3dfQ29udHJvbCBIYXJkd2FyZSBGbG93IENvbnRyb2wKICAgKiBAewogICAqLwotI2RlZmluZSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRElTQUJMRSAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRElTQUJMRSAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRU5BQkxFICAgICBTRE1NQ19DTEtDUl9IV0ZDX0VOCiAKICNkZWZpbmUgSVNfU0RNTUNfSEFSRFdBUkVfRkxPV19DT05UUk9MKENPTlRST0wpICgoKENPTlRST0wpID09IFNETU1DX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTF9ESVNBQkxFKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05UUk9MKSA9PSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRU5BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDT05UUk9MKSA9PSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRU5BQkxFKSkKIC8qKgogICAqIEB9CiAgICovCkBAIC0zODMsNyArMzg2LDcgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfQ2xvY2tfRGl2aXNpb24gQ2xvY2sgRGl2aXNpb24KICAgKiBAewogICAqLwotI2RlZmluZSBJU19TRE1NQ19DTEtESVYoRElWKSAgICgoRElWKSA8PSAweEZGKQorI2RlZmluZSBJU19TRE1NQ19DTEtESVYoRElWKSAgICgoRElWKSA8PSAweEZGVSkKIC8qKgogICAqIEB9CiAgICovICAKQEAgLTM5MSw3ICszOTQsNyBAQAogLyoqIEBkZWZncm91cCBTRE1NQ19MTF9Db21tYW5kX0luZGV4IENvbW1hbmQgSW5kZXgKICAgKiBAewogICAqLwotI2RlZmluZSBJU19TRE1NQ19DTURfSU5ERVgoSU5ERVgpICAgICAgICAgICAgKChJTkRFWCkgPCAweDQwKQorI2RlZmluZSBJU19TRE1NQ19DTURfSU5ERVgoSU5ERVgpICAgICAgICAgICAgKChJTkRFWCkgPCAweDQwVSkKIC8qKgogICAqIEB9CiAgICovCkBAIC0zOTksMTMgKzQwMiwxMyBAQAogLyoqIEBkZWZncm91cCBTRE1NQ19MTF9SZXNwb25zZV9UeXBlIFJlc3BvbnNlIFR5cGUKICAgKiBAewogICAqLwotI2RlZmluZSBTRE1NQ19SRVNQT05TRV9OTyAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgU0RNTUNfUkVTUE9OU0VfTk8gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCiAjZGVmaW5lIFNETU1DX1JFU1BPTlNFX1NIT1JUICAgICAgICAgICAgICAgICBTRE1NQ19DTURfV0FJVFJFU1BfMAogI2RlZmluZSBTRE1NQ19SRVNQT05TRV9MT05HICAgICAgICAgICAgICAgICAgU0RNTUNfQ01EX1dBSVRSRVNQCiAKICNkZWZpbmUgSVNfU0RNTUNfUkVTUE9OU0UoUkVTUE9OU0UpICgoKFJFU1BPTlNFKSA9PSBTRE1NQ19SRVNQT05TRV9OTykgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUE9OU0UpID09IFNETU1DX1JFU1BPTlNFX1NIT1JUKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNQT05TRSkgPT0gU0RNTUNfUkVTUE9OU0VfTE9ORykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUE9OU0UpID09IFNETU1DX1JFU1BPTlNFX1NIT1JUKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUE9OU0UpID09IFNETU1DX1JFU1BPTlNFX0xPTkcpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTQxMywxMyArNDE2LDEzIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX1dhaXRfSW50ZXJydXB0X1N0YXRlIFdhaXQgSW50ZXJydXB0CiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfV0FJVF9OTyAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNETU1DX1dBSVRfTk8gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19XQUlUX0lUICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfQ01EX1dBSVRJTlQgCiAjZGVmaW5lIFNETU1DX1dBSVRfUEVORCAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19DTURfV0FJVFBFTkQKIAogI2RlZmluZSBJU19TRE1NQ19XQUlUKFdBSVQpICgoKFdBSVQpID09IFNETU1DX1dBSVRfTk8pIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQUlUKSA9PSBTRE1NQ19XQUlUX0lUKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FJVCkgPT0gU0RNTUNfV0FJVF9QRU5EKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoV0FJVCkgPT0gU0RNTUNfV0FJVF9JVCkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChXQUlUKSA9PSBTRE1NQ19XQUlUX1BFTkQpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTQyNywxMSArNDMwLDExIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX0NQU01fU3RhdGUgQ1BTTSBTdGF0ZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFNETU1DX0NQU01fRElTQUJMRSAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTRE1NQ19DUFNNX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKICNkZWZpbmUgU0RNTUNfQ1BTTV9FTkFCTEUgICAgICAgICAgICAgICAgICAgIFNETU1DX0NNRF9DUFNNRU4KIAogI2RlZmluZSBJU19TRE1NQ19DUFNNKENQU00pICgoKENQU00pID09IFNETU1DX0NQU01fRElTQUJMRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQU00pID09IFNETU1DX0NQU01fRU5BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1BTTSkgPT0gU0RNTUNfQ1BTTV9FTkFCTEUpKQogLyoqCiAgICogQH0KICAgKi8gIApAQCAtNDM5LDE1ICs0NDIsMTUgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfUmVzcG9uc2VfUmVnaXN0ZXJzIFJlc3BvbnNlIFJlZ2lzdGVyCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfUkVTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCi0jZGVmaW5lIFNETU1DX1JFU1AyICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDRVKQotI2RlZmluZSBTRE1NQ19SRVNQMyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDA4VSkKLSNkZWZpbmUgU0RNTUNfUkVTUDQgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwQykKKyNkZWZpbmUgU0RNTUNfUkVTUDEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNETU1DX1JFU1AyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQorI2RlZmluZSBTRE1NQ19SRVNQMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOFUKKyNkZWZpbmUgU0RNTUNfUkVTUDQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENVCiAKICNkZWZpbmUgSVNfU0RNTUNfUkVTUChSRVNQKSAoKChSRVNQKSA9PSBTRE1NQ19SRVNQMSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU1ApID09IFNETU1DX1JFU1AyKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUkVTUCkgPT0gU0RNTUNfUkVTUDMpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSRVNQKSA9PSBTRE1NQ19SRVNQNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU1ApID09IFNETU1DX1JFU1AyKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU1ApID09IFNETU1DX1JFU1AzKSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFJFU1ApID09IFNETU1DX1JFU1A0KSkKIC8qKgogICAqIEB9CiAgICovCkBAIC00NTUsNyArNDU4LDcgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfRGF0YV9MZW5ndGggRGF0YSBMZW5naHQKICAgKiBAewogICAqLwotI2RlZmluZSBJU19TRE1NQ19EQVRBX0xFTkdUSChMRU5HVEgpICgoTEVOR1RIKSA8PSAweDAxRkZGRkZGKQorI2RlZmluZSBJU19TRE1NQ19EQVRBX0xFTkdUSChMRU5HVEgpICgoTEVOR1RIKSA8PSAweDAxRkZGRkZGVSkKIC8qKgogICAqIEB9CiAgICovCkBAIC00NjMsNyArNDY2LDcgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfRGF0YV9CbG9ja19TaXplICBEYXRhIEJsb2NrIFNpemUKICAgKiBAewogICAqLwotI2RlZmluZSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xQiAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwMFUpCisjZGVmaW5lIFNETU1DX0RBVEFCTE9DS19TSVpFXzFCICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUKICNkZWZpbmUgU0RNTUNfREFUQUJMT0NLX1NJWkVfMkIgICAgICAgICAgICAgICBTRE1NQ19EQ1RSTF9EQkxPQ0tTSVpFXzAKICNkZWZpbmUgU0RNTUNfREFUQUJMT0NLX1NJWkVfNEIgICAgICAgICAgICAgICBTRE1NQ19EQ1RSTF9EQkxPQ0tTSVpFXzEKICNkZWZpbmUgU0RNTUNfREFUQUJMT0NLX1NJWkVfOEIgICAgICAgICAgICAgICAoU0RNTUNfRENUUkxfREJMT0NLU0laRV8wfFNETU1DX0RDVFJMX0RCTE9DS1NJWkVfMSkKQEAgLTQ4MCwyMCArNDgzLDIwIEBACiAjZGVmaW5lIFNETU1DX0RBVEFCTE9DS19TSVpFXzE2Mzg0QiAgICAgICAgICAgKFNETU1DX0RDVFJMX0RCTE9DS1NJWkVfMXxTRE1NQ19EQ1RSTF9EQkxPQ0tTSVpFXzJ8U0RNTUNfRENUUkxfREJMT0NLU0laRV8zKQogCiAjZGVmaW5lIElTX1NETU1DX0JMT0NLX1NJWkUoU0laRSkgKCgoU0laRSkgPT0gU0RNTUNfREFUQUJMT0NLX1NJWkVfMUIpICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8yQikgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNETU1DX0RBVEFCTE9DS19TSVpFXzRCKSAgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RNTUNfREFUQUJMT0NLX1NJWkVfOEIpICAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xNkIpICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNETU1DX0RBVEFCTE9DS19TSVpFXzMyQikgICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNjRCKSAgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xMjhCKSAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNETU1DX0RBVEFCTE9DS19TSVpFXzI1NkIpICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNTEyQikgIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xMDI0QikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNETU1DX0RBVEFCTE9DS19TSVpFXzIwNDhCKSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU0laRSkgPT0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNDA5NkIpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV84MTkyQikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkUpID09IFNETU1DX0RBVEFCTE9DS19TSVpFXzE2Mzg0QikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8yQikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV80QikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV84QikgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xNkIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8zMkIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV82NEIpICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xMjhCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8yNTZCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCKSAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xMDI0QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8yMDQ4QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV80MDk2QikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV84MTkyQikgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTSVpFKSA9PSBTRE1NQ19EQVRBQkxPQ0tfU0laRV8xNjM4NEIpKSAKIC8qKgogICAqIEB9CiAgICovCkBAIC01MDEsMTEgKzUwNCwxMSBAQAogLyoqIEBkZWZncm91cCBTRE1NQ19MTF9UcmFuc2Zlcl9EaXJlY3Rpb24gVHJhbnNmZXIgRGlyZWN0aW9uCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfVFJBTlNGRVJfRElSX1RPX0NBUkQgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQotI2RlZmluZSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUMgICAgICAgICAgICBTRE1NQ19EQ1RSTF9EVERJUgorI2RlZmluZSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fQ0FSRCAgICAgICAgICAgIDB4MDAwMDAwMDBVCisjZGVmaW5lIFNETU1DX1RSQU5TRkVSX0RJUl9UT19TRE1NQyAgICBTRE1NQ19EQ1RSTF9EVERJUgogCiAjZGVmaW5lIElTX1NETU1DX1RSQU5TRkVSX0RJUihESVIpICgoKERJUikgPT0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX0NBUkQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElSKSA9PSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRElSKSA9PSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUMpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTUxMywxMSArNTE2LDExIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX1RyYW5zZmVyX1R5cGUgVHJhbnNmZXIgVHlwZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFNETU1DX1RSQU5TRkVSX01PREVfQkxPQ0sgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSyAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19UUkFOU0ZFUl9NT0RFX1NUUkVBTSAgICAgICAgICAgIFNETU1DX0RDVFJMX0RUTU9ERQogCiAjZGVmaW5lIElTX1NETU1DX1RSQU5TRkVSX01PREUoTU9ERSkgKCgoTU9ERSkgPT0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSykgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNETU1DX1RSQU5TRkVSX01PREVfU1RSRUFNKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTU9ERSkgPT0gU0RNTUNfVFJBTlNGRVJfTU9ERV9TVFJFQU0pKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTUyNSwxMSArNTI4LDExIEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX0RQU01fU3RhdGUgRFBTTSBTdGF0ZQogICAqIEB7CiAgICovCi0jZGVmaW5lIFNETU1DX0RQU01fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDAwVSkKKyNkZWZpbmUgU0RNTUNfRFBTTV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19EUFNNX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIFNETU1DX0RDVFJMX0RURU4KIAogI2RlZmluZSBJU19TRE1NQ19EUFNNKERQU00pICgoKERQU00pID09IFNETU1DX0RQU01fRElTQUJMRSkgfHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRFBTTSkgPT0gU0RNTUNfRFBTTV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChEUFNNKSA9PSBTRE1NQ19EUFNNX0VOQUJMRSkpCiAvKioKICAgKiBAfQogICAqLwpAQCAtNTM3LDExICs1NDAsMTEgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfUmVhZF9XYWl0X01vZGUgUmVhZCBXYWl0IE1vZGUKICAgKiBAewogICAqLwotI2RlZmluZSBTRE1NQ19SRUFEX1dBSVRfTU9ERV9EQVRBMiAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKQorI2RlZmluZSBTRE1NQ19SRUFEX1dBSVRfTU9ERV9EQVRBMiAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQogI2RlZmluZSBTRE1NQ19SRUFEX1dBSVRfTU9ERV9DTEsgICAgICAgICAgICAgICAgICAoU0RNTUNfRENUUkxfUldNT0QpCiAKICNkZWZpbmUgSVNfU0RNTUNfUkVBRFdBSVRfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBTRE1NQ19SRUFEX1dBSVRfTU9ERV9DTEspIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNT0RFKSA9PSBTRE1NQ19SRUFEX1dBSVRfTU9ERV9EQVRBMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE1PREUpID09IFNETU1DX1JFQURfV0FJVF9NT0RFX0RBVEEyKSkKIC8qKgogICAqIEB9CiAgICovICAKQEAgLTU0OSwyOCArNTUyLDI4IEBACiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX0ludGVycnVwdF9zb3VyY2VzIEludGVycnVwdCBTb3VyY2VzCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0RNTUNfSVRfQ0NSQ0ZBSUwgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9DQ1JDRkFJTAotI2RlZmluZSBTRE1NQ19JVF9EQ1JDRkFJTCAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX0RDUkNGQUlMCi0jZGVmaW5lIFNETU1DX0lUX0NUSU1FT1VUICAgICAgICAgICAgICAgICAgICBTRE1NQ19TVEFfQ1RJTUVPVVQKLSNkZWZpbmUgU0RNTUNfSVRfRFRJTUVPVVQgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9EVElNRU9VVAotI2RlZmluZSBTRE1NQ19JVF9UWFVOREVSUiAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX1RYVU5ERVJSCi0jZGVmaW5lIFNETU1DX0lUX1JYT1ZFUlIgICAgICAgICAgICAgICAgICAgICBTRE1NQ19TVEFfUlhPVkVSUgotI2RlZmluZSBTRE1NQ19JVF9DTURSRU5EICAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX0NNRFJFTkQKLSNkZWZpbmUgU0RNTUNfSVRfQ01EU0VOVCAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9DTURTRU5UCi0jZGVmaW5lIFNETU1DX0lUX0RBVEFFTkQgICAgICAgICAgICAgICAgICAgICBTRE1NQ19TVEFfREFUQUVORAotI2RlZmluZSBTRE1NQ19JVF9EQkNLRU5EICAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX0RCQ0tFTkQKLSNkZWZpbmUgU0RNTUNfSVRfQ01EQUNUICAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9DTURBQ1QKLSNkZWZpbmUgU0RNTUNfSVRfVFhBQ1QgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9UWEFDVAotI2RlZmluZSBTRE1NQ19JVF9SWEFDVCAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX1JYQUNUCi0jZGVmaW5lIFNETU1DX0lUX1RYRklGT0hFICAgICAgICAgICAgICAgICAgICBTRE1NQ19TVEFfVFhGSUZPSEUKLSNkZWZpbmUgU0RNTUNfSVRfUlhGSUZPSEYgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9SWEZJRk9IRgotI2RlZmluZSBTRE1NQ19JVF9UWEZJRk9GICAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX1RYRklGT0YKLSNkZWZpbmUgU0RNTUNfSVRfUlhGSUZPRiAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9SWEZJRk9GCi0jZGVmaW5lIFNETU1DX0lUX1RYRklGT0UgICAgICAgICAgICAgICAgICAgICBTRE1NQ19TVEFfVFhGSUZPRQotI2RlZmluZSBTRE1NQ19JVF9SWEZJRk9FICAgICAgICAgICAgICAgICAgICAgU0RNTUNfU1RBX1JYRklGT0UKLSNkZWZpbmUgU0RNTUNfSVRfVFhEQVZMICAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9UWERBVkwKLSNkZWZpbmUgU0RNTUNfSVRfUlhEQVZMICAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9SWERBVkwKLSNkZWZpbmUgU0RNTUNfSVRfU0RJT0lUICAgICAgICAgICAgICAgICAgICAgIFNETU1DX1NUQV9TRElPSVQKKyNkZWZpbmUgU0RNTUNfSVRfQ0NSQ0ZBSUwgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfQ0NSQ0ZBSUxJRQorI2RlZmluZSBTRE1NQ19JVF9EQ1JDRkFJTCAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19EQ1JDRkFJTElFCisjZGVmaW5lIFNETU1DX0lUX0NUSU1FT1VUICAgICAgICAgICAgICAgICAgICBTRE1NQ19NQVNLX0NUSU1FT1VUSUUKKyNkZWZpbmUgU0RNTUNfSVRfRFRJTUVPVVQgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfRFRJTUVPVVRJRQorI2RlZmluZSBTRE1NQ19JVF9UWFVOREVSUiAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19UWFVOREVSUklFCisjZGVmaW5lIFNETU1DX0lUX1JYT1ZFUlIgICAgICAgICAgICAgICAgICAgICBTRE1NQ19NQVNLX1JYT1ZFUlJJRQorI2RlZmluZSBTRE1NQ19JVF9DTURSRU5EICAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19DTURSRU5ESUUKKyNkZWZpbmUgU0RNTUNfSVRfQ01EU0VOVCAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfQ01EU0VOVElFCisjZGVmaW5lIFNETU1DX0lUX0RBVEFFTkQgICAgICAgICAgICAgICAgICAgICBTRE1NQ19NQVNLX0RBVEFFTkRJRQorI2RlZmluZSBTRE1NQ19JVF9EQkNLRU5EICAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19EQkNLRU5ESUUKKyNkZWZpbmUgU0RNTUNfSVRfQ01EQUNUICAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfQ01EQUNUSUUKKyNkZWZpbmUgU0RNTUNfSVRfVFhBQ1QgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfVFhBQ1RJRQorI2RlZmluZSBTRE1NQ19JVF9SWEFDVCAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19SWEFDVElFCisjZGVmaW5lIFNETU1DX0lUX1RYRklGT0hFICAgICAgICAgICAgICAgICAgICBTRE1NQ19NQVNLX1RYRklGT0hFSUUKKyNkZWZpbmUgU0RNTUNfSVRfUlhGSUZPSEYgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfUlhGSUZPSEZJRQorI2RlZmluZSBTRE1NQ19JVF9UWEZJRk9GICAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19UWEZJRk9GSUUKKyNkZWZpbmUgU0RNTUNfSVRfUlhGSUZPRiAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfUlhGSUZPRklFCisjZGVmaW5lIFNETU1DX0lUX1RYRklGT0UgICAgICAgICAgICAgICAgICAgICBTRE1NQ19NQVNLX1RYRklGT0VJRQorI2RlZmluZSBTRE1NQ19JVF9SWEZJRk9FICAgICAgICAgICAgICAgICAgICAgU0RNTUNfTUFTS19SWEZJRk9FSUUKKyNkZWZpbmUgU0RNTUNfSVRfVFhEQVZMICAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfVFhEQVZMSUUKKyNkZWZpbmUgU0RNTUNfSVRfUlhEQVZMICAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfUlhEQVZMSUUKKyNkZWZpbmUgU0RNTUNfSVRfU0RJT0lUICAgICAgICAgICAgICAgICAgICAgIFNETU1DX01BU0tfU0RJT0lUSUUKIC8qKgogICAqIEB9CiAgICovIApAQCAtNjAzLDcgKzYwNiwxMyBAQAogI2RlZmluZSBTRE1NQ19TVEFUSUNfRkxBR1MgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoU0RNTUNfRkxBR19DQ1JDRkFJTCB8IFNETU1DX0ZMQUdfRENSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NUSU1FT1VUIHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19GTEFHX0RUSU1FT1VUIHwgU0RNTUNfRkxBR19UWFVOREVSUiB8IFNETU1DX0ZMQUdfUlhPVkVSUiAgfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0ZMQUdfQ01EUkVORCAgfCBTRE1NQ19GTEFHX0NNRFNFTlQgIHwgU0RNTUNfRkxBR19EQVRBRU5EICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfRkxBR19EQkNLRU5EKSkgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfRkxBR19EQkNLRU5EIHwgU0RNTUNfRkxBR19TRElPSVQpKSAgCisKKyNkZWZpbmUgU0RNTUNfU1RBVElDX0NNRF9GTEFHUyAgICAgICAgICAgICAgICgodWludDMyX3QpKFNETU1DX0ZMQUdfQ0NSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NUSU1FT1VUIHwgU0RNTUNfRkxBR19DTURSRU5EIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19GTEFHX0NNRFNFTlQpKQorCisjZGVmaW5lIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTICAgICAgICAgICAgICAoKHVpbnQzMl90KShTRE1NQ19GTEFHX0RDUkNGQUlMIHwgU0RNTUNfRkxBR19EVElNRU9VVCB8IFNETU1DX0ZMQUdfVFhVTkRFUlIgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0ZMQUdfUlhPVkVSUiAgfCBTRE1NQ19GTEFHX0RBVEFFTkQgIHwgU0RNTUNfRkxBR19EQkNLRU5EKSkKIC8qKgogICAqIEB9CiAgICovCkBAIC02MTYsNyArNjI1LDcgQEAKIC8qKiBAZGVmZ3JvdXAgU0RNTUNfTExfRXhwb3J0ZWRfbWFjcm9zIFNETU1DX0xMIEV4cG9ydGVkIE1hY3JvcwogICAqIEB7CiAgICovCi0gIAorCiAvKiogQGRlZmdyb3VwIFNETU1DX0xMX1JlZ2lzdGVyIEJpdHMgQW5kIEFkZHJlc3NlcyBEZWZpbml0aW9ucwogICAqIEBicmllZiBTRE1NQ19MTCByZWdpc3RlcnMgYml0IGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbgogICAqIEB7CkBAIC02NDAsMTEgKzY0OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfQ01EX0NQU01FTiAgIHwgU0RNTUNfQ01EX1NESU9TVVNQRU5EKSkKIAogLyogU0RNTUMgSW5pdGlhbGl6YXRpb24gRnJlcXVlbmN5ICg0MDBLSHogbWF4KSAqLwotI2RlZmluZSBTRE1NQ19JTklUX0NMS19ESVYgICAgICgodWludDhfdCkweDc2KQorI2RlZmluZSBTRE1NQ19JTklUX0NMS19ESVYgICAgICgodWludDhfdCkweDc2KSAgICAvKiA0OE1IeiAvIChTRE1NQ19JTklUX0NMS19ESVYgKyAyKSA8IDQwMEtIeiAqLwogCiAvKiBTRE1NQyBEYXRhIFRyYW5zZmVyIEZyZXF1ZW5jeSAoMjVNSHogbWF4KSAqLwotI2RlZmluZSBTRE1NQ19UUkFOU0ZFUl9DTEtfRElWICgodWludDhfdCkweDApCi0KKyNkZWZpbmUgU0RNTUNfVFJBTlNGRVJfQ0xLX0RJViAoKHVpbnQ4X3QpMHgwKSAgICAgLyogNDhNSHogLyAoU0RNTUNfVFJBTlNGRVJfQ0xLX0RJViArIDIpIDwgMjVNSHogKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC02NTYsMzUgKzY2NCwzNiBAQAogIAogLyoqCiAgICogQGJyaWVmICBFbmFibGUgdGhlIFNETU1DIGRldmljZS4KLSAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyBTRE1NQyBJbnN0YW5jZSAgCisgICogQHBhcmFtICBfX0lOU1RBTkNFX186IFNETU1DIEluc3RhbmNlICAKICAgKiBAcmV0dmFsIE5vbmUKLSAgKi8gCisgICovCiAjZGVmaW5lIF9fU0RNTUNfRU5BQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+Q0xLQ1IgfD0gU0RNTUNfQ0xLQ1JfQ0xLRU4pCiAKIC8qKgogICAqIEBicmllZiAgRGlzYWJsZSB0aGUgU0RNTUMgZGV2aWNlLgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIFNETU1DIEluc3RhbmNlICAKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXzogU0RNTUMgSW5zdGFuY2UgIAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX1NETU1DX0RJU0FCTEUoX19JTlNUQU5DRV9fKSAgKChfX0lOU1RBTkNFX18pLT5DTEtDUiAmPSB+U0RNTUNfQ0xLQ1JfQ0xLRU4pCiAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIHRoZSBTRE1NQyBETUEgdHJhbnNmZXIuCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gU0RNTUMgSW5zdGFuY2UgIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fOiBTRE1NQyBJbnN0YW5jZSAgCiAgICogQHJldHZhbCBOb25lCi0gICovIAorICAqLwogI2RlZmluZSBfX1NETU1DX0RNQV9FTkFCTEUoX19JTlNUQU5DRV9fKSAgKChfX0lOU1RBTkNFX18pLT5EQ1RSTCB8PSBTRE1NQ19EQ1RSTF9ETUFFTikKKwogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTRE1NQyBETUEgdHJhbnNmZXIuCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gU0RNTUMgSW5zdGFuY2UgICAKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXzogU0RNTUMgSW5zdGFuY2UgICAKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19TRE1NQ19ETUFfRElTQUJMRShfX0lOU1RBTkNFX18pICAoKF9fSU5TVEFOQ0VfXyktPkRDVFJMICY9IH5TRE1NQ19EQ1RSTF9ETUFFTikKICAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIHRoZSBTRE1NQyBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyAgc3BlY2lmaWVzIHRoZSBTRE1NQyBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkLgorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gOiBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC02OTQsNyArNzAzLDcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQKQEAgLTcwNywxNSArNzE2LDE1IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYRklGT0U6ICBSZWNlaXZlIEZJRk8gZW1wdHkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gcmVjZWl2ZSBGSUZPIGludGVycnVwdAotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQgICAKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdCAKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KICNkZWZpbmUgX19TRE1NQ19FTkFCTEVfSVQoX19JTlNUQU5DRV9fLCBfX0lOVEVSUlVQVF9fKSAgKChfX0lOU1RBTkNFX18pLT5NQVNLIHw9IChfX0lOVEVSUlVQVF9fKSkKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTRE1NQyBkZXZpY2UgaW50ZXJydXB0LgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgICAKLSAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gIHNwZWNpZmllcyB0aGUgU0RNTUMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZGlzYWJsZWQuCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gOiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgICAKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX18gOiBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGRpc2FibGVkLgogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ0NSQ0ZBSUw6IENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBmYWlsZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKQEAgLTcyNSw3ICs3MzQsNyBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0CisgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBEQVRBQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYQUNUOiAgICBEYXRhIHRyYW5zbWl0IGluIHByb2dyZXNzIGludGVycnVwdApAQCAtNzM4LDE1ICs3NDcsMTUgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfVFhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHRyYW5zbWl0IEZJRk8gaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiByZWNlaXZlIEZJRk8gaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdCAgIAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0RJTyBpbnRlcnJ1cHQgcmVjZWl2ZWQgaW50ZXJydXB0ICAgCiAgICogQHJldHZhbCBOb25lCiAgICovCiAjZGVmaW5lIF9fU0RNTUNfRElTQUJMRV9JVChfX0lOU1RBTkNFX18sIF9fSU5URVJSVVBUX18pICAoKF9fSU5TVEFOQ0VfXyktPk1BU0sgJj0gfihfX0lOVEVSUlVQVF9fKSkKIAogLyoqCiAgICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNETU1DIGZsYWcgaXMgc2V0IG9yIG5vdC4gCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAotICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiAKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyA6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAorICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQpAQCAtNzU2LDcgKzc2NSw3IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvcgogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFJFTkQ6ICBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIERBVEFDT1VOVCwgaXMgemVybykKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MKQEAgLTc2OSwxNiArNzc4LDE2IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTwotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1NETU1DSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX1NESU9JVDogICBTRElPIGludGVycnVwdCByZWNlaXZlZAogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBTRE1NQ19GTEFHIChTRVQgb3IgUkVTRVQpLgogICAqLwotI2RlZmluZSBfX1NETU1DX0dFVF9GTEFHKF9fSU5TVEFOQ0VfXywgX19GTEFHX18pICAoKChfX0lOU1RBTkNFX18pLT5TVEEgJihfX0ZMQUdfXykpICE9IFJFU0VUKQorI2RlZmluZSBfX1NETU1DX0dFVF9GTEFHKF9fSU5TVEFOQ0VfXywgX19GTEFHX18pICAoKChfX0lOU1RBTkNFX18pLT5TVEEgJihfX0ZMQUdfXykpICE9IDBVKQogCiAKIC8qKgogICAqIEBicmllZiAgQ2xlYXJzIHRoZSBTRE1NQyBwZW5kaW5nIGZsYWdzLgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAotICAqIEBwYXJhbSAgX19GTEFHX18gc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLiAgCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gOiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAorICAqIEBwYXJhbSAgX19GTEFHX186IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gIAogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKQpAQCAtNzg4LDE3ICs3OTcsMTcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpCi0gICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKQogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19GTEFHX0RCQ0tFTkQ6ICBEYXRhIGJsb2NrIHNlbnQvcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpCi0gICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfU0RNTUNJVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkCisgICogICAgICAgICAgICBAYXJnIFNETU1DX0ZMQUdfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkCiAgICogQHJldHZhbCBOb25lCiAgICovCiAjZGVmaW5lIF9fU0RNTUNfQ0xFQVJfRkxBRyhfX0lOU1RBTkNFX18sIF9fRkxBR19fKSAgKChfX0lOU1RBTkNFX18pLT5JQ1IgPSAoX19GTEFHX18pKQogCiAvKioKICAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU0RNTUMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAotICAqIEBwYXJhbSAgX19JTlRFUlJVUFRfXyBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgCisgICogQHBhcmFtICBfX0lOVEVSUlVQVF9fOiBzcGVjaWZpZXMgdGhlIFNETU1DIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIAogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC04MDgsNyArODE3LDcgQEAKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfUlhPVkVSUjogIFJlY2VpdmVkIEZJRk8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURTRU5UOiAgQ29tbWFuZCBzZW50IChubyByZXNwb25zZSByZXF1aXJlZCkgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0RBVEFFTkQ6ICBEYXRhIGVuZCAoZGF0YSBjb3VudGVyLCBTRElEQ09VTlQsIGlzIHplcm8pIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9UWEFDVDogICAgRGF0YSB0cmFuc21pdCBpbiBwcm9ncmVzcyBpbnRlcnJ1cHQKQEAgLTgyMSwxNSArODMwLDE1IEBACiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1JYRklGT0U6ICBSZWNlaXZlIEZJRk8gZW1wdHkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWERBVkw6ICAgRGF0YSBhdmFpbGFibGUgaW4gcmVjZWl2ZSBGSUZPIGludGVycnVwdAotICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdAogICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBTRE1NQ19JVCAoU0VUIG9yIFJFU0VUKS4KICAgKi8KICNkZWZpbmUgX19TRE1NQ19HRVRfSVQgIChfX0lOU1RBTkNFX18sIF9fSU5URVJSVVBUX18pICAoKChfX0lOU1RBTkNFX18pLT5TVEEgJihfX0lOVEVSUlVQVF9fKSkgPT0gKF9fSU5URVJSVVBUX18pKQogCiAvKioKICAgKiBAYnJpZWYgIENsZWFycyB0aGUgU0RNTUMncyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCi0gICogQHBhcmFtICBfX0lOVEVSUlVQVF9fIHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiAKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyA6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIF9fSU5URVJSVVBUX186IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiAKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NDUkNGQUlMOiBDb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0CkBAIC04MzksNjggKzg0OCw2OCBAQAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdAogICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9DTURSRU5EOiAgQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkgaW50ZXJydXB0CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKSBpbnRlcnJ1cHQKLSAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNETU1DX0RDT1VOVCwgaXMgemVybykgaW50ZXJydXB0Ci0gICogICAgICAgICAgICBAYXJnIFNETU1DX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdAorICAqICAgICAgICAgICAgQGFyZyBTRE1NQ19JVF9EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgREFUQUNPVU5ULCBpcyB6ZXJvKSBpbnRlcnJ1cHQKKyAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfSVRfU0RJT0lUOiAgIFNESU8gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdAogICAqIEByZXR2YWwgTm9uZQogICAqLwogI2RlZmluZSBfX1NETU1DX0NMRUFSX0lUKF9fSU5TVEFOQ0VfXywgX19JTlRFUlJVUFRfXykgICgoX19JTlNUQU5DRV9fKS0+SUNSID0gKF9fSU5URVJSVVBUX18pKQogCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSBTdGFydCB0aGUgU0QgSS9PIFJlYWQgV2FpdCBvcGVyYXRpb24uCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gOiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAogICAqIEByZXR2YWwgTm9uZQotICAqLyAgCisgICovCiAjZGVmaW5lIF9fU0RNTUNfU1RBUlRfUkVBRFdBSVRfRU5BQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+RENUUkwgfD0gU0RNTUNfRENUUkxfUldTVEFSVCkKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIFN0YXJ0IHRoZSBTRCBJL08gUmVhZCBXYWl0IG9wZXJhdGlvbnMuCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgCiAgICogQHJldHZhbCBOb25lCi0gICovICAKKyAgKi8KICNkZWZpbmUgX19TRE1NQ19TVEFSVF9SRUFEV0FJVF9ESVNBQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+RENUUkwgJj0gflNETU1DX0RDVFJMX1JXU1RBUlQpCiAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIFN0YXJ0IHRoZSBTRCBJL08gUmVhZCBXYWl0IG9wZXJhdGlvbi4KLSAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyAgUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gOiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgICAKICAgKiBAcmV0dmFsIE5vbmUKLSAgKi8gIAorICAqLwogI2RlZmluZSBfX1NETU1DX1NUT1BfUkVBRFdBSVRfRU5BQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+RENUUkwgfD0gU0RNTUNfRENUUkxfUldTVE9QKQogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgU3RvcCB0aGUgU0QgSS9PIFJlYWQgV2FpdCBvcGVyYXRpb25zLgotICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fICBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAKICAgKiBAcmV0dmFsIE5vbmUKLSAgKi8gIAorICAqLwogI2RlZmluZSBfX1NETU1DX1NUT1BfUkVBRFdBSVRfRElTQUJMRShfX0lOU1RBTkNFX18pICAoKF9fSU5TVEFOQ0VfXyktPkRDVFJMICY9IH5TRE1NQ19EQ1RSTF9SV1NUT1ApCiAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIHRoZSBTRCBJL08gTW9kZSBPcGVyYXRpb24uCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgCiAgICogQHJldHZhbCBOb25lCi0gICovICAKLSNkZWZpbmUgX19TRE1NQ19PUEVSQVRJT05fRU5BQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+RENUUkwgfD0gU0RNTUNfRENUUkxfU0RJT0VOKSAKKyAgKi8KKyNkZWZpbmUgX19TRE1NQ19PUEVSQVRJT05fRU5BQkxFKF9fSU5TVEFOQ0VfXykgICgoX19JTlNUQU5DRV9fKS0+RENUUkwgfD0gU0RNTUNfRENUUkxfU0RJT0VOKQogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgdGhlIFNEIEkvTyBNb2RlIE9wZXJhdGlvbi4KLSAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyAgUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgX19JTlNUQU5DRV9fIDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgTm9uZQotICAqLyAgCisgICovCiAjZGVmaW5lIF9fU0RNTUNfT1BFUkFUSU9OX0RJU0FCTEUoX19JTlNUQU5DRV9fKSAgKChfX0lOU1RBTkNFX18pLT5EQ1RSTCAmPSB+U0RNTUNfRENUUkxfU0RJT0VOKSAKIAogLyoqCiAgICogQGJyaWVmICBFbmFibGUgdGhlIFNEIEkvTyBTdXNwZW5kIGNvbW1hbmQgc2VuZGluZy4KLSAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyAgUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAKKyAgKiBAcGFyYW0gIF9fSU5TVEFOQ0VfXyA6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgCiAgICogQHJldHZhbCBOb25lCi0gICovICAKKyAgKi8KICNkZWZpbmUgX19TRE1NQ19TVVNQRU5EX0NNRF9FTkFCTEUoX19JTlNUQU5DRV9fKSAgKChfX0lOU1RBTkNFX18pLT5DTUQgfD0gU0RNTUNfQ01EX1NESU9TVVNQRU5EKSAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBTRCBJL08gU3VzcGVuZCBjb21tYW5kIHNlbmRpbmcuCi0gICogQHBhcmFtICBfX0lOU1RBTkNFX18gIFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgCisgICogQHBhcmFtICBfX0lOU1RBTkNFX18gOiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgIAogICAqIEByZXR2YWwgTm9uZQotICAqLyAgCisgICovCiAjZGVmaW5lIF9fU0RNTUNfU1VTUEVORF9DTURfRElTQUJMRShfX0lOU1RBTkNFX18pICAoKF9fSU5TVEFOQ0VfXyktPkNNRCAmPSB+U0RNTUNfQ01EX1NESU9TVVNQRU5EKSAKLSAgICAgIAorCiAvKioKICAgKiBAfQogICAqLwpAQCAtOTcwLDcgKzk3OSw3IEBACiB1aW50MzJfdCBTRE1NQ19DbWRHb0lkbGVTdGF0ZShTRE1NQ19UeXBlRGVmICpTRE1NQ3gpOwogdWludDMyX3QgU0RNTUNfQ21kT3BlckNvbmQoU0RNTUNfVHlwZURlZiAqU0RNTUN4KTsKIHVpbnQzMl90IFNETU1DX0NtZEFwcENvbW1hbmQoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBBcmd1bWVudCk7Ci11aW50MzJfdCBTRE1NQ19DbWRBcHBPcGVyQ29tbWFuZChTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IFNkVHlwZSk7Cit1aW50MzJfdCBTRE1NQ19DbWRBcHBPcGVyQ29tbWFuZChTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IEFyZ3VtZW50KTsKIHVpbnQzMl90IFNETU1DX0NtZEJ1c1dpZHRoKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgQnVzV2lkdGgpOwogdWludDMyX3QgU0RNTUNfQ21kU2VuZFNDUihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpOwogdWludDMyX3QgU0RNTUNfQ21kU2VuZENJRChTRE1NQ19UeXBlRGVmICpTRE1NQ3gpOwpAQCAtOTk3LDEwICsxMDA2LDEyIEBACiAgICogQH0KICAgKi8KIAorI2VuZGlmIC8qIFNETU1DMSAqLworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfTExfU0RNTUNfSCAqLworI2VuZGlmIC8qIFNUTTMyRjd4eF9MTF9TRE1NQ19IICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9JbmMvc3RtMzJmN3h4X2xsX3RpbS5oIGIvSW5jL3N0bTMyZjd4eF9sbF90aW0uaAppbmRleCAzZGE1OTYxLi41NzUwZWVmIDEwMDY0NAotLS0gYS9JbmMvc3RtMzJmN3h4X2xsX3RpbS5oCisrKyBiL0luYy9zdG0zMmY3eHhfbGxfdGltLmgKQEAgLTEyMSwxNyArMTIxLDcgQEAKICNkZWZpbmUgVElNX1BPU0lUSU9OX0JSS19TT1VSQ0UgICAgICAgICAgIChQT1NJVElPTl9WQUwoU291cmNlKSAmIDB4MUZVTCkKIAogLyogR2VuZXJpYyBiaXQgZGVmaW5pdGlvbnMgZm9yIFRJTXhfQUYxIHJlZ2lzdGVyICovCi0jZGVmaW5lIFRJTXhfQUYxX0JLSU5FICAgICAgICAgIFRJTTFfQUYxX0JLSU5FICAgICAgIC8qITwgQlJLIEJLSU5FIGlucHV0IGVuYWJsZSAqLwotI2lmIGRlZmluZWQoREZTRE0xX0NoYW5uZWwwKQotI2RlZmluZSBUSU14X0FGMV9CS0RGQktFICAgICAgICBUSU0xX0FGMV9CS0RGQktFICAgICAvKiE8IEJSSyBERlNETTFfQlJFQUtbMF0gZW5hYmxlICovCi0jZW5kaWYgLyogREZTRE0xX0NoYW5uZWwwICovCiAjZGVmaW5lIFRJTXhfQUYxX0JLSU5QICAgICAgICBUSU0xX0FGMV9CS0lOUCAgICAgICAvKiE8IEJSSyBCS0lOIGlucHV0IHBvbGFyaXR5ICovCi0vKiBHZW5lcmljIGJpdCBkZWZpbml0aW9ucyBmb3IgVElNeF9BRjIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVElNeF9BRjJfQksySU5FICAgICAgICAgVElNMV9BRjJfQksySU5FICAgICAgLyohPCBCUksgQjJLSU5FIGlucHV0IGVuYWJsZSAqLwotI2lmIGRlZmluZWQoREZTRE0xX0NoYW5uZWwwKQotI2RlZmluZSBUSU14X0FGMl9CSzJERkJLRSAgICAgICBUSU0xX0FGMl9CSzJERkJLRSAgICAvKiE8IEJSSyBERlNETV9CUkVBS1swXSBlbmFibGUgKi8KLSNlbmRpZiAvKiBERlNETTFfQ2hhbm5lbDAgKi8KLSNkZWZpbmUgVElNeF9BRjJfQksySU5QICAgICAgIFRJTTFfQUYyX0JLMklOUCAgICAgIC8qITwgQlJLIEJLMklOIGlucHV0IHBvbGFyaXR5ICovCiAjZW5kaWYgLyogVElNX0JSRUFLX0lOUFVUX1NVUFBPUlQgKi8KIAogLyogUmVtYXAgbWFzayBkZWZpbml0aW9ucyAqLwpAQCAtMTc2LDE0ICsxNjYsMTQgQEAKICAgKiBAcmV0dmFsIG5vbmUKICAgKi8KICNkZWZpbmUgVElNX0dFVF9DSEFOTkVMX0lOREVYKCBfX0NIQU5ORUxfXykgXAotKCgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMSkgPyAwVSA6XAotKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gxTikgPyAxVSA6XAotKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyKSA/IDJVIDpcCi0oKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDJOKSA/IDNVIDpcCi0oKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDMpID8gNFUgOlwKLSgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIM04pID8gNVUgOlwKLSgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINCkgPyA2VSA6XAotKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0g1KSA/IDdVIDogOFUpCisgICgoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDEpID8gMFUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMU4pID8gMVUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NIMikgPyAyVSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gyTikgPyAzVSA6XAorICAgKChfX0NIQU5ORUxfXykgPT0gTExfVElNX0NIQU5ORUxfQ0gzKSA/IDRVIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDNOKSA/IDVVIDpcCisgICAoKF9fQ0hBTk5FTF9fKSA9PSBMTF9USU1fQ0hBTk5FTF9DSDQpID8gNlUgOlwKKyAgICgoX19DSEFOTkVMX18pID09IExMX1RJTV9DSEFOTkVMX0NINSkgPyA3VSA6IDhVKQogCiAvKiogQGJyaWVmICBDYWxjdWxhdGUgdGhlIGRlYWR0aW1lIHNhbXBsaW5nIHBlcmlvZChpbiBwcykuCiAgICogQHBhcmFtICBfX1RJTUNMS19fIHRpbWVyIGlucHV0IGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopLgpAQCAtMTk0LDkgKzE4NCw5IEBACiAgICogQHJldHZhbCBub25lCiAgICovCiAjZGVmaW5lIFRJTV9DQUxDX0RUUyhfX1RJTUNMS19fLCBfX0NLRF9fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoKF9fQ0tEX18pID09IExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEpID8gKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVS8oX19USU1DTEtfXykpICAgICAgICAgOiBcCi0gICAgICgoX19DS0RfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgPyAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLygoX19USU1DTEtfXykgPj4gMVUpKSA6IFwKLSAgICAgKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVS8oKF9fVElNQ0xLX18pID4+IDJVKSkpCisgICgoKF9fQ0tEX18pID09IExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjEpID8gKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVS8oX19USU1DTEtfXykpICAgICAgICAgOiBcCisgICAoKF9fQ0tEX18pID09IExMX1RJTV9DTE9DS0RJVklTSU9OX0RJVjIpID8gKCh1aW50NjRfdCkxMDAwMDAwMDAwMDAwVS8oKF9fVElNQ0xLX18pID4+IDFVKSkgOiBcCisgICAoKHVpbnQ2NF90KTEwMDAwMDAwMDAwMDBVLygoX19USU1DTEtfXykgPj4gMlUpKSkKIC8qKgogICAqIEB9CiAgICovCkBAIC0yMzUsMTMgKzIyNSwxNCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldENsb2NrRGl2aXNpb24oKS4qLwogCi0gIHVpbnQ4X3QgUmVwZXRpdGlvbkNvdW50ZXI7ICAvKiE8IFNwZWNpZmllcyB0aGUgcmVwZXRpdGlvbiBjb3VudGVyIHZhbHVlLiBFYWNoIHRpbWUgdGhlIFJDUiBkb3duY291bnRlcgorICB1aW50MzJfdCBSZXBldGl0aW9uQ291bnRlcjsgIC8qITwgU3BlY2lmaWVzIHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuIEVhY2ggdGltZSB0aGUgUkNSIGRvd25jb3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoZXMgemVybywgYW4gdXBkYXRlIGV2ZW50IGlzIGdlbmVyYXRlZCBhbmQgY291bnRpbmcgcmVzdGFydHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgUkNSIHZhbHVlIChOKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyBpbiBQV00gbW9kZSB0aGF0IChOKzEpIGNvcnJlc3BvbmRzIHRvOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2YgUFdNIHBlcmlvZHMgaW4gZWRnZS1hbGlnbmVkIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGhhbGYgUFdNIHBlcmlvZCBpbiBjZW50ZXItYWxpZ25lZCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAweDAwIGFuZCAweEZGLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUCB0aW1lcnM6IHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiBNaW5fRGF0YSA9IDB4MDAgYW5kIE1heF9EYXRhID0gMHhGRi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2YW5jZWQgdGltZXJzOiB0aGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAweDAwMDAgYW5kIE1heF9EYXRhID0gMHhGRkZGLgogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyB1c2luZyB1bml0YXJ5IGZ1bmN0aW9uIEByZWYgTExfVElNX1NldFJlcGV0aXRpb25Db3VudGVyKCkuKi8KIH0gTExfVElNX0luaXRUeXBlRGVmOwpAQCAtMTE1Nyw3ICsxMTQ4LDcgQEAKICAgKiBAcmV0dmFsIFVJRiBzdGF0dXMgYml0CiAgICovCiAjZGVmaW5lIF9fTExfVElNX0dFVEZMQUdfVUlGQ1BZKF9fQ05UX18pICBcCi0gICAoUkVBRF9CSVQoKF9fQ05UX18pLCBUSU1fQ05UX1VJRkNQWSkgPj4gVElNX0NOVF9VSUZDUFlfUG9zKQorICAoUkVBRF9CSVQoKF9fQ05UX18pLCBUSU1fQ05UX1VJRkNQWSkgPj4gVElNX0NOVF9VSUZDUFlfUG9zKQogCiAvKioKICAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyBEVEdbMDo3XSBpbiB0aGUgVElNeF9CRFRSIHJlZ2lzdGVyIHRvIGFjaGlldmUgdGhlIHJlcXVlc3RlZCBkZWFkIHRpbWUgZHVyYXRpb24uCkBAIC0xMTcxLDExICsxMTYyLDExIEBACiAgICogQHJldHZhbCBEVEdbMDo3XQogICAqLwogI2RlZmluZSBfX0xMX1RJTV9DQUxDX0RFQURUSU1FKF9fVElNQ0xLX18sIF9fQ0tEX18sIF9fRFRfXykgIFwKLSAgICAoICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKChEVF9ERUxBWV8xKzFVKSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgICAgICAgICAgPyAodWludDhfdCkoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpIC8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgICYgRFRfREVMQVlfMSkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKDY0VSArIChEVF9ERUxBWV8yKzFVKSkgKiAyVSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgPyAodWludDhfdCkoRFRfUkFOR0VfMiB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiAxVSkgLSAodWludDhfdCkgNjQpICYgRFRfREVMQVlfMikpIDpcCi0gICAgICAoKCh1aW50NjRfdCkoKF9fRFRfXykqMTAwMFUpKSA8ICgoMzJVICsgKERUX0RFTEFZXzMrMVUpKSAqIDhVICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpICA/ICh1aW50OF90KShEVF9SQU5HRV8zIHwgKCh1aW50OF90KSgodWludDhfdCkoKCgoKHVpbnQ2NF90KShfX0RUX18pKjEwMDBVKSkvIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpID4+IDNVKSAtICh1aW50OF90KSAzMikgJiBEVF9ERUxBWV8zKSkgOlwKLSAgICAgICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKCgzMlUgKyAoRFRfREVMQVlfNCsxVSkpICogMTZVICogVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkpID8gKHVpbnQ4X3QpKERUX1JBTkdFXzQgfCAoKHVpbnQ4X3QpKCh1aW50OF90KSgoKCgodWludDY0X3QpKF9fRFRfXykqMTAwMFUpKS8gVElNX0NBTENfRFRTKChfX1RJTUNMS19fKSwgKF9fQ0tEX18pKSkgPj4gNFUpIC0gKHVpbnQ4X3QpIDMyKSAmIERUX0RFTEFZXzQpKSA6XAotICAgICAgIDBVKQorICAoICgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpIDwgKChEVF9ERUxBWV8xKzFVKSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgICA/ICh1aW50OF90KSgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkgLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSAgJiBEVF9ERUxBWV8xKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKDY0VSArIChEVF9ERUxBWV8yKzFVKSkgKiAyVSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgPyAodWludDhfdCkoRFRfUkFOR0VfMiB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKHVpbnQ2NF90KSgoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiAxVSkgLSAodWludDhfdCkgNjQpICYgRFRfREVMQVlfMikpIDpcCisgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKDMyVSArIChEVF9ERUxBWV8zKzFVKSkgKiA4VSAqIFRJTV9DQUxDX0RUUygoX19USU1DTEtfXyksIChfX0NLRF9fKSkpKSAgPyAodWludDhfdCkoRFRfUkFOR0VfMyB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKCh1aW50NjRfdCkoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiAzVSkgLSAodWludDhfdCkgMzIpICYgRFRfREVMQVlfMykpIDpcCisgICAgKCgodWludDY0X3QpKChfX0RUX18pKjEwMDBVKSkgPCAoKDMyVSArIChEVF9ERUxBWV80KzFVKSkgKiAxNlUgKiBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSkgPyAodWludDhfdCkoRFRfUkFOR0VfNCB8ICgodWludDhfdCkoKHVpbnQ4X3QpKCgoKCh1aW50NjRfdCkoX19EVF9fKSoxMDAwVSkpLyBUSU1fQ0FMQ19EVFMoKF9fVElNQ0xLX18pLCAoX19DS0RfXykpKSA+PiA0VSkgLSAodWludDhfdCkgMzIpICYgRFRfREVMQVlfNCkpIDpcCisgICAgMFUpCiAKIC8qKgogICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBwcmVzY2FsZXIgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgY291bnRlciBjbG9jayBmcmVxdWVuY3kuCkBAIC0xMTg1LDcgKzExNzYsNyBAQAogICAqIEByZXR2YWwgUHJlc2NhbGVyIHZhbHVlICAoYmV0d2VlbiBNaW5fRGF0YT0wIGFuZCBNYXhfRGF0YT02NTUzNSkKICAgKi8KICNkZWZpbmUgX19MTF9USU1fQ0FMQ19QU0MoX19USU1DTEtfXywgX19DTlRDTEtfXykgICBcCi0gICAoKChfX1RJTUNMS19fKSA+PSAoX19DTlRDTEtfXykpID8gKHVpbnQzMl90KSgoKF9fVElNQ0xLX18pLyhfX0NOVENMS19fKSkgLSAxVSkgOiAwVSkKKyAgKCgoX19USU1DTEtfXykgPj0gKF9fQ05UQ0xLX18pKSA/ICh1aW50MzJfdCkoKChfX1RJTUNMS19fKS8oX19DTlRDTEtfXykpIC0gMVUpIDogMFUpCiAKIC8qKgogICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIGNhbGN1bGF0aW5nIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCBvdXRwdXQgc2lnbmFsIGZyZXF1ZW5jeS4KQEAgLTExOTYsNyArMTE4Nyw3IEBACiAgICogQHJldHZhbCAgQXV0by1yZWxvYWQgdmFsdWUgIChiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTY1NTM1KQogICAqLwogI2RlZmluZSBfX0xMX1RJTV9DQUxDX0FSUihfX1RJTUNMS19fLCBfX1BTQ19fLCBfX0ZSRVFfXykgXAotICAgICAoKCgoX19USU1DTEtfXykvKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgPyAoKChfX1RJTUNMS19fKS8oKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSA6IDBVKQorICAoKCgoX19USU1DTEtfXykvKChfX1BTQ19fKSArIDFVKSkgPj0gKF9fRlJFUV9fKSkgPyAoKChfX1RJTUNMS19fKS8oKF9fRlJFUV9fKSAqICgoX19QU0NfXykgKyAxVSkpKSAtIDFVKSA6IDBVKQogCiAvKioKICAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgY29tcGFyZSB2YWx1ZSByZXF1aXJlZCB0byBhY2hpZXZlIHRoZSByZXF1aXJlZCB0aW1lciBvdXRwdXQgY29tcGFyZSBhY3RpdmUvaW5hY3RpdmUgZGVsYXkuCkBAIC0xMjA3LDggKzExOTgsOCBAQAogICAqIEByZXR2YWwgQ29tcGFyZSB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCiAgICovCiAjZGVmaW5lIF9fTExfVElNX0NBTENfREVMQVkoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fKSAgXAotKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoX19USU1DTEtfXykgKiAodWludDY0X3QpKF9fREVMQVlfXykpIFwKLSAgICAgICAgICAvICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQorICAoKHVpbnQzMl90KSgoKHVpbnQ2NF90KShfX1RJTUNMS19fKSAqICh1aW50NjRfdCkoX19ERUxBWV9fKSkgXAorICAgICAgICAgICAgICAvICgodWludDY0X3QpMTAwMDAwMFUgKiAodWludDY0X3QpKChfX1BTQ19fKSArIDFVKSkpKQogCiAvKioKICAgKiBAYnJpZWYgIEhFTFBFUiBtYWNybyBjYWxjdWxhdGluZyB0aGUgYXV0by1yZWxvYWQgdmFsdWUgdG8gYWNoaWV2ZSB0aGUgcmVxdWlyZWQgcHVsc2UgZHVyYXRpb24gKHdoZW4gdGhlIHRpbWVyIG9wZXJhdGVzIGluIG9uZSBwdWxzZSBtb2RlKS4KQEAgLTEyMjAsOCArMTIxMSw4IEBACiAgICogQHJldHZhbCBBdXRvLXJlbG9hZCB2YWx1ZSAgKGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9NjU1MzUpCiAgICovCiAjZGVmaW5lIF9fTExfVElNX0NBTENfUFVMU0UoX19USU1DTEtfXywgX19QU0NfXywgX19ERUxBWV9fLCBfX1BVTFNFX18pICBcCi0gKCh1aW50MzJfdCkoX19MTF9USU1fQ0FMQ19ERUxBWSgoX19USU1DTEtfXyksIChfX1BTQ19fKSwgKF9fUFVMU0VfXykpIFwKLSAgICAgICAgICAgKyBfX0xMX1RJTV9DQUxDX0RFTEFZKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19ERUxBWV9fKSkpKQorICAoKHVpbnQzMl90KShfX0xMX1RJTV9DQUxDX0RFTEFZKChfX1RJTUNMS19fKSwgKF9fUFNDX18pLCAoX19QVUxTRV9fKSkgXAorICAgICAgICAgICAgICArIF9fTExfVElNX0NBTENfREVMQVkoKF9fVElNQ0xLX18pLCAoX19QU0NfXyksIChfX0RFTEFZX18pKSkpCiAKIC8qKgogICAqIEBicmllZiAgSEVMUEVSIG1hY3JvIHJldHJpZXZpbmcgdGhlIHJhdGlvIG9mIHRoZSBpbnB1dCBjYXB0dXJlIHByZXNjYWxlcgpAQCAtMTIzNCw3ICsxMjI1LDcgQEAKICAgKiBAcmV0dmFsIElucHV0IGNhcHR1cmUgcHJlc2NhbGVyIHJhdGlvICgxLCAyLCA0IG9yIDgpCiAgICovCiAjZGVmaW5lIF9fTExfVElNX0dFVF9JQ1BTQ19SQVRJTyhfX0lDUFNDX18pICBcCi0gICAoKHVpbnQzMl90KSgweDAxVSA8PCAoKChfX0lDUFNDX18pID4+IDE2VSkgPj4gVElNX0NDTVIxX0lDMVBTQ19Qb3MpKSkKKyAgKCh1aW50MzJfdCkoMHgwMVUgPDwgKCgoX19JQ1BTQ19fKSA+PiAxNlUpID4+IFRJTV9DQ01SMV9JQzFQU0NfUG9zKSkpCiAKIAogLyoqCkBAIC0xMzgzLDcgKzEzNzQsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgdGltZXIgY291bnRlciBjb3VudGluZyBtb2RlLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8KKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0bwogICAqICAgICAgIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjb3VudGVyIG1vZGUgc2VsZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkCiAgICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAbm90ZSBTd2l0Y2hpbmcgZnJvbSBDZW50ZXIgQWxpZ25lZCBjb3VudGVyIG1vZGUgdG8gRWRnZSBjb3VudGVyIG1vZGUgKG9yIHJldmVyc2UpCkBAIC0xNDA3LDcgKzEzOTgsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEdldCBhY3R1YWwgY291bnRlciBtb2RlLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPVU5URVJfTU9ERV9TRUxFQ1RfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8KKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ09VTlRFUl9NT0RFX1NFTEVDVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0bwogICAqICAgICAgIGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBjb3VudGVyIG1vZGUgc2VsZWN0aW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkCiAgICogICAgICAgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENSMSAgICAgICAgICBESVIgICAgICAgICAgIExMX1RJTV9HZXRDb3VudGVyTW9kZVxuCkBAIC0xNDQ0LDcgKzE0MzUsNyBAQAogICAqLwogX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0Rpc2FibGVBUlJQcmVsb2FkKFRJTV9UeXBlRGVmICpUSU14KQogewotICBDTEVBUl9CSVQoVElNeC0+Q1IxLFRJTV9DUjFfQVJQRSk7CisgIENMRUFSX0JJVChUSU14LT5DUjEsIFRJTV9DUjFfQVJQRSk7CiB9CiAKIC8qKgpAQCAtMTQ2MCw3ICsxNDUxLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZXQgdGhlIGRpdmlzaW9uIHJhdGlvIGJldHdlZW4gdGhlIHRpbWVyIGNsb2NrICBhbmQgdGhlIHNhbXBsaW5nIGNsb2NrIHVzZWQgYnkgdGhlIGRlYWQtdGltZSBnZW5lcmF0b3JzICh3aGVuIHN1cHBvcnRlZCkgYW5kIHRoZSBkaWdpdGFsIGZpbHRlcnMuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ0xPQ0tfRElWSVNJT05fSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgY2xvY2sgZGl2aXNpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRpbWVyCiAgICogICAgICAgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDUjEgICAgICAgICAgQ0tEICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tEaXZpc2lvbgpAQCAtMTQ3OCw3ICsxNDY5LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBHZXQgdGhlIGFjdHVhbCBkaXZpc2lvbiByYXRpbyBiZXR3ZWVuIHRoZSB0aW1lciBjbG9jayAgYW5kIHRoZSBzYW1wbGluZyBjbG9jayB1c2VkIGJ5IHRoZSBkZWFkLXRpbWUgZ2VuZXJhdG9ycyAod2hlbiBzdXBwb3J0ZWQpIGFuZCB0aGUgZGlnaXRhbCBmaWx0ZXJzLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NMT0NLX0RJVklTSU9OX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIGRpdmlzaW9uIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0aW1lcgogICAqICAgICAgIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ1IxICAgICAgICAgIENLRCAgICAgICAgICAgTExfVElNX0dldENsb2NrRGl2aXNpb24KQEAgLTE0OTUsNyArMTQ4Niw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBjb3VudGVyIHZhbHVlLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KICAgKiBAcm10b2xsIENOVCAgICAgICAgICBDTlQgICAgICAgICAgIExMX1RJTV9TZXRDb3VudGVyCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0xNTA5LDcgKzE1MDAsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEdldCB0aGUgY291bnRlciB2YWx1ZS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCiAgICogQHJtdG9sbCBDTlQgICAgICAgICAgQ05UICAgICAgICAgICBMTF9USU1fR2V0Q291bnRlcgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMTU2Myw3ICsxNTU0LDcgQEAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KICAgKiBAbm90ZSBUaGUgY291bnRlciBpcyBibG9ja2VkIHdoaWxlIHRoZSBhdXRvLXJlbG9hZCB2YWx1ZSBpcyBudWxsLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KICAgKiBAbm90ZSBIZWxwZXIgbWFjcm8gQHJlZiBfX0xMX1RJTV9DQUxDX0FSUiBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIEF1dG9SZWxvYWQgcGFyYW1ldGVyCiAgICogQHJtdG9sbCBBUlIgICAgICAgICAgQVJSICAgICAgICAgICBMTF9USU1fU2V0QXV0b1JlbG9hZApAQCAtMTU3OSw3ICsxNTcwLDcgQEAKIC8qKgogICAqIEBicmllZiAgR2V0IHRoZSBhdXRvLXJlbG9hZCB2YWx1ZS4KICAgKiBAcm10b2xsIEFSUiAgICAgICAgICBBUlIgICAgICAgICAgIExMX1RJTV9HZXRBdXRvUmVsb2FkCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQogICAqIEByZXR2YWwgQXV0by1yZWxvYWQgdmFsdWUKQEAgLTE1OTIsMTEgKzE1ODMsMTEgQEAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSByZXBldGl0aW9uIGNvdW50ZXIgdmFsdWUuCiAgICogQG5vdGUgRm9yIGFkdmFuY2VkIHRpbWVyIGluc3RhbmNlcyBSZXBldGl0aW9uQ291bnRlciBjYW4gYmUgdXAgdG8gNjU1MzUuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX1JFUEVUSVRJT05fQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSByZXBldGl0aW9uIGNvdW50ZXIuCiAgICogQHJtdG9sbCBSQ1IgICAgICAgICAgUkVQICAgICAgICAgICBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXIKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKLSAgKiBAcGFyYW0gIFJlcGV0aXRpb25Db3VudGVyIGJldHdlZW4gTWluX0RhdGE9MCBhbmQgTWF4X0RhdGE9MjU1CisgICogQHBhcmFtICBSZXBldGl0aW9uQ291bnRlciBiZXR3ZWVuIE1pbl9EYXRhPTAgYW5kIE1heF9EYXRhPTI1NSBvciA2NTUzNSBmb3IgYWR2YW5jZWQgdGltZXIuCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9USU1fU2V0UmVwZXRpdGlvbkNvdW50ZXIoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IFJlcGV0aXRpb25Db3VudGVyKQpAQCAtMTYwNiw3ICsxNTk3LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBHZXQgdGhlIHJlcGV0aXRpb24gY291bnRlciB2YWx1ZS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9SRVBFVElUSU9OX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fUkVQRVRJVElPTl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIHJlcGV0aXRpb24gY291bnRlci4KICAgKiBAcm10b2xsIFJDUiAgICAgICAgICBSRVAgICAgICAgICAgIExMX1RJTV9HZXRSZXBldGl0aW9uQ291bnRlcgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMTY0MSw2ICsxNjMyLDE2IEBACiB9CiAKIC8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciB1cGRhdGUgaW50ZXJydXB0IGZsYWcgKFVJRikgY29weSBpcyBzZXQuCisgICogQHBhcmFtICBDb3VudGVyIENvdW50ZXIgdmFsdWUKKyAgKiBAcmV0dmFsIFN0YXRlIG9mIGJpdCAoMSBvciAwKS4KKyAgKi8KK19fU1RBVElDX0lOTElORSB1aW50MzJfdCBMTF9USU1fSXNBY3RpdmVVSUZDUFkodWludDMyX3QgQ291bnRlcikKK3sKKyAgcmV0dXJuICgoKENvdW50ZXIgJiBUSU1fQ05UX1VJRkNQWSkgPT0gKFRJTV9DTlRfVUlGQ1BZKSkgPyAxVUwgOiAwVUwpOworfQorCisvKioKICAgKiBAfQogICAqLwogCkBAIC0xNjUyLDcgKzE2NTMsNyBAQAogICAqIEBub3RlIENDeEUsIENDeE5FIGFuZCBPQ3hNIGJpdHMgYXJlIHByZWxvYWRlZCwgYWZ0ZXIgaGF2aW5nIGJlZW4gd3JpdHRlbiwKICAgKiAgICAgICB0aGV5IGFyZSB1cGRhdGVkIG9ubHkgd2hlbiBhIGNvbW11dGF0aW9uIGV2ZW50IChDT00pIG9jY3Vycy4KICAgKiBAbm90ZSBPbmx5IG9uIGNoYW5uZWxzIHRoYXQgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgb3V0cHV0LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NPTU1VVEFUSU9OX0VWRU5UX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBpcyBhYmxlIHRvIGdlbmVyYXRlIGEgY29tbXV0YXRpb24gZXZlbnQuCiAgICogQHJtdG9sbCBDUjIgICAgICAgICAgQ0NQQyAgICAgICAgICBMTF9USU1fQ0NfRW5hYmxlUHJlbG9hZAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMTY2NSw3ICsxNjY2LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlICB0aGUgY2FwdHVyZS9jb21wYXJlIGNvbnRyb2wgYml0cyAoQ0N4RSwgQ0N4TkUgYW5kIE9DeE0pIHByZWxvYWQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFibGUgdG8gZ2VuZXJhdGUgYSBjb21tdXRhdGlvbiBldmVudC4KICAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1BDICAgICAgICAgIExMX1RJTV9DQ19EaXNhYmxlUHJlbG9hZAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMTY3OCw3ICsxNjc5LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZXQgdGhlIHVwZGF0ZWQgc291cmNlIG9mIHRoZSBjYXB0dXJlL2NvbXBhcmUgY29udHJvbCBiaXRzIChDQ3hFLCBDQ3hORSBhbmQgT0N4TSkuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGlzIGFibGUgdG8gZ2VuZXJhdGUgYSBjb21tdXRhdGlvbiBldmVudC4KICAgKiBAcm10b2xsIENSMiAgICAgICAgICBDQ1VTICAgICAgICAgIExMX1RJTV9DQ19TZXRVcGRhdGUKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTE3MjIsNyArMTcyMyw3IEBACiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgbG9jayBsZXZlbCB0byBmcmVlemUgdGhlCiAgICogICAgICAgICBjb25maWd1cmF0aW9uIG9mIHNldmVyYWwgY2FwdHVyZS9jb21wYXJlIHBhcmFtZXRlcnMuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICB0aGUgbG9jayBtZWNoYW5pc20gaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgTE9DSyAgICAgICAgICBMTF9USU1fQ0NfU2V0TG9ja0xldmVsCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yMDI0LDcgKzIwMjUsNyBAQAogLyoqCiAgICogQGJyaWVmICBTZXQgdGhlIElETEUgc3RhdGUgb2YgYW4gb3V0cHV0IGNoYW5uZWwKICAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25pZmljYW50IG9ubHkgZm9yIHRoZSB0aW1lciBpbnN0YW5jZXMKLSAgKiAgICAgICBzdXBwb3J0aW5nIHRoZSBicmVhayBmZWF0dXJlLiBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KQorICAqICAgICAgIHN1cHBvcnRpbmcgdGhlIGJyZWFrIGZlYXR1cmUuIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KQogICAqICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMKICAgKiAgICAgICBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQ1IyICAgICAgICAgT0lTMSAgICAgICAgICBMTF9USU1fT0NfU2V0SWRsZVN0YXRlXG4KQEAgLTIyNDgsNyArMjI0OSw3IEBACiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSBjbGVhcmluZyB0aGUgb3V0cHV0IGNoYW5uZWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCiAgICogQG5vdGUgVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGluIE91dHB1dCBjb21wYXJlIGFuZCBQV00gbW9kZXMuIEl0IGRvZXMgbm90IHdvcmsgaW4gRm9yY2VkIG1vZGUuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fT0NYUkVGX0NMRUFSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKICAgKiAgICAgICBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gY2xlYXIgdGhlIE9DeFJFRiBzaWduYWwgb24gYW4gZXh0ZXJuYWwgZXZlbnQuCiAgICogQHJtdG9sbCBDQ01SMSAgICAgICAgT0MxQ0UgICAgICAgICAgTExfVElNX09DX0VuYWJsZUNsZWFyXG4KICAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRW5hYmxlQ2xlYXJcbgpAQCAtMjI3NSw3ICsyMjc2LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIGNsZWFyaW5nIHRoZSBvdXRwdXQgY2hhbm5lbCBvbiBhbiBleHRlcm5hbCBldmVudC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqIEBub3RlIE1hY3JvIElTX1RJTV9PQ1hSRUZfQ0xFQVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgogICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGNhbiBjbGVhciB0aGUgT0N4UkVGIHNpZ25hbCBvbiBhbiBleHRlcm5hbCBldmVudC4KICAgKiBAcm10b2xsIENDTVIxICAgICAgICBPQzFDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KICAgKiAgICAgICAgIENDTVIxICAgICAgICBPQzJDRSAgICAgICAgICBMTF9USU1fT0NfRGlzYWJsZUNsZWFyXG4KQEAgLTIzMDQsNyArMjMwNSw3IEBACiAgICogQGJyaWVmICBJbmRpY2F0ZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50IGlzIGVuYWJsZWQgZm9yIHRoZSBvdXRwdXQgY2hhbm5lbC4KICAgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgY2xlYXJpbmcgdGhlIG91dHB1dCBjaGFubmVsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgogICAqIEBub3RlIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBPdXRwdXQgY29tcGFyZSBhbmQgUFdNIG1vZGVzLiBJdCBkb2VzIG5vdCB3b3JrIGluIEZvcmNlZCBtb2RlLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCisgICogQG5vdGUgTWFjcm8gSVNfVElNX09DWFJFRl9DTEVBUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCiAgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgY2FuIGNsZWFyIHRoZSBPQ3hSRUYgc2lnbmFsIG9uIGFuIGV4dGVybmFsIGV2ZW50LgogICAqIEBybXRvbGwgQ0NNUjEgICAgICAgIE9DMUNFICAgICAgICAgIExMX1RJTV9PQ19Jc0VuYWJsZWRDbGVhclxuCiAgICogICAgICAgICBDQ01SMSAgICAgICAgT0MyQ0UgICAgICAgICAgTExfVElNX09DX0lzRW5hYmxlZENsZWFyXG4KQEAgLTIzMzIsNyArMjMzMyw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBkZWFkLXRpbWUgZGVsYXkgKGRlbGF5IGluc2VydGVkIGJldHdlZW4gdGhlIHJpc2luZyBlZGdlIG9mIHRoZSBPQ3hSRUYgc2lnbmFsIGFuZCB0aGUgcmlzaW5nIGVkZ2Ugb2YgdGhlIE9jeCBhbmQgT0N4TiBzaWduYWxzKS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIGRlYWQtdGltZSBpbnNlcnRpb24gZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAbm90ZSBIZWxwZXIgbWFjcm8gQHJlZiBfX0xMX1RJTV9DQUxDX0RFQURUSU1FIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgRGVhZFRpbWUgcGFyYW1ldGVyCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgRFRHICAgICAgICAgICBMTF9USU1fT0NfU2V0RGVhZFRpbWUKQEAgLTIzNDgsOSArMjM0OSw5IEBACiAvKioKICAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCAxIChUSU14X0NDUjEpLgogICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgY29tcGFyZSB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ0MxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgb3V0cHV0IGNoYW5uZWwgMSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENDUjEgICAgICAgICBDQ1IxICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gxCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yMzY1LDkgKzIzNjYsOSBAQAogLyoqCiAgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgMiAoVElNeF9DQ1IyKS4KICAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIG91dHB1dCBjaGFubmVsIDIgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDQ1IyICAgICAgICAgQ0NSMiAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNIMgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjM4Miw5ICsyMzgzLDkgQEAKIC8qKgogICAqIEBicmllZiAgU2V0IGNvbXBhcmUgdmFsdWUgZm9yIG91dHB1dCBjaGFubmVsIDMgKFRJTXhfQ0NSMykuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0gzCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yMzk5LDkgKzI0MDAsOSBAQAogLyoqCiAgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNCAoVElNeF9DQ1I0KS4KICAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIGNvbXBhcmUgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M0X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIG91dHB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fT0NfU2V0Q29tcGFyZUNINAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjQxNSw3ICsyNDE2LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZXQgY29tcGFyZSB2YWx1ZSBmb3Igb3V0cHV0IGNoYW5uZWwgNSAoVElNeF9DQ1I1KS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19TZXRDb21wYXJlQ0g1CiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yNDI5LDcgKzI0MzAsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCBjb21wYXJlIHZhbHVlIGZvciBvdXRwdXQgY2hhbm5lbCA2IChUSU14X0NDUjYpLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzZfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA2IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSNiAgICAgICAgIENDUjYgICAgICAgICAgTExfVElNX09DX1NldENvbXBhcmVDSDYKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI0NDQsOSArMjQ0NSw5IEBACiAvKioKICAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjEpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDEuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAxIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSMSAgICAgICAgIENDUjEgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDEKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI0NjAsOSArMjQ2MSw5IEBACiAvKioKICAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjIpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDIuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDIKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI0NzYsOSArMjQ3Nyw5IEBACiAvKioKICAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjMpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDMuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzNfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCAzIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSMyAgICAgICAgIENDUjMgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDMKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI0OTIsOSArMjQ5Myw5IEBACiAvKioKICAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjQpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDQuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjb21wYXJlIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBvdXRwdXQgY2hhbm5lbCA0IGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSNCAgICAgICAgIENDUjQgICAgICAgICAgTExfVElNX09DX0dldENvbXBhcmVDSDQKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI1MDcsNyArMjUwOCw3IEBACiAKIC8qKgogICAqIEBicmllZiAgR2V0IGNvbXBhcmUgdmFsdWUgKFRJTXhfQ0NSNSkgc2V0IGZvciAgb3V0cHV0IGNoYW5uZWwgNS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ0M1X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgb3V0cHV0IGNoYW5uZWwgNSBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENDUjUgICAgICAgICBDQ1I1ICAgICAgICAgIExMX1RJTV9PQ19HZXRDb21wYXJlQ0g1CiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yNTIwLDcgKzI1MjEsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEdldCBjb21wYXJlIHZhbHVlIChUSU14X0NDUjYpIHNldCBmb3IgIG91dHB1dCBjaGFubmVsIDYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0M2X0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NDNl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIG91dHB1dCBjaGFubmVsIDYgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDQ1I2ICAgICAgICAgQ0NSNiAgICAgICAgICBMTF9USU1fT0NfR2V0Q29tcGFyZUNINgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjUzMyw3ICsyNTM0LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZWxlY3Qgb24gd2hpY2ggcmVmZXJlbmNlIHNpZ25hbCB0aGUgT0M1UkVGIGlzIGNvbWJpbmVkIHRvLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NPTUJJTkVEM1BIQVNFUFdNX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NPTUJJTkVEM1BIQVNFUFdNX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgY29tYmluZWQgMy1waGFzZSBQV00gbW9kZS4KICAgKiBAcm10b2xsIENDUjUgICAgICAgICBHQzVDMyAgICAgICAgICBMTF9USU1fU2V0Q0g1Q29tYmluZWRDaGFubmVsc1xuCiAgICogICAgICAgICBDQ1I1ICAgICAgICAgR0M1QzIgICAgICAgICAgTExfVElNX1NldENINUNvbWJpbmVkQ2hhbm5lbHNcbgpAQCAtMjgzNyw3ICsyODM4LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBDb25uZWN0IHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyAgdG8gdGhlIFRJMSBpbnB1dCAoWE9SIGNvbWJpbmF0aW9uKS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCiAgICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfRW5hYmxlWE9SQ29tYmluYXRpb24KICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI4NTAsNyArMjg1MSw3IEBACiAKIC8qKgogICAqIEBicmllZiAgRGlzY29ubmVjdCB0aGUgVElNeF9DSDEsIENIMiBhbmQgQ0gzIHBpbnMgIGZyb20gdGhlIFRJMSBpbnB1dC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9YT1JfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBYT1IgaW5wdXQuCiAgICogQHJtdG9sbCBDUjIgICAgICAgICAgVEkxUyAgICAgICAgICBMTF9USU1fSUNfRGlzYWJsZVhPUkNvbWJpbmF0aW9uCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yODYzLDcgKzI4NjQsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBUSU14X0NIMSwgQ0gyIGFuZCBDSDMgcGlucyBhcmUgY29ubmVjdGVjdGVkIHRvIHRoZSBUSTEgaW5wdXQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fWE9SX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX1hPUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYW4gWE9SIGlucHV0LgogICAqIEBybXRvbGwgQ1IyICAgICAgICAgIFRJMVMgICAgICAgICAgTExfVElNX0lDX0lzRW5hYmxlZFhPUkNvbWJpbmF0aW9uCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yODc3LDkgKzI4NzgsOSBAQAogLyoqCiAgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgMS4KICAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDMV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzFfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBpbnB1dCBjaGFubmVsIDEgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDQ1IxICAgICAgICAgQ0NSMSAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNIMQogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjg5Myw5ICsyODk0LDkgQEAKIC8qKgogICAqIEBicmllZiAgR2V0IGNhcHR1cmVkIHZhbHVlIGZvciBpbnB1dCBjaGFubmVsIDIuCiAgICogQG5vdGUgSW4gMzItYml0IHRpbWVyIGltcGxlbWVudGF0aW9ucyByZXR1cm5lZCBjYXB0dXJlZCB2YWx1ZSBjYW4gYmUgYmV0d2VlbiAweDAwMDAwMDAwIGFuZCAweEZGRkZGRkZGLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNXzMyQl9DT1VOVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBhIDMyIGJpdHMgY291bnRlci4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DQzJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQ0MyX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgaW5wdXQgY2hhbm5lbCAyIGlzIHN1cHBvcnRlZCBieSBhIHRpbWVyIGluc3RhbmNlLgogICAqIEBybXRvbGwgQ0NSMiAgICAgICAgIENDUjIgICAgICAgICAgTExfVElNX0lDX0dldENhcHR1cmVDSDIKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI5MDksOSArMjkxMCw5IEBACiAvKioKICAgKiBAYnJpZWYgIEdldCBjYXB0dXJlZCB2YWx1ZSBmb3IgaW5wdXQgY2hhbm5lbCAzLgogICAqIEBub3RlIEluIDMyLWJpdCB0aW1lciBpbXBsZW1lbnRhdGlvbnMgcmV0dXJuZWQgY2FwdHVyZWQgdmFsdWUgY2FuIGJlIGJldHdlZW4gMHgwMDAwMDAwMCBhbmQgMHhGRkZGRkZGRi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV8zMkJfQ09VTlRFUl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgYSAzMiBiaXRzIGNvdW50ZXIuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQ0MzX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NDM19JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIGlucHV0IGNoYW5uZWwgMyBpcyBzdXBwb3J0ZWQgYnkgYSB0aW1lciBpbnN0YW5jZS4KICAgKiBAcm10b2xsIENDUjMgICAgICAgICBDQ1IzICAgICAgICAgIExMX1RJTV9JQ19HZXRDYXB0dXJlQ0gzCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0yOTI1LDkgKzI5MjYsOSBAQAogLyoqCiAgICogQGJyaWVmICBHZXQgY2FwdHVyZWQgdmFsdWUgZm9yIGlucHV0IGNoYW5uZWwgNC4KICAgKiBAbm90ZSBJbiAzMi1iaXQgdGltZXIgaW1wbGVtZW50YXRpb25zIHJldHVybmVkIGNhcHR1cmVkIHZhbHVlIGNhbiBiZSBiZXR3ZWVuIDB4MDAwMDAwMDAgYW5kIDB4RkZGRkZGRkYuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fMzJCX0NPVU5URVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKICAgKiAgICAgICB3aGV0aGVyIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIHN1cHBvcnRzIGEgMzIgYml0cyBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NDNF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9DQzRfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBpbnB1dCBjaGFubmVsIDQgaXMgc3VwcG9ydGVkIGJ5IGEgdGltZXIgaW5zdGFuY2UuCiAgICogQHJtdG9sbCBDQ1I0ICAgICAgICAgQ0NSNCAgICAgICAgICBMTF9USU1fSUNfR2V0Q2FwdHVyZUNINAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjk0OCw3ICsyOTQ5LDcgQEAKIC8qKgogICAqIEBicmllZiAgRW5hYmxlIGV4dGVybmFsIGNsb2NrIG1vZGUgMi4KICAgKiBAbm90ZSBXaGVuIGV4dGVybmFsIGNsb2NrIG1vZGUgMiBpcyBlbmFibGVkIHRoZSBjb3VudGVyIGlzIGNsb2NrZWQgYnkgYW55IGFjdGl2ZSBlZGdlIG9uIHRoZSBFVFJGIHNpZ25hbC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fRW5hYmxlRXh0ZXJuYWxDbG9jawogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjk2MSw3ICsyOTYyLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIGV4dGVybmFsIGNsb2NrIG1vZGUgMi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUV4dGVybmFsQ2xvY2sKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTI5NzQsNyArMjk3NSw3IEBACiAKIC8qKgogICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBleHRlcm5hbCBjbG9jayBtb2RlIDIgaXMgZW5hYmxlZC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgRUNFICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkRXh0ZXJuYWxDbG9jawogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMjk5MSw5ICsyOTkyLDkgQEAKICAgKiAgICAgICB0aGUgZXh0ZXJuYWwgY2xvY2sgaXMgYXBwbGllZCBpcyBzZWxlY3RlZCBieSBjYWxsaW5nIHRoZSBAcmVmIExMX1RJTV9TZXRUcmlnZ2VySW5wdXQoKQogICAqICAgICAgIGZ1bmN0aW9uLiBUaGlzIHRpbWVyIGlucHV0IG11c3QgYmUgY29uZmlndXJlZCBieSBjYWxsaW5nCiAgICogICAgICAgdGhlIEByZWYgTExfVElNX0lDX0NvbmZpZygpIGZ1bmN0aW9uLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX0NMT0NLU09VUkNFX0VUUk1PREUxX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyBleHRlcm5hbCBjbG9jayBtb2RlMS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV9DTE9DS1NPVVJDRV9FVFJNT0RFMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgZXh0ZXJuYWwgY2xvY2sgbW9kZTIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0Q2xvY2tTb3VyY2VcbgogICAqICAgICAgICAgU01DUiAgICAgICAgIEVDRSAgICAgICAgICAgTExfVElNX1NldENsb2NrU291cmNlCkBAIC0zMDExLDcgKzMwMTIsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UgbW9kZS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjaworICAqIEBub3RlIE1hY3JvIElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjawogICAqICAgICAgIHdoZXRoZXIgb3Igbm90IGEgdGltZXIgaW5zdGFuY2Ugc3VwcG9ydHMgdGhlIGVuY29kZXIgbW9kZS4KICAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBTTVMgICAgICAgICAgIExMX1RJTV9TZXRFbmNvZGVyTW9kZQogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzAzNSw3ICszMDM2LDcgQEAKICAgKi8KIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSB0cmlnZ2VyIG91dHB1dCAoVFJHTykgdXNlZCBmb3IgdGltZXIgc3luY2hyb25pemF0aW9uIC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9NQVNURVJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fTUFTVEVSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIG1hc3RlciB0aW1lci4KICAgKiBAcm10b2xsIENSMiAgICAgICAgICBNTVMgICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0CiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMDU3LDcgKzMwNTgsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgdHJpZ2dlciBvdXRwdXQgMiAoVFJHTzIpIHVzZWQgZm9yIEFEQyBzeW5jaHJvbml6YXRpb24gLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1RSR08yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgICogQG5vdGUgTWFjcm8gSVNfVElNX1RSR08yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCiAgICogICAgICAgd2hldGhlciBvciBub3QgYSB0aW1lciBpbnN0YW5jZSBjYW4gYmUgdXNlZCBmb3IgQURDIHN5bmNocm9uaXphdGlvbi4KICAgKiBAcm10b2xsIENSMiAgICAgICAgICBNTVMyICAgICAgICAgIExMX1RJTV9TZXRUcmlnZ2VyT3V0cHV0MgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQpAQCAtMzA4Nyw3ICszMDg4LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBtb2RlIG9mIGEgc2xhdmUgdGltZXIuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgU01TICAgICAgICAgICBMTF9USU1fU2V0U2xhdmVNb2RlCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMTA2LDcgKzMxMDcsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCB0aGUgc2VsZWN0cyB0aGUgdHJpZ2dlciBpbnB1dCB0byBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBjb3VudGVyLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgogICAqIEBybXRvbGwgU01DUiAgICAgICAgIFRTICAgICAgICAgICAgTExfVElNX1NldFRyaWdnZXJJbnB1dAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzEyOCw3ICszMTI5LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBFbmFibGUgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX1NMQVZFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBjYW4gb3BlcmF0ZSBhcyBhIHNsYXZlIHRpbWVyLgogICAqIEBybXRvbGwgU01DUiAgICAgICAgIE1TTSAgICAgICAgICAgTExfVElNX0VuYWJsZU1hc3RlclNsYXZlTW9kZQogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzE0MSw3ICszMTQyLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBNYXN0ZXIvU2xhdmUgbW9kZS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9TTEFWRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgY2FuIG9wZXJhdGUgYXMgYSBzbGF2ZSB0aW1lci4KICAgKiBAcm10b2xsIFNNQ1IgICAgICAgICBNU00gICAgICAgICAgIExMX1RJTV9EaXNhYmxlTWFzdGVyU2xhdmVNb2RlCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMTU0LDcgKzMxNTUsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1hc3Rlci9TbGF2ZSBtb2RlIGlzIGVuYWJsZWQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fU0xBVkVfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiBhIHRpbWVyIGluc3RhbmNlIGNhbiBvcGVyYXRlIGFzIGEgc2xhdmUgdGltZXIuCiAgICogQHJtdG9sbCBTTUNSICAgICAgICAgTVNNICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkTWFzdGVyU2xhdmVNb2RlCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMTY3LDcgKzMxNjgsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgZXh0ZXJuYWwgdHJpZ2dlciAoRVRSKSBpbnB1dC4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9FVFJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fRVRSX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhbiBleHRlcm5hbCB0cmlnZ2VyIGlucHV0LgogICAqIEBybXRvbGwgU01DUiAgICAgICAgIEVUUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0VUUlxuCiAgICogICAgICAgICBTTUNSICAgICAgICAgRVRQUyAgICAgICAgICBMTF9USU1fQ29uZmlnRVRSXG4KQEAgLTMyMTUsNyArMzIxNiw3IEBACiAgICovCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktFICAgICAgICAgICBMTF9USU1fRW5hYmxlQlJLCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMjMwLDcgKzMyMzEsNyBAQAogICAqIEBicmllZiAgRGlzYWJsZSB0aGUgYnJlYWsgZnVuY3Rpb24uCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgQktFICAgICAgICAgICBMTF9USU1fRGlzYWJsZUJSSwogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEByZXR2YWwgTm9uZQogICAqLwpAQCAtMzI0MSw3ICszMjQyLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGJyZWFrIGlucHV0LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEJLUCAgICAgICAgICAgTExfVElNX0NvbmZpZ0JSS1xuCiAgICogICAgICAgICBCRFRSICAgICAgICAgQktGICAgICAgICAgICBMTF9USU1fQ29uZmlnQlJLCkBAIC0zMjY4LDE0ICszMjY5LDE1IEBACiAgICogICAgICAgICBAYXJnIEByZWYgTExfVElNX0JSRUFLX0ZJTFRFUl9GRElWMzJfTjgKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLV9fU1RBVElDX0lOTElORSB2b2lkIExMX1RJTV9Db25maWdCUksoVElNX1R5cGVEZWYgKlRJTXgsIHVpbnQzMl90IEJyZWFrUG9sYXJpdHksIHVpbnQzMl90IEJyZWFrRmlsdGVyKQorX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVElNX0NvbmZpZ0JSSyhUSU1fVHlwZURlZiAqVElNeCwgdWludDMyX3QgQnJlYWtQb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQnJlYWtGaWx0ZXIpCiB7CiAgIE1PRElGWV9SRUcoVElNeC0+QkRUUiwgVElNX0JEVFJfQktQIHwgVElNX0JEVFJfQktGLCBCcmVha1BvbGFyaXR5IHwgQnJlYWtGaWx0ZXIpOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSB0aGUgYnJlYWsgMiBmdW5jdGlvbi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgQksyRSAgICAgICAgICBMTF9USU1fRW5hYmxlQlJLMgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzI4OCw3ICszMjkwLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBicmVhayAgMiBmdW5jdGlvbi4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqIEBub3RlIE1hY3JvIElTX1RJTV9CS0lOMl9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAogICAqICAgICAgIGEgdGltZXIgaW5zdGFuY2UgcHJvdmlkZXMgYSBzZWNvbmQgYnJlYWsgaW5wdXQuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgQksyRSAgICAgICAgICBMTF9USU1fRGlzYWJsZUJSSzIKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTMzMDEsNyArMzMwMyw3IEBACiAKIC8qKgogICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBicmVhayAyIGlucHV0LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JLSU4yX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIHNlY29uZCBicmVhayBpbnB1dC4KICAgKiBAcm10b2xsIEJEVFIgICAgICAgICBCSzJQICAgICAgICAgIExMX1RJTV9Db25maWdCUksyXG4KICAgKiAgICAgICAgIEJEVFIgICAgICAgICBCSzJGICAgICAgICAgIExMX1RJTV9Db25maWdCUksyCkBAIC0zMzM1LDcgKzMzMzcsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbGVjdCB0aGUgb3V0cHV0cyBvZmYgc3RhdGUgKGVuYWJsZWQgdi5zLiBkaXNhYmxlZCkgaW4gSWRsZSBhbmQgUnVuIG1vZGVzLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE9TU0kgICAgICAgICAgTExfVElNX1NldE9mZlN0YXRlc1xuCiAgICogICAgICAgICBCRFRSICAgICAgICAgT1NTUiAgICAgICAgICBMTF9USU1fU2V0T2ZmU3RhdGVzCkBAIC0zMzU1LDcgKzMzNTcsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZSBhdXRvbWF0aWMgb3V0cHV0IChNT0UgY2FuIGJlIHNldCBieSBzb2Z0d2FyZSBvciBhdXRvbWF0aWNhbGx5IHdoZW4gYSBicmVhayBpbnB1dCBpcyBhY3RpdmUpLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0VuYWJsZUF1dG9tYXRpY091dHB1dAogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzM2OCw3ICszMzcwLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBEaXNhYmxlIGF1dG9tYXRpYyBvdXRwdXQgKE1PRSBjYW4gYmUgc2V0IG9ubHkgYnkgc29mdHdhcmUpLgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIEFPRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBdXRvbWF0aWNPdXRwdXQKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTMzODEsNyArMzM4Myw3IEBACiAKIC8qKgogICAqIEBicmllZiAgSW5kaWNhdGUgd2hldGhlciBhdXRvbWF0aWMgb3V0cHV0IGlzIGVuYWJsZWQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgQU9FICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQXV0b21hdGljT3V0cHV0CiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zMzk2LDcgKzMzOTgsNyBAQAogICAqIEBicmllZiAgRW5hYmxlIHRoZSBvdXRwdXRzIChzZXQgdGhlIE1PRSBiaXQgaW4gVElNeF9CRFRSIHJlZ2lzdGVyKS4KICAgKiBAbm90ZSBUaGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIgYWxsb3dzIHRvIGVuYWJsZSAvZGlzYWJsZSB0aGUgb3V0cHV0cyBieQogICAqICAgICAgIHNvZnR3YXJlIGFuZCBpcyByZXNldCBpbiBjYXNlIG9mIGJyZWFrIG9yIGJyZWFrMiBldmVudAotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE1PRSAgICAgICAgICAgTExfVElNX0VuYWJsZUFsbE91dHB1dHMKICAgKiBAcGFyYW0gIFRJTXggVGltZXIgaW5zdGFuY2UKQEAgLTM0MTEsNyArMzQxMyw3IEBACiAgICogQGJyaWVmICBEaXNhYmxlIHRoZSBvdXRwdXRzIChyZXNldCB0aGUgTU9FIGJpdCBpbiBUSU14X0JEVFIgcmVnaXN0ZXIpLgogICAqIEBub3RlIFRoZSBNT0UgYml0IGluIFRJTXhfQkRUUiByZWdpc3RlciBhbGxvd3MgdG8gZW5hYmxlIC9kaXNhYmxlIHRoZSBvdXRwdXRzIGJ5CiAgICogICAgICAgc29mdHdhcmUgYW5kIGlzIHJlc2V0IGluIGNhc2Ugb2YgYnJlYWsgb3IgYnJlYWsyIGV2ZW50LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogQG5vdGUgTWFjcm8gSVNfVElNX0JSRUFLX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CiAgICogICAgICAgYSB0aW1lciBpbnN0YW5jZSBwcm92aWRlcyBhIGJyZWFrIGlucHV0LgogICAqIEBybXRvbGwgQkRUUiAgICAgICAgIE1PRSAgICAgICAgICAgTExfVElNX0Rpc2FibGVBbGxPdXRwdXRzCiAgICogQHBhcmFtICBUSU14IFRpbWVyIGluc3RhbmNlCkBAIC0zNDI0LDcgKzM0MjYsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluZGljYXRlcyB3aGV0aGVyIG91dHB1dHMgYXJlIGVuYWJsZWQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCiAgICogQHJtdG9sbCBCRFRSICAgICAgICAgTU9FICAgICAgICAgICBMTF9USU1fSXNFbmFibGVkQWxsT3V0cHV0cwogICAqIEBwYXJhbSAgVElNeCBUaW1lciBpbnN0YW5jZQpAQCAtMzQzOCw3ICszNDQwLDcgQEAKICNpZiBkZWZpbmVkKFRJTV9CUkVBS19JTlBVVF9TVVBQT1JUKQogLyoqCiAgICogQGJyaWVmICBFbmFibGUgdGhlIHNpZ25hbHMgY29ubmVjdGVkIHRvIHRoZSBkZXNpZ25hdGVkIHRpbWVyIGJyZWFrIGlucHV0LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgogICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGFsbG93cyBmb3IgYnJlYWsgaW5wdXQgc2VsZWN0aW9uLgogICAqIEBybXRvbGwgQUYxICAgICAgICAgIEJLSU5FICAgICAgICAgIExMX1RJTV9FbmFibGVCcmVha0lucHV0U291cmNlXG4KICAgKiAgICAgICAgIEFGMSAgICAgICAgICBCS0RGQktFICAgICAgICBMTF9USU1fRW5hYmxlQnJlYWtJbnB1dFNvdXJjZVxuCkBAIC0zNDYxLDcgKzM0NjMsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgdGhlIHNpZ25hbHMgY29ubmVjdGVkIHRvIHRoZSBkZXNpZ25hdGVkIHRpbWVyIGJyZWFrIGlucHV0LgotICAqIEBub3RlIE1hY3JvIEByZWYgSVNfVElNX0JSRUFLU09VUkNFX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgogICAqICAgICAgIG9yIG5vdCBhIHRpbWVyIGluc3RhbmNlIGFsbG93cyBmb3IgYnJlYWsgaW5wdXQgc2VsZWN0aW9uLgogICAqIEBybXRvbGwgQUYxICAgICAgICAgIEJLSU5FICAgICAgICAgIExMX1RJTV9EaXNhYmxlQnJlYWtJbnB1dFNvdXJjZVxuCiAgICogICAgICAgICBBRjEgICAgICAgICAgQktERkJLRSAgICAgICAgTExfVElNX0Rpc2FibGVCcmVha0lucHV0U291cmNlXG4KQEAgLTM0ODQsNyArMzQ4Niw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU2V0IHRoZSBwb2xhcml0eSBvZiB0aGUgYnJlYWsgc2lnbmFsIGZvciB0aGUgdGltZXIgYnJlYWsgaW5wdXQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtTT1VSQ0VfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlcgorICAqIEBub3RlIE1hY3JvIElTX1RJTV9CUkVBS1NPVVJDRV9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyCiAgICogICAgICAgb3Igbm90IGEgdGltZXIgaW5zdGFuY2UgYWxsb3dzIGZvciBicmVhayBpbnB1dCBzZWxlY3Rpb24uCiAgICogQHJtdG9sbCBBRjEgICAgICAgICAgQktJTkUgICAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCiAgICogICAgICAgICBBRjEgICAgICAgICAgQktERkJLRSAgICAgICAgTExfVElNX1NldEJyZWFrSW5wdXRTb3VyY2VQb2xhcml0eVxuCkBAIC0zNTE4LDcgKzM1MjAsNyBAQAogICAqLwogLyoqCiAgICogQGJyaWVmICBDb25maWd1cmVzIHRoZSB0aW1lciBETUEgYnVyc3QgZmVhdHVyZS4KLSAgKiBAbm90ZSBNYWNybyBAcmVmIElTX1RJTV9ETUFCVVJTVF9JTlNUQU5DRShUSU14KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yCisgICogQG5vdGUgTWFjcm8gSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKFRJTXgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3IKICAgKiAgICAgICBub3QgYSB0aW1lciBpbnN0YW5jZSBzdXBwb3J0cyB0aGUgRE1BIGJ1cnN0IG1vZGUuCiAgICogQHJtdG9sbCBEQ1IgICAgICAgICAgREJMICAgICAgICAgICBMTF9USU1fQ29uZmlnRE1BQnVyc3RcbgogICAqICAgICAgICAgRENSICAgICAgICAgIERCQSAgICAgICAgICAgTExfVElNX0NvbmZpZ0RNQUJ1cnN0CkBAIC0zNTg0LDcgKzM1ODYsNyBAQAogICAqLwogLyoqCiAgICogQGJyaWVmICBSZW1hcCBUSU0gaW5wdXRzIChpbnB1dCBjaGFubmVsLCBpbnRlcm5hbC9leHRlcm5hbCB0cmlnZ2VycykuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fUkVNQVBfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fUkVNQVBfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHNvbWUgdGltZXIgaW5wdXRzIGNhbiBiZSByZW1hcHBlZC4KICAgKiBAcm10b2xsIFRJTTJfT1IgICAgIElUUjFfUk1QICAgICAgICAgIExMX1RJTV9TZXRSZW1hcFxuCiAgICogICAgICAgICBUSU01X09SICAgICBUSTRfUk1QICAgICAgICAgICBMTF9USU1fU2V0UmVtYXBcbgpkaWZmIC0tZ2l0IGEvSW5jL3N0bTMyZjd4eF9sbF91c2FydC5oIGIvSW5jL3N0bTMyZjd4eF9sbF91c2FydC5oCmluZGV4IGRmNWRiNWUuLjVhODk2ODggMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfbGxfdXNhcnQuaAorKysgYi9JbmMvc3RtMzJmN3h4X2xsX3VzYXJ0LmgKQEAgLTQyLDEzICs0Miw2IEBACiAvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX0NvbnN0YW50cyBVU0FSVCBQcml2YXRlIENvbnN0YW50cwotICAqIEB7Ci0gICovCi0vKioKLSAgKiBAfQotICAqLwotCiAvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2lmIGRlZmluZWQoVVNFX0ZVTExfTExfRFJJVkVSKQogLyoqIEBkZWZncm91cCBVU0FSVF9MTF9Qcml2YXRlX01hY3JvcyBVU0FSVCBQcml2YXRlIE1hY3JvcwpAQCAtMTU2LDE4ICsxNDksMjEgQEAKICAgKi8KICNkZWZpbmUgTExfVVNBUlRfSUNSX1BFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9QRUNGICAgICAgICAgICAgICAgIC8qITwgUGFyaXR5IGVycm9yIGZsYWcgKi8KICNkZWZpbmUgTExfVVNBUlRfSUNSX0ZFQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9GRUNGICAgICAgICAgICAgICAgIC8qITwgRnJhbWluZyBlcnJvciBmbGFnICovCi0jZGVmaW5lIExMX1VTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgLyohPCBOb2lzZSBlcnJvciBkZXRlY3RlZCBmbGFnICovCisjZGVmaW5lIExMX1VTQVJUX0lDUl9OQ0YgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfTkNGICAgICAgICAgICAgICAgICAvKiE8IE5vaXNlIGVycm9yIGRldGVjdGVkIGZsYWcgKi8KICNkZWZpbmUgTExfVVNBUlRfSUNSX09SRUNGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9PUkVDRiAgICAgICAgICAgICAgIC8qITwgT3ZlcnJ1biBlcnJvciBmbGFnICovCiAjZGVmaW5lIExMX1VTQVJUX0lDUl9JRExFQ0YgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfSURMRUNGICAgICAgICAgICAgICAvKiE8IElkbGUgbGluZSBkZXRlY3RlZCBmbGFnICovCiAjZGVmaW5lIExMX1VTQVJUX0lDUl9UQ0NGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfVENDRiAgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBmbGFnICovCiAjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQogI2RlZmluZSBMTF9VU0FSVF9JQ1JfVENCR1RDRiAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX1RDQkdUQ0YgICAgICAgICAgICAgLyohPCBUcmFuc21pc3Npb24gY29tcGxldGVkIGJlZm9yZSBndWFyZCB0aW1lIGZsYWcgKi8KLSNlbmRpZgorI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KICNkZWZpbmUgTExfVVNBUlRfSUNSX0xCRENGICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lDUl9MQkRDRiAgICAgICAgICAgICAgIC8qITwgTElOIGJyZWFrIGRldGVjdGlvbiBmbGFnICovCiAjZGVmaW5lIExMX1VTQVJUX0lDUl9DVFNDRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfQ1RTQ0YgICAgICAgICAgICAgICAvKiE8IENUUyBmbGFnICovCiAjZGVmaW5lIExMX1VTQVJUX0lDUl9SVE9DRiAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfUlRPQ0YgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmVyIHRpbWVvdXQgZmxhZyAqLwogI2RlZmluZSBMTF9VU0FSVF9JQ1JfRU9CQ0YgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0VPQkNGICAgICAgICAgICAgICAgLyohPCBFbmQgb2YgYmxvY2sgZmxhZyAqLwogI2RlZmluZSBMTF9VU0FSVF9JQ1JfQ01DRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSUNSX0NNQ0YgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLworI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisjZGVmaW5lIExMX1VTQVJUX0lDUl9XVUNGICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JQ1JfV1VDRiAgICAgICAgICAgICAgICAvKiE8IFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnICovCisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0xOTUsMTAgKzE5MSwxNiBAQAogI2RlZmluZSBMTF9VU0FSVF9JU1JfQ01GICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX0NNRiAgICAgICAgICAgICAgICAgLyohPCBDaGFyYWN0ZXIgbWF0Y2ggZmxhZyAqLwogI2RlZmluZSBMTF9VU0FSVF9JU1JfU0JLRiAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1NCS0YgICAgICAgICAgICAgICAgLyohPCBTZW5kIGJyZWFrIGZsYWcgKi8KICNkZWZpbmUgTExfVVNBUlRfSVNSX1JXVSAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0lTUl9SV1UgICAgICAgICAgICAgICAgIC8qITwgUmVjZWl2ZXIgd2FrZXVwIGZyb20gTXV0ZSBtb2RlIGZsYWcgKi8KKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorI2RlZmluZSBMTF9VU0FSVF9JU1JfV1VGICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfSVNSX1dVRiAgICAgICAgICAgICAgICAgLyohPCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgZmxhZyAqLworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAjZGVmaW5lIExMX1VTQVJUX0lTUl9URUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVEVBQ0sgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWl0IGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnICovCisjaWYgZGVmaW5lZChVU0FSVF9JU1JfUkVBQ0spCisjZGVmaW5lIExMX1VTQVJUX0lTUl9SRUFDSyAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfUkVBQ0sgICAgICAgICAgICAgICAvKiE8IFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcgKi8KKyNlbmRpZiAvKiBVU0FSVF9JU1JfUkVBQ0sgKi8KICNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCiAjZGVmaW5lIExMX1VTQVJUX0lTUl9UQ0JHVCAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9JU1JfVENCR1QgICAgICAgICAgICAgICAvKiE8IFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBiZWZvcmUgZ3VhcmQgdGltZSBjb21wbGV0aW9uIGZsYWcgKi8KLSNlbmRpZgorI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0yMTgsOSArMjIwLDEyIEBACiAjZGVmaW5lIExMX1VTQVJUX0NSMl9MQkRJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjJfTEJESUUgICAgICAgICAgICAgICAvKiE8IExJTiBicmVhayBkZXRlY3Rpb24gaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSBMTF9VU0FSVF9DUjNfRUlFICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IzX0VJRSAgICAgICAgICAgICAgICAgLyohPCBFcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lIExMX1VTQVJUX0NSM19DVFNJRSAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjNfQ1RTSUUgICAgICAgICAgICAgICAvKiE8IENUUyBpbnRlcnJ1cHQgZW5hYmxlICovCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKyNkZWZpbmUgTExfVVNBUlRfQ1IzX1dVRklFICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19XVUZJRSAgICAgICAgICAgICAgIC8qITwgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGludGVycnVwdCBlbmFibGUgKi8KKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKICNkZWZpbmUgTExfVVNBUlRfQ1IzX1RDQkdUSUUgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSM19UQ0JHVElFICAgICAgICAgICAgIC8qITwgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGJlZm9yZSBndWFyZCB0aW1lIGludGVycnVwdCBlbmFibGUgKi8KLSNlbmRpZgorI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC00MDAsNiArNDA1LDE4IEBACiAgICogQH0KICAgKi8KIAorI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisvKiogQGRlZmdyb3VwIFVTQVJUX0xMX0VDX1dBS0VVUF9PTiBXYWtldXAgQWN0aXZhdGlvbgorICAqIEB7CisgICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBhZGRyZXNzIG1hdGNoICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9TVEFSVEJJVCAgICAgICAgICAgICBVU0FSVF9DUjNfV1VTXzEgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBTdGFydCBiaXQgZGV0ZWN0aW9uICovCisjZGVmaW5lIExMX1VTQVJUX1dBS0VVUF9PTl9SWE5FICAgICAgICAgICAgICAgICAoVVNBUlRfQ1IzX1dVU18wIHwgVVNBUlRfQ1IzX1dVU18xKSAgICAgLyohPCBXYWtlIHVwIGFjdGl2ZSBvbiBSWE5FICovCisvKioKKyAgKiBAfQorICAqLworCisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KIC8qKiBAZGVmZ3JvdXAgVVNBUlRfTExfRUNfSVJEQV9QT1dFUiBJckRBIFBvd2VyCiAgICogQHsKICAgKi8KQEAgLTQ4MCw3ICs0OTcsOCBAQAogICAqIEBwYXJhbSAgX19CQVVEUkFURV9fIEJhdWQgcmF0ZSB2YWx1ZSB0byBhY2hpZXZlCiAgICogQHJldHZhbCBVU0FSVERJViB2YWx1ZSB0byBiZSB1c2VkIGZvciBCUlIgcmVnaXN0ZXIgZmlsbGluZyBpbiBPdmVyU2FtcGxpbmdfOCBjYXNlCiAgICovCi0jZGVmaW5lIF9fTExfVVNBUlRfRElWX1NBTVBMSU5HOChfX1BFUklQSENMS19fLCBfX0JBVURSQVRFX18pICgoKChfX1BFUklQSENMS19fKSoyVSkgKyAoKF9fQkFVRFJBVEVfXykvMlUpKS8oX19CQVVEUkFURV9fKSkKKyNkZWZpbmUgX19MTF9VU0FSVF9ESVZfU0FNUExJTkc4KF9fUEVSSVBIQ0xLX18sIF9fQkFVRFJBVEVfXykgKCgoKF9fUEVSSVBIQ0xLX18pKjJVKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoX19CQVVEUkFURV9fKS8yVSkpLyhfX0JBVURSQVRFX18pKQogCiAvKioKICAgKiBAYnJpZWYgIENvbXB1dGUgVVNBUlRESVYgdmFsdWUgYWNjb3JkaW5nIHRvIFBlcmlwaGVyYWwgQ2xvY2sgYW5kCkBAIC01NDUsNiArNTYzLDg3IEBACiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUUpID09IChVU0FSVF9DUjFfVUUpKSA/IDFVTCA6IDBVTCk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBVU0FSVCBlbmFibGVkIGluIFNUT1AgTW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbmFibGVkLCBVU0FSVCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIE1DVSBmcm9tIFN0b3AgbW9kZSwgcHJvdmlkZWQgdGhhdAorICAqICAgICAgICAgVVNBUlQgY2xvY2sgc2VsZWN0aW9uIGlzIEhTSSBvciBMU0UgaW4gUkNDLgorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBDUjEgICAgICAgICAgVUVTTSAgICAgICAgICBMTF9VU0FSVF9FbmFibGVJblN0b3BNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0VuYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IxLCBVU0FSVF9DUjFfVUVTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgVVNBUlQgZGlzYWJsZWQgaW4gU1RPUCBNb2RlLgorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2FibGVkLCBVU0FSVCBpcyBub3QgYWJsZSB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBTdG9wIG1vZGUKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IxICAgICAgICAgIFVFU00gICAgICAgICAgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfRGlzYWJsZUluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKK30KKworLyoqCisgICogQGJyaWVmICBJbmRpY2F0ZSBpZiBVU0FSVCBpcyBlbmFibGVkIGluIFNUT1AgTW9kZSAoYWJsZSB0byB3YWtlIHVwIE1DVSBmcm9tIFN0b3AgbW9kZSBvciBub3QpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMSAgICAgICAgICBVRVNNICAgICAgICAgIExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPkNSMSwgVVNBUlRfQ1IxX1VFU00pID09IChVU0FSVF9DUjFfVUVTTSkpID8gMVVMIDogMFVMKTsKK30KKworI2lmIGRlZmluZWQoVVNBUlRfQ1IzX1VDRVNNKQorLyoqCisgICogQGJyaWVmICBVU0FSVCBDbG9jayBlbmFibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgVVNBUlQgQ2xvY2sgaXMgZW5hYmxlZCB3aGlsZSBpbiBTVE9QIG1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX1VTQVJUX0VuYWJsZUNsb2NrSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVDbG9ja0luU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBTRVRfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVUNFU00pOworfQorCisvKioKKyAgKiBAYnJpZWYgIFVTQVJUIGNsb2NrIGRpc2FibGVkIGluIFNUT1AgTW9kZQorICAqIEBub3RlICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgVVNBUlQgQ2xvY2sgaXMgZGlzYWJsZWQgd2hpbGUgaW4gU1RPUCBtb2RlCisgICogQHJtdG9sbCBDUjMgICAgICAgICAgVUNFU00gICAgICAgICBMTF9VU0FSVF9EaXNhYmxlQ2xvY2tJblN0b3BNb2RlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVDbG9ja0luU3RvcE1vZGUoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19VQ0VTTSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgSW5kaWNhdGUgaWYgVVNBUlQgY2xvY2sgaXMgZW5hYmxlZCBpbiBTVE9QIE1vZGUKKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBVQ0VTTSAgICAgICAgIExMX1VTQVJUX0lzQ2xvY2tFbmFibGVkSW5TdG9wTW9kZQorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNDbG9ja0VuYWJsZWRJblN0b3BNb2RlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuIChSRUFEX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1VDRVNNKSA9PSAoVVNBUlRfQ1IzX1VDRVNNKSk7Cit9CisKKyNlbmRpZiAvKiBVU0FSVF9DUjNfVUNFU00gKi8KKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSovCiAvKioKICAgKiBAYnJpZWYgIFJlY2VpdmVyIEVuYWJsZSAoUmVjZWl2ZXIgaXMgZW5hYmxlZCBhbmQgYmVnaW5zIHNlYXJjaGluZyBmb3IgYSBzdGFydCBiaXQpCiAgICogQHJtdG9sbCBDUjEgICAgICAgICAgUkUgICAgICAgICAgICBMTF9VU0FSVF9FbmFibGVEaXJlY3Rpb25SeApAQCAtMTQ2MSw2ICsxNTYwLDQxIEBACiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfT1ZSRElTKSAhPSBVU0FSVF9DUjNfT1ZSRElTKSA/IDFVTCA6IDBVTCk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBTZWxlY3QgZXZlbnQgdHlwZSBmb3IgV2FrZSBVUCBJbnRlcnJ1cHQgRmxhZyAoV1VTWzE6MF0gYml0cykKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVUyAgICAgICAgICAgTExfVVNBUlRfU2V0V0tVUFR5cGUKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEBwYXJhbSAgVHlwZSBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgQGFyZyBAcmVmIExMX1VTQVJUX1dBS0VVUF9PTl9BRERSRVNTCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1NUQVJUQklUCisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX1JYTkUKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgVHlwZSkKK3sKKyAgTU9ESUZZX1JFRyhVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVUywgVHlwZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgUmV0dXJuIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0IEZsYWcgKFdVU1sxOjBdIGJpdHMpCisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVVMgICAgICAgICAgIExMX1VTQVJUX0dldFdLVVBUeXBlCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIFJldHVybmVkIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICBAYXJnIEByZWYgTExfVVNBUlRfV0FLRVVQX09OX0FERFJFU1MKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQKKyAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9VU0FSVF9XQUtFVVBfT05fUlhORQorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0dldFdLVVBUeXBlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgcmV0dXJuICh1aW50MzJfdCkoUkVBRF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19XVVMpKTsKK30KKworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAvKioKICAgKiBAYnJpZWYgIENvbmZpZ3VyZSBVU0FSVCBCUlIgcmVnaXN0ZXIgZm9yIGFjaGlldmluZyBleHBlY3RlZCBCYXVkIFJhdGUgdmFsdWUuCiAgICogQG5vdGUgICBDb21wdXRlIGFuZCBzZXQgVVNBUlRESVYgdmFsdWUgaW4gQlJSIFJlZ2lzdGVyIChmdWxsIEJSUiBjb250ZW50KQpAQCAtMTQ4MCw3ICsxNjE0LDcgQEAKIF9fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX1NldEJhdWRSYXRlKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCwgdWludDMyX3QgUGVyaXBoQ2xrLCB1aW50MzJfdCBPdmVyU2FtcGxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCYXVkUmF0ZSkKIHsKLSAgcmVnaXN0ZXIgdWludDMyX3QgdXNhcnRkaXY7CisgIHVpbnQzMl90IHVzYXJ0ZGl2OwogICByZWdpc3RlciB1aW50MzJfdCBicnJ0ZW1wOwogCiAgIGlmIChPdmVyU2FtcGxpbmcgPT0gTExfVVNBUlRfT1ZFUlNBTVBMSU5HXzgpCkBAIC0yMTYxLDcgKzIyOTUsOCBAQAogewogICAvKiBJbiBBc3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgogICAtIExJTkVOLCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCi0gIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIC0gU0NFTiwgSVJFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLwogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSVJFTiB8IFVTQVJUX0NSM19IRFNFTCkpOwogfQpAQCAtMjE5Nyw3ICsyMzMyLDggQEAKIHsKICAgLyogSW4gU3luY2hyb25vdXMgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgogICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAotICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICAtIFNDRU4sIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKi8KICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOKSk7CiAgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19TQ0VOIHwgVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfSERTRUwpKTsKICAgLyogc2V0IHRoZSBVQVJUL1VTQVJUIGluIFN5bmNocm9ub3VzIG1vZGUgKi8KQEAgLTIyMzcsNyArMjM3Myw4IEBACiB7CiAgIC8qIEluIExJTiBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CiAgIC0gU1RPUCBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAotICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICAtIElSRU4sIFNDRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKi8KICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0NMS0VOIHwgVVNBUlRfQ1IyX1NUT1ApKTsKICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX0lSRU4gfCBVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOwogICAvKiBTZXQgdGhlIFVBUlQvVVNBUlQgaW4gTElOIG1vZGUgKi8KQEAgLTIyNzUsNyArMjQxMiw4IEBACiB7CiAgIC8qIEluIEhhbGYgRHVwbGV4IG1vZGUsIHRoZSBmb2xsb3dpbmcgYml0cyBtdXN0IGJlIGtlcHQgY2xlYXJlZDoKICAgLSBMSU5FTiBhbmQgQ0xLRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAotICAtIFNDRU4gYW5kIElSRU4gYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIC0gU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICovCiAgIENMRUFSX0JJVChVU0FSVHgtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOwogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19JUkVOKSk7CiAgIC8qIHNldCB0aGUgVUFSVC9VU0FSVCBpbiBIYWxmIER1cGxleCBtb2RlICovCkBAIC0yMzE1LDcgKzI0NTMsOCBAQAogewogICAvKiBJbiBTbWFydGNhcmQgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgogICAtIExJTkVOIGJpdCBpbiB0aGUgVVNBUlRfQ1IyIHJlZ2lzdGVyLAotICAtIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4qLworICAtIElSRU4gYW5kIEhEU0VMIGJpdHMgaW4gdGhlIFVTQVJUX0NSMyByZWdpc3Rlci4KKyAgKi8KICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IyLCAoVVNBUlRfQ1IyX0xJTkVOKSk7CiAgIENMRUFSX0JJVChVU0FSVHgtPkNSMywgKFVTQVJUX0NSM19JUkVOIHwgVVNBUlRfQ1IzX0hEU0VMKSk7CiAgIC8qIENvbmZpZ3VyZSBTdG9wIGJpdHMgdG8gMS41IGJpdHMgKi8KQEAgLTIzNTgsNyArMjQ5Nyw4IEBACiB7CiAgIC8qIEluIElSREEgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgogICAtIExJTkVOLCBTVE9QIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCi0gIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIC0gU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLwogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4gfCBVU0FSVF9DUjJfU1RPUCkpOwogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCkpOwogICAvKiBzZXQgdGhlIFVBUlQvVVNBUlQgaW4gSVJEQSBtb2RlICovCkBAIC0yMzk2LDcgKzI1MzYsOCBAQAogewogICAvKiBJbiBNdWx0aSBQcm9jZXNzb3IgbW9kZSwgdGhlIGZvbGxvd2luZyBiaXRzIG11c3QgYmUga2VwdCBjbGVhcmVkOgogICAtIExJTkVOIGFuZCBDTEtFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIsCi0gIC0gSVJFTiwgU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLiovCisgIC0gSVJFTiwgU0NFTiBhbmQgSERTRUwgYml0cyBpbiB0aGUgVVNBUlRfQ1IzIHJlZ2lzdGVyLgorICAqLwogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjIsIChVU0FSVF9DUjJfTElORU4gfCBVU0FSVF9DUjJfQ0xLRU4pKTsKICAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCAoVVNBUlRfQ1IzX1NDRU4gfCBVU0FSVF9DUjNfSERTRUwgfCBVU0FSVF9DUjNfSVJFTikpOwogfQpAQCAtMjYzMCw2ICsyNzcxLDIxIEBACiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUldVKSA9PSAoVVNBUlRfSVNSX1JXVSkpID8gMVVMIDogMFVMKTsKIH0KIAorI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisvKioKKyAgKiBAYnJpZWYgIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcgaXMgc2V0IG9yIG5vdAorICAqIEBub3RlICAgTWFjcm8gQHJlZiBJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShVU0FSVHgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICBXYWtlLXVwIGZyb20gU3RvcCBtb2RlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBVU0FSVHggaW5zdGFuY2UuCisgICogQHJtdG9sbCBJU1IgICAgICAgICAgV1VGICAgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICByZXR1cm4gKChSRUFEX0JJVChVU0FSVHgtPklTUiwgVVNBUlRfSVNSX1dVRikgPT0gKFVTQVJUX0lTUl9XVUYpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogLyoqCiAgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgVHJhbnNtaXQgRW5hYmxlIEFja25vd2xlZGdlIEZsYWcgaXMgc2V0IG9yIG5vdAogICAqIEBybXRvbGwgSVNSICAgICAgICAgIFRFQUNLICAgICAgICAgTExfVVNBUlRfSXNBY3RpdmVGbGFnX1RFQUNLCkBAIC0yNjQxLDYgKzI3OTcsMTkgQEAKICAgcmV0dXJuICgoUkVBRF9CSVQoVVNBUlR4LT5JU1IsIFVTQVJUX0lTUl9URUFDSykgPT0gKFVTQVJUX0lTUl9URUFDSykpID8gMVVMIDogMFVMKTsKIH0KIAorI2lmIGRlZmluZWQoVVNBUlRfSVNSX1JFQUNLKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgUmVjZWl2ZSBFbmFibGUgQWNrbm93bGVkZ2UgRmxhZyBpcyBzZXQgb3Igbm90CisgICogQHJtdG9sbCBJU1IgICAgICAgICAgUkVBQ0sgICAgICAgICBMTF9VU0FSVF9Jc0FjdGl2ZUZsYWdfUkVBQ0sKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgU3RhdGUgb2YgYml0ICgxIG9yIDApLgorICAqLworX19TVEFUSUNfSU5MSU5FIHVpbnQzMl90IExMX1VTQVJUX0lzQWN0aXZlRmxhZ19SRUFDSyhVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfUkVBQ0spID09IChVU0FSVF9JU1JfUkVBQ0spKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNlbmRpZi8qIFVTQVJUX0lTUl9SRUFDSyAqLwogI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKIC8qIEZ1bmN0aW9uIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgc3VwcG9ydGluZyBUcmFuc21pdCBDb21wbGV0ZSBiZWZvcmUgR3VhcmQgVGltZSBmZWF0dXJlICovCiAvKioKQEAgLTI2NTMsOCArMjgyMiw4IEBACiB7CiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+SVNSLCBVU0FSVF9JU1JfVENCR1QpID09IChVU0FSVF9JU1JfVENCR1QpKSA/IDFVTCA6IDBVTCk7CiB9Ci0jZW5kaWYKIAorI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KIC8qKgogICAqIEBicmllZiAgQ2xlYXIgUGFyaXR5IEVycm9yIEZsYWcKICAgKiBAcm10b2xsIElDUiAgICAgICAgICBQRUNGICAgICAgICAgIExMX1VTQVJUX0NsZWFyRmxhZ19QRQpAQCAtMjczMyw3ICsyOTAyLDcgQEAKIHsKICAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfVENCR1RDRik7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBVU0FSVF9UQ0JHVF9TVVBQT1JUICovCiAKIC8qKgogICAqIEBicmllZiAgQ2xlYXIgTElOIEJyZWFrIERldGVjdGlvbiBGbGFnCkBAIC0yNzk2LDYgKzI5NjUsMjEgQEAKICAgV1JJVEVfUkVHKFVTQVJUeC0+SUNSLCBVU0FSVF9JQ1JfQ01DRik7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBDbGVhciBXYWtlIFVwIGZyb20gc3RvcCBtb2RlIEZsYWcKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgSUNSICAgICAgICAgIFdVQ0YgICAgICAgICAgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAKKyAgKiBAcGFyYW0gIFVTQVJUeCBVU0FSVCBJbnN0YW5jZQorICAqIEByZXR2YWwgTm9uZQorICAqLworX19TVEFUSUNfSU5MSU5FIHZvaWQgTExfVVNBUlRfQ2xlYXJGbGFnX1dLVVAoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQoreworICBXUklURV9SRUcoVVNBUlR4LT5JQ1IsIFVTQVJUX0lDUl9XVUNGKTsKK30KKworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMjkzNSw2ICszMTE5LDIxIEBACiAgIFNFVF9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBFbmFibGUgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQKKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfRW5hYmxlSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBOb25lCisgICovCitfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9VU0FSVF9FbmFibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1dVRklFKTsKK30KKworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAjaWYgZGVmaW5lZChVU0FSVF9UQ0JHVF9TVVBQT1JUKQogLyogRnVuY3Rpb24gYXZhaWxhYmxlIG9ubHkgb24gZGV2aWNlcyBzdXBwb3J0aW5nIFRyYW5zbWl0IENvbXBsZXRlIGJlZm9yZSBHdWFyZCBUaW1lIGZlYXR1cmUgKi8KIC8qKgpAQCAtMjk0OSw3ICszMTQ4LDcgQEAKIHsKICAgU0VUX0JJVChVU0FSVHgtPkNSMywgVVNBUlRfQ1IzX1RDQkdUSUUpOwogfQotI2VuZGlmCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLwogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGUgSURMRSBJbnRlcnJ1cHQKQEAgLTMwODIsNiArMzI4MSwyMSBAQAogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19DVFNJRSk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBEaXNhYmxlIFdha2UgVXAgZnJvbSBTdG9wIE1vZGUgSW50ZXJydXB0CisgICogQG5vdGUgICBNYWNybyBAcmVmIElTX1VBUlRfV0FLRVVQX0ZST01TVE9QX0lOU1RBTkNFKFVTQVJUeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIFdha2UtdXAgZnJvbSBTdG9wIG1vZGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIFVTQVJUeCBpbnN0YW5jZS4KKyAgKiBAcm10b2xsIENSMyAgICAgICAgICBXVUZJRSAgICAgICAgIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQCisgICogQHBhcmFtICBVU0FSVHggVVNBUlQgSW5zdGFuY2UKKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK19fU1RBVElDX0lOTElORSB2b2lkIExMX1VTQVJUX0Rpc2FibGVJVF9XS1VQKFVTQVJUX1R5cGVEZWYgKlVTQVJUeCkKK3sKKyAgQ0xFQVJfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpOworfQorCisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KICNpZiBkZWZpbmVkKFVTQVJUX1RDQkdUX1NVUFBPUlQpCiAvKiBGdW5jdGlvbiBhdmFpbGFibGUgb25seSBvbiBkZXZpY2VzIHN1cHBvcnRpbmcgVHJhbnNtaXQgQ29tcGxldGUgYmVmb3JlIEd1YXJkIFRpbWUgZmVhdHVyZSAqLwogLyoqCkBAIC0zMDk2LDcgKzMzMTAsNyBAQAogewogICBDTEVBUl9CSVQoVVNBUlR4LT5DUjMsIFVTQVJUX0NSM19UQ0JHVElFKTsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIFVTQVJUX1RDQkdUX1NVUFBPUlQgKi8KIAogLyoqCiAgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgSURMRSBJbnRlcnJ1cHQgIHNvdXJjZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgpAQCAtMzIyNSw2ICszNDM5LDIxIEBACiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfQ1RTSUUpID09IChVU0FSVF9DUjNfQ1RTSUUpKSA/IDFVTCA6IDBVTCk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmICBDaGVjayBpZiB0aGUgVVNBUlQgV2FrZSBVcCBmcm9tIFN0b3AgTW9kZSBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgKiBAbm90ZSAgIE1hY3JvIEByZWYgSVNfVUFSVF9XQUtFVVBfRlJPTVNUT1BfSU5TVEFOQ0UoVVNBUlR4KSBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAorICAqICAgICAgICAgV2FrZS11cCBmcm9tIFN0b3AgbW9kZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSB0aGUgVVNBUlR4IGluc3RhbmNlLgorICAqIEBybXRvbGwgQ1IzICAgICAgICAgIFdVRklFICAgICAgICAgTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUAorICAqIEBwYXJhbSAgVVNBUlR4IFVTQVJUIEluc3RhbmNlCisgICogQHJldHZhbCBTdGF0ZSBvZiBiaXQgKDEgb3IgMCkuCisgICovCitfX1NUQVRJQ19JTkxJTkUgdWludDMyX3QgTExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUChVU0FSVF9UeXBlRGVmICpVU0FSVHgpCit7CisgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfV1VGSUUpID09IChVU0FSVF9DUjNfV1VGSUUpKSA/IDFVTCA6IDBVTCk7Cit9CisKKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogI2lmIGRlZmluZWQoVVNBUlRfVENCR1RfU1VQUE9SVCkKIC8qIEZ1bmN0aW9uIGF2YWlsYWJsZSBvbmx5IG9uIGRldmljZXMgc3VwcG9ydGluZyBUcmFuc21pdCBDb21wbGV0ZSBiZWZvcmUgR3VhcmQgVGltZSBmZWF0dXJlICovCiAvKioKQEAgLTMyMzksNyArMzQ2OCw3IEBACiB7CiAgIHJldHVybiAoKFJFQURfQklUKFVTQVJUeC0+Q1IzLCBVU0FSVF9DUjNfVENCR1RJRSkgPT0gKFVTQVJUX0NSM19UQ0JHVElFKSkgPyAxVUwgOiAwVUwpOwogfQotI2VuZGlmCisjZW5kaWYgLyogVVNBUlRfVENCR1RfU1VQUE9SVCAqLwogCiAvKioKICAgKiBAfQpAQCAtMzM2NSwxMiArMzU5NCwxMiBAQAogICBpZiAoRGlyZWN0aW9uID09IExMX1VTQVJUX0RNQV9SRUdfREFUQV9UUkFOU01JVCkKICAgewogICAgIC8qIHJldHVybiBhZGRyZXNzIG9mIFREUiByZWdpc3RlciAqLwotICAgIGRhdGFfcmVnX2FkZHIgPSAodWludDMyX3QpICYgKFVTQVJUeC0+VERSKTsKKyAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmKFVTQVJUeC0+VERSKTsKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiByZXR1cm4gYWRkcmVzcyBvZiBSRFIgcmVnaXN0ZXIgKi8KLSAgICBkYXRhX3JlZ19hZGRyID0gKHVpbnQzMl90KSAmIChVU0FSVHgtPlJEUik7CisgICAgZGF0YV9yZWdfYWRkciA9ICh1aW50MzJfdCkgJihVU0FSVHgtPlJEUik7CiAgIH0KIAogICByZXR1cm4gZGF0YV9yZWdfYWRkcjsKQEAgLTMzOTIsNyArMzYyMSw3IEBACiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdWludDhfdCBMTF9VU0FSVF9SZWNlaXZlRGF0YTgoVVNBUlRfVHlwZURlZiAqVVNBUlR4KQogewotICByZXR1cm4gKHVpbnQ4X3QpKFJFQURfQklUKFVTQVJUeC0+UkRSLCBVU0FSVF9SRFJfUkRSKSk7CisgIHJldHVybiAodWludDhfdCkoUkVBRF9CSVQoVVNBUlR4LT5SRFIsIFVTQVJUX1JEUl9SRFIpICYgMHhGRlUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfbGxfdXNiLmggYi9JbmMvc3RtMzJmN3h4X2xsX3VzYi5oCmluZGV4IGQ1M2YxMGMuLjZkMzc2OWMgMTAwNjQ0Ci0tLSBhL0luYy9zdG0zMmY3eHhfbGxfdXNiLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9sbF91c2IuaApAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gIHVpbnQ4X3QgICBkZXZfYWRkciA7ICAgICAgICAgIC8qITwgVVNCIGRldmljZSBhZGRyZXNzLgorICB1aW50OF90ICAgZGV2X2FkZHI7ICAgICAgICAgICAvKiE8IFVTQiBkZXZpY2UgYWRkcmVzcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gTWluX0RhdGEgPSAxIGFuZCBNYXhfRGF0YSA9IDI1NSAgICAqLwogCiAgIHVpbnQ4X3QgICBjaF9udW07ICAgICAgICAgICAgIC8qITwgSG9zdCBjaGFubmVsIG51bWJlci4KQEAgLTE5OSwxMCArMTk5LDEwIEBACiAKICAgdWludDMyX3QgIEVyckNudDsgICAgICAgICAgICAgLyohPCBIb3N0IGNoYW5uZWwgZXJyb3IgY291bnQuKi8KIAotICBVU0JfT1RHX1VSQlN0YXRlVHlwZURlZiAgdXJiX3N0YXRlOyAgLyohPCBVUkIgc3RhdGUuCisgIFVTQl9PVEdfVVJCU3RhdGVUeXBlRGVmIHVyYl9zdGF0ZTsgIC8qITwgVVJCIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IHZhbHVlIG9mIEByZWYgVVNCX09UR19VUkJTdGF0ZVR5cGVEZWYgKi8KIAotICBVU0JfT1RHX0hDU3RhdGVUeXBlRGVmICAgc3RhdGU7ICAgICAvKiE8IEhvc3QgQ2hhbm5lbCBzdGF0ZS4KKyAgVVNCX09UR19IQ1N0YXRlVHlwZURlZiBzdGF0ZTsgICAgICAgLyohPCBIb3N0IENoYW5uZWwgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSB2YWx1ZSBvZiBAcmVmIFVTQl9PVEdfSENTdGF0ZVR5cGVEZWYgICAqLwogfSBVU0JfT1RHX0hDVHlwZURlZjsKICNlbmRpZiAvKiBkZWZpbmVkIChVU0JfT1RHX0ZTKSB8fCBkZWZpbmVkIChVU0JfT1RHX0hTKSAqLwpAQCAtMjM0LDYgKzIzNCwxOCBAQAogICAqIEB9CiAgICovCiAKKy8qKiBAZGVmZ3JvdXAgVVNCX0xMIERldmljZSBTcGVlZAorICAqIEB7CisgICovCisjZGVmaW5lIFVTQkRfSFNfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIFVTQkRfSFNJTkZTX1NQRUVEICAgICAgICAgICAgICAgICAgICAgIDFVCisjZGVmaW5lIFVTQkhfSFNfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDBVCisjZGVmaW5lIFVTQkRfRlNfU1BFRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDJVCisjZGVmaW5lIFVTQkhfRlNMU19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgIDFVCisvKioKKyAgKiBAfQorICAqLworCiAvKiogQGRlZmdyb3VwIFVTQl9MTF9Db3JlX1NwZWVkIFVTQiBMb3cgTGF5ZXIgQ29yZSBTcGVlZAogICAqIEB7CiAgICovCkBAIC0yNTIsNyArMjY0LDcgQEAKICNkZWZpbmUgVVNCX09UR19IU19FTUJFRERFRF9QSFkgICAgICAgICAgICAgICAgM1UKIAogI2lmICFkZWZpbmVkICAoVVNCX0hTX1BIWUNfVFVORV9WQUxVRSkKLSNkZWZpbmUgVVNCX0hTX1BIWUNfVFVORV9WQUxVRSAgICAweDAwMDAwRjEzVSAvKiE8IFZhbHVlIG9mIFVTQiBIUyBQSFkgVHVuZSAqLworI2RlZmluZSBVU0JfSFNfUEhZQ19UVU5FX1ZBTFVFICAgICAgICAweDAwMDAwRjEzVSAvKiE8IFZhbHVlIG9mIFVTQiBIUyBQSFkgVHVuZSAqLwogI2VuZGlmIC8qIFVTQl9IU19QSFlDX1RVTkVfVkFMVUUgKi8KIC8qKgogICAqIEB9CkBAIC0yNjIsMTEgKzI3NCwxMSBAQAogICAqIEB7CiAgICovCiAjaWZuZGVmIFVTQkRfSFNfVFJEVF9WQUxVRQotI2RlZmluZSBVU0JEX0hTX1RSRFRfVkFMVUUgICAgICAgICAgIDlVCisjZGVmaW5lIFVTQkRfSFNfVFJEVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDlVCiAjZW5kaWYgLyogVVNCRF9IU19UUkRUX1ZBTFVFICovCiAjaWZuZGVmIFVTQkRfRlNfVFJEVF9WQUxVRQotI2RlZmluZSBVU0JEX0ZTX1RSRFRfVkFMVUUgICAgICAgICAgIDVVCi0jZGVmaW5lIFVTQkRfREVGQVVMVF9UUkRUX1ZBTFVFICAgICAgOVUKKyNkZWZpbmUgVVNCRF9GU19UUkRUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgNVUKKyNkZWZpbmUgVVNCRF9ERUZBVUxUX1RSRFRfVkFMVUUgICAgICAgICAgICAgICAgOVUKICNlbmRpZiAvKiBVU0JEX0hTX1RSRFRfVkFMVUUgKi8KIC8qKgogICAqIEB9CkBAIC0yNzUsOSArMjg3LDkgQEAKIC8qKiBAZGVmZ3JvdXAgVVNCX0xMX0NvcmVfTVBTIFVTQiBMb3cgTGF5ZXIgQ29yZSBNUFMKICAgKiBAewogICAqLwotI2RlZmluZSBVU0JfT1RHX0hTX01BWF9QQUNLRVRfU0laRSAgICAgICAgICAgICA1MTJVCi0jZGVmaW5lIFVTQl9PVEdfRlNfTUFYX1BBQ0tFVF9TSVpFICAgICAgICAgICAgIDY0VQotI2RlZmluZSBVU0JfT1RHX01BWF9FUDBfU0laRSAgICAgICAgICAgICAgICAgICA2NFUKKyNkZWZpbmUgVVNCX09UR19IU19NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgIDUxMlUKKyNkZWZpbmUgVVNCX09UR19GU19NQVhfUEFDS0VUX1NJWkUgICAgICAgICAgICA2NFUKKyNkZWZpbmUgVVNCX09UR19NQVhfRVAwX1NJWkUgICAgICAgICAgICAgICAgICA2NFUKIC8qKgogICAqIEB9CiAgICovCkBAIC0yODcsNyArMjk5LDYgQEAKICAgKi8KICNkZWZpbmUgRFNUU19FTlVNU1BEX0hTX1BIWV8zME1IWl9PUl82ME1IWiAgICAgKDBVIDw8IDEpCiAjZGVmaW5lIERTVFNfRU5VTVNQRF9GU19QSFlfMzBNSFpfT1JfNjBNSFogICAgICgxVSA8PCAxKQotI2RlZmluZSBEU1RTX0VOVU1TUERfTFNfUEhZXzZNSFogICAgICAgICAgICAgICAoMlUgPDwgMSkKICNkZWZpbmUgRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWiAgICAgICAgICAgICAgKDNVIDw8IDEpCiAvKioKICAgKiBAfQpAQCAtMzk3LDcgKzQwOCw3IEBACiAjZGVmaW5lIFVTQlBIWUMgICAgICAgICAoKFVTQlBIWUNfR2xvYmFsVHlwZURlZiAqKSgodWludDMyX3QgKVVTQl9QSFlfSFNfQ09OVFJPTExFUl9CQVNFKSkKICNlbmRpZiAvKiBkZWZpbmVkIChVU0JfT1RHX0ZTKSB8fCBkZWZpbmVkIChVU0JfT1RHX0hTKSAqLwogCi0jZGVmaW5lIEVQX0FERFJfTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RlUKKyNkZWZpbmUgRVBfQUREUl9NU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RlUKIC8qKgogICAqIEB9CiAgICovCkBAIC00NjIsMTMgKzQ3Myw5IEBACiBIQUxfU3RhdHVzVHlwZURlZiBVU0JfRHJpdmVWYnVzKFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCwgdWludDhfdCBzdGF0ZSk7CiB1aW50MzJfdCAgICAgICAgICBVU0JfR2V0SG9zdFNwZWVkKFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCk7CiB1aW50MzJfdCAgICAgICAgICBVU0JfR2V0Q3VycmVudEZyYW1lKFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCk7Ci1IQUxfU3RhdHVzVHlwZURlZiBVU0JfSENfSW5pdChVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRldl9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1wcyk7CitIQUxfU3RhdHVzVHlwZURlZiBVU0JfSENfSW5pdChVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngsIHVpbnQ4X3QgY2hfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlcG51bSwgdWludDhfdCBkZXZfYWRkcmVzcywgdWludDhfdCBzcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZXBfdHlwZSwgdWludDE2X3QgbXBzKTsKIEhBTF9TdGF0dXNUeXBlRGVmIFVTQl9IQ19TdGFydFhmZXIoVVNCX09UR19HbG9iYWxUeXBlRGVmICpVU0J4LCBVU0JfT1RHX0hDVHlwZURlZiAqaGMsIHVpbnQ4X3QgZG1hKTsKIHVpbnQzMl90ICAgICAgICAgIFVTQl9IQ19SZWFkSW50ZXJydXB0KFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCk7CiBIQUxfU3RhdHVzVHlwZURlZiBVU0JfSENfSGFsdChVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngsIHVpbnQ4X3QgaGNfbnVtKTsKZGlmZiAtLWdpdCBhL0luYy9zdG0zMmY3eHhfbGxfd3dkZy5oIGIvSW5jL3N0bTMyZjd4eF9sbF93d2RnLmgKaW5kZXggNjIwYTUyNC4uMTY2MTYzMCAxMDA2NDQKLS0tIGEvSW5jL3N0bTMyZjd4eF9sbF93d2RnLmgKKysrIGIvSW5jL3N0bTMyZjd4eF9sbF93d2RnLmgKQEAgLTU4LDggKzU4LDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBXV0RHX0xMX0VDX1BSRVNDQUxFUiAgUFJFU0NBTEVSCi0qIEB7Ci0qLworICAqIEB7CisgICovCiAjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzEgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8xICovCiAjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzIgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS8yICovCiAjZGVmaW5lIExMX1dXREdfUFJFU0NBTEVSXzQgICAgICAgICAgICAgICAgIFdXREdfQ0ZSX1dER1RCXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFdXREcgY291bnRlciBjbG9jayA9IChQQ0xLMS80MDk2KS80ICovCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgKiAgICAgICAgIEBhcmcgQHJlZiBMTF9XV0RHX1BSRVNDQUxFUl8yCiAgICogICAgICAgICBAYXJnIEByZWYgTExfV1dER19QUkVTQ0FMRVJfNAogICAqICAgICAgICAgQGFyZyBAcmVmIExMX1dXREdfUFJFU0NBTEVSXzgKLSogQHJldHZhbCBOb25lCisgICogQHJldHZhbCBOb25lCiAgICovCiBfX1NUQVRJQ19JTkxJTkUgdm9pZCBMTF9XV0RHX1NldFByZXNjYWxlcihXV0RHX1R5cGVEZWYgKldXREd4LCB1aW50MzJfdCBQcmVzY2FsZXIpCiB7CkBAIC0zMTQsNiArMzE0LDYgQEAKIH0KICNlbmRpZgogCi0jZW5kaWYgLyogX19TVE0zMkY3eHhfTExfV1dER19IICovCisjZW5kaWYgLyogU1RNMzJGN3h4X0xMX1dXREdfSCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvTGljZW5zZS5tZCBiL0xpY2Vuc2UubWQKaW5kZXggZDk1YzFkYi4uY2FkZWJlYyAxMDA2NDQKLS0tIGEvTGljZW5zZS5tZAorKysgYi9MaWNlbnNlLm1kCkBAIC0xLDMgKzEsMyBAQAogIyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzCiAKLVRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QgMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KK1RoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUTWljcm9lbGVjdHJvbmljcyB1bmRlciB0aGUgKipCU0QtMy1DbGF1c2UqKiBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhpcyBsaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgW2hlcmVdKGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlKS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCAzMTIwN2M4Li5mOTU1YzRmIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC01LDE0ICs1LDE0IEBACiAqKlNUTTMyQ3ViZSoqIGlzIGFuIFNUTWljcm9lbGVjdHJvbmljcyBvcmlnaW5hbCBpbml0aWF0aXZlIHRvIGVhc2UgdGhlIGRldmVsb3BlcnMgbGlmZSBieSByZWR1Y2luZyBlZmZvcnRzLCB0aW1lIGFuZCBjb3N0LgogCiAqKlNUTTMyQ3ViZSoqIGNvdmVycyB0aGUgb3ZlcmFsbCBTVE0zMiBwcm9kdWN0cyBwb3J0Zm9saW8uIEl0IGluY2x1ZGVzIGEgY29tcHJlaGVuc2l2ZSBlbWJlZGRlZCBzb2Z0d2FyZSBwbGF0Zm9ybSwgZGVsaXZlcmVkIGZvciBlYWNoIFNUTTMyIHNlcmllcy4KLSAgICogVGhlIENNU0lTIG1vZHVsZXMgKGNvcmUgYW5kIGRldmljZSkgY29ycmVzcG9uZGluZyB0byB0aGUgQVJNKHRtKSBjb3JlIGltcGxlbWVudGVkIGluIHRoaXMgU1RNMzIgcHJvZHVjdAotICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpbwotICAgKiBUaGUgQlNQIERyaXZlcnMgb2YgZWFjaCBldmFsdWF0aW9uIG9yIGRlbW9uc3RyYXRpb24gYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMKLSAgICogQSBjb25zaXN0ZW50IHNldCBvZiBtaWRkbGV3YXJlcyBjb21wb25lbnRzIHN1Y2ggYXMgUlRPUywgVVNCLCBGYXRGUywgR3JhcGhpY3MsIFNUTTMyX1RvdWNoU2Vuc2luZ19MaWJyYXJ5IC4uLgotICAgKiBBIGZ1bGwgc2V0IG9mIHNvZnR3YXJlIHByb2plY3RzIChiYXNpYyBleGFtcGxlcywgYXBwbGljYXRpb25zIG9yIGRlbW9uc3RyYXRpb25zKSBmb3IgZWFjaCBib2FyZCBwcm92aWRlZCBieSB0aGlzIFNUTTMyIHNlcmllcworICAgKiBUaGUgQ01TSVMgbW9kdWxlcyAoY29yZSBhbmQgZGV2aWNlKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBBUk0odG0pIGNvcmUgaW1wbGVtZW50ZWQgaW4gdGhpcyBTVE0zMiBwcm9kdWN0LgorICAgKiBUaGUgU1RNMzIgSEFMLUxMIGRyaXZlcnMgOiBhbiBhYnN0cmFjdGlvbiBkcml2ZXJzIGxheWVyLCB0aGUgQVBJIGVuc3VyaW5nIG1heGltaXplZCBwb3J0YWJpbGl0eSBhY3Jvc3MgdGhlIFNUTTMyIHBvcnRmb2xpby4KKyAgICogVGhlIEJTUCBEcml2ZXJzIG9mIGVhY2ggZXZhbHVhdGlvbiBvciBkZW1vbnN0cmF0aW9uIGJvYXJkIHByb3ZpZGVkIGJ5IHRoaXMgU1RNMzIgc2VyaWVzLgorICAgKiBBIGNvbnNpc3RlbnQgc2V0IG9mIG1pZGRsZXdhcmVzIGNvbXBvbmVudHMgc3VjaCBhcyBSVE9TLCBVU0IsIEZhdEZTLCBHcmFwaGljcywgU1RNMzJfVG91Y2hTZW5zaW5nX0xpYnJhcnkuLi4KKyAgICogQSBmdWxsIHNldCBvZiBzb2Z0d2FyZSBwcm9qZWN0cyAoYmFzaWMgZXhhbXBsZXMsIGFwcGxpY2F0aW9ucyBvciBkZW1vbnN0cmF0aW9ucykgZm9yIGVhY2ggYm9hcmQgcHJvdmlkZWQgYnkgdGhpcyBTVE0zMiBzZXJpZXMuCiAKIFR3byBtb2RlbHMgb2YgcHVibGljYXRpb24gYXJlIHByb3Bvc2VkIGZvciB0aGUgU1RNMzJDdWJlIGVtYmVkZGVkIHNvZnR3YXJlOgotICAgKiBUaGUgbW9ub2xpdGhpYyAqKk1DVSBQYWNrYWdlKiogOiBhbGwgU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZXMgb2Ygb25lIFNUTTMyIHNlcmllcyBhcmUgcHJlc2VudCAoRHJpdmVycywgTWlkZGxld2FyZXMsIFByb2plY3RzLCBVdGlsaXRpZXMpIGluIHRoZSByZXBvICh1c3VhbCBuYW1lICoqU1RNMzJDdWJleHgqKiwgeHggY29ycmVzcG9uZGluZyB0byB0aGUgU1RNMzIgc2VyaWVzKQorICAgKiBUaGUgbW9ub2xpdGhpYyAqKk1DVSBQYWNrYWdlKiogOiBhbGwgU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZXMgb2Ygb25lIFNUTTMyIHNlcmllcyBhcmUgcHJlc2VudCAoRHJpdmVycywgTWlkZGxld2FyZXMsIFByb2plY3RzLCBVdGlsaXRpZXMpIGluIHRoZSByZXBvICh1c3VhbCBuYW1lICoqU1RNMzJDdWJleHgqKiwgeHggY29ycmVzcG9uZGluZyB0byB0aGUgU1RNMzIgc2VyaWVzKS4KICAgICogVGhlICoqTUNVIGNvbXBvbmVudCoqIDogcHJvZ3Jlc3NpdmVseSBmcm9tIE5vdmVtYmVyIDIwMTksIGVhY2ggU1RNMzJDdWJlIHNvZnR3YXJlIG1vZHVsZSBiZWluZyBwYXJ0IG9mIHRoZSBTVE0zMkN1YmUgTUNVIFBhY2thZ2UsIHdpbGwgYmUgZGVsaXZlcmVkIGFzIGFuIGluZGl2aWR1YWwgcmVwbywgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IGFuZCBnZXQgb25seSB0aGUgcmVxdWlyZWQgc29mdHdhcmUgZnVuY3Rpb25zLgogCiAjIyBEZXNjcmlwdGlvbgpAQCAtMjMsOSArMjMsMTMgQEAKIAogQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4KIAotVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIHVuZGVyIEJTRC0zLUNsYXVzZSBsaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIFtoZXJlXShodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZSkuCiAKKyMjIFJlbGVhc2Ugbm90ZQorCitEZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IG9mIHRoaXMgcmVsZWFzZSBhcmUgYXZhaWxhYmxlIGluIHRoZSByZWxlYXNlIG5vdGUgW2hlcmVdKGh0dHBzOi8vaHRtbHByZXZpZXcuZ2l0aHViLmlvLz9odHRwczovL2dpdGh1Yi5jb20vU1RNaWNyb2VsZWN0cm9uaWNzL3N0bTMyZjd4eF9oYWxfZHJpdmVyL2Jsb2IvbWFzdGVyL1JlbGVhc2VfTm90ZXMuaHRtbCkuCisKICMjIENvbXBhdGliaWxpdHkgaW5mb3JtYXRpb24KIAogSW4gdGhpcyB0YWJsZSwgeW91IGNhbiBmaW5kIHRoZSBzdWNjZXNzaXZlIHZlcnNpb25zIG9mIHRoaXMgSEFMLUxMIERyaXZlciBjb21wb25lbnQsIGluIGxpbmUgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9ucyBvZiB0aGUgZnVsbCBNQ1UgcGFja2FnZToKQEAgLTM0LDEyICszOCwxMyBAQAogCiBIQUwgRHJpdmVyIEY3IHwgQ01TSVMgRGV2aWNlIEY3IHwgQ01TSVMgQ29yZSB8IFdhcyBkZWxpdmVyZWQgaW4gdGhlIGZ1bGwgTUNVIHBhY2thZ2UKIC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGFnIHYxLjIuNyB8IFRhZyB2MS4yLjQgfCBUYWcgdjUuNC4wX2NtNyB8IFRhZyB2MS4xNS4wIChhbmQgZm9sbG93aW5nLCBpZiBhbnksIHRpbGwgbmV4dCBuZXcgdGFnKQorVGFnIHYxLjIuNyB8IFRhZyB2MS4yLjQgfCBUYWcgdjUuNC4wX2NtNyB8IFRhZyB2MS4xNS4wIChhbmQgZm9sbG93aW5nLCBpZiBhbnksIHRpbGwgbmV4dCB0YWcpCitUYWcgdjEuMi44IHwgVGFnIHYxLjIuNSB8IFRhZyB2NS40LjBfY203IHwgVGFnIHYxLjE2LjAgKGFuZCBmb2xsb3dpbmcsIGlmIGFueSwgdGlsbCBuZXh0IHRhZykKIAogVGhlIGZ1bGwgKipTVE0zMkN1YmVGNyoqIE1DVSBwYWNrYWdlIGlzIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVGNykuCiAKICMjIFRyb3VibGVzaG9vdGluZwogCi1JZiB5b3UgaGF2ZSBhbnkgaXNzdWUgd2l0aCB0aGUgKipTb2Z0d2FyZSBjb250ZW50Kiogb2YgdGhpcyByZXBvLCB5b3UgY2FuIFtmaWxlIGFuIGlzc3VlIG9uIEdpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9zdG0zMmY3eHhfaGFsX2RyaXZlci9pc3N1ZXMvbmV3KS4KK0lmIHlvdSBoYXZlIGFueSBpc3N1ZSB3aXRoIHRoZSAqKlNvZnR3YXJlIGNvbnRlbnQqKiBvZiB0aGlzIHJlcG9zaXRvcnksIHlvdSBjYW4gZmlsZSBhbiBpc3N1ZSBpbnRvIHRoZSBmaXJtd2FyZSByZXBvc2l0b3J5IFtTVE0zMkN1YmVGN10oaHR0cHM6Ly9naXRodWIuY29tL1NUTWljcm9lbGVjdHJvbmljcy9TVE0zMkN1YmVGNy9pc3N1ZXMvbmV3L2Nob29zZSkuCiAKIEZvciBhbnkgb3RoZXIgcXVlc3Rpb24gcmVsYXRlZCB0byB0aGUgcHJvZHVjdCwgdGhlIHRvb2xzLCB0aGUgZW52aXJvbm1lbnQsIHlvdSBjYW4gc3VibWl0IGEgdG9waWMgb24gdGhlIFtTVCBDb21tdW5pdHkvU1RNMzIgTUNVcyBmb3J1bV0oaHR0cHM6Ly9jb21tdW5pdHkuc3QuY29tL3MvZ3JvdXAvMEY5MFgwMDAwMDBBWHNBU0FXL3N0bTMyLW1jdXMpLgpkaWZmIC0tZ2l0IGEvUmVsZWFzZV9Ob3Rlcy5odG1sIGIvUmVsZWFzZV9Ob3Rlcy5odG1sCmluZGV4IDI4MDFiNzEuLjI2MDhlZDIgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VfTm90ZXMuaHRtbAorKysgYi9SZWxlYXNlX05vdGVzLmh0bWwKQEAgLTY1Miw3ICs2NTIsOCBAQAoge21hcmdpbi1ib3R0b206MGluO30KIC0tPgogPC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gMTBdPiA8c3R5bGU+IC8qIFN0eWxlIERlZmluaXRpb25zICovIHRhYmxlLk1zb05vcm1hbFRhYmxlIHttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsgbXNvLXRzdHlsZS1yb3diYW5kLXNpemU6MDsgbXNvLXRzdHlsZS1jb2xiYW5kLXNpemU6MDsgbXNvLXN0eWxlLW5vc2hvdzp5ZXM7IG1zby1zdHlsZS1wcmlvcml0eTo5OTsgbXNvLXN0eWxlLXFmb3JtYXQ6eWVzOyBtc28tc3R5bGUtcGFyZW50OiIiOyBtc28tcGFkZGluZy1hbHQ6MGluIDUuNHB0IDBpbiA1LjRwdDsgbXNvLXBhcmEtbWFyZ2luOjBpbjsgbXNvLXBhcmEtbWFyZ2luLWJvdHRvbTouMDAwMXB0OyBtc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47IGZvbnQtc2l6ZToxMC4wcHQ7IGZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fSA8L3N0eWxlPiA8IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRpdCIgc3BpZG1heD0iNzE3MCIvPiA8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4gPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPiA8bzppZG1hcCB2OmV4dD0iZWRpdCIgZGF0YT0iMSIvPiA8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+Ci08bWV0YSBjb250ZW50PSJNQ0QgQXBwbGljYXRpb24gVGVhbSIgbmFtZT0iYXV0aG9yIj48L2hlYWQ+PGJvZHkgbGluaz0iYmx1ZSIgdmxpbms9ImJsdWUiPgorPG1ldGEgY29udGVudD0iTUNEIEFwcGxpY2F0aW9uIFRlYW0iIG5hbWU9ImF1dGhvciI+PC9oZWFkPgorPGJvZHkgbGluaz0iYmx1ZSIgdmxpbms9ImJsdWUiPgogPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7QXJpYWwmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KIDxkaXYgYWxpZ249ImNlbnRlciI+CkBAIC02ODgsOCArNjg5LDEzOCBAQAogPHRib2R5PgogPHRyPgogPHRkIHN0eWxlPSJwYWRkaW5nOiAwaW47IiB2YWxpZ249InRvcCI+Ci08aDIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsiPjxhIG5hbWU9Ikhpc3RvcnkiPjwvYT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBjb2xvcjogd2hpdGU7Ij5VcGRhdGUgSGlzdG9yeTwvc3Bhbj4KLSAgICAgICAgICAgIDwvaDI+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi43LyAwOC1GZWJydWFyeS0yMDE5PC9zcGFuPjwvaDM+Cis8aDIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsiPjxhIG5hbWU9Ikhpc3RvcnkiPjwvYT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBjb2xvcjogd2hpdGU7Ij5VcGRhdGUgSGlzdG9yeTwvc3Bhbj4KKyAgICAgICAgICAgIDwvaDI+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi44LyAxMy1GZWJydWFyeS0yMDIwPC9zcGFuPjwvaDM+CisgICAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiPjx1PjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CisgICAgICAgICAgICA8dWwgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBtYXJnaW4tdG9wOiAwY207IG1hcmdpbi1ib3R0b206IDBpbjsgd29yZC1zcGFjaW5nOiAwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+R2VuZXJhbCB1cGRhdGVzICB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUwvTEwgR1BJTyZuYnNwOzwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyI+PG86cD48L286cD48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlJm5ic3A7R1BJTworICAgICAgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2U8Yj4mbmJzcDs8L2I+dG8gYXZvaWQgdW53YW50ZWQgcHVsc2Ugb24gR1BJTyBQaW4nczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUwgSTJDJm5ic3A7PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+dXBkYXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7Ij48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLWJvdHRvbTogMC4wMDAxcHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZQorICAgICAgSEFMX0kyQ19FVl9JUlFIYW5kbGVyKCkgQVBJIHRvIGZpeCBJMkMgc2VuZCBicmVhayBpc3N1ZSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQKKyAgICAgICBhZGRpdGlvbmFsIGNoZWNrIG9uIGhpMmMtJmd0O2hkbWF0eCwKKyAgICAgICBoZG1hdHgtJmd0O1hmZXJDcGx0Q2FsbGJhY2ssJm5ic3A7aGkyYy0mZ3Q7aGRtYXJ4LAorICAgICAgIGhkbWFyeC0mZ3Q7WGZlckNwbHRDYWxsYmFjayBpbiBJMkNfTWFzdGVyX1NCKCkgQVBJIHRvCisgICAgICAgYXZvaWQmbmJzcDtlbmFibGluZyBETUEgcmVxdWVzdCZuYnNwO3doZW4gSVQgbW9kZSBpcyB1c2VkLjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyIgbGFuZz0iRU4tVVMiPjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUKKyAgICAgIEhBTF9JMkNfRVJfSVJRSGFuZGxlcigpIEFQSSB0byBmaXggYWNrbm93bGVkZ2UgZmFpbHVyZSBpc3N1ZSB3aXRoCisgICAgICBJMkMmbmJzcDttZW1vcnkgSVQgcHJvY2Vzc2VzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPiZuYnNwO0FkZCZuYnNwO3N0b3AKKyAgICAgICBjb25kaXRpb24gZ2VuZXJhdGlvbiZuYnNwO3doZW4mbmJzcDtOQUNLIG9jY3Vycy48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlJm5ic3A7SEFMX0kyQ19Jbml0KCkKKyAgICAgIEFQSSB0byBmb3JjZSBzb2Z0d2FyZSByZXNldCBiZWZvcmUgc2V0dGluZyBuZXcgSTJDIGNvbmZpZ3VyYXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZQorICAgICAgSEFMIEkyQyBwcm9jZXNzZXMgdG8gcmVwb3J0IEVycm9yQ29kZSZuYnNwO3doZW4gd3JvbmcgSTJDIHN0YXJ0IGNvbmRpdGlvbgorICAgICAgb2NjdXJzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPiZuYnNwO0FkZAorICAgICAgIG5ldyZuYnNwO0Vycm9yQ29kZSBkZWZpbmU6IEhBTF9JMkNfV1JPTkdfU1RBUlQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPiZuYnNwO1NldCZuYnNwO0Vycm9yQ29kZQorICAgICAgIHBhcmFtZXRlciBpbiZuYnNwO0kyQyBoYW5kbGUgdG8mbmJzcDtIQUxfSTJDX1dST05HX1NUQVJUPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSZuYnNwO0kyQ19ETUFYZmVyQ3BsdCgpLAorICAgICAgSTJDX0RNQUVycm9yKCkgYW5kIEkyQ19ETUFBYm9ydCgpIEFQSXMgdG8gZml4IGhhcmRmYXVsdCBpc3N1ZSB3aGVuIGhkbWF0eAorICAgICAgYW5kIGhkbWFyeCZuYnNwO3BhcmFtZXRlcnMgaW4gaTJjIGhhbmRsZSBhcmVuJ3QgaW5pdGlhbGl6ZWQgKE5VTEwgcG9pbnRlcikuPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZAorICAgICAgIGFkZGl0aW9uYWwgY2hlY2sgb24gaGkyYy0mZ3Q7aGRtdHggYW5kIGhpMmMtJmd0O2hkbWFyeCBiZWZvcmUKKyAgICAgICByZXNldHRpbmcmbmJzcDtETUEgVHgvUnggY29tcGxldGUgY2FsbGJhY2s8L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD4KKworPHVsIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgdGV4dC1pbmRlbnQ6IDBweDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbWFyZ2luLXRvcDogMGNtOyBtYXJnaW4tYm90dG9tOiAwaW47IHdvcmQtc3BhY2luZzogMHB4OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBBREMgPC9zcGFuPlVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCAiQURDX0lOVEVSTkFMX05PTkUiIGNoYW5uZWwgdG8gZGlzYWJsZSB0aGUgVkJBVCAmYW1wOyBUU1ZSRUZFIGNoYW5uZWwuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBEQ01JIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgRENNSV9TeW5jVW5tYXNrVHlwZURlZiBzdHJ1Y3R1cmUgYW5kIEhBTF9EQ01JX0NvbmZpZ1N5bmNVbm1hc2soKSBBUEkgdG8gbWFuYWdlIGVtYmVkZGVkIHN5bmNocm9uaXphdGlvbiBkZWxpbWl0ZXJzIHVubWFza3M8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEVYVEk8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkdlbmVyYWwgdXBkYXRlIHRvIGVuaGFuY2UgSEFMIEVYVEkgZHJpdmVyIHJvYnVzdG5lc3MmbmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgYWRkaXRpb25hbCBhc3NlcnQgY2hlY2sgb24gRVhUSSBjb25maWcgbGluZXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byBjb21wdXRlIEVYVEkgbGluZSBtYXNrIGJlZm9yZSByZWFkL3dyaXRlIGFjY2VzcyB0byBFWFRJIHJlZ2lzdGVyczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgRVhUSSBjYWxsYmFja3MgbWFuYWdlbWVudCB0byBiZSBjb21wbGlhbnQgd2l0aCByZWZlcmVuY2UgbWFudWFsOiBvbmx5IG9uZSBQUiByZWdpc3RlciBmb3IgcmlzaW5nIGFuZCBmYWxsaW5nIGludGVycnVwdHMuPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlCitwYXJhbWV0ZXJzIGluIEVYVElfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmU6IG1lcmdlIEhBTCBFWFRJCitSaXNpbmdDYWxsYmFjayBhbmQgRmFsbGluZ0NhbGxiYWNrIGluIG9ubHkgb25lIFBlbmRpbmdDYWxsYmFjay48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBIQUxfRVhUSV9SSVNJTkdfQ0JfSUQgYW5kIEhBTF9FWFRJX0ZBTExJTkdfQ0JfSUQgdmFsdWVzIGZyb20gRVhUSV9DYWxsYmFja0lEVHlwZURlZiBlbnVtZXJhdGlvbi48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9FWFRJX0lSUUhhbmRsZXIoKSBBUEkgdG8gc2VydmUgaW50ZXJydXB0cyBjb3JyZWN0bHkuPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIGNvbXB1dGUgRVhUSSBsaW5lIG1hc2sgYmVmb3JlIGhhbmRsZSBFWFRJIGludGVycnVwdC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHN1cHBvcnQgR1BJTyBwb3J0IGludGVycnVwdHM6PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyAiR1BJT1NlbCIgcGFyYW1ldGVyIGluIEVYVElfQ29uZmlnVHlwZURlZiBzdHJ1Y3R1cmU8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSEFTSCZuYnNwOzwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+TnVsbCBwb2ludGVyIG9uIGhhbmRsZXIgImhoYXNoIiBpcyBub3cgY2hlY2tlZCBiZWZvcmUgYWNjZXNzaW5nIHN0cnVjdHVyZSBtZW1iZXIgImhoYXNoLSZndDtJbml0LkRhdGFUeXBlIiBpbiB0aGUgZm9sbG93aW5nIEFQSTo8L3NwYW4+PC9saT48L3VsPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9Jbml0KCk8L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+Rm9sbG93aW5nIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmludGVycnVwdC1iYXNlZDwvc3Bhbj4KK0FQSXMgaGF2ZSBiZWVuIGFkZGVkLiBJbnRlcnJ1cHQgbW9kZSBjb3VsZCBhbGxvdyB0aGUgTUNVIHRvIGVudGVyCisiU2xlZXAiIG1vZGUgd2hpbGUgYSBkYXRhIGJsb2NrIGlzIGJlaW5nIHByb2Nlc3NlZC4gUGxlYXNlIHJlZmVyIHRvIHRoZQorIiMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMiIHNlY3Rpb24gZm9yIGRldGFpbHMgYWJvdXQgdGhlaXIKK3VzZS48L3NwYW4+PC9saT48L3VsPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9TSEExX0FjY21sdF9JVCgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9NRDVfQWNjbWx0X0lUKCk8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9JVCgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfSVQoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5Gb2xsb3dpbmcgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+YWxpYXNlczwvc3Bhbj4gaGF2ZSBiZWVuIGFkZGVkIChqdXN0IDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmZvciBjbGFyaXR5IHNha2U8L3NwYW4+KSBhcyB0aGV5IHNoYWxsIGJlIHVzZWQgYXQgdGhlIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmVuZDwvc3Bhbj4gb2YgdGhlIGNvbXB1dGF0aW9uIG9mIGEgbXVsdGktYnVmZmVycyBtZXNzYWdlIGFuZCBub3QgYXQgdGhlIHN0YXJ0Ojwvc3Bhbj48L2xpPjwvdWw+PHVsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIX1NIQTFfQWNjbWx0X0VuZCgpIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBIQUxfSEFTSF9TSEExX1N0YXJ0KCk8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIX01ENV9BY2NtbHRfRW5kKCkgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIEhBTF9IQVNIX01ENV9TdGFydCgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9TSEExX0FjY21sdF9FbmRfSVQoKSB0byBiZSB1c2VkIGluc3RlYWQgb2YgSEFMX0hBU0hfU0hBMV9TdGFydF9JVCgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9NRDVfQWNjbWx0X0VuZF9JVCgpIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBIQUxfSEFTSF9NRDVfU3RhcnRfSVQoKTwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0VuZCgpIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBIQUxfSEFTSEV4X1NIQTIyNF9TdGFydCgpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kKCkgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIEhBTF9IQVNIRXhfU0hBMjU2X1N0YXJ0KCk8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmRfSVQoKSB0byBiZSB1c2VkIGluc3RlYWQgb2YgSEFMX0hBU0hFeF9TSEEyMjRfU3RhcnRfSVQoKTwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0VuZF9JVCgpIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBIQUxfSEFTSEV4X1NIQTI1Nl9TdGFydF9JVCgpPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPk1JU1JBQy0yMDEyCitydWxlIFIuNS4xIChpZGVudGlmaWVycyBzaGFsbCBiZSBkaXN0aW5jdCBpbiB0aGUgZmlyc3QgMzEgY2hhcmFjdGVycykKK2NvbnN0cmFpbmVkIHRoZSBuYW1pbmcgb2YgdGhlIGFib3ZlIGxpc3RlZCBhbGlhc2VzIChlLmcuCitIQUxfSEFTSEV4X1NIQTI1Nl88c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5BY2NtbHQ8L3NwYW4+X0VuZCgpIGNvdWxkIG5vdCBiZSBuYW1lZCBIQUxfSEFTSEV4X1NIQTI1Nl88c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5BY2N1bXVsYXRlPC9zcGFuPl9FbmQoKS4gT3RoZXJ3aXNlIHRoZSBuYW1lIHdvdWxkIGhhdmUgY29uZmxpY3RlZCB3aXRoIEhBTF9IQVNIRXhfU0hBMjU2XzxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkFjY3VtdWxhdGU8L3NwYW4+X0VuZF9JVCgpKS4gSW4gb3JkZXIgdG8gaGF2ZSBhbGlnbmVkIG5hbWVzIGZvbGxvd2luZyBBUElzIGhhdmUgYmVlbiByZW5hbWVkOjwvc3Bhbj48L2xpPjwvdWw+PHVsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIX01ENV9BY2N1bXVsYXRlKCkgcmVuYW1lZCBIQUxfSEFTSF9NRDVfQWNjbWx0KCk8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZSgpIHJlbmFtZWQgSEFMX0hBU0hfU0hBMV9BY2NtbHQoKTwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZSgpIHJlbmFtZWQgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0KCk8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGUoKSByZW5hbWVkIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdCgpPC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBU0ggPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+aGFuZGxlcjwvc3Bhbj4gc3RhdGUgaXMgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+bm8gbW9yZTwvc3Bhbj4gcmVzZXQgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+b25jZSBETUEgaGFzIGJlZW4gc3RhcnRlZDwvc3Bhbj4gaW4gdGhlIGZvbGxvd2luZyBBUElzOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9IQVNIX01ENV9TdGFydF9ETUEoKTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hNQUNfTUQ1X1N0YXJ0X0RNQSgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSEFTSF9TSEExX1N0YXJ0X0RNQSgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfSE1BQ19TSEExX1N0YXJ0X0RNQSgpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBU0ggPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+cGhhc2U8L3NwYW4+IHN0YXRlIGlzIG5vdyBzZXQgdG8gSEFMX0hBU0hfUEhBU0VfUkVBRFk8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4gb25jZSB0aGUgZGlnZXN0IGhhcyBiZWVuIHJlYWQ8L3NwYW4+IGluIHRoZSBmb2xsb3dpbmcgQVBJczo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQVNIX0lUKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhNQUNfUHJvY2Vzc2luZygpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5IQVNIX1N0YXJ0KCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkhBU0hfRmluaXNoKCk8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+Q2FzZSBvZiBhIGxhcmdlIGJ1ZmZlciBzY2F0dGVyZWQgYXJvdW5kIGluIG1lbW9yeSBlYWNoIHBpZWNlIG9mIHdoaWNoIGlzIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPm5vdDwvc3Bhbj4gbmVjZXNzYXJpbHkgYSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5tdWx0aXBsZSBvZiA0PC9zcGFuPiBieXRlcyBpbiBsZW5ndGguPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+SW4KK3NlY3Rpb24gIiMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMiLCBzdWItc2VjdGlvbiAiKioqIFJlbWFya3MKK29uIG1lc3NhZ2UgbGVuZ3RoICoqKiIgYWRkZWQgdG8gcHJvdmlkZSByZWNvbW1lbmRhdGlvbnMgdG8gZm9sbG93IGluCitzdWNoIGNhc2UuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij5ObyBtb2RpZmljYXRpb24gb2YgdGhlIGRyaXZlciBhcyB0aGUgcm9vdC1jYXVzZSBpcyBhdCBkZXNpZ24tbGV2ZWwuPGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHVsIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgdGV4dC1pbmRlbnQ6IDBweDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbWFyZ2luLXRvcDogMGNtOyBtYXJnaW4tYm90dG9tOiAwaW47IHdvcmQtc3BhY2luZzogMHB4OyB3aGl0ZS1zcGFjZTogbm9ybWFsOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU0RNTUMmbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCZuYnNwO3R5cG8gaW4gIkZpbGVGb3JtYXRHcm91cCIgcGFyYW1ldGVyIGluIHRoZSBIQUxfTU1DX0NhcmRDU0RUeXBlRGVmIGFuZCBIQUxfU0RfQ2FyZENTRFR5cGVEZWYgc3RydWN0dXJlcy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPkZpeCBhbiBpbXByb3ZlIGhhbmRsZSBzdGF0ZSBhbmQgZXJyb3IgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIHRoZSBkZWZpbmVkIE1NQyBjYXJkIGNhcGFjaXR5IHR5cGUgdG8gYmUgbW9yZSBtZWFuaW5nZnVsOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NTUNfSElHSF9WT0xUQUdFX0NBUkQ8L3NwYW4+IHRvIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPk1NQyBMT1dfQ0FQQUNJVFlfQ0FSRDwvc3Bhbj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5NTUNfRFVBTF9WT0xUQUdFX0NSQUQ8L3NwYW4+IHRvIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPk1NQ19ISUdIX0NBUEFDSVRZX0NBUkQ8L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFFTUEkgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSBMb2NrIG1lY2hhbmlzbSBmcm9tIEhBTF9RU1BJX0luaXQoKSBhbmQgSEFMX1FTUElfRGVJbml0KCkgQVBJczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBmb250LXNpemU6IDE2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+SEFMIExQVElNPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgYSBwb2xsaW5nIG1lY2hhbmlzbSB0byBjaGVjayBvbiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkxQVElNX0ZMQUdfWFhPSzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+PHNwYW4+Jm5ic3A7PC9zcGFuPmZsYWdzIGluIGRpZmZlcmVudCBBUEkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPjwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+QWRkJm5ic3A7TFBUSU1fV2FpdEZvckZsYWcoKTxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPkFQSTxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnRvIHdhaXQgZm9yIGZsYWcgc2V0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPlBlcmZvcm0gbmV3IGNoZWNrcyBvbiBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPldvcmthcm91bmQgdG8gZml4IE1DVSBzbGFjayBpbiBzbGVlcCBtb2RlPGJyPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5VcGRhdGUgX19IQUxfTFBUSU1fRElTQUJMRSAoKSBtYWNybyB1c2VkIHRvIGRpc2FibGUgTFBUSU0gSFcgaW5zdGFuY2U8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+UmVtb3ZlIHRoZSBMUFRJTV9DUl9FTkFCTEUgYml0IGNsZWFyLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPkFkZCBhIG5ldyBBUEkmbmJzcDsgTFBUSU1fRGlzYWJsZSgpIGRlZmluZWQgaW4mbmJzcDsgaGFsX2xwdGltLmM8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+VXBkYXRlIF9fSEFMX0xQVElNX1JFU0VUX0hBTkRMRV9TVEFURShfX0hBTkRMRV9fKSBtYWNybyBieSBhZGRpbmcgYSBzcGVjaWZpYyAuLi4uIHdoZW4gdXNpbmcgY2FsbGJhY2sgcmVnaXN0ZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5fX0hBTF9MUFRJTV9FTkFCTEU8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5SZW1vdmUgdXNzZWxlc3MgY2hlY2sgb24gTFBUSU0yIGluIHRoZSBMTCBkcml2ZXIgc2luY2UgRjcgc3VwcG9ydCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBMUFRJTS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5VcGRhdGUgdGhlJm5ic3A7IExMX0xQVElNX0RJU0FCTEUoKSBBUEkgdXNlZCB0byBkaXNhYmxlIExQVElNIEhXIGluc3RhbmNlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPk1vdmUgQVBJIGRlZmluaXRpb24gdG8gbGxfbHB0aW0uYzwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBmb250LXNpemU6IDE2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+SEFMJm5ic3A7VElNPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48L2I+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgbmV3IG1hY3JvcyB0byBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGZhc3QgbW9kZSB3aGVuIHVzaW5nIHRoZSBvbmUgcHVsc2UgbW9kZSB0byBvdXRwdXQgYSB3YXZlZm9ybSB3aXRoIGEgbWluaW11bSBkZWxheTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5fPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPl9IQUxfVElNX0VOQUJMRV9PQ3hGQVNUKCkgYW5kIF9fSEFMX1RJTV9ESVNBQkxFX09DeEZBU1QoKS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+VTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsgZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+cGRhdGUgRW5jb2RlciBpbnRlcmZhY2UgbW9kZSB0byBrZWVwJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5USU1fQ0NFUl9DQ3hOUCBiaXRzIGxvdzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPlRJTV9FTkNPREVSSU5QVVRQT0xBUklUWV9SSVNJTkcgYW5kIFRJTV9FTkNPREVSSU5QVVRQT0xBUklUWV9GQUxMSU5HPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48c3Bhbj4mbmJzcDs8L3NwYW4+ZGVmaW5pdGlvbnMgdG8gZGV0ZXJtaW5lIGVuY29kZXIgaW5wdXQgcG9sYXJpdHkuPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+QWRkPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+SVNfVElNX0VOQ09ERVJJTlBVVF9QT0xBUklUWSgpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48c3Bhbj4mbmJzcDs8L3NwYW4+bWFjcm8gdG8gY2hlY2smbmJzcDt0aGUgZW5jb2RlciBpbnB1dCBwb2xhcml0eS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5VcGRhdGUgSEFMX1RJTV9FbmNvZGVyX0luaXQoKSBBUEkmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPlJlcGxhY2UgSVNfVElNX0lDX1BPTEFSSVRZKCkgbWFjcm8gYnkgSVNfVElNX0VOQ09ERVJJTlBVVF9QT0xBUklUWSgpIG1hY3JvLjwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkNvcnJlY3Qgd3JvbmcKKyAgICAgIGluc3RhbmNlIHBhcmFtZXRlciBjaGVjayBpbiBlbmNvZGVyIG1vZGU8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlJlcGxhY2UKKyAgICAgICAgSVNfVElNX0NDMl9JTlNUQU5DRSBieSBJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UgaW4gZW5jb2RlcgorICAgICAgICBpbnRlcmZhY2UgOiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTF9USU1fRW5jb2Rlcl9TdGFydCgpPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTF9USU1fRW5jb2Rlcl9TdG9wKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMX1RJTV9FbmNvZGVyX1N0b3BfSVQoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlJlcGxhY2UKKyAgICAgICAgSVNfVElNX0RNQV9DQ19JTlNUQU5DRSBieSBJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UgaW4gZW5jb2RlcgorICAgICAgICBpbnRlcmZhY2UgaW4gRE1BIG1vZGUgOiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTF9USU1fRW5jb2Rlcl9TdGFydF9ETUEoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUxfVElNX0VuY29kZXJfU3RvcF9ETUEoKTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PC91bD4KKworPHVsPjx1bD48bGk+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlVwZGF0ZQorICAgICAgSEFMX1RJTUV4X01hc3RlckNvbmZpZ1N5bmNocm9uaXphdGlvbigpIEFQSSB0byBhdm9pZCBmdW5jdGlvbmFsIGVycm9ycworICAgICAgYW5kJm5ic3A7YXNzZXJ0IGZhaWxzIHdoZW4gdXNpbmcgc29tZSBUSU0gaW5zdGFuY2VzIGFzIGlucHV0IHRyaWdnZXIuPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlJlcGxhY2UmbmJzcDtJU19USU1fU1lOQ0hST19JTlNUQU5DRSgpCisgICAgICAgbWFjcm8gYnkgSVNfVElNX01BU1RFUl9JTlNUQU5DRSgpIG1hY3JvLiZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQmbmJzcDtJU19USU1fU0xBVkVfSU5TVEFOQ0UoKQorICAgICAgIG1hY3JvIHRvJm5ic3A7Y2hlY2sgb24gVElNX1NNQ1JfTVNNIGJpdC48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5Qcm92aWRlIG5ldworICAgICAgQVBJJm5ic3A7dG8gc2V0IGFuZCBjbGVhciBVSUZSRU1BUDxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCBuZXcKKyAgICAgICBkZWZpbml0aW9uIGZvciBUSU0gVXBkYXRlIEludGVycnVwdCBGbGFnIFJlbWFwPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VElNX1VJRlJFTUFQX0RJU0FCTEU8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VElNX1VJRlJFTUFQX0VOQUJMRTxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCBuZXcgbWFjcm8KKyAgICAgICBpbiBIQUwgZHJpdmVyIHRvIGVuYWJsZSBhbmQgZGVzYWJsZSB0aGUmbmJzcDsgVXBkYXRlIEludGVycnVwdCBGbGFnCisgICAgICAgUmVtYXA8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJkaXNjIj48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij4mbmJzcDtfX0hBTF9USU1fVUlGUkVNQVBfRU5BQkxFKCk8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+X19IQUxfVElNX1VJRlJFTUFQX0RJU0FCTEUoKS9fX0hBTF9USU1fR0VUX1VJRkNQWQorICAgICAgICBtYWNybzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCBuZXcKKyAgICAgICBtZWNhbmlzbSB0byBjaGVjayB3aGV0aGVyIHRoZSZuYnNwO3VwZGF0ZSBpbnRlcnJ1cHQgZmxhZyAoVUlGKSBjb3B5IGlzCisgICAgICAgc2V0IG9yIG5vdCZuYnNwOzxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCB0aGUKKyAgICAgICAgX19IQUxfVElNX0dFVF9VSUZDUFkoKSBtYWNybyBpbiB0aGUgSEFMIGRyaXZlcjxvOnA+PC9vOnA+PC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQKKyAgICAgICAgTExfVElNX0lzQWN0aXZlVUlGQ1BZKCkgQVBJIGluIHRoZSBMTCBkcml2ZXI8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgbmV3IG1hY3JvCisgICAgICAgdG8gY2hlY2sgb24gdGhlJm5ic3A7VXBkYXRlIEludGVycnVwdCBGbGFnIFJlbWFwIG1vZGU8bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9ImRpc2MiPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5JU19USU1fVUlGUkVNQVBfTU9ERSgpPG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5SZW1vdmUgdXNzZWxlc3MKKyAgICAgIGRlZmluZSBpbiB0aGUgTEwgZHJpdmVyJm5ic3A7PG86cD48L286cD48L3NwYW4+PC9saT48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0iZGlzYyI+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VElNeF9BRjFfQktJTkUKKyAgICAgICAvIFRJTXhfQUYxX0JLREZCS0UgLyAmbmJzcDtUSU14X0FGMl9CSzJJTkUgLyAmbmJzcDtUSU14X0FGMl9CSzJERkJLRSAvCisgICAgICAgJm5ic3A7VElNeF9BRjJfQksySU5QPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPjwvc3Bhbj48dWwgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBtYXJnaW4tdG9wOiAwY207IG1hcmdpbi1ib3R0b206IDBpbjsgd29yZC1zcGFjaW5nOiAwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTZweDsgZm9udC1zdHlsZTogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5IQUwmbmJzcDs8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+U01BUlRDQVJEPC9zcGFuPiB1cGRhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IDQwMDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsiPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgU01BUlRDQVJEX1NldENvbmZpZygpIEFQSS48L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlNwbGl0IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCkgYW5kCitIQUxfUkNDX0dldFBDTEsyRnJlcSgpIG1hY3JvcyBmcm9tIHRoZSBCUlIgY2FsY3VsYXRpb24uPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyBmb250LXdlaWdodDogYm9sZDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMJm5ic3A7PC9zcGFuPjxiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBmb250LXNpemU6IDE2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogbGVmdDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyI+PC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPklSREEmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgSVJEQV9TZXRDb25maWcoKSBBUEkmbmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlNwbGl0IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCkgYW5kCitIQUxfUkNDX0dldFBDTEsyRnJlcSgpIG1hY3JvcyBmcm9tIHRoZSBJUkRBX0RJVl9TQU1QTElORzE2KCkgbWFjcm8uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VXBkYXRlIHNvbWUgQVBJIGRlc2NpcHRpb248L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTF9JUkRBX1RyYW5zbWl0KCkgLyZuYnNwO0hBTF9JUkRBX1RyYW5zbWl0X0lUKCk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9JUkRBX1JlY2VpdmUoKSAvJm5ic3A7SEFMX0lSREFfUmVjZWl2ZV9JVCgpPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkhBTF9JUkRBX1RyYW5zbWl0X0RNQSgpIC8gSEFMX0lSREFfUmVjZWl2ZV9ETUEoKTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFMIFJDQyA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgdGhlIEhBTF9SQ0NfQ2xvY2tDb25maWcoKSBhbmQgSEFMX1JDQ19EZUluaXQoKSBBUEkgdG8gZG9uJ3Qgb3ZlcndyaXRlIHRoZSBjdXN0b20gdGljayBwcmlvcml0eTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgSEFMX1JDQ19Pc2NDb25maWcoKSBBUEkgdG8gZG9uJ3QgcmV0dXJuIEhBTF9FUlJPUiBpZiByZXF1ZXN0IHJlcGVhdHMgdGhlIGN1cnJlbnQgUExMIGNvbmZpZ3VyYXRpb248L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5IQUwvTEwgVVNBUlQ8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+Jm5ic3A7dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgc3VwcG9ydCB0byB0aGUgUmVjZWl2ZXIgVGltZW91dCBJbnRlcnJ1cHQgaW4gdGhlCitIQUxfVVNBUlRfSVJRSGFuZGxlcjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5VcGRhdGUgc29tZSBBUEkgZGVzY2lwdGlvbiZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPgorCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtOyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfVVNBUlRfVHJhbnNtaXQoKSAvJm5ic3A7SEFMX1VTQVJUX1RyYW5zbWl0X0lUKCkmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworCisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMX1VTQVJUX1JlY2VpdmUoKSAvJm5ic3A7SEFMX1VTQVJUX1JlY2VpdmVfSVQoKSZuYnNwOzwvc3Bhbj48L3A+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPgorCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtIDJwdCAxOHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmUoKSAvJm5ic3A7SEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVCgpJm5ic3A7PC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IQUxfVVNBUlRfVHJhbnNtaXRfRE1BKCkgLyBIQUxfVVNBUlRfUmVjZWl2ZV9ETUEoKSAvIEhBTF9VU0FSVF9UcmFuc21pdFJlY2VpdmVfRE1BKCk8L3NwYW4+PC9wPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+VXBkYXRlIFVTQVJUX1NldENvbmZpZygpIEFQSSZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5TcGxpdCBIQUxfUkNDX0dldFBDTEsxRnJlcSgpIGFuZAorSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSBtYWNyb3MgZnJvbSB0aGUgVVNBUlRfRElWX1NBTVBMSU5HOCgpIG1hY3JvPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPlN1cHBvcnQgU3RvcCBNb2RlIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgVVNBUlQKK2RyaXZlciZuYnNwOyZuYnNwOzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgJm5ic3A7ZGVmaW5pdGlvbiBvZiBVU0FSVF9JU1JfUkVBQ0sgVVNBUlQsJm5ic3A7CityZWNlaXZlIGVuYWJsZSBhY2tub3dsZWRnZSBmbGFnIGluIHRoZSBIQUwgZHJpdmVyPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBsaW5lLWhlaWdodDogMTA2JTsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPkFkZCBuZXcgZmxhZyBkZWZpbml0aW9uIGluIHRoZSBMTCBkcml2ZXImbmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworCisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfSUNSX1dVQ0YmbmJzcDsgV2FrZXVwIGZyb20gU3RvcCBtb2RlIGZsYWcmbmJzcDs8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9JU1JfV1VGIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnJm5ic3A7PC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfSVNSX1JFQUNLIFJlY2VpdmUgZW5hYmxlIGFja25vd2xlZGdlIGZsYWcmbmJzcDs8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtIDJwdCAxOHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkxMX1VTQVJUX0NSM19XVUZJRSBXYWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IGVuYWJsZTwvc3Bhbj48L3A+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5BZGQgbmV3IGRlZmluaXRpb24gb2YgdGhlIGRpZmZlcmVudCBldmVudCB3aGljaAorYWN0aXZhdGVzIHRoZSZuYnNwO3dha2V1cCBmcm9tIFN0b3AgbW9kZSBmbGFnPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgbGluZS1oZWlnaHQ6IDEwNiU7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij5MTF8gPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGxpbmUtaGVpZ2h0OiAxMDYlOyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVTQVJUX1dBS0VVUF9PTl9BRERSRVNTPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9XQUtFVVBfT05fU1RBUlRCSVQ8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9XQUtFVVBfT05fUlhORTwvc3Bhbj48L3A+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBBUEkgaW4gTEwgZHJpdmVyIHRvIHN1cHBvcnQgc3RvcCBtb2RlPC9zcGFuPjwvcD48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPgorCisKKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9FbmFibGVJblN0b3BNb2RlKCkgdG8gZW5hYmxlIHRoZSBVU0FSVCBpbiBzdG9wIG1vZGU8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9EaXNhYmxlSW5TdG9wTW9kZSgpIHRvIGRpc2FibGUgdGhlIFVTQVJUIGluIHN0b3AgbW9kZTwvc3Bhbj48L3A+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPgorCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtIDJwdCAxOHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkxMX1VTQVJUX0lzRW5hYmxlZEluU3RvcE1vZGUoKSB0byBjaGVjayBpZiB0aGUgVVNBUlQgaXMgZW5hYmxlZCBvciBub3QKK2luIHRoZSBzdG9wIG1vZGU8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9FbmFibGVDbG9ja0luU3RvcE1vZGUoKSB0byBlbmFibGUgdGhlIFVTQVJUIGNsb2NrIGluIHRoZSBzdG9wCittb2RlPC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfRGlzYWJsZUNsb2NrSW5TdG9wTW9kZSgpIHRvIGRpc2FibGUgdGhlIFVTQVJUIGNsb2NrIGluIHRoZSBzdG9wCittb2RlPC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5MTF9VU0FSVF9Jc0Nsb2NrRW5hYmxlZEluU3RvcE1vZGUoKSB0byBjaGVjayB3aGV0aGVyIFVTQVJUIGNsb2NrIGFyZQorZW5hYmxlZCBvciBub3QgaW4gdGhlIHN0b3AgbW9kZTwvc3Bhbj48L3A+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+QWRkIG5ldyBBUEkgaW4gTEwgZHJpdmVyIHRvIG1hbmFnZSBldmVudCByZWxpc3RlZCB0byBXYWtlIFVQIEludGVycnVwdAorRmxhZzwvc3Bhbj48L3A+PC9saT48L3VsPjx1bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworCisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfU2V0V0tVUFR5cGUoKSB0byBzZWxlY3QgdGhlIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0CitGbGFnPC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfR2V0V0tVUFR5cGUoKSB0byBnZXQmbmJzcDsgdGhlIGV2ZW50IHR5cGUgZm9yIFdha2UgVVAgSW50ZXJydXB0CitGbGFnPC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfSXNBY3RpdmVGbGFnX1dLVVAoKSB0byBDaGVjayBpZiB0aGUgVVNBUlQgV2FrZSBVcCBmcm9tIHN0b3AKK21vZGUgRmxhZyBpcyBzZXQgb3Igbm90PC9zcGFuPjwvcD48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+CisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfSXNBY3RpdmVGbGFnX1JFQUNLKCkgdG8gQ2hlY2sgaWYgdGhlIFVTQVJUIFJlY2VpdmUgRW5hYmxlCitBY2tub3dsZWRnZSBGbGFnIGlzIHNldCBvciBub3Q8L3NwYW4+PC9wPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtIDJwdCAxOHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkxMX1VTQVJUX0NsZWFyRmxhZ19XS1VQKCkgQ2xlYXIgV2FrZSBVcCBmcm9tIHN0b3AgbW9kZSBGbGFnPC9zcGFuPjwvcD48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMnB0IDBjbSAycHQgMThwdDsgdGV4dC1pbmRlbnQ6IC0xOHB0OyBsaW5lLWhlaWdodDogbm9ybWFsOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQgbmV3IEFQSSBpbiBMTCBkcml2ZXIgdG8gbWFuYWdlIHdha2UgdXAgZnJvbSBzdG9wIGludGVycnVwdGlvbjwvc3Bhbj48L3A+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij4KKworCisKKzxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfRW5hYmxlSVRfV0tVUCgpIHRvIEVuYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdDwvc3Bhbj48L3A+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPgorCis8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAycHQgMGNtIDJwdCAxOHB0OyB0ZXh0LWluZGVudDogLTE4cHQ7IGxpbmUtaGVpZ2h0OiBub3JtYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkxMX1VTQVJUX0Rpc2FibGVJVF9XS1VQKCkgdG8gRGlzYWJsZSBXYWtlIFVwIGZyb20gU3RvcCBNb2RlIEludGVycnVwdDwvc3Bhbj48L3A+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDJwdCAwY20gMnB0IDE4cHQ7IHRleHQtaW5kZW50OiAtMThwdDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+TExfVVNBUlRfSXNFbmFibGVkSVRfV0tVUCgpIHRvIENoZWNrIGlmIHRoZSBVU0FSVCBXYWtlIFVwIGZyb20gU3RvcCBNb2RlCitJbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3Q8L3NwYW4+PC9wPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+SEFML0xMIFVTQiA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7Ij4mbmJzcDtBZGQgaGFuZGxpbmcgVVNCIGhvc3QgYmFiYmxlIGVycm9yIGludGVycnVwdDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyI+Jm5ic3A7Rml4IEVuYWJsaW5nIFVMUEkgaW50ZXJmYWNlIGZvciBwbGF0Zm9ybXMgdGhhdCBpbnRlZ3JhdGVzIFVTQiBIUyBQSFk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPiZuYnNwO0ZpeCBIb3N0IGRhdGEgdG9nZ2xpbmcgZm9yIElOIElzbyB0cmFuc2ZlcnM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiPiZuYnNwO0Vuc3VyZSB0byBkaXNhYmxlIFVTQiBFUCBkdXJpbmcgZW5kcG9pbnQgZGVhY3RpdmF0aW9uPC9zcGFuPjwvbGk+PC91bD48L3VsPgorPGIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGZvbnQtc2l6ZTogMTZweDsgZm9udC1zdHlsZTogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij48L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi43LyAwOC1GZWJydWFyeS0yMDE5PC9zcGFuPjwvaDM+CiAgICAgICAgICAgICA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiPjx1PjxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+CiAgICAgICAgICAgICA8dWwgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IHRleHQtdHJhbnNmb3JtOiBub25lOyB0ZXh0LWluZGVudDogMHB4OyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBtYXJnaW4tdG9wOiAwY207IG1hcmdpbi1ib3R0b206IDBpbjsgd29yZC1zcGFjaW5nOiAwcHg7IHdoaXRlLXNwYWNlOiBub3JtYWw7IiB0eXBlPSJzcXVhcmUiPgogPGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PC9saT4KQEAgLTg3NSwxMSArMTAwNiwxMSBAQAogCiA8L3VsPgogICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj4KLTxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjQxcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuNiAvIDI5LUp1bmUtMjAxODwvc3Bhbj48L2gzPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogNDAwOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7Ij48Yj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7OyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgb3JwaGFuczogMjsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDI7IHdvcmQtc3BhY2luZzogMHB4OyBsaW5lLWhlaWdodDogbm9ybWFsOyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0byBzdXBwb3J0IFNUTTMyRjczMHh4IGFuZCBTVE0zMkY3NTB4eCB2YWx1ZSBsaW5lczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+RE1BX0NIQU5ORUxfOCB0byBETUFfQ0hBTk5FTF8xNSBhcmUgYWxzbyBkZWZpbmVkIGluIGNhc2Ugb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjczMHh4ICg8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPnNhbWUmbmJzcDtmZWF0dXJlcyBhcyBTVE0zMkY3MzN4eCBsaW5lPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4pPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0g8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2Y8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5TVE0zMkY3MzB4eCB3aXRoIDQgRkxhc2ggc2VjdG9ycyBvZiAxNktCIGVhY2g8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPi48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgc3VwcG9ydCBvZjxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjc1MHh4IHdpdGggMiBGTGFzaCBzZWN0b3JzIG9mIDMyS0IgZWFjaDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Ljwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU88c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjczMHh4IHZhbHVlIGxpbmUgOiBzYW1lJm5ic3A7ZmVhdHVyZXMgYXMgU1RNMzJGNzMzeHggbGluZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBzdXBwb3J0IG9mJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5TVE0zMkY3NTB4eCB2YWx1ZSBsaW5lIDogc2FtZSZuYnNwO2ZlYXR1cmVzIGFzIFNUTTMyRjc1Nnh4Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5saW5lPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUkNDPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBzdXBwb3J0IG9mJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5TVE0zMkY3MzB4eCB2YWx1ZSBsaW5lIDogc2FtZSZuYnNwO2ZlYXR1cmVzIGFzIFNUTTMyRjczM3h4Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5saW5lPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjc1MHh4IHZhbHVlIGxpbmUgOiBzYW1lJm5ic3A7ZmVhdHVyZXMgYXMgU1RNMzJGNzU2eHgmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPmxpbmU8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi41IC8gMDItRmVicnVhcnktMjAxODwvc3Bhbj48L2gzPgorPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi42IC8gMjktSnVuZS0yMDE4PC9zcGFuPjwvaDM+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiA0MDA7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IG9ycGhhbnM6IDI7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAyOyB3b3JkLXNwYWNpbmc6IDBweDsiPjxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDs7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBvcnBoYW5zOiAyOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdpZG93czogMjsgd29yZC1zcGFjaW5nOiAwcHg7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHN1cHBvcnQgU1RNMzJGNzMweHggYW5kIFNUTTMyRjc1MHh4IHZhbHVlIGxpbmVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQTxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5ETUFfQ0hBTk5FTF84IHRvIERNQV9DSEFOTkVMXzE1IGFyZSBhbHNvIGRlZmluZWQgaW4gY2FzZSBvZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGNzMweHggKDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+c2FtZSZuYnNwO2ZlYXR1cmVzIGFzIFNUTTMyRjczM3h4IGxpbmU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPik8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSDxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgc3VwcG9ydCBvZjxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjczMHh4IHdpdGggNCBGTGFzaCBzZWN0b3JzIG9mIDE2S0IgZWFjaDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBzdXBwb3J0IG9mPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGNzUweHggd2l0aCAyIEZMYXNoIHNlY3RvcnMgb2YgMzJLQiBlYWNoPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij4uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR1BJTzxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgc3VwcG9ydCBvZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGNzMweHggdmFsdWUgbGluZSA6IHNhbWUmbmJzcDtmZWF0dXJlcyBhcyBTVE0zMkY3MzN4eCBsaW5lPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjc1MHh4IHZhbHVlIGxpbmUgOiBzYW1lJm5ic3A7ZmVhdHVyZXMgYXMgU1RNMzJGNzU2eHgmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPmxpbmU8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8c3Bhbj4mbmJzcDs8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlNUTTMyRjczMHh4IHZhbHVlIGxpbmUgOiBzYW1lJm5ic3A7ZmVhdHVyZXMgYXMgU1RNMzJGNzMzeHgmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPmxpbmU8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgc3VwcG9ydCBvZiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+U1RNMzJGNzUweHggdmFsdWUgbGluZSA6IHNhbWUmbmJzcDtmZWF0dXJlcyBhcyBTVE0zMkY3NTZ4eCZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+bGluZTwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDI0MXB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjUgLyAwMi1GZWJydWFyeS0yMDE4PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkdlbmVyYWwgdXBkYXRlcyB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMJm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IG1hY3JvIHRvIGdldCB2YXJpYWJsZSBhbGlnbmVkIG9uIDMyLWJ5dGVzLCByZXF1aXJlZCBmb3IgY2FjaGUgbWFpbnRlbmFuY2UgcHVycG9zZTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBVTlVTRUQoKSBtYWNybyBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCBHQ0Mgd2FybmluZzwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5UaGUgd2FybmluZyBpcyBkZXRlY3RlZCB3aGVuIHRoZSBVTlVTRUQoKSBtYWNybyBpcyBjYWxsZWQgZnJvbSBDKysgZmlsZTwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU0FJIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9TQUlfRE1BU3RvcCgpIGFuZCBIQUxfU0FJX0Fib3J0KCkgcHJvY2VzcyB0byBmaXggdGhlIGxvY2svdW5sb2NrIGF1ZGlvIGlzc3VlIDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBXUiA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZQogSEFMX1BXUl9FbnRlclNMRUVQTW9kZSgpIGFuZCBIQUxfUFdSX0VudGVyU1RPUE1vZGUoKSBBUElzIHRvIGVuc3VyZQotdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGZpbmlzaGVkIGJlZm9yZSBlbnRlcmluZyBTVE9QIG1vZGUuIDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhDRCA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgY2FsbGJhY2sgdG8gYmUgdXNlZCB0byBoYW5kbGUgdXNiIGRldmljZSBjb25uZWN0aW9uL2Rpc2Nvbm5lY3Rpb248L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hDRF9Qb3J0RW5hYmxlZF9DYWxsYmFjaygpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hDRF9Qb3J0RGlzYWJsZWRfQ2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHByZXZlbnQgcmVhY3RpdmF0ZSBob3N0IGludGVycnJ1cHQgY2hhbm5lbDxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi40IC8gMjItRGVjZW1iZXItMjAxNzwvc3Bhbj48L2gzPgordGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIGZpbmlzaGVkIGJlZm9yZSBlbnRlcmluZyBTVE9QIG1vZGUuIDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEhDRCA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgY2FsbGJhY2sgdG8gYmUgdXNlZCB0byBoYW5kbGUgdXNiIGRldmljZSBjb25uZWN0aW9uL2Rpc2Nvbm5lY3Rpb248L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hDRF9Qb3J0RW5hYmxlZF9DYWxsYmFjaygpPC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX0hDRF9Qb3J0RGlzYWJsZWRfQ2FsbGJhY2soKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRvIHByZXZlbnQgcmVhY3RpdmF0ZSBob3N0IGludGVycnJ1cHQgY2hhbm5lbDxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyNDFweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi40IC8gMjItRGVjZW1iZXItMjAxNzwvc3Bhbj48L2gzPgogPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgogQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPlRoZSBmb2xsb3dpbmcgY2hhbmdlcyBkb25lIG9uIHRoZSBIQUwgZHJpdmVycyByZXF1aXJlIGFuIHVwZGF0ZSBvbiB0aGUgYXBwbGljYXRpb24gY29kZSBiYXNlZCBvbiBvbGRlciBIQUwgdmVyc2lvbnM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPlJld29yayBvZiBIQUwgQ0FOIGRyaXZlciAoY29tcGF0aWJpbGl0eSBicmVhaykmbmJzcDs8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7Ij5BCiBuZXcgSEFMIENBTiBkcml2ZXIgaGFzIGJlZW4gcmVkZXNpZ25lZCB3aXRoIG5ldyBBUElzLCB0byBieXBhc3MKQEAgLTkxNywxNCArMTA0OCwxNCBAQAogICAgICAgICBzdGF0dXM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZCBjaGVja3MgZm9yIEhTSSwgUExMIGFuZAogICAgICAgICBQTExJMlMgJm5ic3A7cmVhZHkgYmVmb3JlIG1vZGlmeWluZyBSQ0MgQ0ZHUiByZWdpc3RlcnM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkNsZWFyIGFsbCBpbnRlcnJ1cHQgZmxhZ3M8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsiIGxhbmc9IkVOLVVTIj48bzpwPjwvbzpwPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkluaXRpYWxpemUgc3lzdGljayBpbnRlcnJ1cHQKICAgICAgICAgcGVyaW9kPC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIERNQSA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBsYW5nPSJmciI+PGZvbnQgZmFjZT0iQ291cmllciBOZXciIHNpemU9IjIiPjwvZm9udD48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQgY2xlYW4gb2YgY2FsbGJhY2tzIGluIEhBTF9ETUFfRGVJbml0KCkmbmJzcDtBUEk8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5GaXggd3JvbmcgRE1BX0ZMQUdfRkVJRk9fNCBhbmQgRE1BX0ZMQUdETUFFSUZPXzQgZGVmaW5lcyB2YWx1ZXMmbmJzcDs8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBJMkMgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEludGVyZmFjZSBBUElzIGhlYWRlcnMgdG8gcmVtb3ZlIGNvbmZ1c2luZyBtZXNzYWdlIGFib3V0IGRldmljZSBhZGRyZXNzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkkyQ19XYWl0T25SWE5FRmxhZ1VudGlsVGltZW91dCgpIHRvIHJlc29sdmUgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIFNUT1BGIGFuZCBSWE5FIEZsYWdzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IiBsYW5nPSJFTi1VUyI+PG86cD48L286cD48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlJm5ic3A7STJDX1RyYW5zZmVyQ29uZmlnKCkgdG8gZml4IHdyb25nIGJpdCBtYW5hZ2VtZW50PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBVU0FSVDxzcGFuPiZuYnNwOzwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgYXNzZXJ0IG1hY3JvcyB0byBjaGVjayBVU0FSVCBCYXVkUmF0ZSByZWdpc3Rlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+SEFMIEVUSCA8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkRvey4ufSBXaGlsZSgwKSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPmluc3VyZWQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+aW4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5tdWx0aSBzdGF0ZW1lbnQgbWFjcm9zPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+IDo8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+X19IQUxfRVRIX1dBS0VVUF9FWFRJX0VOQUJMRV9GQUxMSU5HUklTSU5HX1RSSUdHRVIoKSZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPl9fSEFMX0VUSF9XQUtFVVBfRVhUSV9ESVNBQkxFX0ZBTExJTkdSSVNJTkdfVFJJR0dFUigpPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+IDxicj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj48L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEZMQVNIPHNwYW4+Jm5ic3A7PC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9GTEFTSF9VbmxvY2soKSB1cGRhdGUgdG8gcmV0dXJuIHN0YXRlIGVycm9yIHdoZW4gdGhlIEZMQVNIIGlzIGFscmVhZHkgdW5sb2NrZWQ8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBHUElPPHNwYW4+IDwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBtaXNzaW5nIGRlZmluZSBvZiBHUElPX1BJTl8yIGluIEdQSU9LX1BJTl9BVkFJTEFCTEUgbGlzdDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFBDRDxzcGFuPiA8L3NwYW4+PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+RG97Li59IFdoaWxlKDApICZuYnNwO2luc3VyZWQgaW4gbXVsdGkgc3RhdGVtZW50IG1hY3Jvczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVVRJTFM8c3Bhbj4gPC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5zdG0zMmY3eHhfPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5sbF91dGlscy5oIDogVXBkYXRlIExMX0dldFBhY2thZ2VUeXBlIGNvbW1hbmQgdG8gcmV0dXJuIHVpbnQzMl90IGluc3RlYWQgb2YgdWludDE2X3Q8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBUSU08c3Bhbj4gPC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPnN0bTMyZjd4eF9oYWxfdGltX2V4LmMgOiBVcGRhdGUgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUgQVBJIHRvIGF2b2lkIHRvIGJsb2NrIHRpbWVyIGJlaGF2aW9yIHdoZW4gPGJyPnJlbWFpbnMgaW4gdGhlIHN0YXRlIEhBTF9USU1fU1RBVEVfQlVTWS48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+c3RtMzJmN3h4X2hhbF90aW0uaCA6Jm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5GaXggX19IQUxfVElNX1NFVF9QUkVTQ0FMRVIoKSBtYWNybzwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyxzZXJpZjsgY29sb3I6IGJsYWNrOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5GaXggdHlwb3MgaW4gc29tZSBleHBvcnRlZCBtYWNyb3MgZGVzY3JpcHRpb24mbmJzcDs8L3NwYW4+PC9saT48L3VsPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgRk1DPHNwYW4+IDwvc3Bhbj48L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LXNpemU6IDEycHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfU0RSQU1fU2VuZENvbW1hbmQoKSBBUEk6IDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIHRoZSZuYnNwO3RpbWVvdXQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPiBjaGVjazwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIE5BTkQ8c3Bhbj4gPC9zcGFuPjwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCB3cm9uZyBjaGVjayBmb3IgTkFORCBzdGF0dXM8L3NwYW4+PC9saT48L3VsPjwvdWw+Ci08aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjMgLyAyNS1BdWd1c3QtMjAxNzwvc3Bhbj48L2gzPgorPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi4zIC8gMjUtQXVndXN0LTIwMTc8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47IGNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgZm9udC1zaXplOiBtZWRpdW07IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd29yZC1zcGFjaW5nOiAwcHg7IG1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgCiB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgRGF0ZSBhbmQgVmVyc2lvbiBmcm9tIGhlYWRlciBmaWxlczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTCBkcml2ZXJzIHRvIHJlZmVyIHRvIHRoZSBuZXcmbmJzcDtDTVNJUyBiaXQgcG9zaXRpb24gZGVmaW5lcyBpbnN0ZWFkIG9mIHVzYWdlIHRoZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlBPU0lUSU9OX1ZBTCgpIG1hY3JvPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENBTiA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkFkZCBtaXNzaW5nIHVubG9jayBpbiBIQUxfQ0FOX1JlY2VpdmVfSVQoKSBwcm9jZXNzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRENNSSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBEQ01JIGRyaXZlciBjbGVhbi11cDogcmVtb3ZlIG5vbiByZWZlcmVuY2VkIGNhbGxiYWNrIEFQSXM6IEhBTF9EQ01JX1ZzeW5jQ2FsbGJhY2soKSBhbmQgSEFMX0RDTUlfSHN5bmNDYWxsYmFjaygpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwmbmJzcDtERlNETSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCBjYXN0IGlzc3VlIG9uIEFQSXMgdGhhdCByZXR1cm4gc2lnbmVkIGludGVnZXIgdmFsdWUgKHVpbnQzMl90KSZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTCBETUEgZHJpdmVyIGNsZWFuLXVwOiByZW1vdmUgbm9uIHJlZmVyZW5jZWQgY2FsbGJhY2sgQVBJczogSEFMX0RNQV9DbGVhbkNhbGxiYWNrcygpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0ggPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5GTEFTSF9Qcm9ncmFtX0RvdWJsZVdvcmQoKSBBUEk6IFJlcGxhY2UgNjQtYml0IGFjY2Vzc2VzIHdpdGggMiBkb3VibGUgd29yZHMgb3BlcmF0aW9uczwvc3Bhbj48L2xpPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbjsgY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IG1lZGl1bTsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbjogc3RhcnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3b3JkLXNwYWNpbmc6IDBweDsgbWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR2VuZXJpYyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBhc3NlcnRfcGFyYW0oKSBtYWNybyBkZWZpbml0aW9uIHRvIGJlIGluIGxpbmUgd2l0aCBzdG0zMl9sbF91dGlscy5jIGRyaXZlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEdQSU8gPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5HUElPS19QSU5fQVZBSUxBQkxFKCkgYXNzZXJ0IG1hY3JvIHVwZGF0ZSB0byBhbGxvdyBwb3NzaWJpbGl0eSB0byBjb25maWd1cmUgR1BJT19QSU5fMjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIExUREMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5SZW5hbWUgSEFMX0xURENfTGluZUV2ZW5DYWxsYmFjaygpIEFQSSB0byZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkhBTF9MVERDX0xpbmVFdmVuPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+dDwvc3Bhbj5DYWxsYmFjaygpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUENEIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIEhBTF9QQ0RfSVJRSGFuZGxlcigpIEFQSSB0byBmaXgmbmJzcDt0cmFuc2ZlciBpc3N1ZXMgd2hlbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VU0IgSFMgaXMgdXNlZCB3aXRoIERNQSZuYnNwO2VuYWJsZWQ8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0MgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX1JDQ19HZXRPc2NDb25maWcoKSBBUEkgdG86PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPnNldCBQTExSIGluIHRoZSBSQ0NfT3NjSW5pdFN0cnVjdDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPmNoZWNrIG9uIG51bGwgcG9pbnRlcjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkgQVBJIHRvOjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5jaGVjayBvbiBudWxsIHBvaW50ZXI8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5vcHRpbWl6ZSZuYnNwO2NvZGUgc2l6ZSBieSB1cGRhdGluZyB0aGUgaGFuZGxpbmcgbWV0aG9kIG9mIHRoZSBTV1MgYml0czwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPnVwZGF0ZQogdG8gdXNlJm5ic3A7IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgZmxhc2ggbWFjcm8gaW5zdGVhZCBvZiB1c2luZwogZGlyZWN0IHJlZ2lzdGVyIGFjY2VzcyB0byZuYnNwO0xBVEVOQ1kgYml0cyBpbiBGTEFTSCBBQ1IgcmVnaXN0ZXI8L3NwYW4+PHNwYW4gbGFuZz0iZnIiPi4gPC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTQUkgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgSEFMX1NBSV9ETUFTdG9wKCkgQVBJIHRvIGZsdXNoIGZpZm8gYWZ0ZXIgZGlzYWJsaW5nJm5ic3A7U0FJPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9USU1FeF9Db25maWdCcmVha0lucHV0KCkgQVBJIHRvJm5ic3A7c3VwcG9ydCBCS0lOUC9CS0lOMlAgcG9sYXJpdHkgYml0cy48YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIERNQSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZQogU0VUX0JJVCgpIGFjY2VzcyB0byBMSUZDUiBhbmQgSElGQ1IgcmVnaXN0ZXJzIGJ5IFdSSVRFX1JFRygpIHRvIGF2b2lkCi1yZWFkIGFjY2VzcyB0aGF0IGlzIG5vdCBhbGxvd2VkIHdoZW4gY2xlYXJpbmcgRE1BIGZsYWdzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBJMkMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgTExfSTJDX0luaXQoKSBBUEkgdG8gYXZvaWQgZW5hYmxpbmcgb3duIGFkZHJlc3MxIHdoZW4gT3duQWRkcmVzczEgcGFyYW1ldGVyIHZhbHVlIGluIHRoZSBJMkNfSW5pdFN0cnVjdCBpcyBlcXVhbCB0byAwLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVElNIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudCgpIEFQSSB0byBjbGVhciBVRElTIGJpdCBpbiBDUjEgcmVnaXN0ZXIgaW5zdGVhZCBvZiBzZXR0aW5nIGl0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50KCkgQVBJIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPnRvIHNldCBVRElTIGJpdCBpbiBDUjEgcmVnaXN0ZXIgaW5zdGVhZCBvZiBjbGVhcmluZyBpdC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQiA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBVU0JfRVAwU3RhcnRYZmVyKCkgQVBJIHRvIGZpeCZuYnNwO3RyYW5zZmVyIGlzc3VlcyB3aGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVTQiBIUyBpcyB1c2VkIHdpdGggRE1BJm5ic3A7ZW5hYmxlZDwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjIgLyAxNC1BcHJpbC0yMDE3PC9zcGFuPjwvaDM+CityZWFkIGFjY2VzcyB0aGF0IGlzIG5vdCBhbGxvd2VkIHdoZW4gY2xlYXJpbmcgRE1BIGZsYWdzPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBJMkMgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgTExfSTJDX0luaXQoKSBBUEkgdG8gYXZvaWQgZW5hYmxpbmcgb3duIGFkZHJlc3MxIHdoZW4gT3duQWRkcmVzczEgcGFyYW1ldGVyIHZhbHVlIGluIHRoZSBJMkNfSW5pdFN0cnVjdCBpcyBlcXVhbCB0byAwLjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVElNIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LHNhbnMtc2VyaWY7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIExMX1RJTV9FbmFibGVVcGRhdGVFdmVudCgpIEFQSSB0byBjbGVhciBVRElTIGJpdCBpbiBDUjEgcmVnaXN0ZXIgaW5zdGVhZCBvZiBzZXR0aW5nIGl0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBMTF9USU1fRGlzYWJsZVVwZGF0ZUV2ZW50KCkgQVBJIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPnRvIHNldCBVRElTIGJpdCBpbiBDUjEgcmVnaXN0ZXIgaW5zdGVhZCBvZiBjbGVhcmluZyBpdC48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFVTQiA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBVU0JfRVAwU3RhcnRYZmVyKCkgQVBJIHRvIGZpeCZuYnNwO3RyYW5zZmVyIGlzc3VlcyB3aGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPlVTQiBIUyBpcyB1c2VkIHdpdGggRE1BJm5ic3A7ZW5hYmxlZDwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjIgLyAxNC1BcHJpbC0yMDE3PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluOyBjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbic7IGZvbnQtc2l6ZTogbWVkaXVtOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBzdGFydDsgdGV4dC1pbmRlbnQ6IDBweDsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IHdvcmQtc3BhY2luZzogMHB4OyBtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+R2VuZXJhbCB1cGRhdGVzIAogdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDQU4gPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5BZGQKQEAgLTkzMywxMiArMTA2NCwxMiBAQAogICAgICAgaW50ZXJydXB0Ljwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyIgbGFuZz0iRU4tVVMiPkZpeCZuYnNwO21lc3NhZ2UKICAgICAgIGxvc3QgaXNzdWUgd2l0aCBzcGVjaWZpYyBzZXF1ZW5jZSBvZiB0cmFuc21pdCByZXF1ZXN0cy48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssc2Fucy1zZXJpZjsiIGxhbmc9IkVOLVVTIj5IYW5kbGUKICAgICAgIHRyYW5zbWlzc2lvbiBmYWlsdXJlIHdpdGggZXJyb3IgY2FsbGJhY2ssIHdoZW4gTkFSVCBpcyBlbmFibGVkLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OyxzYW5zLXNlcmlmOyBjb2xvcjogYmxhY2s7IiBsYW5nPSJFTi1VUyI+QWRkIF9fSEFMX0NBTl9DQU5DRUxfVFJBTlNNSVQoKSBjYWxsIHRvIGFib3J0IHRyYW5zbWlzc2lvbiB3aGVuCi0gICAgICB0aW1lb3V0IGlzIHJlYWNoZWQ8L3NwYW4+PC9saT48L3VsPjwvdWw+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAyMDBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMi4xIC8gMjQtTWFyY2gtMjAxNzwvc3Bhbj48L2gzPgorICAgICAgdGltZW91dCBpcyByZWFjaGVkPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuMSAvIDI0LU1hcmNoLTIwMTc8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTMuMzMzM3B4OyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtdmFyaWFudDogbm9ybWFsOyBsZXR0ZXItc3BhY2luZzogbm9ybWFsOyBsaW5lLWhlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsgZGlzcGxheTogaW5saW5lICEgaW1wb3J0YW50OyBmbG9hdDogbm9uZTsiPlVwZGF0ZSBDSE0gVXNlck1hbnVhbHMgdG8gc3VwcG9ydCBMTCBkcml2ZXJzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgCiB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQSA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfRE1BX0luaXQoKSBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIGNvbXBhdGliaWxpdHkgY2hlY2sgYmV0d2VlbiBGSUZPIHRocmVzaG9sZCBhbmQgYnVyc3QgY29uZmlndXJhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIE1NQyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfTU1DX0luaXRDYXJkKCkgZnVuY3Rpb24gd2l0aCBwcm9wZXIgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgYWRkaW5nIGEgZGVsYXkgYWZ0ZXIgTU1DIGNsb2NrIGVuYWJsZTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBNTUNfRE1BRXJyb3IoKSBmdW5jdGlvbiBpZ25vcmUgRE1BIEZJRk8gZXJyb3IgYXMgbm90IGltcGFjdGluZyB0aGUgZGF0YSB0cmFuc2Zlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNEIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9TRF9Jbml0Q2FyZCgpIGZ1bmN0aW9uIHdpdGggcHJvcGVyIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGFkZGluZyBhIGRlbGF5IGFmdGVyIFNEIGNsb2NrIGVuYWJsZTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBTRF9ETUFFcnJvcigpIGZ1bmN0aW9uIGlnbm9yZSBETUEgRklGTyBlcnJvciBhcyBub3QgaW1wYWN0aW5nIHRoZSBkYXRhIHRyYW5zZmVyPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIE5BTkQgPC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX05BTkRfQWRkcmVzc19JbmMoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgcHJvcGVyIHBsYW5lIG51bWJlciBjaGVjazwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFNETU1DIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIFNETU1DX0RBVEFUSU1FT1VUIHZhbHVlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWUgbmVlZGVkIGJ5IHJlYWRpbmcgYW5kIHdyaXRpbmcgb3BlcmF0aW9ucyBvZiBTRCBhbmQgTU1DIGNhcmRzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOyBjb2xvcjogcmdiKDAsIDAsIDApOyBkaXJlY3Rpb246IGx0cjsiIGRpcj0ibHRyIj48L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkxMIFJUQyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkxMX1JUQ19USU1FX0dldCgpIGFuZCBMTF9SVENfREFURV9HZXQoKSBpbmxpbmUgbWFjcm9zIG9wdGltaXphdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgQURDIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Rml4IHdyb25nIEFEQyBncm91cCBpbmplY3RlZCBzZXF1ZW5jZSBjb25maWd1cmF0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkxMX0FEQ19JTkpfU2V0U2VxdWVuY2VyUmFua3MoKQogYW5kIExMX0FEQ19JTkpfR2V0U2VxdWVuY2VyUmFua3MoKSBBUEkncyB1cGRhdGUgdG8gdGFrZSBpbgotY29uc2lkZXJhdGlvbiB0aGUgQURDIG51bWJlciBvZiBjb252ZXJzaW9uczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0aGUmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5kZWZpbmVkIHZhbHVlcyBmb3I8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij4gQURDIGdyb3VwIGluamVjdGVkIHNlcWVuY2VyIHJhbmtzJm5ic3A7PGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjIuMCAvIDMwLURlY2VtYmVyLTIwMTY8L3NwYW4+PC9oMz4KK2NvbnNpZGVyYXRpb24gdGhlIEFEQyBudW1iZXIgb2YgY29udmVyc2lvbnM8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+ZGVmaW5lZCB2YWx1ZXMgZm9yPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+IEFEQyBncm91cCBpbmplY3RlZCBzZXFlbmNlciByYW5rcyZuYnNwOzxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4yLjAgLyAzMC1EZWNlbWJlci0yMDE2PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5PZmZpY2lhbCByZWxlYXNlIHRvIGFkZCB0aGUgc3VwcG9ydCBvZiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkY3MjJ4eCwgU1RNMzJGNzIzeHgsIFNUTTMyRjczMnh4PC9zcGFuPiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5hbmQgU1RNMzJGNzMzeHg8L3NwYW4+IGRldmljZXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEzLjMzMzNweDsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXZhcmlhbnQ6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IGxlZnQ7IHRleHQtaW5kZW50OiAwcHg7IHRleHQtdHJhbnNmb3JtOiBub25lOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyB3aWRvd3M6IDE7IHdvcmQtc3BhY2luZzogMHB4OyBkaXNwbGF5OiBpbmxpbmUgISBpbXBvcnRhbnQ7IGZsb2F0OiBub25lOyI+QWRkIExvdyBMYXllciBkcml2ZXJzIGFsbG93aW5nIHBlcmZvcm1hbmNlIGFuZCBmb290cHJpbnQgb3B0aW1pemF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkxvdwogTGF5ZXIgZHJpdmVycyBBUElzIHByb3ZpZGUgcmVnaXN0ZXIgbGV2ZWwgcHJvZ3JhbW1pbmc6IHJlcXVpcmUgZGVlcApAQCAtOTQ4LDkgKzEwNzksOSBAQAogVVNBUlQsIFdXREcgcGVyaXBoZXJhbHMgYW5kIGFkZGl0aW9ubmFsIExvdyBMZXZlbCBCdXMsIFN5c3RlbSBhbmQKIFV0aWxpdGllcyBBUElzLjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtc2l6ZTogMTJwdDsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsiPkxvdyBMYXllciBkcml2ZXJzIEFQSXMgYXJlIGltcGxlbWVudGVkIGFzIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gaW4gbmV3PHNwYW4gY2xhc3M9IkFwcGxlLWNvbnZlcnRlZC1zcGFjZSI+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5JbmMvc3RtMzJmN3h4X2xsX3BwcC5oPC9zcGFuPjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwvc3Bhbj5maWxlcyBmb3IgUFBQIHBlcmlwaGVyYWxzLCB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGVhY2g8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnN0bTMyZjd4eF9sbF9wcHAuaDwvc3Bhbj48c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4mbmJzcDs8L3NwYW4+ZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIHVzZXIgY29kZS48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+R2VuZXJhbCB1cGRhdGVzIAogdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBIQUwgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TU1DPC9zcGFuPiBhbmQgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+U01CVVM8L3NwYW4+IGRyaXZlcnM8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ29ydGV4PC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+TW92ZSBIQUxfTVBVX0Rpc2FibGUoKSBhbmQgSEFMX01QVV9FbmFibGUoKSBmcm9tIHN0bTMyZjd4eF9oYWxfY29ydGV4LmggdG8gc3RtMzJmN3h4X2hhbF9jb3J0ZXguYzwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkNsZWFyIHRoZSB3aG9sZSBNUFUgY29udHJvbCByZWdpc3RlciBpbiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9NUFVfRGlzYWJsZSgpIEFQSTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENSWVA8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgc3VwcG9ydCBvZiBBRVM8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgYSBjaGVjayBvbiBETUEgc3RyZWFtIGluc3RhbmNlIGluIEhBTF9ETUFfRGVJbml0KCkgQVBJPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRVRIPC9zcGFuPiB1cGRhdGUmbmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5GaXggd3JvbmcgZGVmaW5pdGlvbnMgaW4gZHJpdmVyIGhlYWRlciBmaWxlIHN0bTMyZjdfaGFsX2V0aC5oPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRkxBU0g8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5TdXBwb3J0IE9UUCBwcm9ncmFtIG9wZXJhdGlvbjwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0aGUgc3VwcG9ydCBvZiBQQ1JPUCBmZWF0dXJlPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRoZSBjbGVhcmluZyBvZiBlcnJvciBmbGFnczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFsaWduIGRyaXZlciBzb3VyY2UgY29kZSB3aXRoIG90aGVyIFNUTTMyIGZhbWlsaWVzPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEpQRUc8L3NwYW4+IHVwZGF0ZSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSB0aGUgb3V0cHV0IGRhdGEgbWFuYWdlbWVudCB3aGVuJm5ic3A7SEFMX0pQRUdfUGF1c2UoKSBpcyBwZXJmb3JtZWQgZHVyaW5nIHRoZSBsYXN0IGRhdGEgc2VuZGluZzwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFJDQyA8L3NwYW4+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkVuYWJsZSBQV1Igb25seSBpZiBuZWNlc3NhcnkgZm9yIExTRSBjb25maWd1cmF0aW9uIGluIEhBTF9SQ0NfT3NjQ29uZmlnKCkgQVBJPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVuYW1lIFJDQ19MUFRJTTFDTEtTT1VSQ0VfUENMSyBkZWZpbmUgdG8gUkNDX0xQVElNMUNMS1NPVVJDRV9QQ0xLMTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbmFtZSBSQ0NfREZTRE0xQ0xLU09VUkNFX1BDTEsgZGVmaW5lIHRvIFJDQ19ERlNETTFDTEtTT1VSQ0VfUENMSzI8YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU1BJPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Q2xlYXIgUlggRklGTyBhdCB0aGUgZW5kIG9mIGVhY2ggdHJhbnNhY3Rpb248L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBVQVJUPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVTQVJUX0NSMl9MSU5FTiBiaXQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+Y2xlYXJpbmcmbmJzcDt3aGVuIGluaXRpYWxpemluZyBpbiBzeW5jaHJvbm91cyBtb2RlPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVVNCPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YgZW1iZWRkZWQgVVNCIFBIWSBDb250cm9sbGVyPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIHN1cHBvcnQgb2YgQmF0dGVyeSBDaGFyZ2luZyBEZXRlY3RvciAoQkNEKSBmZWF0dXJlPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5MTCBTRE1NQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgU0RNTUNfQ21kU0RFcmFzZVN0YXJ0QWRkLCBTRE1NQ19DbWRTREVyYXNlRW5kQWRkLCBTRE1NQ19DbWRPcENvbmRpdGlvbiBhbmQgU0RNTUNfQ21kU3dpdGNoIGZ1bmN0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TEwgVVNCPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIFBFTkEgYml0IGNsZWFyaW5nIGluIE9UR19IUFJUMCByZWdpc3Rlcjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5UaGUgZm9sbG93aW5nIGNoYW5nZXMgZG9uZSBvbiB0aGUgSEFMIGRyaXZlcnMgcmVxdWlyZSBhbiB1cGRhdGUgb24gdGhlIAotYXBwbGljYXRpb24gY29kZSBiYXNlZCBvbiBvbGRlciBIQUwgdmVyc2lvbnM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTRDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+T3ZlcmFsbCByZXdvcmsgb2YgdGhlIGRyaXZlciBmb3IgYSBtb3JlIGVmZmljaWVudCZuYnNwO2ltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TW9kaWZ5IGluaXRpYWxpemF0aW9uIEFQSSBhbmQgc3RydWN0dXJlczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TW9kaWZ5IFJlYWQgLyBXcml0ZSBzZXF1ZW5jZXM6IHNlcGFyYXRlIHRyYW5zZmVyIHByb2Nlc3MgYW5kIFNEIENhcmRzIHN0YXRlIG1hbmFnZW1lbnQmbmJzcDs8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZGluZyBpbnRlcnJ1cHQgbW9kZSBmb3IgUmVhZCAvIFdyaXRlIG9wZXJhdGlvbnM8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0aGUgSEFMX1NEX0lSUUhhbmRsZXIgZnVuY3Rpb24gYnkgb3B0aW1pemluZyB0aGUgbWFuYWdlbWVudCBvZiBpbnRlcnJ1cHQgZXJyb3JzPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5SZWZlciB0byB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM6IEJTUCBleGFtcGxlIGFuZCBVU0JfRGV2aWNlL01TQ19TdGFuZGFsb25lIGFwcGxpY2F0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBBdXRvUmVsb2FkUHJlbG9hZCBmaWVsZCBpbiBUSU1fQmFzZV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmU8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlZmVyIHRvIHRoZSBUSU0gZXhhbXBsZXMgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4mbmJzcDs8L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTkFORDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPk1vZGlmeSBOQU5EX0FkZHJlc3NUeXBlRGVmLCBOQU5EX0RldmljZUNvbmZpZ1R5cGVEZWYgYW5kIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmVzIGZpZWxkczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgSEFMX05BTkRfQ29uZmlnRGV2aWNlIEFQSTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48YiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IDE2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMSAvIDAxLUp1bHktMjAxNjwvc3Bhbj48L2gzPgorYXBwbGljYXRpb24gY29kZSBiYXNlZCBvbiBvbGRlciBIQUwgdmVyc2lvbnM8L3NwYW4+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTRDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+T3ZlcmFsbCByZXdvcmsgb2YgdGhlIGRyaXZlciBmb3IgYSBtb3JlIGVmZmljaWVudCZuYnNwO2ltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TW9kaWZ5IGluaXRpYWxpemF0aW9uIEFQSSBhbmQgc3RydWN0dXJlczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+TW9kaWZ5IFJlYWQgLyBXcml0ZSBzZXF1ZW5jZXM6IHNlcGFyYXRlIHRyYW5zZmVyIHByb2Nlc3MgYW5kIFNEIENhcmRzIHN0YXRlIG1hbmFnZW1lbnQmbmJzcDs8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkFkZGluZyBpbnRlcnJ1cHQgbW9kZSBmb3IgUmVhZCAvIFdyaXRlIG9wZXJhdGlvbnM8L3NwYW4+PC9saT48L3VsPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSB0aGUgSEFMX1NEX0lSUUhhbmRsZXIgZnVuY3Rpb24gYnkgb3B0aW1pemluZyB0aGUgbWFuYWdlbWVudCBvZiBpbnRlcnJ1cHQgZXJyb3JzPGJyPjwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5SZWZlciB0byB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM6IEJTUCBleGFtcGxlIGFuZCBVU0JfRGV2aWNlL01TQ19TdGFuZGFsb25lIGFwcGxpY2F0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QWRkIG5ldyBBdXRvUmVsb2FkUHJlbG9hZCBmaWVsZCBpbiBUSU1fQmFzZV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmU8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlJlZmVyIHRvIHRoZSBUSU0gZXhhbXBsZXMgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4mbmJzcDs8L3NwYW4+PC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgTkFORDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPk1vZGlmeSBOQU5EX0FkZHJlc3NUeXBlRGVmLCBOQU5EX0RldmljZUNvbmZpZ1R5cGVEZWYgYW5kIE5BTkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmVzIGZpZWxkczwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBuZXcgSEFMX05BTkRfQ29uZmlnRGV2aWNlIEFQSTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48YiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nOyBmb250LXNpemU6IDE2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC12YXJpYW50OiBub3JtYWw7IGxldHRlci1zcGFjaW5nOiBub3JtYWw7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ246IHN0YXJ0OyB0ZXh0LWluZGVudDogMHB4OyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgd2lkb3dzOiAxOyB3b3JkLXNwYWNpbmc6IDBweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMSAvIDAxLUp1bHktMjAxNjwvc3Bhbj48L2gzPgogPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogNC41cHQgMGNtIDQuNXB0IDE4cHQ7Ij48YiBzdHlsZT0iIj48dT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogVmVyZGFuYTsgY29sb3I6IGJsYWNrOyI+TWFpbgotQ2hhbmdlczwvc3Bhbj48L3U+PC9iPjwvcD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIERNQTwvc3Bhbj4gdXBkYXRlJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9ETUFfUG9sbEZvclRyYW5zZmVyKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gdG8mbmJzcDthdm9pZCBlYXJseSBUSU1FT1VUIGVycm9yLjwvc3Bhbj4gPC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBKUEVHPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9KUEVHX0NvbmZpZ0VuY29kaW5nKCkgZnVuY3Rpb24gdG8gcHJvcGVybHkgc2V0IHRoZSBJbWFnZUhlaWdodCBhbmQgSW1hZ2VXaWR0aDwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFNQSTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBTUElfRE1BVHJhbnNtaXRSZWNlaXZlQ3BsdCgpIGZ1bmN0aW9uIHRvIHByb3Blcmx5IGhhbmRsZSB0aGUgQ1JDIGFuZCBhdm9pZCBjb25kaXRpb25hbCBzdGF0ZW1lbnQgZHVwbGljYXRpb248YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMjAwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjEuMCAvIDIyLUFwcmlsLTIwMTY8L3NwYW4+PC9oMz4KK0NoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBETUE8L3NwYW4+IHVwZGF0ZSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfRE1BX1BvbGxGb3JUcmFuc2ZlcigpIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIHRvJm5ic3A7YXZvaWQgZWFybHkgVElNRU9VVCBlcnJvci48L3NwYW4+IDwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSlBFRzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfSlBFR19Db25maWdFbmNvZGluZygpIGZ1bmN0aW9uIHRvIHByb3Blcmx5IHNldCB0aGUgSW1hZ2VIZWlnaHQgYW5kIEltYWdlV2lkdGg8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTUEk8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgU1BJX0RNQVRyYW5zbWl0UmVjZWl2ZUNwbHQoKSBmdW5jdGlvbiB0byBwcm9wZXJseSBoYW5kbGUgdGhlIENSQyBhbmQgYXZvaWQgY29uZGl0aW9uYWwgc3RhdGVtZW50IGR1cGxpY2F0aW9uPGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDIwMHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4xLjAgLyAyMi1BcHJpbC0yMDE2PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5PZmZpY2lhbCByZWxlYXNlIHRvIGFkZCB0aGUgc3VwcG9ydCBvZiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5TVE0zMkY3NjV4eCwgU1RNMzJGNzY3eHgsIFNUTTMyRjc2OHh4LCBTVE0zMkY3Njl4eCwgU1RNMzJGNzc3eHgsIFNUTTMyRjc3OHh4PC9zcGFuPiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5hbmQgU1RNMzJGNzc5eHg8L3NwYW4+IGRldmljZXM8YnI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5HZW5lcmFsIHVwZGF0ZXMgCiB0byBmaXgga25vd24gZGVmZWN0cyBhbmQgZW5oYW5jZW1lbnRzIGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1zaXplOiAxMnB0OyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7Ij5BZGQgbmV3IEhBTCBkcml2ZXJzIGZvcjxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+REZTRE0sIERTSTxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiwgSlBFRyA8L3NwYW4+PC9zcGFuPmFuZDxzcGFuIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+TURJT1M8c3BhbiBjbGFzcz0iQXBwbGUtY29udmVydGVkLXNwYWNlIj4gPC9zcGFuPjwvc3Bhbj5wZXJpcGhlcmFsczwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkVuaGFuY2UgSEFMIGRlbGF5IGFuZCB0aW1lYmFzZSBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IApAQCAtMTE1MCwxMiArMTI4MSwxMiBAQAogPHVsIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW47Ij48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCB0aGUgbWFuYWdlbWVudCBvZiBTUEkgcGVyaXBoZXJhbCBlcnJvcnMgZHVyaW5nIERNQSBwcm9jZXNzLiBUaGlzIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgdXBkYXRlcyBpbgogdGhlIHVzZXIgYXBwbGljYXRpb246PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwaW47IGZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJyxzZXJpZjsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEycHQ7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+Q29uZmlndXJlIGFuZCBlbmFibGUgdGhlIFNQSSBJUlEgaW4gSEFMX1NQSV9Nc3BJbml0KCkgZnVuY3Rpb248L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkluIHN0bTMyZjd4eF9pdC5jIGZpbGUsIFNQSV9JUlFIYW5kbGVyKCkgZnVuY3Rpb246IGFkZCBhIGNhbGwgdG8gSEFMX1NQSV9JUlFIYW5kbGVyKCkgZnVuY3Rpb248L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbjogNC41cHQgMGluOyBmb250LWZhbWlseTogJ1RpbWVzIE5ldyBSb21hbicsc2VyaWY7IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxMnB0OyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkFkZCBhbmQgY3VzdG9taXplIHRoZSBFcnJvciBDYWxsYmFjayBBUEk6IEhBTF9TUElfRXJyb3JDYWxsYmFjaygpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBpbjsgZm9udC1mYW1pbHk6ICdUaW1lcyBOZXcgUm9tYW4nLHNlcmlmOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMTJwdDsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5SZWZlciB0byB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2hpY2ggZGVzY3JpYmUgdGhlIGNoYW5nZXM6IFNQSV9GdWxsRHVwbGV4X0NvbURNQTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+CiA8L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFRJTSA8L3NwYW4+dXBkYXRlJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfVElNX0NvbmZpZ09DcmVmQ2xlYXIoKSBmdW5jdGlvbiBmb3IgcHJvcGVyIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFNNQ1IgcmVnaXN0ZXI8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BZGQgbmV3IGZ1bmN0aW9uIEhBTF9USU1FeF9Db25maWdCcmVha0lucHV0KCkgdG8gY29uZmlndXJlIHRoZSBicmVhayBpbnB1dCBzb3VyY2U8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48Yj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SEFMIFVBUlQsIFVTQVJULCBTTUFSVENBUkQgYW5kIElSREEgPC9zcGFuPjwvYj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPjwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij48L3NwYW4+KHJlZmVyZW5jZWQgYXMgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPlBQUDwvc3Bhbj4gaGVyZSBiZWxvdyk8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+PC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPiA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj51cGRhdGU8Yj48bzpwPjwvbzpwPjwvYj48L3NwYW4+IAotPC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5VcGRhdGUgUG9sbGluZyBtYW5hZ2VtZW50Ojwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlRoZSB1c2VyIFRpbWVvdXQgdmFsdWUmbmJzcDttdXN0IGJlIGVzdGltYXRlZCBmb3IgdGhlIG92ZXJhbGwgcHJvY2VzcyBkdXJhdGlvbjogdGhlIFRpbWVvdXQgbWVhc3VyZW1lbnQgaXMgY3VtdWxhdGl2ZTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgRE1BIHByb2Nlc3M6PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdGhlIG08L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPmFuYWdlbWVudCBvZiBQUFAgcGVyaXBoZXJhbCBlcnJvcnMgZHVyaW5nIERNQSBwcm9jZXNzLiBUaGlzIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgdXBkYXRlcyBpbiB1c2VyIGFwcGxpY2F0aW9uOjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPkNvbmZpZ3VyZSBhbmQgZW5hYmxlIHRoZSBQUFAgSVJRIGluIEhBTF9QUFBfTXNwSW5pdCgpIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5JbiBzdG0zMmY3eHhfaXQuYyBmaWxlLCBQUFBfSVJRSGFuZGxlcigpIGZ1bmN0aW9uOiBhZGQgYSBjYWxsIHRvIEhBTF9QUFBfSVJRSGFuZGxlcigpIGZ1bmN0aW9uPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5BZGQgYW5kIGN1c3RvbWl6ZSB0aGUgRXJyb3IgQ2FsbGJhY2sgQVBJOiBIQUxfUFBQX0Vycm9yQ2FsbGJhY2soKTxicj48L3NwYW4+PC9saT48L3VsPjwvdWw+PC91bD48L3VsPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgV1dERyA8L3NwYW4+dXBkYXRlJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPk92ZXJhbGwgcmV3b3JrIG9mIHRoZSBkcml2ZXIgZm9yIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZSB0aGUgZm9sbG93aW5nIEFQSXM6PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX1N0YXJ0KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19TdGFydF9JVCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfTXNwRGVJbml0KCk8L3NwYW4+PC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19HZXRTdGF0ZSgpPC9zcGFuPjwvbGk+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgaW1wbGVtZW50YXRpb246PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX0luaXQoKTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5BJm5ic3A7bmV3IHBhcmFtZXRlciBpbiB0aGUgSW5pdCBTdHJ1Y3R1cmU6Jm5ic3A7RVdJTW9kZTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfTXNwSW5pdCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfUmVmcmVzaCgpJm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlRoaXMgZnVuY3Rpb24gaW5zdXJlcyB0aGUgcmVsb2FkIG9mIHRoZSBjb3VudGVyPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VGhlICJjb3VudGVyIiBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZDwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfSVJRSGFuZGxlcigpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjaygpIGlzIHRoZSBuZXcgcHJvdG90eXBlIG9mIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrKCk8YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0byBpZGVudGlmeSB0aGUgY2hhbmdlczogV1dER19FeGFtcGxlPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjAuNCAvIDA5LURlY2VtYmVyLTIwMTU8L3NwYW4+PC9oMz4KKzwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+VXBkYXRlIFBvbGxpbmcgbWFuYWdlbWVudDo8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5UaGUgdXNlciBUaW1lb3V0IHZhbHVlJm5ic3A7bXVzdCBiZSBlc3RpbWF0ZWQgZm9yIHRoZSBvdmVyYWxsIHByb2Nlc3MgZHVyYXRpb246IHRoZSBUaW1lb3V0IG1lYXN1cmVtZW50IGlzIGN1bXVsYXRpdmU8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIERNQSBwcm9jZXNzOjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIHRoZSBtPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5hbmFnZW1lbnQgb2YgUFBQIHBlcmlwaGVyYWwgZXJyb3JzIGR1cmluZyBETUEgcHJvY2Vzcy4gVGhpcyByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHVwZGF0ZXMgaW4gdXNlciBhcHBsaWNhdGlvbjo8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiIGxhbmc9IkVOLVVTIj5Db25maWd1cmUgYW5kIGVuYWJsZSB0aGUgUFBQIElSUSBpbiBIQUxfUFBQX01zcEluaXQoKSBmdW5jdGlvbjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+SW4gc3RtMzJmN3h4X2l0LmMgZmlsZSwgUFBQX0lSUUhhbmRsZXIoKSBmdW5jdGlvbjogYWRkIGEgY2FsbCB0byBIQUxfUFBQX0lSUUhhbmRsZXIoKSBmdW5jdGlvbjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJyxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IiBsYW5nPSJFTi1VUyI+QWRkIGFuZCBjdXN0b21pemUgdGhlIEVycm9yIENhbGxiYWNrIEFQSTogSEFMX1BQUF9FcnJvckNhbGxiYWNrKCk8YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjwvdWw+PC91bD48dWwgc3R5bGU9Im1hcmdpbi10b3A6IDBjbTsiIHR5cGU9InNxdWFyZSI+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFdXREcgPC9zcGFuPnVwZGF0ZSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5PdmVyYWxsIHJld29yayBvZiB0aGUgZHJpdmVyIGZvciBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgdGhlIGZvbGxvd2luZyBBUElzOjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19TdGFydCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfU3RhcnRfSVQoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX01zcERlSW5pdCgpPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1dXREdfR2V0U3RhdGUoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIGltcGxlbWVudGF0aW9uOjwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IQUxfV1dER19Jbml0KCk8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+QSZuYnNwO25ldyBwYXJhbWV0ZXIgaW4gdGhlIEluaXQgU3RydWN0dXJlOiZuYnNwO0VXSU1vZGU8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX01zcEluaXQoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX1JlZnJlc2goKSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5UaGlzIGZ1bmN0aW9uIGluc3VyZXMgdGhlIHJlbG9hZCBvZiB0aGUgY291bnRlcjwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlRoZSAiY291bnRlciIgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQ8L3NwYW4+PC9saT48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX0lSUUhhbmRsZXIoKTwvc3Bhbj48L2xpPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPkhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKSBpcyB0aGUgbmV3IHByb3RvdHlwZSBvZiBIQUxfV1dER19XYWtldXBDYWxsYmFjaygpPGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZWZlciB0byB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdG8gaWRlbnRpZnkgdGhlIGNoYW5nZXM6IFdXREdfRXhhbXBsZTwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjQgLyAwOS1EZWNlbWJlci0yMDE1PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR2VuZXJpYyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUwgCiB3ZWFrIGVtcHR5IGNhbGxiYWNrcyB0byBwcmV2ZW50IHVudXNlZCBhcmd1bWVudCBjb21waWxhdGlvbiB3YXJuaW5ncyB3aXRoIHNvbWUgCiBjb21waWxlcnMgYnkgY2FsbGluZyB0aGUgZm9sbG93aW5nIGxpbmU6PC9zcGFuPgotPC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VU5VU0VEKGhwcHApOzwvc3Bhbj48L2xpPjwvdWw+PC91bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRVRIPC9zcGFuPiB1cGRhdGUmbmJzcDs8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9FVEhfSW5pdCgpIGZ1bmN0aW9uIHRvIGFkZCB0aW1lb3V0IG9uIHRoZSBTb2Z0d2FyZSByZXNldCBtYW5hZ2VtZW50PGJyPjwvc3Bhbj48L2xpPjwvdWw+PC91bD48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjMgLyAxMy1Ob3ZlbWJlci0yMDE1PC9zcGFuPjwvaDM+Cis8L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VTlVTRUQoaHBwcCk7PC9zcGFuPjwvbGk+PC91bD48L3VsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBFVEg8L3NwYW4+IHVwZGF0ZSZuYnNwOzwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgSEFMX0VUSF9Jbml0KCkgZnVuY3Rpb24gdG8gYWRkIHRpbWVvdXQgb24gdGhlIFNvZnR3YXJlIHJlc2V0IG1hbmFnZW1lbnQ8YnI+PC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjAuMyAvIDEzLU5vdmVtYmVyLTIwMTU8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmEsc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMHB0OyI+R2VuZXJhbCB1cGRhdGVzIAogdG8gZml4IGtub3duIGRlZmVjdHMgYW5kIGVuaGFuY2VtZW50cyBpbXBsZW1lbnRhdGlvbjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPk9uZSBjaGFuZ2UgZG9uZSBvbiB0aGUgSEFMIENSWVAgcmVxdWlyZXMgYW4gdXBkYXRlIG9uIApAQCAtMTE2OSw3ICsxMzAwLDcgQEAKIHZhbHVlIGZvciB0aGUgRXh0ZXJuYWxUcmlnSW5qZWNDb252RWRnZSBwYXJhbWV0ZXIgaW4gdGhlIEFEQ19Jbml0VHlwZURlZiAKIHN0cnVjdHVyZSB0byBzZWxlY3QgdGhlIEFEQyBzb2Z0d2FyZSB0cmlnZ2VyIG1vZGUuPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ09SVEVYIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+CiA8L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5SZW1vdmUgZHVwbGljYXRpb24gCi1mb3IgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHKCkgbWFjcm88L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDUllQIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9DUllQX0RFU0VDQl9EZWNyeXB0KCkgQVBJIHRvIGZpeCB0aGUgaW52ZXJ0ZWQgcFBsYWluRGF0YSBhbmQgcEN5cGhlckRhdGEgcGFyYW1ldGVycyBpc3N1ZSA8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBPQl9JV0RHX1NUT1BfQUNUSVZFIGRlZmluaXRpb248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgT0JfUkRQX0xFVkVMX3ggZGVmaW5pdGlvbiBieSBwcm9wZXIgdmFsdWVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEZMQVNIX01hc3NFcmFzZSgpIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoZSB2b2x0YWdlIHJhbmdlIHBhcmFtZXRlciBpbiB0aGUgbWFzcyBlcmFzZSBjb25maWd1cmF0aW9uIDxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgdmFsdWVzIGZvciBMU0UgRHJpdmUgY2FwYWJpbGl0eSBkZWZpbmVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIFBMTE4gbWluIHZhbHVlIDUwIGluc3RlYWQgb2YgMTAwPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+YWRkIFJDQ19QTExJMlNQX0RJVnggZGVmaW5lcyBmb3IgUExMSTJTUCBjbG9jayBkaXZpZGVyPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpIG1hY3JvIHRvIHJlbW92ZSB0aGUgZGlzYWJsZSBvZiB0aGUgU1lTQ0ZHPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+Jm5ic3A7PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxKCkgZnVuY3Rpb24gZm9yIHByb3BlciBTQUkgY2xvY2sgY29uZmlndXJhdGlvbjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTQUkgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIGZvciBwcm9wZXIgbWFuYWdlbWVudCBvZiB0aGUgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uIGlucHV0IHNlbGVjdGlvbjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgb2YmbmJzcDtIQUxfU0FJX0luaXQgKCkgZnVuY2l0b248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgZGVmaW5pdGlvbiBvZiBTQUlfQmxvY2tfU3luY0V4dCBhbmQgU0FJX0Jsb2NrX1N5bmNocm9uaXphdGlvbiBncm91cHM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTQUlfU0xPVEFDVElWRV9YICZuYnNwO2RlZmluZXMgdmFsdWVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1NBSV9Jbml0KCkgZnVuY3Rpb24gZm9yIHByb3BlciBjb21wYW5kaW5nIG1vZGUgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTQUlfVHJhbnNtaXRfSVR4eEJpdCgpIGZ1bmN0aW9ucyB0byBhZGQgdGhlIGNoZWNrIG9uIHRyYW5zZmVyIGNvdW50ZXIgYmVmb3JlIHdyaXRpbmcgbmV3IGRhdGEgdG8gU0FJeF9EUiByZWdpc3RlcnM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU0FJX0ZpbGxGaWZvKCkgZnVuY3Rpb24gdG8gYXZvaWQgaXNzdWUgd2hlbiB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNtaXQgaXMgc21hbGxlciB0aGFuIHRoZSBGSUZPIHNpemU8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgSEFMX1NBSV9FbmFibGVSeE11dGVNb2RlKCkgZnVuY3Rpb24gZm9yIHByb3BlciBtdXRlIG1hbmFnZW1lbnQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU0FJX0luaXRQQ00oKSBmdW5jdGlvbiB0byBzdXBwb3J0IDI0Yml0cyBjb25maWd1cmF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU0QgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlIEhBTF9TRF9HZXRfQ2FyZEluZm8oKSB0byBwcm9wZXJseSBzdXBwb3J0IGhpZ2ggY2FwYWNpdHkgY2FyZHM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU1BESUZSWCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU1BESUZSWF9ETUFSeENwbHQoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiB0byZuYnNwO2NoZWNrIG9uIGNpcmN1bGFyIG1vZGUgYmVmb3JlIGRpc2FibGluZyB0aGUgRE1BPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZm9yIHByb3BlciBwYXJhbWV0ZXJzIGNoZWNrPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVUFSVDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBfX0hBTF9VQVJUX0NMRUFSX0lUIG1hY3JvIGZvciBwcm9wZXIgZnVuY3Rpb25uaW5nJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sbCBGTUM8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5hZGQgRk1DX1BBR0VfU0laRV81MTIgZGVmaW5lPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sbCBTRE1NQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTRE1NQ19TZXRTRE1NQ1JlYWRXYWl0TW9kZSgpIGZ1bmN0aW9uIGZvciBwcm9wZXIgZnVuY3Rpb25uaW5nPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogLW1vei1pbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjAuMiAvIDIxLVNlcHRlbWJlci0yMDE1PC9zcGFuPjwvaDM+Citmb3IgX19IQUxfQ09SVEVYX1NZU1RJQ0tDTEtfQ09ORklHKCkgbWFjcm88L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBDUllQIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9DUllQX0RFU0VDQl9EZWNyeXB0KCkgQVBJIHRvIGZpeCB0aGUgaW52ZXJ0ZWQgcFBsYWluRGF0YSBhbmQgcEN5cGhlckRhdGEgcGFyYW1ldGVycyBpc3N1ZSA8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBGTEFTSCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBPQl9JV0RHX1NUT1BfQUNUSVZFIGRlZmluaXRpb248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgT0JfUkRQX0xFVkVMX3ggZGVmaW5pdGlvbiBieSBwcm9wZXIgdmFsdWVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEZMQVNIX01hc3NFcmFzZSgpIGZ1bmN0aW9uIHRvIGNvbnNpZGVyIHRoZSB2b2x0YWdlIHJhbmdlIHBhcmFtZXRlciBpbiB0aGUgbWFzcyBlcmFzZSBjb25maWd1cmF0aW9uIDxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0M8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgdmFsdWVzIGZvciBMU0UgRHJpdmUgY2FwYWJpbGl0eSBkZWZpbmVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIFBMTE4gbWluIHZhbHVlIDUwIGluc3RlYWQgb2YgMTAwPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+YWRkIFJDQ19QTExJMlNQX0RJVnggZGVmaW5lcyBmb3IgUExMSTJTUCBjbG9jayBkaXZpZGVyPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyIgbGFuZz0iRU4tVVMiPlVwZGF0ZSBfX0hBTF9SQ0NfVVNCX09UR19GU19DTEtfRElTQUJMRSgpIG1hY3JvIHRvIHJlbW92ZSB0aGUgZGlzYWJsZSBvZiB0aGUgU1lTQ0ZHPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+Jm5ic3A7PC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+VXBkYXRlIEhBTF9SQ0NFeF9HZXRQZXJpcGhDTEtGcmVxKCkgZnVuY3Rpb24gZm9yIHByb3BlciBTQUkgY2xvY2sgY29uZmlndXJhdGlvbjxicj48L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBTQUkgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIGZvciBwcm9wZXIgbWFuYWdlbWVudCBvZiB0aGUgZXh0ZXJuYWwgc3luY2hyb25pemF0aW9uIGlucHV0IHNlbGVjdGlvbjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgb2YmbmJzcDtIQUxfU0FJX0luaXQgKCkgZnVuY2l0b248L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgZGVmaW5pdGlvbiBvZiBTQUlfQmxvY2tfU3luY0V4dCBhbmQgU0FJX0Jsb2NrX1N5bmNocm9uaXphdGlvbiBncm91cHM8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTQUlfU0xPVEFDVElWRV9YICZuYnNwO2RlZmluZXMgdmFsdWVzPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlJm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+SEFMX1NBSV9Jbml0KCkgZnVuY3Rpb24gZm9yIHByb3BlciBjb21wYW5kaW5nIG1vZGUgbWFuYWdlbWVudDwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTQUlfVHJhbnNtaXRfSVR4eEJpdCgpIGZ1bmN0aW9ucyB0byBhZGQgdGhlIGNoZWNrIG9uIHRyYW5zZmVyIGNvdW50ZXIgYmVmb3JlIHdyaXRpbmcgbmV3IGRhdGEgdG8gU0FJeF9EUiByZWdpc3RlcnM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU0FJX0ZpbGxGaWZvKCkgZnVuY3Rpb24gdG8gYXZvaWQgaXNzdWUgd2hlbiB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gdHJhbnNtaXQgaXMgc21hbGxlciB0aGFuIHRoZSBGSUZPIHNpemU8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgSEFMX1NBSV9FbmFibGVSeE11dGVNb2RlKCkgZnVuY3Rpb24gZm9yIHByb3BlciBtdXRlIG1hbmFnZW1lbnQ8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU0FJX0luaXRQQ00oKSBmdW5jdGlvbiB0byBzdXBwb3J0IDI0Yml0cyBjb25maWd1cmF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU0QgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlIEhBTF9TRF9HZXRfQ2FyZEluZm8oKSB0byBwcm9wZXJseSBzdXBwb3J0IGhpZ2ggY2FwYWNpdHkgY2FyZHM8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgU1BESUZSWCA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsiPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgU1BESUZSWF9ETUFSeENwbHQoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiB0byZuYnNwO2NoZWNrIG9uIGNpcmN1bGFyIG1vZGUgYmVmb3JlIGRpc2FibGluZyB0aGUgRE1BPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVElNIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBIQUxfVElNX0NvbmZpZ0Nsb2NrU291cmNlKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZm9yIHByb3BlciBwYXJhbWV0ZXJzIGNoZWNrPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVUFSVDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPlVwZGF0ZSBfX0hBTF9VQVJUX0NMRUFSX0lUIG1hY3JvIGZvciBwcm9wZXIgZnVuY3Rpb25uaW5nJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sbCBGTUM8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5hZGQgRk1DX1BBR0VfU0laRV81MTIgZGVmaW5lPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sbCBTRE1NQzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBTRE1NQ19TZXRTRE1NQ1JlYWRXYWl0TW9kZSgpIGZ1bmN0aW9uIGZvciBwcm9wZXIgZnVuY3Rpb25uaW5nPC9zcGFuPjwvbGk+PC91bD48L3VsPjxoMyBzdHlsZT0iYmFja2dyb3VuZDogcmdiKDUxLCAxMDIsIDI1NSkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDUwJTsgLW1vei1iYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiBpbml0aWFsOyBtYXJnaW4tcmlnaHQ6IDUwMHB0OyB3aWR0aDogMTgwcHg7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogQXJpYWw7IGNvbG9yOiB3aGl0ZTsiPlYxLjAuMiAvIDIxLVNlcHRlbWJlci0yMDE1PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgR2VuZXJpYyA8L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyBmb250LXdlaWdodDogbm9ybWFsOyI+dXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnN0bTMyZjd4eF9oYWwuY29uZl90ZW1wbGF0ZS5oOiB1cGRhdGUmbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5IU0VfU1RBUlRVUF9USU1FT1VUPC9zcGFuPjwvbGk+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+c3RtMzJmN3h4X2hhbF9kZWYuaDogdXBkYXRlIHRoZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPiBxdW90YXRpb24gbWFya3MgdXNlZCBpbiAjZXJyb3IiVVNFX1JUT1Mgc2hvdWxkIGJlIDAgaW4gdGhlIGN1cnJlbnQgSEFMIHJlbGVhc2UiPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRE1BPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsiPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIHN0eWxlPSJtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7IGNvbG9yOiBibGFjazsiIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+T3ZlcmFsbCAKIGRyaXZlciB1cGRhdGUgZm9yIGNvZGUgb3B0aW1pemF0aW9uPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBzdHlsZT0ibWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyBjb2xvcjogYmxhY2s7IiBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPmFkZCAKQEAgLTEyMDEsNyArMTMzMiw3IEBACiBIQUxfSEFTSF9QaGFzZVR5cGVEZWYgdG8gSEFMX0hBU0hQaGFzZVR5cGVEZWY8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBSQ0MgPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7Ij51cGRhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSB2YWx1ZXMgZm9yIExTRSBEcml2ZSBjYXBhYmlsaXR5IGRlZmluZXM8L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgUExMTi9QTExJMlNOL1BMTFNBSSBWQ08gbWluIHZhbHVlIDEwME1IeiBpbnN0ZWFkIG9mIDE5Mk1Iejwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdWZXJkYW5hJywnc2Fucy1zZXJpZic7IGZvbnQtc2l6ZTogMTBwdDsiPmFkZCBfX0hBTF9SQ0NfTUNPMV9DT05GSUcoKSBhbmQgPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+X19IQUxfUkNDX01DTzJfQ09ORklHKCkgbWFjcm9zPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+PC9zcGFuPjwvbGk+PC91bD48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoKSBmdW5jdGlvbiB0byByZXNldCB0aGUgQmFja3VwIGRvbWFpbiBvbmx5IGlmIHRoZSBSVEMgQ2xvY2sgc291cmNlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCZuYnNwOzwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIFRJTTwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgX19IQUxfVElNX1NFVF9DT01QQVJFKCkgbWFjcm88L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij5yZW1vdmUgdXNlbGVzcyBhc3NlcnQoKSBpbiZuYnNwO0hBTF9USU1fUFdNX0NvbmZpZ0NoYW5uZWwoKSwgVElNX09DMl9TZXRDb25maWcoKSBhbmQgSEFMX1RJTV9QV01fQ29uZmlnQ2hhbm5lbCgpIDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPmZ1bmN0aW9uczwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIENBTjwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPmFkZCB0aGUgY2xlYXIgZmxhZyBFUlJJIGJpdCBpbiBIQUxfQ0FOX0lSUUhhbmRsZXIoKTwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+SEFMIEkyUzwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPnVwZGF0ZSBJMlMgSEFMX0kyU19UcmFuc21pdCgpIEFQSSZuYnNwO3RvIGtlZXAgdGhlIGNoZWNrIG9uIGJ1c3kgZmxhZyBvbmx5IGZvciB0aGUgc2xhdmU8L3NwYW4+PC9saT48L3VsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPkhBTCBRU1BJPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+QWRkIF9fSEFMX1FTUElfQ0xFQVJfRkxBRygpIGJlZm9yZSBRU1BJX0NvbmZpZygpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgVUFSVDwvc3Bhbj4gdXBkYXRlPC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPlJlbW92ZQogZW5hYmxpbmcgb2YgRVJSIElUIHNvdXJjZSBhbmQgUEUgc291cmNlIGZyb20gSEFMX1VBUlRfVHJhbnNtaXRfSVQoKSBhbmQKIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBkaXNhYmxpbmcgRVJSL1BFIElUIGZyb20gVUFSVF9FbmRUcmFuc21pdF9JVCgpPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgUENEPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPiB1cGRhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+Jm5ic3A7PC9zcGFuPjwvbGk+PHVsPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPkNsZWFuIHN0YXR1cyBwaGFzZSByZWNlaXZlZCBpbnRlcnJ1cHQgd2hlbiBETUEgbW9kZSBlbmFibGVkJm5ic3A7PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgSENEIDwvc3Bhbj48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48L3NwYW4+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gdXNlIGxvY2FsIAotdmFyaWFibGUgaW4gVVNCIEhvc3QgY2hhbm5lbCByZS1hY3RpdmF0aW9uPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sbCBGTUM8L3NwYW4+IHVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgdGhlIGRlZmluZSBGTUMgV3JpdGUgRklGTyBEaXNhYmxlL0VuYWJsZTogRk1DX1dSSVRFX0ZJRk9fRElTQUJMRSBhbmQgRk1DX1dSSVRFX0ZJRk9fRU5BQkxFPC9zcGFuPjwvbGk+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+cmVtb3ZlIHJldHVybiBIQUxfRVJST1IgZnJvbSBGTUNfU0RSQU1fU2VuZENvbW1hbmQoKSBmdW5jdGlvbjwvc3Bhbj48L2xpPjwvdWw+PC91bD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjEgLyAyNS1KdW5lLTIwMTU8L3NwYW4+PC9oMz4KK3ZhcmlhYmxlIGluIFVTQiBIb3N0IGNoYW5uZWwgcmUtYWN0aXZhdGlvbjwvc3Bhbj48L2xpPjwvdWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+bGwgRk1DPC9zcGFuPiB1cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIHRoZSBkZWZpbmUgRk1DIFdyaXRlIEZJRk8gRGlzYWJsZS9FbmFibGU6IEZNQ19XUklURV9GSUZPX0RJU0FCTEUgYW5kIEZNQ19XUklURV9GSUZPX0VOQUJMRTwvc3Bhbj48L2xpPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPnJlbW92ZSByZXR1cm4gSEFMX0VSUk9SIGZyb20gRk1DX1NEUkFNX1NlbmRDb21tYW5kKCkgZnVuY3Rpb248L3NwYW4+PC9saT48L3VsPjwvdWw+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMC4xIC8gMjUtSnVuZS0yMDE1PC9zcGFuPjwvaDM+CiA8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiA0LjVwdCAwY20gNC41cHQgMThwdDsiPjxiIHN0eWxlPSIiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hOyBjb2xvcjogYmxhY2s7Ij5NYWluCiBDaGFuZ2VzPC9zcGFuPjwvdT48L2I+PC9wPjx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMGNtOyIgdHlwZT0ic3F1YXJlIj48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTBwdDsiPkdlbmVyYWwgdXBkYXRlcyAKIHRvIGZpeCBrbm93biBkZWZlY3RzIGFuZCBlbmhhbmNlbWVudHMgaW1wbGVtZW50YXRpb248L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PC9saT48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ1JDJm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgX19IQUxfQ1JDX1NFVF9JRFIoKSBtYWNybyBpbXBsZW1lbnRhdGlvbiB0byB1c2UgV1JJVEVfUkVHKCkgaW5zdGVhZCBvZiBNT0RJRllfUkVHKCk8YnI+PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ0VDJm5ic3A7PC9zcGFuPnVwZGF0ZTwvc3Bhbj48L2xpPjx1bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij51cGRhdGUgdGltZW91dCBtYW5hZ2VtZW50IGluIEhBTF9DRUNfVHJhbnNtaXQoKSBhbmQgSEFMX0NFQ19SZWNlaXZlKCkgZnVuY3Rpb25zPC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgQ29ydGV4IDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+dXBkYXRlIEhBTF9NUFVfQ29uZmlnUmVnaW9uKCkgZnVuY3Rpb24gdG8gYmUgbWlzcmEgY29tcGxpYW50PC9zcGFuPjwvbGk+PC91bD48bGkgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImNvbG9yOiBibGFjazsgbWFyZ2luLXRvcDogNC41cHQ7IG1hcmdpbi1ib3R0b206IDQuNXB0OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij5IQUwgRVRIIDwvc3Bhbj51cGRhdGU8L3NwYW4+PC9saT48dWw+PGxpIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgZm9udC1zaXplOiAxMHB0OyI+UmVtb3ZlIApAQCAtMTIyNywxMiArMTM1OCwxMiBAQAogPC9saT48bGkgc3R5bGU9Im1hcmdpbi10b3A6IDQuNXB0OyBtYXJnaW4tYm90dG9tOiA0LjVwdDsgY29sb3I6IGJsYWNrOyIgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBmb250LXNpemU6IDEwcHQ7Ij5VcGRhdGUgdG8gdXNlIGxvY2FsIAogdmFyaWFibGUgaW4gVVNCIEhvc3QgY2hhbm5lbCByZS1hY3RpdmF0aW9uPC9zcGFuPjwvbGk+PC91bD48L3VsPgogPGI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6ICZxdW90O1ZlcmRhbmEmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OzsgY29sb3I6IGJsYWNrOyI+PC9zcGFuPjwvdT48L2I+Ci08aDMgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1vcmlnaW46IC1tb3otaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IC1tb3otaW5pdGlhbDsgbWFyZ2luLXJpZ2h0OiA1MDBwdDsgd2lkdGg6IDE4MHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IEFyaWFsOyBjb2xvcjogd2hpdGU7Ij5WMS4wLjAgLyAxMi1NYXktMjAxNTwvc3Bhbj48L2gzPgorPGgzIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLW9yaWdpbjogaW5pdGlhbDsgLW1vei1iYWNrZ3JvdW5kLWlubGluZS1wb2xpY3k6IGluaXRpYWw7IG1hcmdpbi1yaWdodDogNTAwcHQ7IHdpZHRoOiAxODBweDsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHdoaXRlOyI+VjEuMC4wIC8gMTItTWF5LTIwMTU8L3NwYW4+PC9oMz4KIDxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDQuNXB0IDBjbSA0LjVwdCAxOHB0OyI+PGIgc3R5bGU9IiI+PHU+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmE7IGNvbG9yOiBibGFjazsiPk1haW4KIENoYW5nZXM8L3NwYW4+PC91PjwvYj48L3A+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48L3NwYW4+PHVsIHN0eWxlPSJtYXJnaW4tdG9wOiAwY207IiB0eXBlPSJzcXVhcmUiPjxsaSBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiA0LjVwdDsgbWFyZ2luLWJvdHRvbTogNC41cHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTBwdDsiPjwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBmb250LWZhbWlseTogJnF1b3Q7VmVyZGFuYSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7OyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYTsgZm9udC1zaXplOiAxMHB0OyI+Rmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBmb3I8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyBmb250LXdlaWdodDogYm9sZDsiPiBTVE0zMkY3NTZ4eC83NDZ4eC83NDV4eDwvc3Bhbj4gCiBkZXZpY2VzPC9zcGFuPjwvbGk+PC91bD4KIDxiPjx1PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7IGNvbG9yOiBibGFjazsiPjwvc3Bhbj48L3U+PC9iPgotPGgyIHN0eWxlPSJiYWNrZ3JvdW5kOiByZ2IoNTEsIDEwMiwgMjU1KSBub25lIHJlcGVhdCBzY3JvbGwgMCUgNTAlOyAtbW96LWJhY2tncm91bmQtY2xpcDogLW1vei1pbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiAtbW96LWluaXRpYWw7IC1tb3otYmFja2dyb3VuZC1pbmxpbmUtcG9saWN5OiAtbW96LWluaXRpYWw7Ij48YSBuYW1lPSJMaWNlbnNlIj48L2E+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHdoaXRlOyI+TGljZW5zZTxvOnA+PC9vOnA+PC9zcGFuPjwvaDI+Cis8aDIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYig1MSwgMTAyLCAyNTUpIG5vbmUgcmVwZWF0IHNjcm9sbCAwJSA1MCU7IC1tb3otYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyAtbW96LWJhY2tncm91bmQtaW5saW5lLXBvbGljeTogaW5pdGlhbDsiPjxhIG5hbWU9IkxpY2Vuc2UiPjwvYT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB0OyBjb2xvcjogd2hpdGU7Ij5MaWNlbnNlPG86cD48L286cD48L3NwYW4+PC9oMj4KIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij48Zm9udCBzaXplPSItMSI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAmcXVvdDtWZXJkYW5hJnF1b3Q7LCZxdW90O3NhbnMtc2VyaWYmcXVvdDs7Ij5SZWRpc3RyaWJ1dGlvbgogYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9TcmMvTGVnYWN5L3N0bTMyZjd4eF9oYWxfY2FuLmMgYi9TcmMvTGVnYWN5L3N0bTMyZjd4eF9oYWxfY2FuLmMKaW5kZXggMTI2MmU0ZC4uMzNjNzBlOSAxMDA2NDQKLS0tIGEvU3JjL0xlZ2FjeS9zdG0zMmY3eHhfaGFsX2Nhbi5jCisrKyBiL1NyYy9MZWdhY3kvc3RtMzJmN3h4X2hhbF9jYW4uYwpAQCAtODMsMTMgKzgzLDI5IEBACiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KICAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgotICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KICAgKgotICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAotICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKLSAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgKgorICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbC5jIGIvU3JjL3N0bTMyZjd4eF9oYWwuYwppbmRleCA1M2Y2NGIzLi5jZTMwOGU0IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsLmMKQEAgLTUwLDExICs1MCwxMSBAQAogICAqIEB7CiAgICovCiAvKioKLSAqIEBicmllZiBTVE0zMkY3eHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlciBWMS4yLjcKKyAqIEBicmllZiBTVE0zMkY3eHggSEFMIERyaXZlciB2ZXJzaW9uIG51bWJlciBWMS4yLjgKICAgICovCiAjZGVmaW5lIF9fU1RNMzJGN3h4X0hBTF9WRVJTSU9OX01BSU4gICAoMHgwMSkgLyohPCBbMzE6MjRdIG1haW4gdmVyc2lvbiAqLwogI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfVkVSU0lPTl9TVUIxICAgKDB4MDIpIC8qITwgWzIzOjE2XSBzdWIxIHZlcnNpb24gKi8KLSNkZWZpbmUgX19TVE0zMkY3eHhfSEFMX1ZFUlNJT05fU1VCMiAgICgweDA3KSAvKiE8IFsxNTo4XSAgc3ViMiB2ZXJzaW9uICovCisjZGVmaW5lIF9fU1RNMzJGN3h4X0hBTF9WRVJTSU9OX1NVQjIgICAoMHgwOCkgLyohPCBbMTU6OF0gIHN1YjIgdmVyc2lvbiAqLwogI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfVkVSU0lPTl9SQyAgICAgKDB4MDApIC8qITwgWzc6MF0gIHJlbGVhc2UgY2FuZGlkYXRlICovIAogI2RlZmluZSBfX1NUTTMyRjd4eF9IQUxfVkVSU0lPTiAgICAgICAgICgoX19TVE0zMkY3eHhfSEFMX1ZFUlNJT05fTUFJTiA8PCAyNClcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfChfX1NUTTMyRjd4eF9IQUxfVkVSU0lPTl9TVUIxIDw8IDE2KVwKQEAgLTMxOSwxNCArMzE5LDI2IEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU2V0VGlja0ZyZXEoSEFMX1RpY2tGcmVxVHlwZURlZiBGcmVxKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgID0gSEFMX09LOworICBIQUxfVGlja0ZyZXFUeXBlRGVmIHByZXZUaWNrRnJlcTsKKwogICBhc3NlcnRfcGFyYW0oSVNfVElDS0ZSRVEoRnJlcSkpOwogCiAgIGlmICh1d1RpY2tGcmVxICE9IEZyZXEpCiAgIHsKKyAgICAvKiBCYWNrIHVwIHV3VGlja0ZyZXEgZnJlcXVlbmN5ICovCisgICAgcHJldlRpY2tGcmVxID0gdXdUaWNrRnJlcTsKKworICAgIC8qIFVwZGF0ZSB1d1RpY2tGcmVxIGdsb2JhbCB2YXJpYWJsZSB1c2VkIGJ5IEhBTF9Jbml0VGljaygpICovCiAgICAgdXdUaWNrRnJlcSA9IEZyZXE7CiAKICAgICAvKiBBcHBseSB0aGUgbmV3IHRpY2sgRnJlcSAgKi8KICAgICBzdGF0dXMgPSBIQUxfSW5pdFRpY2sodXdUaWNrUHJpbyk7CisKKyAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIHByZXZpb3VzIHRpY2sgZnJlcXVlbmN5ICovCisgICAgICB1d1RpY2tGcmVxID0gcHJldlRpY2tGcmVxOworICAgIH0KICAgfQogCiAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9hZGMuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2FkYy5jCmluZGV4IGEwZmRlMzEuLmY2YjY0ZTcgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2FkYy5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2FkYy5jCkBAIC0xMzEsNiArMTMxLDcgQEAKICAgICAgIAogICAgICAqKiogQ2FsbGJhY2sgZnVuY3Rpb25zICoqKgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgWy4uXQogICAgICAgKEApIENhbGxiYWNrIGZ1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHVzZXIgcHJvZ3JhbToKICAgICAgICgrQCkgSEFMX0FEQ19FcnJvckNhbGxiYWNrKCkKICAgICAgICgrQCkgSEFMX0FEQ19MZXZlbE91dE9mV2luZG93Q2FsbGJhY2soKSAoY2FsbGJhY2sgb2YgYW5hbG9nIHdhdGNoZG9nKQpAQCAtMTYzMSwyMyArMTYzMiwyMyBAQAogICAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoYWRjKTsKLQkJCQotCS8qIGlmIEFEQ19DaGFubmVsXzEwIC4uLiBBRENfQ2hhbm5lbF8xOCBpcyBzZWxlY3RlZCAqLwotCWlmIChzQ29uZmlnLT5DaGFubmVsID4gQURDX0NIQU5ORUxfOSkKLQl7Ci0JCS8qIENsZWFyIHRoZSBvbGQgc2FtcGxlIHRpbWUgKi8KLQkJaGFkYy0+SW5zdGFuY2UtPlNNUFIxICY9IH5BRENfU01QUjEoQURDX1NNUFIxX1NNUDEwLCBzQ29uZmlnLT5DaGFubmVsKTsKKyAgCisgIC8qIGlmIEFEQ19DaGFubmVsXzEwIC4uLiBBRENfQ2hhbm5lbF8xOCBpcyBzZWxlY3RlZCAqLworICBpZiAoKHNDb25maWctPkNoYW5uZWwgPiBBRENfQ0hBTk5FTF85KSAmJiAoc0NvbmZpZy0+Q2hhbm5lbCAhPSBBRENfSU5URVJOQUxfTk9ORSkpCisgIHsKKyAgICAvKiBDbGVhciB0aGUgb2xkIHNhbXBsZSB0aW1lICovCisgICAgaGFkYy0+SW5zdGFuY2UtPlNNUFIxICY9IH5BRENfU01QUjEoQURDX1NNUFIxX1NNUDEwLCBzQ29uZmlnLT5DaGFubmVsKTsKIAotCQlpZiAoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKQotCQl7Ci0JCQkvKiBTZXQgdGhlIG5ldyBzYW1wbGUgdGltZSAqLwotCQkJaGFkYy0+SW5zdGFuY2UtPlNNUFIxIHw9IEFEQ19TTVBSMShzQ29uZmlnLT5TYW1wbGluZ1RpbWUsIEFEQ19DSEFOTkVMXzE4KTsKLQkJfQotCSAgZWxzZQotCSAgewkKLQkJICAvKiBTZXQgdGhlIG5ldyBzYW1wbGUgdGltZSAqLwotCQkgIGhhZGMtPkluc3RhbmNlLT5TTVBSMSB8PSBBRENfU01QUjEoc0NvbmZpZy0+U2FtcGxpbmdUaW1lLCBzQ29uZmlnLT5DaGFubmVsKTsKLQkgIH0KKyAgICBpZiAoc0NvbmZpZy0+Q2hhbm5lbCA9PSBBRENfQ0hBTk5FTF9URU1QU0VOU09SKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgbmV3IHNhbXBsZSB0aW1lICovCisgICAgICBoYWRjLT5JbnN0YW5jZS0+U01QUjEgfD0gQURDX1NNUFIxKHNDb25maWctPlNhbXBsaW5nVGltZSwgQURDX0NIQU5ORUxfMTgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogU2V0IHRoZSBuZXcgc2FtcGxlIHRpbWUgKi8KKyAgICAgIGhhZGMtPkluc3RhbmNlLT5TTVBSMSB8PSBBRENfU01QUjEoc0NvbmZpZy0+U2FtcGxpbmdUaW1lLCBzQ29uZmlnLT5DaGFubmVsKTsKKyAgICB9CiAgIH0KICAgZWxzZSAvKiBBRENfQ2hhbm5lbCBpbmNsdWRlIGluIEFEQ19DaGFubmVsX1swLi45XSAqLwogICB7CkBAIC0xNjg2LDYgKzE2ODcsMTMgQEAKICAgICBoYWRjLT5JbnN0YW5jZS0+U1FSMSB8PSBBRENfU1FSMV9SSyhzQ29uZmlnLT5DaGFubmVsLCBzQ29uZmlnLT5SYW5rKTsKICAgfQogICAKKyAgLyogaWYgbm8gaW50ZXJuYWwgY2hhbm5lbCBzZWxlY3RlZCAqLworICBpZiAoKGhhZGMtPkluc3RhbmNlID09IEFEQzEpICYmIChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19JTlRFUk5BTF9OT05FKSkKKyAgeworICAgIC8qIERpc2FibGUgdGhlIFZCQVQgJiBUU1ZSRUZFIGNoYW5uZWwqLworICAgIEFEQy0+Q0NSICY9IH4oQURDX0NDUl9WQkFURSB8IEFEQ19DQ1JfVFNWUkVGRSk7CisgIH0KKwogICAvKiBpZiBBREMxIENoYW5uZWxfMTggaXMgc2VsZWN0ZWQgZW5hYmxlIFZCQVQgQ2hhbm5lbCAqLwogICBpZiAoKGhhZGMtPkluc3RhbmNlID09IEFEQzEpICYmIChzQ29uZmlnLT5DaGFubmVsID09IEFEQ19DSEFOTkVMX1ZCQVQpKQogICB7CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9hZGNfZXguYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2FkY19leC5jCmluZGV4IDI3ZTQ0MzkuLjQwZjA1ODcgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2FkY19leC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2FkY19leC5jCkBAIC01LDcgKzUsNyBAQAogICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBBREMgZXh0ZW5zaW9uIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgRXh0ZW5kZWQgZmVhdHVyZXMgZnVuY3Rpb25zCi0gICogICAgICAgICAKKyAgKgogICBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKQEAgLTE1LDggKzE1LDggQEAKICAgICAgICAoIyMpIEVuYWJsZSB0aGUgQURDIGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfQURDX0NMS19FTkFCTEUoKQogICAgICAgICgjIykgQURDIHBpbnMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBBREMgR1BJT3MgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKLSAgICAgICAgICAgICAgICAgICBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpICAKLSAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgQURDIHBpbnMgaW4gYW5hbG9nIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpIAorICAgICAgICAgICAgICAgICAgIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCkKKyAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgQURDIHBpbnMgaW4gYW5hbG9nIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpCiAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIGludGVycnVwdHMgKGUuZy4gSEFMX0FEQ19TdGFydF9JVCgpKQogICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgQURDIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCiAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBBREMgSVJRIGhhbmRsZXIgdXNpbmcgSEFMX05WSUNfRW5hYmxlSVJRKCkKQEAgLTI5LDU3ICsyOSw0NSBAQAogICAgICAgICAgICAgICAgICB1c2luZyAgX19IQUxfTElOS0RNQSgpCiAgICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUKICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IG9uIHRoZSB0d28gRE1BIFN0cmVhbXMuIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBoYXZlIGhpZ2hlcgotICAgICAgICAgICAgICAgICBwcmlvcml0eSB0aGFuIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgCi0gICAgICgjKSBDb25maWd1cmUgdGhlIEFEQyBQcmVzY2FsZXIsIGNvbnZlcnNpb24gcmVzb2x1dGlvbiBhbmQgZGF0YSBhbGlnbm1lbnQgCi0gICAgICAgICB1c2luZyB0aGUgSEFMX0FEQ19Jbml0KCkgZnVuY3Rpb24uIAotICAKKyAgICAgICAgICAgICAgICAgcHJpb3JpdHkgdGhhbiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAoIykgQ29uZmlndXJlIHRoZSBBREMgUHJlc2NhbGVyLCBjb252ZXJzaW9uIHJlc29sdXRpb24gYW5kIGRhdGEgYWxpZ25tZW50CisgICAgICAgICB1c2luZyB0aGUgSEFMX0FEQ19Jbml0KCkgZnVuY3Rpb24uCisKICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgQURDIEluamVjdGVkIGNoYW5uZWxzIGdyb3VwIGZlYXR1cmVzLCB1c2UgSEFMX0FEQ19Jbml0KCkKICAgICAgICAgIGFuZCBIQUxfQURDX0NvbmZpZ0NoYW5uZWwoKSBmdW5jdGlvbnMuCi0gICAgICAgICAKLSAgICAgKCMpIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6ICAgICAKLSAgCisKKyAgICAgKCMpIFRocmVlIG9wZXJhdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGRyaXZlciA6CisKICAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBbLi5dICAgIAotICAgICAgICgrKSBTdGFydCB0aGUgQURDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoKSAKKyAgICAgWy4uXQorICAgICAgICgrKSBTdGFydCB0aGUgQURDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RhcnQoKQogICAgICAgICgrKSBXYWl0IGZvciBlbmQgb2YgY29udmVyc2lvbiB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRQb2xsRm9yQ29udmVyc2lvbigpLCBhdCB0aGlzIHN0YWdlCi0gICAgICAgICAgIHVzZXIgY2FuIHNwZWNpZnkgdGhlIHZhbHVlIG9mIHRpbWVvdXQgYWNjb3JkaW5nIHRvIGhpcyBlbmQgYXBwbGljYXRpb24gICAgICAKKyAgICAgICAgICAgdXNlciBjYW4gc3BlY2lmeSB0aGUgdmFsdWUgb2YgdGltZW91dCBhY2NvcmRpbmcgdG8gaGlzIGVuZCBhcHBsaWNhdGlvbgogICAgICAgICgrKSBUbyByZWFkIHRoZSBBREMgY29udmVydGVkIHZhbHVlcywgdXNlIHRoZSBIQUxfQURDRXhfSW5qZWN0ZWRHZXRWYWx1ZSgpIGZ1bmN0aW9uLgogICAgICAgICgrKSBTdG9wIHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wKCkKLSAgCi0gICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqICAgIAorCisgICAgICoqKiBJbnRlcnJ1cHQgbW9kZSBJTyBvcGVyYXRpb24gKioqCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFsuLl0gICAgCi0gICAgICAgKCspIFN0YXJ0IHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpIAorICAgICBbLi5dCisgICAgICAgKCspIFN0YXJ0IHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9JVCgpCiAgICAgICAgKCspIFVzZSBIQUxfQURDX0lSUUhhbmRsZXIoKSBjYWxsZWQgdW5kZXIgQURDX0lSUUhhbmRsZXIoKSBJbnRlcnJ1cHQgc3Vicm91dGluZQotICAgICAgICgrKSBBdCBBREMgZW5kIG9mIGNvbnZlcnNpb24gSEFMX0FEQ0V4X0luamVjdGVkQ29udkNwbHRDYWxsYmFjaygpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiAKKyAgICAgICAoKykgQXQgQURDIGVuZCBvZiBjb252ZXJzaW9uIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KICAgICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2sgCiAgICAgICAgKCspIEluIGNhc2Ugb2YgQURDIEVycm9yLCBIQUxfQURDRXhfSW5qZWN0ZWRFcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAogICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0FEQ0V4X0luamVjdGVkRXJyb3JDYWxsYmFjawogICAgICAgICgrKSBTdG9wIHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdG9wX0lUKCkKLSAgICAgICAKLSAgICAgICAgICAgIAotICAgICAqKiogRE1BIG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICAKLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFsuLl0gICAgCi0gICAgICAgKCspIFN0YXJ0IHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfSW5qZWN0ZWRTdGFydF9ETUEoKSwgYXQgdGhpcyBzdGFnZSB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsZW5ndGggCi0gICAgICAgICAgIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgYXQgZWFjaCBlbmQgb2YgY29udmVyc2lvbiAKLSAgICAgICAoKykgQXQgVGhlIGVuZCBvZiBkYXRhIHRyYW5zZmVyIGJhIEhBTF9BRENFeF9JbmplY3RlZENvbnZDcGx0Q2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4gCi0gICAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfQURDRXhfSW5qZWN0ZWRDb252Q3BsdENhbGxiYWNrIAotICAgICAgICgrKSBJbiBjYXNlIG9mIHRyYW5zZmVyIEVycm9yLCBIQUxfQURDRXhfSW5qZWN0ZWRFcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuIAotICAgICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX0FEQ0V4X0luamVjdGVkRXJyb3JDYWxsYmFjawotICAgICAgICAoKykgU3RvcCB0aGUgQURDIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0FEQ0V4X0luamVjdGVkU3RvcF9ETUEoKQotICAgICAgICAKKwogICAgICAqKiogTXVsdGkgbW9kZSBBRENzIFJlZ3VsYXIgY2hhbm5lbHMgY29uZmlndXJhdGlvbiAqKioKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFsuLl0gICAgICAgIAotICAgICAgICgrKSBTZWxlY3QgdGhlIE11bHRpIG1vZGUgQURDIHJlZ3VsYXIgY2hhbm5lbHMgZmVhdHVyZXMgKGR1YWwgb3IgdHJpcGxlIG1vZGUpICAKLSAgICAgICAgICBhbmQgY29uZmlndXJlIHRoZSBETUEgbW9kZSB1c2luZyBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9ucy4gCi0gICAgICAgKCspIFN0YXJ0IHRoZSBBREMgcGVyaXBoZXJhbCB1c2luZyBIQUxfQURDRXhfTXVsdGlNb2RlU3RhcnRfRE1BKCksIGF0IHRoaXMgc3RhZ2UgdGhlIHVzZXIgc3BlY2lmeSB0aGUgbGVuZ3RoIAotICAgICAgICAgICBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGF0IGVhY2ggZW5kIG9mIGNvbnZlcnNpb24gICAgICAgICAgIAorICAgICBbLi5dCisgICAgICAgKCspIFNlbGVjdCB0aGUgTXVsdGkgbW9kZSBBREMgcmVndWxhciBjaGFubmVscyBmZWF0dXJlcyAoZHVhbCBvciB0cmlwbGUgbW9kZSkKKyAgICAgICAgICBhbmQgY29uZmlndXJlIHRoZSBETUEgbW9kZSB1c2luZyBIQUxfQURDRXhfTXVsdGlNb2RlQ29uZmlnQ2hhbm5lbCgpIGZ1bmN0aW9ucy4KKyAgICAgICAoKykgU3RhcnQgdGhlIEFEQyBwZXJpcGhlcmFsIHVzaW5nIEhBTF9BRENFeF9NdWx0aU1vZGVTdGFydF9ETUEoKSwgYXQgdGhpcyBzdGFnZSB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsZW5ndGgKKyAgICAgICAgICAgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBhdCBlYWNoIGVuZCBvZiBjb252ZXJzaW9uCiAgICAgICAgKCspIFJlYWQgdGhlIEFEQ3MgY29udmVydGVkIHZhbHVlcyB1c2luZyB0aGUgSEFMX0FEQ0V4X011bHRpTW9kZUdldFZhbHVlKCkgZnVuY3Rpb24uCi0gIAotICAKKworCiAgICAgQGVuZHZlcmJhdGltCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KQEAgLTkzLDcgKzgxLDcgQEAKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqLyAKKyAgKi8KIAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsLmgiCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9jYW4uYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2Nhbi5jCmluZGV4IGE0NWIyYTUuLjk1NGY1Y2UgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2Nhbi5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2Nhbi5jCkBAIC0xNTU2LDcgKzE1NTYsNyBAQAogICAgIHsKICAgICAgIHBIZWFkZXItPkV4dElkID0gKChDQU5fUkkwUl9FWElEIHwgQ0FOX1JJMFJfU1RJRCkgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUklSKSA+PiBDQU5fUkkwUl9FWElEX1BvczsKICAgICB9Ci0gICAgcEhlYWRlci0+UlRSID0gKENBTl9SSTBSX1JUUiAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SSVIpID4+IENBTl9SSTBSX1JUUl9Qb3M7CisgICAgcEhlYWRlci0+UlRSID0gKENBTl9SSTBSX1JUUiAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SSVIpOwogICAgIHBIZWFkZXItPkRMQyA9IChDQU5fUkRUMFJfRExDICYgaGNhbi0+SW5zdGFuY2UtPnNGSUZPTWFpbEJveFtSeEZpZm9dLlJEVFIpID4+IENBTl9SRFQwUl9ETENfUG9zOwogICAgIHBIZWFkZXItPkZpbHRlck1hdGNoSW5kZXggPSAoQ0FOX1JEVDBSX0ZNSSAmIGhjYW4tPkluc3RhbmNlLT5zRklGT01haWxCb3hbUnhGaWZvXS5SRFRSKSA+PiBDQU5fUkRUMFJfRk1JX1BvczsKICAgICBwSGVhZGVyLT5UaW1lc3RhbXAgPSAoQ0FOX1JEVDBSX1RJTUUgJiBoY2FuLT5JbnN0YW5jZS0+c0ZJRk9NYWlsQm94W1J4Rmlmb10uUkRUUikgPj4gQ0FOX1JEVDBSX1RJTUVfUG9zOwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfY3J5cC5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfY3J5cC5jCmluZGV4IDM2ODkyZDYuLmFkYzM1YmQgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2NyeXAuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9jcnlwLmMKQEAgLTMsNyArMyw3IEBACiAgICogQGZpbGUgICAgc3RtMzJmN3h4X2hhbF9jcnlwLmMKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBDcnlwdG9ncmFwaHkgKENSWVApIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24sIGRlLWluaXRpYWxpemF0aW9uLCBzZXQgY29uZmlnIGFuZCBnZXQgY29uZmlnICBmdW5jdGlvbnMKICAgKiAgICAgICAgICAgKyBERVMvVERFUywgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCkBAIC02NCw2ICs2NCwxMiBAQAogCiAgICAgICAgKCMpQ2FsbCBIQUxfQ1JZUF9EZUluaXQoKSB0byBkZWluaXRpYWxpemUgdGhlIENSWVAgcGVyaXBoZXJhbC4KIAorICAgICAgICgjKVRvIHByb2Nlc3MgYSBzaW5nbGUgbWVzc2FnZSB3aXRoIGNvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9DUllQX0VuY3J5cHQoKSBvciBIQUxfQ1JZUF9EZWNyeXB0KCkKKyAgICAgICAgICB3aXRob3V0IGhhdmluZyB0byBjb25maWd1cmUgYWdhaW4gdGhlIEtleSBvciB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIGJldHdlZW4gZWFjaCBBUEkgY2FsbCwKKyAgICAgICAgICB0aGUgZmllbGQgS2V5SVZDb25maWdTa2lwIG9mIHRoZSBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgbXVzdCBiZSBzZXQgdG8gQ1JZUF9LRVlJVkNPTkZJR19PTkNFLgorICAgICAgICAgIFNhbWUgaXMgdHJ1ZSBmb3IgY29uc2VjdXRpdmUgY2FsbHMgb2YgSEFMX0NSWVBfRW5jcnlwdF9JVCgpLCBIQUxfQ1JZUF9EZWNyeXB0X0lUKCksIEhBTF9DUllQX0VuY3J5cHRfRE1BKCkKKyAgICAgICAgICBvciBIQUxfQ1JZUF9EZWNyeXB0X0RNQSgpLgorCiAgICAgWy4uXQogICAgICAgVGhlIGNyeXB0b2dyYXBoaWMgcHJvY2Vzc29yIHN1cHBvcnRzIGZvbGxvd2luZyBzdGFuZGFyZHM6CiAgICAgICAoIykgVGhlIGRhdGEgZW5jcnlwdGlvbiBzdGFuZGFyZCAoREVTKSBhbmQgVHJpcGxlLURFUyAoVERFUykgc3VwcG9ydGVkIG9ubHkgYnkgQ1JZUDEgSVA6CkBAIC0yMzcsMTYgKzI0MywxNiBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4gCisgICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICAqCiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCi0gICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKKyAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjd4eF9oYWwuaCIKQEAgLTI1NCw5ICsyNjAsOSBAQAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyCiAgICogQHsKICAgKi8KLSAgCisKICNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQotICAKKwogLyoqIEBkZWZncm91cCBDUllQIENSWVAKICAgKiBAYnJpZWYgQ1JZUCBIQUwgbW9kdWxlIGRyaXZlci4KICAgKiBAewpAQCAtMjc2LDM2ICsyODIsMzYgQEAKIAogI2RlZmluZSAgQ1JZUF9QSEFTRV9SRUFEWSAgICAgICAgICAgICAgICAweDAwMDAwMDAxVSAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyByZWFkeSBmb3IgaW5pdGlhbGl6YXRpb24uICovCiAjZGVmaW5lICBDUllQX1BIQVNFX1BST0NFU1MgICAgICAgICAgICAgIDB4MDAwMDAwMDJVIC8qITwgQ1JZUCBwZXJpcGhlcmFsIGlzIGluIHByb2Nlc3NpbmcgcGhhc2UgKi8KLSAgICAKKwogI2lmIGRlZmluZWQoQUVTKQogI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgLyohPCBFbmNyeXB0aW9uIG1vZGUoTW9kZSAxKSAgKi8KICNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgIC8qITwgS2V5IGRlcml2YXRpb24gbW9kZSAgb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAoTW9kZSAyKSAqLwogI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCAgICAgICAgICAgICAgICAgICBBRVNfQ1JfTU9ERV8xICAgLyohPCBEZWNyeXB0aW9uICAgIChNb2RlIDMpICAgICovCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQgICAgIEFFU19DUl9NT0RFICAgICAvKiE8IEtleSBkZXJpdmF0aW9uIGFuZCBkZWNyeXB0aW9uIG9ubHkgdXNlZCB3aGVuIHBlcmZvcm1pbmcgRUNCIGFuZCBDQkMgZGVjcnlwdGlvbnMgKE1vZGUgNCkgKi8KLSNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgICAgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAgICAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLyAKKyNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgIC8qITwgR0NNL0dNQUMgKG9yIENDTSkgaW5pdCBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMCAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8xICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNICBmaW5hbCBwaGFzZSAqLwogI2Vsc2UgIC8qIENSWVAgKi8KICNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCi0jZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMSAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICAgICovIAotI2RlZmluZSBDUllQX1BIQVNFX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQX0NSX0dDTV9DQ01QSCAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSAgZmluYWwgcGhhc2UgKi8gCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBfQ1JfR0NNX0NDTVBIXzAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBDUllQX0NSX0dDTV9DQ01QSF8xICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEggICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICovCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KICNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgQ1JZUF9DUl9BTEdPRElSICAgICAgICAgLyohPCBEZWNyeXB0aW9uICAgICAgICAqLwotI2VuZGlmIC8qIEVuZCBDUllQIG9yICBBRVMgKi8gCisjZW5kaWYgLyogRW5kIENSWVAgb3IgIEFFUyAqLwogCi0gLyogIENUUjEgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8wICAgICAgICAgICAgICAgICAgMHgwN0ZGRkZGRlUgICAgICAgICAKLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8xICAgICAgICAgICAgICAgICAgMHhGRkZGRkYwMFUgICAgICAgICAKLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMV8yICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVUgICAgICAgICAKKy8qICBDVFIxIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMCAgICAgICAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMSAgICAgICAgICAgICAgICAgIDB4RkZGRkZGMDBVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjFfMiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVCiAKIAogLyoqCiAgICogQH0KICAgKi8KIAotICAKKwogLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfTWFjcm9zCiAgICogQHsKQEAgLTMxNyw5ICszMjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKF9fUEhBU0VfXyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQogCi0jZGVmaW5lIEhBTF9DUllQX0ZJRk9fRkxVU0goX19IQU5ETEVfXykgKChfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSIHw9ICBDUllQX0NSX0ZGTFVTSCkgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNlbHNlIC8qQUVTKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgSEFMX0NSWVBfRklGT19GTFVTSChfX0hBTkRMRV9fKSAoKF9fSEFORExFX18pLT5JbnN0YW5jZS0+Q1IgfD0gIENSWVBfQ1JfRkZMVVNIKQorCisjZWxzZSAvKkFFUyovCiAjZGVmaW5lIENSWVBfU0VUX1BIQVNFKF9fSEFORExFX18sIF9fUEhBU0VfXykgIGRveyhfX0hBTkRMRV9fKS0+SW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCkofkFFU19DUl9HQ01QSCk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX19IQU5ETEVfXyktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKF9fUEhBU0VfXyk7XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH13aGlsZSgwKQpAQCAtMzI4LDE0ICszMzQsMTQgQEAKIAogLyoqCiAgICogQH0KLSAgKi8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKi8KKwogLyogUHJpdmF0ZSBzdHJ1Y3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zX3Byb3RvdHlwZXMKICAgKiBAewotICAqLyAgCisgICovCiAKIHN0YXRpYyB2b2lkIENSWVBfU2V0RE1BQ29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IGlucHV0YWRkciwgdWludDE2X3QgU2l6ZSwgdWludDMyX3Qgb3V0cHV0YWRkcik7CiBzdGF0aWMgdm9pZCBDUllQX0RNQUluQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CkBAIC0zNTAsNyArMzU2LDcgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CiBzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpOwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKQEAgLTM3Niw3ICszODIsNyBAQAogCiAvKioKICAgKiBAfQotICAqLyAKKyAgKi8KIAogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM4NCwyNyArMzkwLDI3IEBACiAgICogQHsKICAgKi8KIAotICAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgCi0gKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4gCi0gKgotQHZlcmJhdGltICAgIAorCisvKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisgICoKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uLCBkZS1pbml0aWFsaXphdGlvbiBhbmQgU2V0IGFuZCBHZXQgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86Ci0gICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCAgCi0gICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQICAKKyAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBDUllQCiAgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKLSAgICAgICgrKSBEZUluaXRpYWxpemUgdGhlIENSWVAgTVNQIAorICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBNU1AKICAgICAgICgrKSBjb25maWd1cmUgQ1JZUCAoSEFMX0NSWVBfU2V0Q29uZmlnKSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgQ1JZUF9Db25maWdUeXBlRGVmCiAgICAgICAgICAgUGFyYW1ldGVycyB3aGljaCBhcmUgY29uZmlndXJlZCBpbiBUaGlzIHNlY3Rpb24gYXJlIDoKLSAgICAgICAgICAoKykgS2V5IHNpemUgCisgICAgICAgICAgKCspIEtleSBzaXplCiAgICAgICAgICAgKCspIERhdGEgVHlwZSA6IDMyLDE2LCA4IG9yIDFiaXQKLSAgICAgICAgICAoKykgQWxnb01vZGUgOiAKLSAgICAgICAgICAgICAgLSBmb3IgQ1JZUDEgSVAgOiAKLSAgICAgICAgICAgICAgICAgRUNCIGFuZCBDQkMgaW4gREVTL1RERVMgU3RhbmRhcmQgCi0gICAgICAgICAgICAgICAgIEVDQixDQkMsQ1RSLEdDTS9HTUFDIGFuZCBDQ00gaW4gQUVTIFN0YW5kYXJkLiAKKyAgICAgICAgICAoKykgQWxnb01vZGUgOgorICAgICAgICAgICAgICAtIGZvciBDUllQMSBJUCA6CisgICAgICAgICAgICAgICAgIEVDQiBhbmQgQ0JDIGluIERFUy9UREVTIFN0YW5kYXJkCisgICAgICAgICAgICAgICAgIEVDQixDQkMsQ1RSLEdDTS9HTUFDIGFuZCBDQ00gaW4gQUVTIFN0YW5kYXJkLgogICAgICAgICAgICAgICAtIGZvciBUaW55QUVTMiBJUCwgb25seSBFQ0IsQ0JDLENUUixHQ00vR01BQyBhbmQgQ0NNIGluIEFFUyBTdGFuZGFyZCBhcmUgc3VwcG9ydGVkLgogICAgICAgKCspIEdldCBDUllQIGNvbmZpZ3VyYXRpb24gKEhBTF9DUllQX0dldENvbmZpZykgZnJvbSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIENSWVBfSGFuZGxlVHlwZURlZgogCkBAIC00MjIsMTUyICs0MjgsMTU1IEBACiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9Jbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17IAorewogICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwotICBpZihoY3J5cCA9PSBOVUxMKQorICBpZiAoaGNyeXAgPT0gTlVMTCkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKGhjcnlwLT5Jbml0LktleVNpemUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfREFUQVRZUEUoaGNyeXAtPkluaXQuRGF0YVR5cGUpKTsKLSAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfQUxHT1JJVEhNKGhjcnlwLT5Jbml0LkFsZ29yaXRobSkpOyAgCi0gIAotICAjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQorICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0oaGNyeXAtPkluaXQuQWxnb3JpdGhtKSk7CisgIGFzc2VydF9wYXJhbShJU19DUllQX0lOSVQoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwKSk7CisKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgIGhjcnlwLT5Mb2NrID0gSEFMX1VOTE9DS0VEOwotICAgIAorCiAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrICA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgSW5DcGx0Q2FsbGJhY2sgICAqLwogICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIE91dENwbHRDYWxsYmFjayAgKi8KICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayAgID0gSEFMX0NSWVBfRXJyb3JDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICovCi0gICAgCi0gICAgaWYoaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorCisgICAgaWYgKGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgICB7CiAgICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCAgKi8KICAgICB9Ci0gICAgCisKICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KLSAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrKGhjcnlwKTsgICAgCisgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayhoY3J5cCk7CiAgIH0KICNlbHNlCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKICAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBoY3J5cC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKLSAgICAKKwogICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogICAgIEhBTF9DUllQX01zcEluaXQoaGNyeXApOwogICB9Ci0gI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLwotICAKKyNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KKwogICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUgYW5kIEFsZ29yaXRobSAqLwogI2lmIGRlZmluZWQgKENSWVApCi0gIAotICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfREFUQVRZUEV8Q1JZUF9DUl9LRVlTSVpFfENSWVBfQ1JfQUxHT01PREUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7Ci0gIAorCisgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9EQVRBVFlQRSB8IENSWVBfQ1JfS0VZU0laRSB8IENSWVBfQ1JfQUxHT01PREUsCisgICAgICAgICAgICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKwogI2Vsc2UgLypBRVMqLwotICAKLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEV8QUVTX0NSX0tFWVNJWkV8QUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5EYXRhVHlwZSB8IGhjcnlwLT5Jbml0LktleVNpemUgfCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOwotICAKKworICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSB8IEFFU19DUl9LRVlTSVpFIHwgQUVTX0NSX0NITU9ELAorICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICNlbmRpZiAgLyogRW5kIEFFUyBvciBDUllQKi8KLSAgCisKICAgLyogUmVzZXQgRXJyb3IgQ29kZSBmaWVsZCAqLwotICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsgCi0gIAorICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgCisgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlICovCiAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUkVBRFk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBEZS1Jbml0aWFsaXplcyB0aGUgQ1JZUCBwZXJpcGhlcmFsLiAKKyAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBDUllQIHBlcmlwaGVyYWwuCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVJbml0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCi0gIGlmKGhjcnlwID09IE5VTEwpCisgIGlmIChoY3J5cCA9PSBOVUxMKQogICB7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKKwogICAvKiBTZXQgdGhlIGRlZmF1bHQgQ1JZUCBwaGFzZSAqLwogICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOwotICAKKwogICAvKiBSZXNldCBDcnlwSW5Db3VudCBhbmQgQ3J5cE91dENvdW50ICovCiAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CiAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwOwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0wOyAKLSAgCisgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwOworCiAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKKwogI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gIAotICBpZihoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKworICBpZiAoaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7IC8qIExlZ2FjeSB3ZWFrIE1zcERlSW5pdCAgKi8KICAgfQogICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLwogICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2soaGNyeXApOwotICAKKwogI2Vsc2UKLSAgCisKICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCiAgIEhBTF9DUllQX01zcERlSW5pdChoY3J5cCk7Ci0gIAorCiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVTRVQ7Ci0gIAorCiAgIC8qIFJlbGVhc2UgTG9jayAqLwogICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9Ci0gICAgCisKIC8qKgogICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBDUllQIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCi0gICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYgCisgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0NvbmZpZ1R5cGVEZWYKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZQogICAqIEBwYXJhbSAgcENvbmY6IHBvaW50ZXIgdG8gYSBDUllQX0NvbmZpZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfU2V0Q29uZmlnKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIENSWVBfQ29uZmlnVHlwZURlZiAqcENvbmYgKQoteyAKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX1NldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mKQorewogICAvKiBDaGVjayB0aGUgQ1JZUCBoYW5kbGUgYWxsb2NhdGlvbiAqLwotICBpZigoaGNyeXAgPT0gTlVMTCl8fCAocENvbmYgPT0gTlVMTCkgKQorICBpZiAoKGhjcnlwID09IE5VTEwpIHx8IChwQ29uZiA9PSBOVUxMKSkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9LRVlTSVpFKHBDb25mLT5LZXlTaXplKSk7CiAgIGFzc2VydF9wYXJhbShJU19DUllQX0RBVEFUWVBFKHBDb25mLT5EYXRhVHlwZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPUklUSE0ocENvbmYtPkFsZ29yaXRobSkpOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKSAKLSAgeyAgCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgewogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwotICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgICAgCi0gICAgCi0gICAgLyogU2V0ICBDUllQIHBhcmFtZXRlcnMgICovICAgIAorICAgIF9fSEFMX0xPQ0soaGNyeXApOworCisgICAgLyogU2V0ICBDUllQIHBhcmFtZXRlcnMgICovCiAgICAgaGNyeXAtPkluaXQuRGF0YVR5cGUgICA9IHBDb25mLT5EYXRhVHlwZTsKICAgICBoY3J5cC0+SW5pdC5wS2V5ICAgICAgID0gcENvbmYtPnBLZXk7CiAgICAgaGNyeXAtPkluaXQuQWxnb3JpdGhtICA9IHBDb25mLT5BbGdvcml0aG07CkBAIC01NzcsNDIgKzU4Niw0NCBAQAogICAgIGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPSBwQ29uZi0+SGVhZGVyU2l6ZTsKICAgICBoY3J5cC0+SW5pdC5CMCAgICAgICAgID0gcENvbmYtPkIwOwogICAgIGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPSBwQ29uZi0+RGF0YVdpZHRoVW5pdDsKLSAgICAKLSAgICAvKiBTZXQgdGhlIGtleSBzaXplKFRoaXMgYml0IGZpZWxkIGlzIGRvbpJ0IGNhcmUgaW4gdGhlIERFUyBvciBUREVTIG1vZGVzKSBkYXRhIHR5cGUsIEFsZ29Nb2RlIGFuZCBvcGVyYXRpbmcgbW9kZSovICAgIAotI2lmIGRlZmluZWQgKENSWVApIAotICAgIAotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9EQVRBVFlQRXxDUllQX0NSX0tFWVNJWkV8Q1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuRGF0YVR5cGUgfCBoY3J5cC0+SW5pdC5LZXlTaXplIHwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKLSAgICAKKworICAgIC8qIFNldCB0aGUga2V5IHNpemUoVGhpcyBiaXQgZmllbGQgaXMgZG9uknQgY2FyZSBpbiB0aGUgREVTIG9yIFRERVMgbW9kZXMpIGRhdGEgdHlwZSwgQWxnb01vZGUgYW5kIG9wZXJhdGluZyBtb2RlKi8KKyNpZiBkZWZpbmVkIChDUllQKQorCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0RBVEFUWVBFIHwgQ1JZUF9DUl9LRVlTSVpFIHwgQ1JZUF9DUl9BTEdPTU9ERSwKKyAgICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICNlbHNlIC8qQUVTKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRXxBRVNfQ1JfS0VZU0laRXxBRVNfQ1JfQ0hNT0QsIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7Ci0gICAgCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUgfCBBRVNfQ1JfS0VZU0laRSB8IEFFU19DUl9DSE1PRCwKKyAgICAgICAgICAgICAgIGhjcnlwLT5Jbml0LkRhdGFUeXBlIHwgaGNyeXAtPkluaXQuS2V5U2l6ZSB8IGhjcnlwLT5Jbml0LkFsZ29yaXRobSk7CisKICAgICAvKmNsZWFyIGVycm9yIGZsYWdzKi8KLSAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9FUlJfQ0xFQVIpOwotICAgIAotI2VuZGlmICAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCi0gICAgCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0VSUl9DTEVBUik7CisKKyNlbmRpZiAgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIFJlc2V0IEVycm9yIENvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsgCi0gICAgCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX05PTkU7CisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgIAorICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgICAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1JFQURZOwotICAgIAorCiAgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgCi0gICAgCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKwogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KIH0KQEAgLTYyNCwyMyArNjM1LDIzIEBACiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0dldENvbmZpZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBDUllQX0NvbmZpZ1R5cGVEZWYgKnBDb25mICkKLXsgCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9HZXRDb25maWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgQ1JZUF9Db25maWdUeXBlRGVmICpwQ29uZikKK3sKICAgLyogQ2hlY2sgdGhlIENSWVAgaGFuZGxlIGFsbG9jYXRpb24gKi8KLSAgaWYoKGhjcnlwID09IE5VTEwpfHwgKHBDb25mID09IE5VTEwpICkKKyAgaWYgKChoY3J5cCA9PSBOVUxMKSB8fCAocENvbmYgPT0gTlVMTCkpCiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpIAotICB7ICAKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCi0gICAgX19IQUxfTE9DSyhoY3J5cCk7ICAKLSAgICAKLSAgICAvKiBHZXQgIENSWVAgcGFyYW1ldGVycyAgKi8gICAgICAKKyAgICBfX0hBTF9MT0NLKGhjcnlwKTsKKworICAgIC8qIEdldCAgQ1JZUCBwYXJhbWV0ZXJzICAqLwogICAgIHBDb25mLT5EYXRhVHlwZSAgICAgICAgPSBoY3J5cC0+SW5pdC5EYXRhVHlwZTsKICAgICBwQ29uZi0+cEtleSAgICAgICAgICAgID0gaGNyeXAtPkluaXQucEtleTsKICAgICBwQ29uZi0+QWxnb3JpdGhtICAgICAgID0gaGNyeXAtPkluaXQuQWxnb3JpdGhtOwpAQCAtNjUwLDIzICs2NjEsMjMgQEAKICAgICBwQ29uZi0+SGVhZGVyU2l6ZSAgICAgID0gaGNyeXAtPkluaXQuSGVhZGVyU2l6ZTsKICAgICBwQ29uZi0+QjAgICAgICAgICAgICAgID0gaGNyeXAtPkluaXQuQjA7CiAgICAgcENvbmYtPkRhdGFXaWR0aFVuaXQgICAgPSBoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0OwotICAgIAorCiAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KLSAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAKLSAgICAKKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKwogICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICByZXR1cm4gSEFMX09LOwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAKLSAgICAKKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQogfQpAQCAtNjgwLDcgKzY5MSw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtNjk2LDcgKzcwNyw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCkBAIC03MTEsNzYgKzcyMiw3NyBAQAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElEIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAgKiBAcmV0dmFsIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKworICBpZiAocENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7Ci0gICAgCisKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewotICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgotICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX09VVFBVVF9DT01QTEVURV9DQl9JRCA6Ci0gICAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX0VSUk9SX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBlbHNlIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgZWxzZSBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgIHsKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGVsc2UKQEAgLTc5MCwxMCArODAyLDEwIEBACiAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogUmVsZWFzZSBMb2NrICovCiAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gIAorCiAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgwNSw3ICs4MTcsNyBAQAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCBJbnB1dCBGSUZPIHRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgT3V0cHV0IEZJRk8gdHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX0VSUk9SX0NCX0lEIEVycm9yIGNhbGxiYWNrIElEIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBFcnJvciBjYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIE1zcEluaXQgY2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICAqIEByZXR2YWwgc3RhdHVzCkBAIC04MTMsNjAgKzgyNSw2MCBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIEhBTF9DUllQX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoY3J5cCk7Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7Ci0gICAgY2FzZSBIQUxfQ1JZUF9JTlBVVF9DT01QTEVURV9DQl9JRCA6Ci0gICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBJbkNwbHRDYWxsYmFjayAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9PVVRQVVRfQ09NUExFVEVfQ0JfSUQgOgotICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IEhBTF9DUllQX091dENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICAgICAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfQ1JZUF9FUlJPUl9DQl9JRCA6Ci0gICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKLSAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0NSWVBfSU5QVVRfQ09NUExFVEVfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrICBJbkNwbHRDYWxsYmFjayAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUX0NPTVBMRVRFX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IEhBTF9DUllQX091dENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBPdXRDcGx0Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0NSWVBfRVJST1JfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayA9IEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOworICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBlbHNlIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRVNFVCkKKyAgZWxzZSBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFU0VUKQogICB7CiAgICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgIHsKLSAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKLSAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKLSAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgZWxzZQpAQCAtODc2LDEwICs4ODgsMTAgQEAKICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCiAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgfQotICAKKwogICAvKiBSZWxlYXNlIExvY2sgKi8KICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgCisKICAgcmV0dXJuIHN0YXR1czsKIH0KICNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCkBAIC04ODcsMTYgKzg5OSwxNiBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyICBFbmNyeXB0IERlY3J5cHQgZnVuY3Rpb25zIAotICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLiAKLSAqCi1AdmVyYmF0aW0gICAKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyICBFbmNyeXB0IERlY3J5cHQgZnVuY3Rpb25zCisgICogIEBicmllZiAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorICAqCitAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgRW5jcnlwdCBEZWNyeXB0ICBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQVBJIGFsbG93aW5nIHRvIEVuY3J5cHQvRGVjcnlwdCBEYXRhIGZvbGxvd2luZyAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEFQSSBhbGxvd2luZyB0byBFbmNyeXB0L0RlY3J5cHQgRGF0YSBmb2xsb3dpbmcKICAgICAgICAgICBTdGFuZGFyZCBERVMvVERFUyBvciBBRVMsIGFuZCBBbGdvcml0aG0gY29uZmlndXJlZCBieSB0aGUgdXNlcjoKLSAgICAgICgrKSBTdGFuZGFyZCBERVMvVERFUyBvbmx5IHN1cHBvcnRlZCBieSBDUllQMSBJUCwgYmVsb3cgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkIDogCisgICAgICAoKykgU3RhbmRhcmQgREVTL1RERVMgb25seSBzdXBwb3J0ZWQgYnkgQ1JZUDEgSVAsIGJlbG93IGxpc3Qgb2YgQWxnb3JpdGhtIHN1cHBvcnRlZCA6CiAgICAgICAgICAgIC0gRWxlY3Ryb25pYyBDb2RlIEJvb2soRUNCKQogICAgICAgICAgICAtIENpcGhlciBCbG9jayBDaGFpbmluZyAoQ0JDKQogICAgICAgKCspIFN0YW5kYXJkIEFFUyAgc3VwcG9ydGVkIGJ5IENSWVAxIElQICYgVGlueUFFUywgbGlzdCBvZiBBbGdvcml0aG0gc3VwcG9ydGVkOgpAQCAtOTA2LDcgKzkxOCw3IEBACiAgICAgICAgICAgIC0gQ2lwaGVyIEJsb2NrIENoYWluaW5nIChDQkMpCiAgICAgICAgICAgIC0gQ291bnRlciBtb2RlIChDVFIpCiAgICAgICAgICAgIC0gR2Fsb2lzL2NvdW50ZXIgbW9kZSAoR0NNKQotICAgICAgICAgICAtIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pIAorICAgICAgICAgICAtIENvdW50ZXIgd2l0aCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmctTWVzc2FnZShDQ00pCiAgICAgWy4uXSAgVGhyZWUgcHJvY2Vzc2luZyBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZToKICAgICAgICgrKSBQb2xsaW5nIG1vZGUgOiBIQUxfQ1JZUF9FbmNyeXB0ICYgSEFMX0NSWVBfRGVjcnlwdAogICAgICAgKCspIEludGVycnVwdCBtb2RlIDogSEFMX0NSWVBfRW5jcnlwdF9JVCAmIEhBTF9DUllQX0RlY3J5cHRfSVQKQEAgLTkyNCwyOCArOTM2LDI5IEBACiAgICogQHBhcmFtICBJbnB1dDogUG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChwbGFpbnRleHQpCiAgICogQHBhcmFtICBTaXplOiBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gd29yZC4KICAgKiBAcGFyYW0gIE91dHB1dDogUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcihjaXBoZXJ0ZXh0KQotICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgYWxnbzsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQotICB7IAorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKLSAgICAKKwogICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICAgewpAQCAtOTUzLDEzMiArOTY2LDE0MCBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgICB9Ci0gICAgCi0jaWYgZGVmaW5lZCAoQ1JZUCkgIAotICAgIC8qIFNldCBFbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAKLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgICAKKworI2lmIGRlZmluZWQgKENSWVApCisgICAgLyogU2V0IEVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICBjYXNlIENSWVBfREVTX0VDQjoKLSAgICBjYXNlIENSWVBfREVTX0NCQzoKLSAgICBjYXNlIENSWVBfVERFU19FQ0I6Ci0gICAgY2FzZSBDUllQX1RERVNfQ0JDOgotICAgICAgCi0gICAgICAvKlNldCBLZXkgKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLyAgICAKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmx1c2ggRklGTyAqLwotICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogU3RhdHJ0IERFUy9UREVTIGVuY3J5cHRpb24gcHJvY2VzcyAqLyAgICAgCi0gICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8gICAgICAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAgICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOwotICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8gIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgfSAgICAgIAotICAgIAotI2Vsc2UgLypBRVMqLwotICAgIAotICAgIC8qIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsgIAotICAgIAotICAgIHN3aXRjaChhbGdvKQotICAgIHsgICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8gICAgICAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7ICAgICAKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKLSAgICAgIAotICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MgKGhjcnlwLFRpbWVvdXQpIDsgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCxUaW1lb3V0KTsgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHJldHVybiBIQUxfRVJST1I7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgICAgY2FzZSBDUllQX0RFU19FQ0I6CisgICAgICBjYXNlIENSWVBfREVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKKworICAgICAgICAvKlNldCBLZXkgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0KTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciAoSVYpKi8KKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZsdXNoIEZJRk8gKi8KKyAgICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7CisKKyAgICAgICAgLyogU3RhdHJ0IERFUy9UREVTIGVuY3J5cHRpb24gcHJvY2VzcyAqLworICAgICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRW5jcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgorCisgICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsKKworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQICovICAgCi0gICAgCisKKyNlbHNlIC8qQUVTKi8KKworICAgIC8qIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0VuY3J5cHQoaGNyeXAsIFRpbWVvdXQpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKKworICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyNlbmRpZiAvKmVuZCBBRVMgb3IgQ1JZUCAqLworCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCi0gICAgeyAKKyAgICB7CiAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKKwogICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICB9ICAgIAorICAgIH0KICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwotICB9IAotICAKKyAgfQorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIEhBTF9PSzsgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTEwODgsMjggKzExMDksMjkgQEAKICAgKiBAcGFyYW0gIElucHV0OiBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGNpcGhlcnRleHQgKQogICAqIEBwYXJhbSAgU2l6ZTogTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIHdvcmQuCiAgICogQHBhcmFtICBPdXRwdXQ6IFBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIocGxhaW50ZXh0KQotICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqSW5wdXQsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90ICpPdXRwdXQsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGltZW91dCkKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwotICB1aW50MzJfdCBhbGdvOyAKLSAgCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgdWludDMyX3QgYWxnbzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogICB7CiAgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KLSAgICBfX0hBTF9MT0NLKGhjcnlwKTsgCi0gICAgCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKICAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyICBwYXJhbWV0ZXJzKi8KICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKLSAgICAKKwogICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICAgewpAQCAtMTExNywxMzMgKzExMzksMTQxIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CQorICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwogICAgIH0KLSAgICAKKwogI2lmIGRlZmluZWQgKENSWVApCi0gICAgCisKICAgICAvKiBTZXQgRGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKLSAgICAKLSAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gICAKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLwogICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKLSAgICBjYXNlIENSWVBfVERFU19DQkM6Ci0gICAgICAKLSAgICAgIC8qU2V0IEtleSAqLwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsgIAotICAgICAgfQotICAgICAgCi0gICAgICAvKlNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKElWKSovICAgCi0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIFN0YXJ0IERFUy9UREVTIGRlY3J5cHRpb24gcHJvY2VzcyAqLyAgCi0gICAgICBzdGF0dXMgPSBDUllQX1RERVNfUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7Ci0gICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovICAgCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0KGhjcnlwLCBUaW1lb3V0KTsKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAgICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3MgKGhjcnlwLCBUaW1lb3V0KSA7ICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KTsgCi0gICAgICBicmVhazsKLSAgICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9ICAgICAgCi0gICAgCi0jZWxzZSAvKkFFUyovCi0gICAgCi0gICAgLyogU2V0IERlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgICAgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7Ci0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2VzcyAoaGNyeXAsIFRpbWVvdXQpIDsgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7ICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLypTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBERVMvVERFUyBkZWNyeXB0aW9uIHByb2Nlc3MgKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9UREVTX1Byb2Nlc3MoaGNyeXAsIFRpbWVvdXQpOworCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNOgorCisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotICAgIAorCisjZWxzZSAvKkFFUyovCisKKyAgICAvKiBTZXQgRGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdChoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorCisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzKGhjcnlwLCBUaW1lb3V0KSA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0NDTToKKworICAgICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2VzcyhoY3J5cCwgVGltZW91dCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCi0gICAgeyAKKyAgICB7CiAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKKwogICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICB9ICAgIAorICAgIH0KICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIEhBTF9PSzsgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTEyNTcsMjMgKzEyODcsMjMgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQogewotICB1aW50MzJfdCBhbGdvOyAKKyAgdWludDMyX3QgYWxnbzsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7Ci0gICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsgIAotICAgIAorICAgIGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgPSBPdXRwdXQ7CisKICAgICAvKiAgQ2FsY3VsYXRlIFNpemUgcGFyYW1ldGVyIGluIEJ5dGUqLwogICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhV2lkdGhVbml0ID09IENSWVBfREFUQVdJRFRIVU5JVF9XT1JEKQogICAgIHsKQEAgLTEyODEsMTI0ICsxMzExLDEzMiBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwkKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKICAgICB9Ci0gICAgCisKICNpZiBkZWZpbmVkIChDUllQKQotICAgIAotICAgIC8qIFNldCBlbmNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAKLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKLSAgICAKLSAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8gIAotICAgIGFsZ28gPSAoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREUpOwotICAgIAotICAgIHN3aXRjaChhbGdvKQotICAgIHsgICAgCi0gICAgY2FzZSBDUllQX0RFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0RFU19DQkM6Ci0gICAgY2FzZSBDUllQX1RERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKLSAgICAgIAotICAgICAgLypTZXQgS2V5ICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOyAgCi0gICAgICB9Ci0gICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0gICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwotICAgICAgCi0gICAgICAvKiBFbmFibGUgQ1JZUCB0byBzdGFydCBERVMvVERFUyBwcm9jZXNzKi8KLSAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0VuY3J5cHRfSVQoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTToKLSAgICAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoaGNyeXApIDsgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7ICAKLSAgICAgIGJyZWFrOwotICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSNlbHNlIC8qIEFFUyAqLwotICAgIAorCiAgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBlbmNyeXB0aW9uICovICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0VuY3J5cHRfSVQoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgotICAgICAgCi0gICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8gIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoaGNyeXApIDsgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0NDTToKLSAgICAgIAotICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovICAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOyAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERSk7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgICAgY2FzZSBDUllQX0RFU19FQ0I6CisgICAgICBjYXNlIENSWVBfREVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKKworICAgICAgICAvKlNldCBLZXkgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0KTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKKyAgICAgICAgfQorICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaCBGSUZPICovCisgICAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCisgICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisKKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQKi8gCi0gICAgCisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX0NITU9EOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19FbmNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisKKyAgICAgICAgLyogQUVTIEdDTSBlbmNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8qZW5kIEFFUyBvciBDUllQKi8KKwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtMTQxNCwyMSArMTQ1MiwyMSBAQAogewogICB1aW50MzJfdCBhbGdvOwogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCi0gIHsgIAorCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwotICAgIF9fSEFMX0xPQ0soaGNyeXApOyAgCi0gICAgCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKICAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciBhbmQgcENyeXBPdXRCdWZmUHRyIHBhcmFtZXRlcnMqLwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwotICAgIAorCiAgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgICB7CkBAIC0xNDM2LDEyOCArMTQ3NCwxMzYgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsJCisgICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CiAgICAgfQotICAgIAorCiAjaWYgZGVmaW5lZCAoQ1JZUCkKLSAgICAKKwogICAgIC8qIFNldCBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUixDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7Ci0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT0RJUiwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCiAgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwotICAgIAotICAgIHN3aXRjaChhbGdvKQotICAgIHsgICAgCi0gICAgY2FzZSBDUllQX0RFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0RFU19DQkM6Ci0gICAgY2FzZSBDUllQX1RERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKLSAgICAgIAotICAgICAgLypTZXQgS2V5ICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOyAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIC8qIEZsdXNoIEZJRk8gKi8KLSAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gICAgICAKLSAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwotICAgICAgCi0gICAgICAvKiBFbmFibGUgQ1JZUCBhbmQgc3RhcnQgREVTL1RERVMgcHJvY2VzcyovCi0gICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7IAotICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTToKLSAgICAgIAotICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoaGNyeXApIDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006Ci0gICAgICAKLSAgICAgIC8qIEFFUyBDQ01kZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19JVChoY3J5cCk7ICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsgCisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgICAgY2FzZSBDUllQX0RFU19FQ0I6CisgICAgICBjYXNlIENSWVBfREVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKKworICAgICAgICAvKlNldCBLZXkgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAzKTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0KTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICAgICAgfQorICAgICAgICAvKiBGbHVzaCBGSUZPICovCisgICAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgYW5kIHN0YXJ0IERFUy9UREVTIHByb2Nlc3MqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisKKyAgICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfSVQoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorCisgICAgICAgIC8qIEFFUyBDQ01kZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICAKKwogI2Vsc2UgLypBRVMqLwotICAgIAorCiAgICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0VDQjoKLSAgICBjYXNlIENSWVBfQUVTX0NCQzoKLSAgICBjYXNlIENSWVBfQUVTX0NUUjoKLSAgICAgIAotICAgICAgLyogQUVTIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU19EZWNyeXB0X0lUKGhjcnlwKTsKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKLSAgICAgIAotICAgICAgLyogQUVTIEdDTSBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVCAoaGNyeXApIDsgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgotICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKGhjcnlwKTsgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7Ci0gICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICAgICAgYnJlYWs7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19HQ01fR01BQzoKKworICAgICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19JVChoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisKKyAgICAgICAgLyogQUVTIENDTSBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTQ0NNX1Byb2Nlc3NfSVQoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9Ci0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovICAKLSAgICAKKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gIH0gCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgpAQCAtMTU3MSwyMyArMTYxNywyNCBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKklucHV0LCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCAqT3V0cHV0KQogewotICB1aW50MzJfdCBhbGdvOyAKKyAgdWludDMyX3QgYWxnbzsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgIHsKICAgICAvKiBDaGFuZ2Ugc3RhdGUgQnVzeSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogIFJlc2V0IENyeXBJbkNvdW50LCBDcnlwT3V0Q291bnQgYW5kIEluaXRpYWxpemUgcENyeXBJbkJ1ZmZQdHIgYW5kIHBDcnlwT3V0QnVmZlB0ciBwYXJhbWV0ZXJzKi8KICAgICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwVTsKICAgICBoY3J5cC0+Q3J5cE91dENvdW50ID0gMFU7CiAgICAgaGNyeXAtPnBDcnlwSW5CdWZmUHRyID0gSW5wdXQ7CiAgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciA9IE91dHB1dDsKLSAgICAKKwogICAgIC8qICBDYWxjdWxhdGUgU2l6ZSBwYXJhbWV0ZXIgaW4gQnl0ZSovCiAgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFXaWR0aFVuaXQgPT0gQ1JZUF9EQVRBV0lEVEhVTklUX1dPUkQpCiAgICAgewpAQCAtMTU5NSwxNTAgKzE2NDIsMjAwIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBoY3J5cC0+U2l6ZSA9IFNpemU7CQorICAgICAgaGNyeXAtPlNpemUgPSBTaXplOwogICAgIH0KLSAgICAKKwogI2lmIGRlZmluZWQgKENSWVApCi0gICAgCi0gICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLyAgIAotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7IAotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCi0gICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09NT0RFOwotICAgIAotICAgIHN3aXRjaChhbGdvKQotICAgIHsgICAgCi0gICAgY2FzZSBDUllQX0RFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0RFU19DQkM6Ci0gICAgY2FzZSBDUllQX1RERVNfRUNCOgotICAgIGNhc2UgQ1JZUF9UREVTX0NCQzoKLSAgICAgIAotICAgICAgLypTZXQgS2V5ICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOyAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmx1c2ggRklGTyAqLwotICAgICAgSEFMX0NSWVBfRklGT19GTFVTSChoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIERFUy9UREVTICovIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICAgICAgCi0gICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciBJViAqLwotICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSAgICAgIH0gICAgIAotICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwotICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOyAgCi0gICAgICAKLSAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBBRVMgKi8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgICAgICAgICAgCi0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNOiAgICAKLSAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BIChoY3J5cCkgOyAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOiAgICAgIAotICAgICAgLyogQUVTIENDTSBlbmNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOyAgICAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0jZWxzZSAvKkFFUyovIAorCiAgICAgLyogU2V0IGVuY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAKLSAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8gCi0gICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKLSAgICAgIHsgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAgIAotICAgICAgLyogU3RhcnQgRE1BIHByb2Nlc3MgdHJhbnNmZXIgZm9yIEFFUyAqLyAKLSAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKCBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUvNFUpLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAgCi0gICAgICBicmVhazsgICAKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6ICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BIChoY3J5cCkgOyAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006ICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7Ci0gICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICAgICAgYnJlYWs7CisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09ESVIsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLworICAgIGFsZ28gPSBoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPTU9ERTsKKworICAgIHN3aXRjaCAoYWxnbykKKyAgICB7CisgICAgICBjYXNlIENSWVBfREVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9ERVNfQ0JDOgorICAgICAgY2FzZSBDUllQX1RERVNfRUNCOgorICAgICAgY2FzZSBDUllQX1RERVNfQ0JDOgorCisgICAgICAgIC8qU2V0IEtleSAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0RFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgICAgIHsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2ggRklGTyAqLworICAgICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKKworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgREVTL1RERVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgorICAgICAgY2FzZSBDUllQX0FFU19DQkM6CisgICAgICBjYXNlIENSWVBfQUVTX0NUUjoKKworICAgICAgICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgICAgICAgeworICAgICAgICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgICAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgICAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIG5vdCBiZWVuIGRvbmUgYWxyZWFkeSwgZG8gaXQgYW5kIHNldCBLZXlJVkNvbmZpZworICAgICAgICAgICAgdG8ga2VlcCB0cmFjayBpdCB3b24ndCBoYXZlIHRvIGJlIGRvbmUgYWdhaW4gbmV4dCB0aW1lICovCisgICAgICAgICAgICBoY3J5cC0+S2V5SVZDb25maWcgPSAxVTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLworICAgICAgICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxVSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyVSk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzVSk7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBBRVMgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpIC8gNFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisgICAgICAgIC8qIEFFUyBHQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZW5jcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAgCi0gICAgCisKKyNlbHNlIC8qQUVTKi8KKyAgICAvKiBTZXQgZW5jcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovCisgICAgYWxnbyA9IGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfQ0hNT0Q7CisKKyAgICBzd2l0Y2ggKGFsZ28pCisgICAgeworCisgICAgICBjYXNlIENSWVBfQUVTX0VDQjoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgorICAgICAgY2FzZSBDUllQX0FFU19DVFI6CisKKyAgICAgICAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICAgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgICAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyAgICAgICAgICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgICAgICAgICB7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisgICAgICAgICAgfQorICAgICAgICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworICAgICAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgQUVTICovCisgICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOgorICAgICAgICAvKiBBRVMgR0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNHQ01fUHJvY2Vzc19ETUEoaGNyeXApIDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOgorICAgICAgICAvKiBBRVMgQ0NNIGVuY3J5cHRpb24gKi8KKyAgICAgICAgc3RhdHVzID0gQ1JZUF9BRVNDQ01fUHJvY2Vzc19ETUEoaGNyeXApOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7IAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICB9IAotICAKKyAgfQorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIHN0YXR1czsgIAorICByZXR1cm4gc3RhdHVzOwogfQogCiAvKioKQEAgLTE3NTIsMjQgKzE4NDksMjQgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpJbnB1dCwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgKk91dHB1dCkKIHsKLSAgdWludDMyX3QgYWxnbzsgCisgIHVpbnQzMl90IGFsZ287CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewotICAgIAorCiAgICAgLyogQ2hhbmdlIHN0YXRlIEJ1c3kgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KLSAgICBfX0hBTF9MT0NLKGhjcnlwKTsgCi0gICAgCisgICAgX19IQUxfTE9DSyhoY3J5cCk7CisKICAgICAvKiAgUmVzZXQgQ3J5cEluQ291bnQsIENyeXBPdXRDb3VudCBhbmQgSW5pdGlhbGl6ZSBwQ3J5cEluQnVmZlB0ciwgcENyeXBPdXRCdWZmUHRyIGFuZCBTaXplIHBhcmFtZXRlcnMqLwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCA9IDBVOwogICAgIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwVTsKICAgICBoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgPSBJbnB1dDsKICAgICBoY3J5cC0+cENyeXBPdXRCdWZmUHRyID0gT3V0cHV0OwotICAgIAorCiAgICAgLyogIENhbGN1bGF0ZSBTaXplIHBhcmFtZXRlciBpbiBCeXRlKi8KICAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVdpZHRoVW5pdCA9PSBDUllQX0RBVEFXSURUSFVOSVRfV09SRCkKICAgICB7CkBAIC0xNzc3LDE0MCArMTg3NCwxNDkgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsJCi0gICAgfSAgICAKLSAgICAKKyAgICAgIGhjcnlwLT5TaXplID0gU2l6ZTsKKyAgICB9CisKICNpZiBkZWZpbmVkIChDUllQKQotICAgIAorCiAgICAgLyogU2V0IGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwogICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7Ci0gICAgCi0gICAgLyogYWxnbyBnZXQgYWxnb3JpdGhtIHNlbGVjdGVkICovICAgCisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT01PREU7Ci0gICAgCi0gICAgc3dpdGNoKGFsZ28pCi0gICAgeyAgICAKLSAgICBjYXNlIENSWVBfREVTX0VDQjoKLSAgICBjYXNlIENSWVBfREVTX0NCQzoKLSAgICBjYXNlIENSWVBfVERFU19FQ0I6Ci0gICAgY2FzZSBDUllQX1RERVNfQ0JDOgotICAgICAgCi0gICAgICAvKlNldCBLZXkgKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwotICAgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGbHVzaCBGSUZPICovCi0gICAgICBIQUxfQ1JZUF9GSUZPX0ZMVVNIKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwotICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgICAgCi0gICAgICAvKiBTdGFydCBETUEgcHJvY2VzcyB0cmFuc2ZlciBmb3IgREVTL1RERVMgKi8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7ICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfRUNCOgotICAgIGNhc2UgQ1JZUF9BRVNfQ0JDOgotICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgotICAgICAgCi0gICAgICAvKiBBRVMgZGVjcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfRE1BKGhjcnlwKTsKLSAgICAgIGJyZWFrOyAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19HQ006ICAgICAKLSAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLyAKLSAgICAgIHN0YXR1cyA9IENSWVBfQUVTR0NNX1Byb2Nlc3NfRE1BIChoY3J5cCkgOyAgICAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19DQ006ICAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKyAgICAgIGNhc2UgQ1JZUF9ERVNfRUNCOgorICAgICAgY2FzZSBDUllQX0RFU19DQkM6CisgICAgICBjYXNlIENSWVBfVERFU19FQ0I6CisgICAgICBjYXNlIENSWVBfVERFU19DQkM6CisKKyAgICAgICAgLypTZXQgS2V5ICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMik7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMyk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCisgICAgICAgIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfQ0JDKSkKKyAgICAgICAgeworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaCBGSUZPICovCisgICAgICAgIEhBTF9DUllQX0ZJRk9fRkxVU0goaGNyeXApOworCisgICAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgICAgIC8qIFN0YXJ0IERNQSBwcm9jZXNzIHRyYW5zZmVyIGZvciBERVMvVERFUyAqLworICAgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkgLyA0VSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfRE1BKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgY2FzZSBDUllQX0FFU19HQ006CisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIAorCiAjZWxzZSAvKkFFUyovCi0gICAgCisKICAgICAvKiBTZXQgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCiAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpOwotICAgIAotICAgIC8qIGFsZ28gZ2V0IGFsZ29yaXRobSBzZWxlY3RlZCAqLyAgCisKKyAgICAvKiBhbGdvIGdldCBhbGdvcml0aG0gc2VsZWN0ZWQgKi8KICAgICBhbGdvID0gaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9DSE1PRDsKLSAgICAKLSAgICBzd2l0Y2goYWxnbykKLSAgICB7ICAgIAotICAgICAgCi0gICAgY2FzZSBDUllQX0FFU19FQ0I6Ci0gICAgY2FzZSBDUllQX0FFU19DQkM6Ci0gICAgY2FzZSBDUllQX0FFU19DVFI6Ci0gICAgICAKLSAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovIAotICAgICAgc3RhdHVzID0gQ1JZUF9BRVNfRGVjcnlwdF9ETUEoaGNyeXApOwotICAgICAgYnJlYWs7ICAgCi0gICAgICAKLSAgICBjYXNlIENSWVBfQUVTX0dDTV9HTUFDOiAgICAgCi0gICAgICAvKiBBRVMgR0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQSAoaGNyeXApIDsgICAgICAgCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQ1JZUF9BRVNfQ0NNOiAgICAgCi0gICAgICAvKiBBRVMgQ0NNIGRlY3J5cHRpb24gKi8gCi0gICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7ICAgICAgIAotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9OT1RfU1VQUE9SVEVEOwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworCisgICAgc3dpdGNoIChhbGdvKQorICAgIHsKKworICAgICAgY2FzZSBDUllQX0FFU19FQ0I6CisgICAgICBjYXNlIENSWVBfQUVTX0NCQzoKKyAgICAgIGNhc2UgQ1JZUF9BRVNfQ1RSOgorCisgICAgICAgIC8qIEFFUyBkZWNyeXB0aW9uICovCisgICAgICAgIHN0YXR1cyA9IENSWVBfQUVTX0RlY3J5cHRfRE1BKGhjcnlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ1JZUF9BRVNfR0NNX0dNQUM6CisgICAgICAgIC8qIEFFUyBHQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0dDTV9Qcm9jZXNzX0RNQShoY3J5cCkgOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDUllQX0FFU19DQ006CisgICAgICAgIC8qIEFFUyBDQ00gZGVjcnlwdGlvbiAqLworICAgICAgICBzdGF0dXMgPSBDUllQX0FFU0NDTV9Qcm9jZXNzX0RNQShoY3J5cCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX05PVF9TVVBQT1JURUQ7CisgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAgICAgIAorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENSWVAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAgCi0gKiAgQGJyaWVmICAgQ1JZUCBJUlEgaGFuZGxlci4KLSAqCi1AdmVyYmF0aW0gICAKKy8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIENSWVAgSVJRIGhhbmRsZXIgbWFuYWdlbWVudAorICAqICBAYnJpZWYgICBDUllQIElSUSBoYW5kbGVyLgorICAqCitAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgIyMjIyMgQ1JZUCBJUlEgaGFuZGxlciBtYW5hZ2VtZW50ICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIENSWVAgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICAgICgrKSBIQUxfQ1JZUF9JUlFIYW5kbGVyIENSWVAgaW50ZXJydXB0IHJlcXVlc3QKICAgICAgICgrKSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAoKykgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrIG91dHB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrCiAgICAgICAoKykgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayAgQ1JZUCBlcnJvciBjYWxsYmFjawotICAgICAgKCspIEhBTF9DUllQX0dldFN0YXRlIHJldHVybiB0aGUgQ1JZUCBzdGF0ZSAKKyAgICAgICgrKSBIQUxfQ1JZUF9HZXRTdGF0ZSByZXR1cm4gdGhlIENSWVAgc3RhdGUKICAgICAgICgrKSBIQUxfQ1JZUF9HZXRFcnJvciByZXR1cm4gdGhlIENSWVAgZXJyb3IgY29kZQogQGVuZHZlcmJhdGltCiAgICogQHsKQEAgLTE5MjQsMjggKzIwMzAsMzIgQEAKICAgKi8KIHZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewotICAKKwogI2lmIGRlZmluZWQgKENSWVApCi0gIAotICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfSU5JKSAhPSAweDBVKSB8fCAoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSkgIT0gMHgwVSkpCisKKyAgdWludDMyX3QgaXRzdGF0dXMgPSBoY3J5cC0+SW5zdGFuY2UtPk1JU1I7CisKKyAgaWYgKChpdHN0YXR1cyAmIChDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSkpICE9IDBVKQogICB7Ci0gICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfRUNCKXx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfQ0JDKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19FQ0IpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9UREVTX0NCQykpCisgICAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9ERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfREVTX0NCQykKKyAgICAgICAgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX1RERVNfRUNCKSB8fCAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfVERFU19DQkMpKQogICAgIHsKICAgICAgIENSWVBfVERFU19JVChoY3J5cCk7IC8qIERFUyBvciBUREVTKi8KICAgICB9Ci0gICAgZWxzZSBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ1RSKSkKKyAgICBlbHNlIGlmICgoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0VDQikgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQkMpCisgICAgICAgICAgICAgfHwgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DVFIpKQogICAgIHsKICAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsgLypBRVMqLwogICAgIH0KICAgICAKLSAgICBlbHNlIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNKSB8fChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0NNKSApCisgICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ00pIHx8IChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9DUl9BTEdPTU9ERV9BRVNfQ0NNKSkKICAgICB7CiAgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfUEhBU0VfSEVBREVSKSA9PSBDUllQX1BIQVNFX0hFQURFUiApCisgICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIpCiAgICAgICB7CiAgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKLSAgICAgIH0gICAgIAotICAgICAgZWxzZSAgLyogaWYgcGF5bG9hZCBwaGFzZSAqLyAgICAgICAgIAorICAgICAgfQorICAgICAgZWxzZSAgLyogaWYgcGF5bG9hZCBwaGFzZSAqLwogICAgICAgewogICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOwogICAgICAgfQpAQCAtMTk1NSw2MCArMjA2NSw2MyBAQAogICAgIHsKICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9Ci0gIH0gCi0gIAotI2Vsc2UgLypBRVMqLyAKLSAgaWYoKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9DQ0YpICE9IDB4MFUpICYmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSkgIT0gMHgwVSkpCisgIH0KKworI2Vsc2UgLypBRVMqLworICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9DQ0YpICE9IFJFU0VUKQogICB7Ci0gICAgCi0gICAgLyogQ2xlYXIgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyAqLwotICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCxDUllQX0NDRl9DTEVBUik7Ci0gICAgCi0gICAgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTV9HTUFDKQorICAgIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsIENSWVBfSVRfQ0NGSUUpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIAotICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCi0gICAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX1BIQVNFX0hFQURFUikgPT0gQ1JZUF9QSEFTRV9IRUFERVIgKQorCisgICAgICAvKiBDbGVhciBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnICovCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICAgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwotICAgICAgfSAgICAKLSAgICAgIGVsc2UgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8gICAgCisKKyAgICAgICAgLyogaWYgaGVhZGVyIHBoYXNlICovCisgICAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfUEhBU0VfSEVBREVSKSA9PSBDUllQX1BIQVNFX0hFQURFUikKKyAgICAgICAgeworICAgICAgICAgIENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0lUKGhjcnlwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBpZiBwYXlsb2FkIHBoYXNlICovCisgICAgICAgIHsKKyAgICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQogICAgICAgewotICAgICAgICBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQoaGNyeXApOworICAgICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KKyAgICAgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPj0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9JVChoY3J5cCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIGlmIHBheWxvYWQgcGhhc2UgKi8KKyAgICAgICAgeworICAgICAgICAgIENSWVBfR0NNQ0NNX1NldFBheWxvYWRQaGFzZV9JVChoY3J5cCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLworICAgICAgeworICAgICAgICBDUllQX0FFU19JVChoY3J5cCk7CiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0NDTSkKLSAgICB7Ci0gICAgICAvKiBpZiBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplID49ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICkKLSAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoaGNyeXApOwotICAgICAgfSAgICAKLSAgICAgIGVsc2UgICAvKiBpZiBwYXlsb2FkIHBoYXNlICovICAKLSAgICAgIHsKLSAgICAgICAgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKGhjcnlwKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UgIC8qIEFFUyBBbGdvcml0aG0gRUNCLENCQyBvciBDVFIqLwotICAgIHsKLSAgICAgIENSWVBfQUVTX0lUKGhjcnlwKTsKLSAgICB9Ci0gIH0gICAgCisgIH0KICAgLyogQ2hlY2sgaWYgZXJyb3Igb2NjdXJyZWQgKi8KLSAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCxDUllQX0lUX0VSUklFKSAhPSBSRVNFVCkKKyAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUX1NPVVJDRShoY3J5cCwgQ1JZUF9JVF9FUlJJRSkgIT0gUkVTRVQpCiAgIHsKICAgICAvKiBJZiB3cml0ZSBFcnJvciBvY2N1cnJlZCAqLwotICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLENSWVBfSVRfV1JFUlIpICE9IFJFU0VUKQorICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0lUX1dSRVJSKSAhPSBSRVNFVCkKICAgICB7CiAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1dSSVRFOwogICAgIH0KICAgICAvKiBJZiByZWFkIEVycm9yIG9jY3VycmVkICovCi0gICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsQ1JZUF9JVF9SREVSUikgIT0gUkVTRVQpCisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfSVRfUkRFUlIpICE9IFJFU0VUKQogICAgIHsKICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfUkVBRDsKICAgICB9CiAgIH0KLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgIAorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogfQogCiAvKioKQEAgLTIwNDMsMTAgKzIxNTYsMTAgQEAKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGNyeXApOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgpAQCAtMjA1OSw3ICsyMTcyLDcgQEAKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGNyeXApOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KQEAgLTIwNzEsMTQgKzIxODQsMTQgQEAKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSBfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCitfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhjcnlwKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAvKioKICAgKiBAfQpAQCAtMjA4OSw4OCArMjIwMiw5NCBAQAogICAqIEB7CiAgICovCiAKLSAjaWYgZGVmaW5lZCAoQ1JZUCkKKyNpZiBkZWZpbmVkIChDUllQKQogCiAvKioKICAgKiBAYnJpZWYgIEVuY3J5cHRpb24gaW4gRUNCL0NCQyBBbGdvcml0aG0gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUgCi0gICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IHNwZWNpZnkgVGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfVERFU19Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8gIAotICB1aW50MTZfdCBpbmNvdW50OyAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8gCisgIHVpbnQzMl90IHRlbXBbMl07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDE2X3QgaW5jb3VudDsgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCiAgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwotICAKKyAgdWludDMyX3QgaTsKKwogICAvKiBFbmFibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgCi0gIC8qU3RhcnQgcHJvY2Vzc2luZyovICAKLSAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IChoY3J5cC0+U2l6ZS80VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQotICB7IAotICAgIC8qIFRlbXBvcmFyeSBDcnlwSW5Db3VudCBWYWx1ZSAqLyAKLSAgICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OyAgICAgIAorCisgIC8qU3RhcnQgcHJvY2Vzc2luZyovCisgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQorICB7CisgICAgLyogVGVtcG9yYXJ5IENyeXBJbkNvdW50IFZhbHVlICovCisgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19JRk5GKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgICAKLSAgICB9ICAgCi0gICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICB9CisKICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKKyAgICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvckNvZGUqLwogICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9Ci0gICAgCisKICAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgICAKLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IEJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovICAgIAotICAgICAgdGVtcCA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgCi0gICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgCi0gICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgIAorICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgQnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8KKyAgICAgIGZvciAoaSA9IDBVOyBpIDwgMlU7IGkrKykKKyAgICAgIHsKKyAgICAgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICAgIH0KKyAgICAgIGkgPSAwVTsKKyAgICAgIHdoaWxlICgoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplKSAvIDRVKSkpICYmIChpIDwgMlUpKQorICAgICAgeworICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CisgICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICAgICAgaSsrOworICAgICAgfQogICAgIH0KICAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKICAgfQogICAvKiBEaXNhYmxlIENSWVAgKi8KLSAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsgCisgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKLS8qKiAKKy8qKgogICAqIEBicmllZiAgQ1JZUCBibG9jayBpbnB1dC9vdXRwdXQgZGF0YSBoYW5kbGluZyB1bmRlciBpbnRlcnJ1cHRpb24gd2l0aCBERVMvVERFUyBzdGFuZGFyZC4KICAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKICAgKiAgICAgICAgIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgQ1JZUF9EZWNyeXB0X0lUKCkgYW5kIENSWVBfRW5jcnlwdF9JVCgpLgpAQCAtMjE4MCw3MyArMjI5OSw4NCBAQAogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9UREVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8gCi0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfQlVTWSkKLSAgeyAKLSAgICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfSU5JKSAhPSAweDBVKSAmJiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX0lOUklTKSAhPSAweDBVKSkKLSAgICAgIAotICAgIHsgICAgIAotICAgICAgLyogV3JpdGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICAKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSkKLSAgICAgIHsgICAgIAotICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKLSAgICAgICAgLyogQ2FsbCB0aGUgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKSAKLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOworICB1aW50MzJfdCB0ZW1wWzJdOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGk7CisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQorICB7CisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUKGhjcnlwLCBDUllQX0lUX0lOSSkgIT0gMHgwVSkKKyAgICB7CisgICAgICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX0lOUklTKSAhPSAweDBVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKworICAgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CisgICAgICAgICAgLyogQ2FsbCB0aGUgaW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKLSAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworICAgICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICBpZigoX19IQUxfQ1JZUF9HRVRfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSkgIT0gMHgwVSkmJiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9GTEFHX09VVFJJUykgIT0gMHgwVSkpCisgICAgaWYgKF9fSEFMX0NSWVBfR0VUX0lUKGhjcnlwLCBDUllQX0lUX09VVEkpICE9IDB4MFUpCiAgICAgewotICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgQnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gICAgCi0gICAgICB0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKSA9IHRlbXA7ICAgICAgCi0gICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAKLSAgICAgIHRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAgICAgICAgIAotICAgICAgaWYoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAgKCh1aW50MTZfdCkoaGNyeXAtPlNpemUpLzRVKSkKKyAgICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0ZMQUdfT1VUUklTKSAhPSAweDBVKQogICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdGlvbiAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7Ci0gICAgICAgIAotICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKLSAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CisgICAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IEJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCisgICAgICAgIGZvciAoaSA9IDBVOyBpIDwgMlU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgICAgIH0KKyAgICAgICAgaSA9IDBVOworICAgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDJVKSkKKyAgICAgICAgeworICAgICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChoY3J5cC0+Q3J5cE91dENvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX09VVEkpOworCisgICAgICAgICAgLyogRGlzYWJsZSBDUllQICovCisgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgICAgICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKKyAgICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgICAgfQogICAgICAgfQotICAgIH0gICAKKyAgICB9CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAKKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCkBAIC0yMjYwLDU4ICsyMzkwLDgwIEBACiAKIC8qKgogICAqIEBicmllZiAgRW5jcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIEFsZ29yaXRobSB3aXRoIEFFUyBTdGFuZGFyZAotICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIAotICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBUaW1lb3V0OiBzcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19FbmNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCi17ICAKK3sKICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0gIAotICAvKiAgU2V0IHRoZSBLZXkqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0VDQikKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KLSNpZiBkZWZpbmVkIChBRVMpICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotI2Vsc2UgLyogQ1JZUCAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQogICB9Ci0gIAorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisKKyAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisjZWxzZSAvKiBDUllQICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKwogICAvKiBTZXQgdGhlIHBoYXNlICovCiAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgCisKICAgLyogRW5hYmxlIENSWVAgKi8KICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKKwogICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIAotICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCi0gIHsgICAgICAKKworICB3aGlsZSAoKGhjcnlwLT5DcnlwSW5Db3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKKyAgewogICAgIC8qIFdyaXRlIHBsYWluIERkdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwotICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOyAKKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KLSAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7ICAgICAKLSAgfSAKLSAgCisgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OworICB9CisKICAgLyogRGlzYWJsZSBDUllQICovCiAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIAorCiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gSEFMX09LOyAgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTIzMjEsMjAyICsyNDczLDI0NSBAQAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKLXsgICAKLSAgCi0gIC8qICBTZXQgdGhlIEtleSovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgCi0gIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQoreworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0gICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IqLwotI2lmIGRlZmluZWQgKEFFUykgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAgIAotI2Vsc2UgLyogQ1JZUCAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQogICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyNlbHNlIC8qIENSWVAgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgaWYoaGNyeXAtPlNpemUgIT0gMFUpCi0gIHsgICAgCi0jaWYgZGVmaW5lZCAoQUVTKSAKLSAgICAKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisKICAgICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKLSAgICAKKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCiAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7IAotICAgIAotI2Vsc2UgLyogQ1JZUCAqLyAgCi0gICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisjZWxzZSAvKiBDUllQICovCisKICAgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7Ci0gICAgCisKICAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgCi0gICAgCi0jZW5kaWYgLyogIEVuZCBBRVMgb3IgQ1JZUCAgKi8gICAgICAKKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyNlbmRpZiAvKiAgRW5kIEFFUyBvciBDUllQICAqLwogICB9CiAgIGVsc2UKLSAgeyAgCisgIHsKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgCi0gIH0gICAKLSAgCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgfQorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQGJyaWVmICBEZWNyeXB0aW9uIGluIEVDQi9DQkMgJiBDVFIgbW9kZSB3aXRoIEFFUyBTdGFuZGFyZAotICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIAotICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQgKQoteyAgCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9BRVNfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQorewogICB1aW50MTZfdCBvdXRjb3VudDsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUgKi8KLSAgCi0gIC8qICBLZXkgcHJlcGFyYXRpb24gZm9yIEVDQi9DQkMgKi8KLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpIAorICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0jaWYgZGVmaW5lZCAoQUVTKSAKLSAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KLSAgICB7ICAgICAKLSAgICAgIC8qIFNldCBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUqLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOwotICAgICAgCisgICAgaWYgKGhjcnlwLT5LZXlJVkNvbmZpZyA9PSAxVSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgIH0KKyAgfQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIgS2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorI2Vsc2UgLyogQ1JZUCAqLworICAgICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSk7CisKICAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7IAotICAgICAgCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKKworICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgaWYgKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KLSAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCi0gICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgICAgIAotICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovICAgICAgCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KICAgICB9Ci0gICAgZWxzZSAvKk1vZGUgNCA6IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24qLworICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgIHsKICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYgS2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8gICAgICAgICAgICAgCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsgIAotICAgIH0gICAgIAorICAgIH0KKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkgKTsKLSAgICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAKLSAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKLSAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25CVVNZRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKLSAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9ICAgICAgIAotICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtICk7ICAKLSAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovIAotICB9Ci0gIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwotICB7ICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgfSAKLSAgCi0gIC8qIFNldCBJViAqLyAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSNlbHNlIC8qIENSWVAgKi8KLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICB9ICAgICAKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKKwogICAvKiBFbmFibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLyAgCi0gIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsgCi0gIAotICB3aGlsZSgoaGNyeXAtPkNyeXBJbkNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCi0gIHsgICAgICAKKworICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLworICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKKyAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCisgIHsKICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCxUaW1lb3V0KTsKKyAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIH0gIAotICAKKyAgfQorCiAgIC8qIERpc2FibGUgQ1JZUCAqLwogICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKKwogICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIEhBTF9PSzsgICAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIC8qKgogICAqIEBicmllZiAgRGVjcnlwdGlvbiBpbiBFQ0IvQ0JDICYgQ1RSIG1vZGUgd2l0aCBBRVMgU3RhbmRhcmQgdXNpbmcgaW50ZXJydXB0IG1vZGUKQEAgLTI1MjcsMTU2ICsyNzIyLDE3NiBAQAogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOwotICAKLSAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLwotICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtICE9IENSWVBfQUVTX0NUUikgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLwotICAgIHsgICAgIAotICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTik7Ci0gICAgICAKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKyAgICAvKiAgS2V5IHByZXBhcmF0aW9uIGZvciBFQ0IvQ0JDICovCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19DVFIpCisgICAgeworI2lmIGRlZmluZWQgKEFFUykKKyAgICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBLZXkgcHJlcGFyYXRpb24qLworICAgICAgeworICAgICAgICAvKiBTZXQga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04pOworCisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBFbmFibGUgQ1JZUCAqLworICAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCisgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0tFWVBSRVBBUkFUSU9OOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisKKyAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgICAgLyogUmV0dXJuIHRvIGRlY3J5cHRpb24gb3BlcmF0aW5nIG1vZGUoTW9kZSAzKSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogIFNldCB0aGUgS2V5Ki8KKyAgICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8KKyAgICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT05fREVDUllQVCk7CisgICAgICB9CisjZWxzZSAvKiBDUllQICovCisKKyAgICAgIC8qIGNoYW5nZSBBTEdPTU9ERSB0byBrZXkgcHJlcGFyYXRpb24gZm9yIGRlY3J5cHRpb24qLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkpOworCiAgICAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOyAKLSAgICAgIAorICAgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCiAgICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KKworICAgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047CiAgICAgICBkbwogICAgICAgewogICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgewotICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCiAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgfQotICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAgICAgCi0gICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwotICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gICAgICAKLSAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLyAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CisKKyAgICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgICAgfQotICAgIGVsc2UgLypNb2RlIDQgOiBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uKi8KKworICAgIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwogICAgIHsKICAgICAgIC8qICBTZXQgdGhlIEtleSovCiAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gICAgICAKLSAgICAgIC8qIFNldCBkZWNyeXB0aW9uICYga2V5IHByZXBhcmF0aW9uIG9wZXJhdGluZyBtb2RlKi8gCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKTsgCi0gICAgfSAgICAgICAgCi0jZWxzZSAvKiBDUllQICovCi0gICAgCi0gICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0NSX0FMR09NT0RFX0FFU19LRVkgKTsKLSAgICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAKLSAgICAvKiBFbmFibGUgQ1JZUCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKLSAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgY291bnQgPSBDUllQX1RJTUVPVVRfS0VZUFJFUEFSQVRJT047Ci0gICAgZG8KLSAgICB7Ci0gICAgICBjb3VudC0tIDsKLSAgICAgIGlmKGNvdW50ID09IDBVKQotICAgICAgewotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICB9CiAgICAgfQotICAgIHdoaWxlKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7ICAKLSAgICAKLSAgICAvKiBUdXJuIGJhY2sgdG8gQUxHT01PREUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIGhjcnlwLT5Jbml0LkFsZ29yaXRobSApOyAKLSAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgCi0gIH0KLSAgCi0gIGVsc2UgIC8qQWxnb3JpdGhtIENUUiAqLwotICB7ICAKLSAgICAvKiAgU2V0IHRoZSBLZXkqLwotICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgfSAgICAKLSAgCi0gIC8qIFNldCBJViAqLyAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKKworICAgIC8qIFNldCBJViAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KLSAgfSAgICAgCisgICAgfQorICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKLSAgeyAKLSAgICAKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIAorICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKworI2lmIGRlZmluZWQgKEFFUykKKwogICAgIC8qIEVuYWJsZSBjb21wdXRhdGlvbiBjb21wbGV0ZSBmbGFnIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOwotICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7CisKICAgICAvKiBFbmFibGUgQ1JZUCAqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgIAotICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKwogI2Vsc2UgLyogQ1JZUCAqLwotICAgIAorCiAgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkgfCBDUllQX0lUX09VVEkpOwotICAgIAorCiAgICAgLyogRW5hYmxlIENSWVAgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovICAgICAgICAKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwogICB9Ci0gIGVsc2UgCisgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICB9ICAKLSAgCisgIH0KKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0yNjg5LDEzMSArMjkwNCwxNTAgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7Ci0gIAotICAvKiAgS2V5IHByZXBhcmF0aW9uIGZvciBFQ0IvQ0JDICovCi0gIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKSAgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSNpZiBkZWZpbmVkIChBRVMpIAotICAgIGlmIChoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPT0gRElTQUJMRSkvKk1vZGUgMiBrZXkgcHJlcGFyYXRpb24qLwotICAgIHsgICAgIAotICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfS0VZREVSSVZBVElPTik7Ci0gICAgICAKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgfQorICB9CisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIEtleSBwcmVwYXJhdGlvbiBmb3IgRUNCL0NCQyAqLworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfQ1RSKQorICAgIHsKKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBpZiAoaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID09IERJU0FCTEUpLypNb2RlIDIga2V5IHByZXBhcmF0aW9uKi8KKyAgICAgIHsKKyAgICAgICAgLyogU2V0IGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OKTsKKworICAgICAgICAvKiAgU2V0IHRoZSBLZXkqLworICAgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAgICAgLyogRW5hYmxlIENSWVAgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgICAgIC8qIFJldHVybiB0byBkZWNyeXB0aW9uIG9wZXJhdGluZyBtb2RlKE1vZGUgMykqLworICAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfREVDUllQVCk7CisgICAgICB9CisgICAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgICB7CisgICAgICAgIC8qICBTZXQgdGhlIEtleSovCisgICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgICAgICAvKiBTZXQgZGVjcnlwdGlvbiAmIEtleSBwcmVwYXJhdGlvbiBvcGVyYXRpbmcgbW9kZSovCisgICAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOworICAgICAgfQorI2Vsc2UgLyogQ1JZUCAqLworICAgICAgLyogY2hhbmdlIEFMR09NT0RFIHRvIGtleSBwcmVwYXJhdGlvbiBmb3IgZGVjcnlwdGlvbiovCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSk7CisKICAgICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7IAotICAgICAgCisgICAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKICAgICAgIC8qIEVuYWJsZSBDUllQICovCiAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworCisgICAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKICAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIGNvdW50LS0gOwotICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgIAotICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KLSAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAgICAgCi0gICAgICAvKiBSZXR1cm4gdG8gZGVjcnlwdGlvbiBvcGVyYXRpbmcgbW9kZShNb2RlIDMpKi8gICAgICAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKTsgICAKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSk7CisKKyAgICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBoY3J5cC0+SW5pdC5BbGdvcml0aG0pOworCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLwogICAgIH0KLSAgICBlbHNlIC8qTW9kZSA0IDogZGVjcnlwdGlvbiAmIGtleSBwcmVwYXJhdGlvbiovCisgICAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCiAgICAgewogICAgICAgLyogIFNldCB0aGUgS2V5Ki8KICAgICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgICAgIAotICAgICAgLyogU2V0IGRlY3J5cHRpb24gJiBLZXkgcHJlcGFyYXRpb24gb3BlcmF0aW5nIG1vZGUqLyAKLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQpOyAKLSAgICB9ICAgICAKLSNlbHNlIC8qIENSWVAgKi8gICAKLSAgICAvKiBjaGFuZ2UgQUxHT01PREUgdG8ga2V5IHByZXBhcmF0aW9uIGZvciBkZWNyeXB0aW9uKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQ1JfQUxHT01PREVfQUVTX0tFWSApOwotICAgIAotICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICAgIAotICAgIC8qIEVuYWJsZSBDUllQICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgIAotICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgICBjb3VudCA9IENSWVBfVElNRU9VVF9LRVlQUkVQQVJBVElPTjsKLSAgICBkbwotICAgIHsKLSAgICAgIGNvdW50LS0gOwotICAgICAgaWYoY291bnQgPT0gMFUpCi0gICAgICB7Ci0gICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKLSAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfQogICAgIH0KLSAgICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOwotICAgIAotICAgIC8qIFR1cm4gYmFjayB0byBBTEdPTU9ERSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgaGNyeXAtPkluaXQuQWxnb3JpdGhtICk7IAotICAgIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8gCi0gIH0KLSAgZWxzZSAgLypBbGdvcml0aG0gQ1RSICovCi0gIHsgIAotICAgIC8qICBTZXQgdGhlIEtleSovCi0gICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICB9IAotICAKLSAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAhPSBDUllQX0FFU19FQ0IpCi0gIHsKLSAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIFZlY3RvciovCi0jaWYgZGVmaW5lZCAoQUVTKSAgICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gIT0gQ1JZUF9BRVNfRUNCKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yKi8KKyNpZiBkZWZpbmVkIChBRVMpCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CiAjZWxzZSAvKiBDUllQICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCi0gIH0gICAgICAKKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICBoY3J5cC0+UGhhc2UgPSBDUllQX1BIQVNFX1BST0NFU1M7Ci0gIAotICBpZihoY3J5cC0+U2l6ZSAhPSAwVSkKLSAgeyAgICAKLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAKKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8KKyAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUgLyA0VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICB9Ci0gIGVsc2UgCisgIGVsc2UKICAgewogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAgIAorCiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIH0gICAgICAgCi0gIAorICB9CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQpAQCAtMjgyNCw0MCArMzA1OCw0MCBAQAogICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgQ1JZUF9ETUFJbkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAKK3N0YXRpYyB2b2lkIENSWVBfRE1BSW5DcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBDUllQX0hhbmRsZVR5cGVEZWYqIGhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKLSAgCisgIENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciBpbnB1dCBGSUZPIHJlcXVlc3QgYnkgcmVzZXR0aW5nIHRoZSBESUVOIGJpdAogICBpbiB0aGUgRE1BQ1IgcmVnaXN0ZXIgKi8KLSNpZiBkZWZpbmVkIChDUllQKSAgCi0gIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgJj0gKHVpbnQzMl90KSh+Q1JZUF9ETUFDUl9ESUVOKTsgIAotICAKKyNpZiBkZWZpbmVkIChDUllQKQorICBoY3J5cC0+SW5zdGFuY2UtPkRNQUNSICY9ICh1aW50MzJfdCkofkNSWVBfRE1BQ1JfRElFTik7CisKICNlbHNlIC8qIEFFUyAqLwogICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQUlORU4pOwotICAKKwogICAvKiBUaW55QUVTMiwgTm8gb3V0cHV0IG9uIENDTSBBRVMsIHVubG9jayBzaG91bGQgYmUgZG9uZSB3aGVuIGlucHV0IGRhdGEgcHJvY2VzcyBjb21wbGV0ZSAqLwotICBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfQ0NNKSA9PSBDUllQX0FFU19DQ00pCi0gIHsgIAorICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgPT0gQ1JZUF9BRVNfQ0NNKQorICB7CiAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsQ1JZUF9DQ0ZfQ0xFQVIpOwotICAgIAorICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCiAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlIHRvIHJlYWR5ICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgfQotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAKLSAgCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgLyogQ2FsbCBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogfQogCiAvKioKQEAgLTI4NjcsNzggKzMxMDEsNzggQEAKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfRE1BT3V0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7Ci0gIAorICBDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwID0gKENSWVBfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCiAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igb3V0cHV0IEZJRk8gcmVxdWVzdCBieSByZXNldHRpbmcKICAgdGhlIERPRU4gYml0IGluIHRoZSBETUFDUiByZWdpc3RlciAqLwotICAKLSNpZiBkZWZpbmVkIChDUllQKSAKKworI2lmIGRlZmluZWQgKENSWVApCiAKICAgaGNyeXAtPkluc3RhbmNlLT5ETUFDUiAmPSAodWludDMyX3QpKH5DUllQX0RNQUNSX0RPRU4pOwotICBpZigoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNKSAhPSBDUllQX0FFU19HQ00pCi0gIHsgIAorICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTSkgIT0gQ1JZUF9BRVNfR0NNKQorICB7CiAgICAgLyogRGlzYWJsZSBDUllQICAobm90IGFsbG93ZWQgaW4gIEdDTSkqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAgIH0KLSNlbHNlIC8qIEFFUyAqLyAKLSAgCisjZWxzZSAvKiBBRVMgKi8KKwogICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RNQU9VVEVOKTsKLSAgCisKICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLENSWVBfQ0NGX0NMRUFSKTsgIAotICAKLSAgaWYoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKLSAgeyAgCi0gICAgLyogRGlzYWJsZSBDUllQIChub3QgYWxsb3dlZCBpbiAgR0NNKSovIAorICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworICBpZiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0dDTV9HTUFDKSAhPSBDUllQX0FFU19HQ01fR01BQykKKyAgeworICAgIC8qIERpc2FibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSkqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIH0gCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotICAKKyAgfQorI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCiAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSB0byByZWFkeSAqLwogICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwotICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgLyogQ2FsbCBvdXRwdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIENSWVAgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4gCisgICogQGJyaWVmICBETUEgQ1JZUCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgogICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgQ1JZUF9IYW5kbGVUeXBlRGVmKiBoY3J5cCA9IChDUllQX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7Ci0gIAotICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLyAKLSAgaGNyeXAtPlN0YXRlPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgCisgIENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAgPSAoQ1JZUF9IYW5kbGVUeXBlRGVmICopKChETUFfSGFuZGxlVHlwZURlZiAqKWhkbWEpLT5QYXJlbnQ7CisKKyAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KKyAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7IAotICAKLSNpZiBkZWZpbmVkIChBRVMpIAotICAKKyAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9ETUE7CisKKyNpZiBkZWZpbmVkIChBRVMpCisKICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLENSWVBfQ0NGX0NMRUFSKTsgIAotICAKLSNlbmRpZiAvKiBBRVMgKi8gICAKLSAgCisgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisjZW5kaWYgLyogQUVTICovCisKICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiB9CiAKIC8qKgpAQCAtMjk1NCw0NCArMzE4OCw0NCBAQAogewogICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgIGhjcnlwLT5oZG1haW4tPlhmZXJDcGx0Q2FsbGJhY2sgPSBDUllQX0RNQUluQ3BsdDsKLSAgCisKICAgLyogU2V0IHRoZSBETUEgaW5wdXQgZXJyb3IgY2FsbGJhY2sgKi8KICAgaGNyeXAtPmhkbWFpbi0+WGZlckVycm9yQ2FsbGJhY2sgPSBDUllQX0RNQUVycm9yOwotICAKKwogICAvKiBTZXQgdGhlIENSWVAgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgIGhjcnlwLT5oZG1hb3V0LT5YZmVyQ3BsdENhbGxiYWNrID0gQ1JZUF9ETUFPdXRDcGx0OwotICAKKwogICAvKiBTZXQgdGhlIERNQSBvdXRwdXQgZXJyb3IgY2FsbGJhY2sgKi8KICAgaGNyeXAtPmhkbWFvdXQtPlhmZXJFcnJvckNhbGxiYWNrID0gQ1JZUF9ETUFFcnJvcjsKLSAgCi0jaWYgZGVmaW5lZCAoQ1JZUCkgICAKLSAgCisKKyNpZiBkZWZpbmVkIChDUllQKQorCiAgIC8qIEVuYWJsZSBDUllQICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCisKICAgLyogRW5hYmxlIHRoZSBpbnB1dCBETUEgU3RyZWFtICovCi0gIGlmICggSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYWluLCBpbnB1dGFkZHIsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ESU4sIFNpemUpIT1IQUxfT0spCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1haW4sIGlucHV0YWRkciwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRJTiwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAotICB9ICAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KICAgLyogRW5hYmxlIHRoZSBvdXRwdXQgRE1BIFN0cmVhbSAqLwotICBpZiAoSEFMX0RNQV9TdGFydF9JVChoY3J5cC0+aGRtYW91dCwgKHVpbnQzMl90KSZoY3J5cC0+SW5zdGFuY2UtPkRPVVQsIG91dHB1dGFkZHIsIFNpemUpIT1IQUxfT0spCisgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhjcnlwLT5oZG1hb3V0LCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RE9VVCwgb3V0cHV0YWRkciwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCkBAIC0zMDAxLDE4OSArMzIzNSwxODggQEAKICAgfQogICAvKiBFbmFibGUgSW4vT3V0IERNQSByZXF1ZXN0ICovCiAgIGhjcnlwLT5JbnN0YW5jZS0+RE1BQ1IgPSBDUllQX0RNQUNSX0RPRU4gfCBDUllQX0RNQUNSX0RJRU47Ci0gIAorCiAjZWxzZSAvKiBBRVMgKi8KLSAgCi0gIGlmKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKSAmJiAoKGhjcnlwLT5Jbml0LkFsZ29yaXRobSAmIENSWVBfQUVTX0NDTSkgIT0gQ1JZUF9BRVNfQ0NNKSkKLSAgeyAgCi0gICAgLyogRW5hYmxlIENSWVAgKG5vdCBhbGxvd2VkIGluICBHQ00gJiBDQ00pKi8gCisKKyAgaWYgKCgoaGNyeXAtPkluaXQuQWxnb3JpdGhtICYgQ1JZUF9BRVNfR0NNX0dNQUMpICE9IENSWVBfQUVTX0dDTV9HTUFDKQorICAgICAgJiYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pICE9IENSWVBfQUVTX0NDTSkpCisgIHsKKyAgICAvKiBFbmFibGUgQ1JZUCAobm90IGFsbG93ZWQgaW4gIEdDTSAmIENDTSkqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBFbmFibGUgdGhlIERNQSBpbnB1dCBzdHJlYW0gKi8KLSAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkhPUhBTF9PSykKKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJmhjcnlwLT5JbnN0YW5jZS0+RElOUiwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0gIH0gIAorICB9CiAgIC8qIEVuYWJsZSB0aGUgRE1BIG91dHB1dCBzdHJlYW0gKi8KLSAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VUUiwgb3V0cHV0YWRkciwgU2l6ZSkhPUhBTF9PSykKKyAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGNyeXAtPmhkbWFvdXQsICh1aW50MzJfdCkmaGNyeXAtPkluc3RhbmNlLT5ET1VUUiwgb3V0cHV0YWRkciwgU2l6ZSkgIT0gSEFMX09LKQogICB7CiAgICAgLyogRE1BIGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0RNQTsgIAotICAgIAorICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfRE1BOworCiAgICAgLyogQ2FsbCBlcnJvciBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0gIH0gIAotIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLyAKKyAgfQorICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KICAgLyogRW5hYmxlIEluIGFuZCBPdXQgRE1BIHJlcXVlc3RzICovCi0gIGlmKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKLSAgeyAKKyAgaWYgKChoY3J5cC0+SW5pdC5BbGdvcml0aG0gJiBDUllQX0FFU19DQ00pID09IENSWVBfQUVTX0NDTSkKKyAgewogICAgIC8qIEVuYWJsZSBvbmx5IEluIERNQSByZXF1ZXN0cyBmb3IgQ0NNKi8KLSAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTiApKTsKKyAgICBTRVRfQklUKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIChBRVNfQ1JfRE1BSU5FTikpOwogICB9CiAgIGVsc2UKICAgewogICAgIC8qIEVuYWJsZSBJbiBhbmQgT3V0IERNQSByZXF1ZXN0cyAqLwogICAgIFNFVF9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgKEFFU19DUl9ETUFJTkVOIHwgQUVTX0NSX0RNQU9VVEVOKSk7Ci0gIH0gIAorICB9CiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgUHJvY2VzcyBEYXRhOiBXcml0ZSBJbnB1dCBkYXRhIGluIHBvbGxpbmcgbW9kZSBhbmQgdXNlZCBpbiBBRVMgZnVuY3Rpb25zLiAKKyAgKiBAYnJpZWYgIFByb2Nlc3MgRGF0YTogV3JpdGUgSW5wdXQgZGF0YSBpbiBwb2xsaW5nIG1vZGUgYW5kIHVzZWQgaW4gQUVTIGZ1bmN0aW9ucy4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgVGltZW91dCB2YWx1ZSAgCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfQUVTX1Byb2Nlc3NEYXRhKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIAotICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisKKyAgdWludDMyX3QgdGVtcFs0XTsgIC8qIFRlbXBvcmFyeSBDcnlwT3V0QnVmZiAqLworICB1aW50MzJfdCBpOwogI2lmIGRlZmluZWQgKENSWVApCiAgIHVpbnQxNl90IGluY291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0jZW5kaWYgCi0gIAotI2lmIGRlZmluZWQgKENSWVApICAKLSAgIAorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDUllQKQorCiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCi0gIGluY291bnQgPSBoY3J5cC0+Q3J5cEluQ291bnQ7IAotICAKLSAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX0lGTkYgKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorICBpbmNvdW50ID0gaGNyeXAtPkNyeXBJbkNvdW50OworCisgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORikgIT0gMHgwVSkgJiYgKGluY291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpKQogICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgIH0KLSAgCisKICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICBpZihDUllQX1dhaXRPbk9GTkVGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgeyAKKyAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgewogICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2Ugc3RhdGUgJiBlcnJvciBjb2RlKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgCi0gICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKworICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAotICB9IAotICAKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKwogICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwogICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gIAotICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSApICE9IDB4MFUpICYmIChvdXRjb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpKQorCisgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgewotICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7ICAgICAgCi0gICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAotICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICB9IAotICAKKyAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLworICAgIGZvciAoaSA9IDBVOyBpIDwgNFU7IGkrKykKKyAgICB7CisgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIH0KKyAgICBpID0gMFU7CisgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCisgICAgeworICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgICAgaSsrOworICAgIH0KKyAgfQorCiAjZWxzZSAvKiBBRVMgKi8KLSAgCisKICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgIAotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAgICAKLSAgCisgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKwogICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICB7IAorICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgewogICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAKLSAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICB9Ci0gIAorCiAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAKLSAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPXRlbXA7Ci0gIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID10ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCi0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICAKKworICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICB7CisgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgIH0KKyAgaSA9IDBVOworICB3aGlsZSAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplICsgM1UpIC8gNFUpKSAmJiAoaSA8IDRVKSkKKyAgeworICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgaSsrOworICB9CiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiB9CiAKLS8qKiAKKy8qKgogICAqIEBicmllZiAgSGFuZGxlIENSWVAgYmxvY2sgaW5wdXQvb3V0cHV0IGRhdGEgaGFuZGxpbmcgdW5kZXIgaW50ZXJydXB0aW9uLgogICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZQogICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfQ1JZUF9FbmNyeXB0X0lUIG9yIEhBTF9DUllQX0RlY3J5cHRfSVQuCkBAIC0zMTkzLDM2ICszNDI2LDM3IEBACiAgICovCiBzdGF0aWMgdm9pZCBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQogewotICB1aW50MzJfdCB0ZW1wOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCi0jaWYgZGVmaW5lZCAoQ1JZUCkgCisgIHVpbnQzMl90IHRlbXBbNF07ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KKyAgdWludDMyX3QgaTsKKyNpZiBkZWZpbmVkIChDUllQKQogICB1aW50MTZfdCBpbmNvdW50OyAvKiBUZW1wb3JhcnkgQ3J5cEluQ291bnQgVmFsdWUgKi8KICAgdWludDE2X3Qgb3V0Y291bnQ7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlICovCi0jZW5kaWYgCi0gIAotICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfQlVTWSkKLSAgeyAKLSNpZiBkZWZpbmVkIChDUllQKSAKLSAgIAorI2VuZGlmCisKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9CVVNZKQorICB7CisjaWYgZGVmaW5lZCAoQ1JZUCkKKwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICAgaW5jb3VudCA9IGhjcnlwLT5DcnlwSW5Db3VudDsKLSAgICBpZigoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfSUZORiApICE9IDB4MFUpICYmIChpbmNvdW50IDwgKGhjcnlwLT5TaXplLzRVKSkpCisgICAgaWYgKCgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19JRk5GKSAhPSAweDBVKSAmJiAoaW5jb3VudCA8IChoY3J5cC0+U2l6ZSAvIDRVKSkpCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgCi0gICAgICBpZihoY3J5cC0+Q3J5cEluQ291bnQgPT0gICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSkpCi0gICAgICB7ICAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09ICgodWludDE2X3QpKGhjcnlwLT5TaXplKSAvIDRVKSkKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgICAgICAKKwogICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKQEAgLTMyMzMsNzkgKzM0NjcsNzcgQEAKICAgICB9CiAgICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7Ci0gICAgCi0gICAgaWYoKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAmJiAob3V0Y291bnQgPCAoaGNyeXAtPlNpemUvNFUpKSkKKworICAgIGlmICgoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkgJiYgKG91dGNvdW50IDwgKGhjcnlwLT5TaXplIC8gNFUpKSkKICAgICB7Ci0gICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLyAKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOyAgICAgIAotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOwotICAgICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7ICAgIAotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgICAKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgIAotICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wOwotICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAKLSAgICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gICgodWludDE2X3QpKGhjcnlwLT5TaXplKS80VSkpCisgICAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyICAqLworICAgICAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgICAgfQorICAgICAgaSA9IDBVOworICAgICAgd2hpbGUgKCgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUpIC8gNFUpKSkgJiYgKGkgPCA0VSkpCisgICAgICB7CisgICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcFtpXTsKKyAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICAgICAgICBpKys7CisgICAgICB9CisgICAgICBpZiAoaGNyeXAtPkNyeXBPdXRDb3VudCA9PSAoKHVpbnQxNl90KShoY3J5cC0+U2l6ZSkgLyA0VSkpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgICAgIAotICAgICAgICAKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKICAgICAgICAgLyogRGlzYWJsZSBDUllQICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworCisgICAgICAgIC8qIENhbGwgT3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKICNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQotICAgIAorCiAjZWxzZSAvKkFFUyovCi0gICAgCi0gICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID10ZW1wOwotICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgICA9dGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gdGVtcDsgICAgICAKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOyAKLSAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID0gdGVtcDsKLSAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAotICAgIAotICAgIGlmKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gIChoY3J5cC0+U2l6ZS80VSkpCisKKyAgICAvKiBSZWFkIHRoZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgb3V0cHV0IEZJRk8gYW5kIHB1dCB0aGVtIGluIHRlbXBvcmFyeSBidWZmZXIgdGhlbiBnZXQgQ3J5cE91dEJ1ZmYgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyKi8KKyAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgICAgeworICAgICAgdGVtcFtpXSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgfQorICAgIGkgPSAwVTsKKyAgICB3aGlsZSAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoKGhjcnlwLT5TaXplICsgM1UpIC8gNFUpKSAmJiAoaSA8IDRVKSkKKyAgICB7CisgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXBbaV07CisgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICBpKys7CisgICAgfQorCisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gKGhjcnlwLT5TaXplIC8gNFUpKQogICAgIHsKICAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgZmxhZyBhbmQgZXJyb3JzIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOwotICAgICAgCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKwogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDYWxsIE91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQpAQCAtMzMxNCwxMTYgKzM1NDYsMTE2IEBACiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgIH0KICAgICBlbHNlCi0gICAgeyAgCisgICAgewogICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgICAgCi0gICAgICAKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgKGhjcnlwLT5TaXplLzRVKSkgCi0gICAgICB7ICAgIAorICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworCisgICAgICBpZiAoaGNyeXAtPkNyeXBJbkNvdW50ID09IChoY3J5cC0+U2l6ZSAvIDRVKSkKKyAgICAgIHsKICAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKSAKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIH0gICAKLSAgICB9IAorICAgICAgfQorICAgIH0KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCi0gICAKLSAgfSAKKworICB9CiAgIGVsc2UKICAgewogICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwotICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwogICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgfQotfSAKK30KIAogLyoqCi0gICogQGJyaWVmICBXcml0ZXMgS2V5IGluIEtleSByZWdpc3RlcnMuIAorICAqIEBicmllZiAgV3JpdGVzIEtleSBpbiBLZXkgcmVnaXN0ZXJzLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEBwYXJhbSAgS2V5U2l6ZTogU2l6ZSBvZiBLZXkKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIENSWVBfU2V0S2V5KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IEtleVNpemUpCi17ICAKK3sKICNpZiBkZWZpbmVkIChDUllQKQotICAKLSAgc3dpdGNoKEtleVNpemUpCisKKyAgc3dpdGNoIChLZXlTaXplKQogICB7Ci0gIGNhc2UgQ1JZUF9LRVlTSVpFXzI1NkI6Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzEpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzIpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzMpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzQpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzUpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KzcpOyAKLSAgICBicmVhazsKLSAgY2FzZSBDUllQX0tFWVNJWkVfMTkyQjoKLSAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMkxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LM1JSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrNSk7IAotICAgIGJyZWFrOwotICBjYXNlIENSWVBfS0VZU0laRV8xMjhCOiAgICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPksyUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsgCi0gICAgCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkswUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMyk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA0KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA3KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzE5MkI6CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksxTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzJSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LM0xSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgNCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszUlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyA1KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUF9LRVlTSVpFXzEyOEI6CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPksyTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LMlJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wS2V5ICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkszTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SzNSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICNlbHNlIC8qQUVTKi8KLSAgc3dpdGNoKEtleVNpemUpCisgIHN3aXRjaCAoS2V5U2l6ZSkKICAgewotICBjYXNlIENSWVBfS0VZU0laRV8yNTZCOgotICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wS2V5KTsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI2ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI1ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI0ID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSszKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs0KTsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIyID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs1KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIxID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIwID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSs3KTsKLSAgICBicmVhazsKLSAgY2FzZSBDUllQX0tFWVNJWkVfMTI4QjogICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVIzID0qKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEtleSk7ICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9Kih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBLZXkrMyk7ICAgCi0gICAgCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMjU2QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjcgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDQpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQX0tFWVNJWkVfMTI4QjoKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBLZXkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEtleSArIDMpOworCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiB9CiAKIAogLyoqCi0gICogQGJyaWVmICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gcHJvY2VzcyBpbiBBRVMgR0NNIG1vZGUgYW5kIHByZXBhcmUgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyAKKyAgKiBAYnJpZWYgIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBwcm9jZXNzIGluIEFFUyBHQ00gbW9kZSBhbmQgcHJlcGFyZSB0aGUgYXV0aGVudGljYXRpb24gVEFHCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uCkBAIC0zNDMyLDE2NCArMzY2NCwxOTEgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKLSAgdWludDMyX3Qgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKS80VSA7CisgIHVpbnQzMl90IHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyA0VSA7CiAgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLwotICAgIAotICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCi0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyogR2V0IHRpY2sgKi8KLSAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIHdoaWxlKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworCisgIGlmIChoY3J5cC0+SW5pdC5LZXlJVkNvbmZpZ1NraXAgPT0gQ1JZUF9LRVlJVkNPTkZJR19PTkNFKQogICB7Ci0gICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQotICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgIH0KKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICAKLSNlbHNlIC8qIEFFUyAqLwotICAvKiBXb3JrYXJvdW5kIDEgOiBvbmx5IEFFUy4KLSAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKLSAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCi0gIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOwotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCi0gIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgeyAKLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgICAgICAgIAotICAgIAotICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KLSAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAgICAgICAgICAKLSAgICByZXR1cm4gSEFMX0VSUk9SOwotICB9Ci0gIC8qIENsZWFyIENDRiBmbGFnICovCi0gIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgZWxzZQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKipQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCi0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOwotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovIAotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpIAorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogICB7Ci0gICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgIHdvcmRzaXplID0gICgod29yZHNpemUvNFUpKjRVKSA7IAorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIHsKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworI2Vsc2UgLyogQUVTICovCisgICAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMuCisgICAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKKyAgICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KKyAgICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsICBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKlBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworI2lmIGRlZmluZWQoQ1JZUCkKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworI2Vsc2UgLyogQUVTICovCisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKKyAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KKyAgICB3b3Jkc2l6ZSA9ICgod29yZHNpemUgLyA0VSkgKiA0VSkgOwogICB9Ci0gIAorCiAgIC8qIEdldCB0aWNrICovCiAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsKLSAgCisKICAgLyogV3JpdGUgaW5wdXQgZGF0YSBhbmQgZ2V0IG91dHB1dCBEYXRhICovCi0gIHdoaWxlKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQotICB7ICAgICAgCisgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKKyAgewogICAgIC8qIFdyaXRlIHBsYWluIGRhdGEgYW5kIGdldCBjaXBoZXIgZGF0YSAqLwotICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwotICAgIAorICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLCBUaW1lb3V0KTsKKwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCi0gICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OyAKLSAgICAKKyAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICB7Ci0gICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAmIGVycm9yIGNvZGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgCi0gIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKSAKKworICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKICAgewogICAgIC8qICBXb3JrYXJvdW5kIDIgOiAgQ1JZUDEgJiBBRVMgZ2VuZXJhdGVzIGNvcnJlY3QgVEFHIGZvciBHQ00gbW9kZSBvbmx5IHdoZW4gaW5wdXQgYmxvY2sgc2l6ZSBpcyBtdWx0aXBsZSBvZgogICAgIDEyOCBiaXRzLiBJZiBsdGhlIHNpemUgb2YgdGhlIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCBpcyBpbmZlcmlvciB0byAxMjggYml0cywgd2hlbiBHQ00gZW5jcnlwdGlvbgotICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovICAgCi0gICAgQ1JZUF9Xb3JrYXJvdW5kKGhjcnlwLFRpbWVvdXQpOyAgIAorICAgIGlzIHNlbGVjdGVkLCB0aGVuIHRoZSBUQUcgbWVzc2FnZSB3aWxsIGJlIHdyb25nLiovCisgICAgQ1JZUF9Xb3JrYXJvdW5kKGhjcnlwLCBUaW1lb3V0KTsKICAgfQotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0zNjAzLDI0NiArMzg2MiwyNzIgQEAKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0dDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CiAgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKLSNpZiBkZWZpbmVkKEFFUykgCisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCisjaWYgZGVmaW5lZChBRVMpCiAgIHVpbnQzMl90IGxvb3Bjb3VudGVyOwotICB1aW50MzJfdCBsYXN0d29yZHNpemU7IAorICB1aW50MzJfdCBsYXN0d29yZHNpemU7CiAgIHVpbnQzMl90IG5wYmxiOwotI2VuZGlmIC8qIEFFUyAqLyAKLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9MFU7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkgICAgIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMyk7Ci0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCisjZW5kaWYgLyogQUVTICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LktleUlWQ29uZmlnU2tpcCA9PSBDUllQX0tFWUlWQ09ORklHX09OQ0UpCiAgIHsKLSAgICBjb3VudC0tIDsKLSAgICBpZihjb3VudCA9PSAwVSkKKyAgICBpZiAoaGNyeXAtPktleUlWQ29uZmlnID09IDFVKQogICAgIHsKLSAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAotICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgc2tpcCBpdCAqLworICAgICAgRG9LZXlJVkNvbmZpZyA9IDBVOworICAgICAgaGNyeXAtPlNpemVzU3VtICs9IGhjcnlwLT5TaXplOyAvKiBDb21wdXRlIG1lc3NhZ2UgdG90YWwgcGF5bG9hZCBsZW5ndGggKi8KICAgICB9Ci0gIH0KLSAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pOwotICAKLSNlbHNlIC8qIEFFUyAqLwotICAKLSAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMKLSAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIElOSVQgcGhhc2UuIE9ubHksIGFmdGVyIElOSVQsIGFuZCBiZWZvcmUgcmUKLSAgZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBkaWZmZXJlbnQgZnJvbSAzMiBiaXRzIGNhbiBiZSBjb25maWd1cmVkLiovCi0gIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzMpOyAgICAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCi0gIHsKLSAgICBjb3VudC0tIDsKLSAgICBpZihjb3VudCA9PSAwVSkKKyAgICBlbHNlCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7Ci0gIAotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgCi0gIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7ICAKLSAgCi0gIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7Ci0gIAotICAvKiBFbmFibGUgQ1JZUCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKiBXb3JrYXJvdW5kIDE6IG9ubHkgQUVTICwgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQqLwotICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOyAKLSAgCi0gIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCi0gIAotICAvKiBFbmFibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCxDUllQX0lUX0NDRklFIHwgQ1JZUF9JVF9FUlJJRSk7ICAgIAotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgaWYoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLwotICB7Ci0gICAgLyogU2V0IHRoZSBwaGFzZSAqLwotICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAKLSAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7Ci0gICAgCi0gICAgLyogV3JpdGUgdGhlIHBheWxvYWQgSW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8gCi0gICAgaWYoaGNyeXAtPlNpemUgPT0gMFUpCi0gICAgeyAgICAgCi0gICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXwgQ1JZUF9JVF9FUlJJRSk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgfSAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKGhjcnlwLT5TaXplID49IDE2VSkKLSAgICB7ICAgICAgIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7Ci0gICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGlmKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAoIGhjcnlwLT5TaXplLzRVKSkgICAKLSAgICAgIHsgICAKLSAgICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAotICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAgICAgfSAKLSAgICB9Ci0gICAgZWxzZSAvKiBTaXplIDwgMTZCeXRlcyAgOiBmaXJzdCBibG9jayBpcyB0aGUgbGFzdCBibG9jayovCi0gICAgewotICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQqLyAgCi0gICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgotICAgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCi0gICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCi0gICAgICAKLSAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwotICAgICAgbnBibGIgPSAxNlUtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOyAKLSAgICAgIAotICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgICAgIGlmICgobnBibGIgJSA0VSkgPT0wVSkgCi0gICAgICB7IAotICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUtbnBibGIpLzRVKSArMVU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qICBsYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplIDsgbG9vcGNvdW50ZXIrKykKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCi0gICAgICAgIGxvb3Bjb3VudGVyKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQotICB7Ci0gICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA7IGxvb3Bjb3VudGVyKyspCi0gICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgCi0gICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgIH0KLSAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICB7IAotICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCi0gICAgICBsb29wY291bnRlcisrOwotICAgIH0KLSAgICAvKiBTZXQgdGhlIHBoYXNlICovCi0gICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgIAotICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KLSAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgICAKLSAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCi0gICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwotICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZWxzZQotICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gIAotICB9IAotICBlbHNlIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgPj0gNFUpCi0gIHsgIAotICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwotICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAKLSAgfQogICBlbHNlCiAgIHsKLSAgICAvKiBOb3RoaW5nIHRvIGRvICovCi0gIH0gIAotICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gICAgICAKLSAgCisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CisgIH0KKworICAvKiBDb25maWd1cmUgS2V5LCBJViBhbmQgcHJvY2VzcyBtZXNzYWdlIChoZWFkZXIgYW5kIHBheWxvYWQpICovCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQorICB7CisgICAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgPSAwVTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworI2lmIGRlZmluZWQoQ1JZUCkKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLyogV29ya2Fyb3VuZCAxIDogb25seSBBRVMKKyAgICBEYXRhdHlwZSBjb25maWd1cmF0aW9uIG11c3QgYmUgMzIgYml0cyBkdXJpbmcgSU5JVCBwaGFzZS4gT25seSwgYWZ0ZXIgSU5JVCwgYW5kIGJlZm9yZSByZQorICAgIGVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgZGlmZmVyZW50IGZyb20gMzIgYml0cyBjYW4gYmUgY29uZmlndXJlZC4qLworICAgIC8qIFNlbGVjdCBEQVRBVFlQRSAzMiAgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgQ1JZUF9EQVRBVFlQRV8zMkIpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYW5kIHRoZSBjb3VudGVyIDogSW5pdGlhbCBDb3VudGVyIEJsb2NrIChJQ0IpKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDIpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMyk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qIGp1c3Qgd2FpdCBmb3IgaGFzaCBjb21wdXRhdGlvbiAqLworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCisgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KKyAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKworI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JKTsKKworICAgIC8qIEVuYWJsZSBDUllQICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisjZWxzZSAvKiBBRVMgKi8KKworICAgIC8qIFdvcmthcm91bmQgMTogb25seSBBRVMgLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZCovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogRW5hYmxlIGNvbXB1dGF0aW9uIGNvbXBsZXRlIGZsYWcgYW5kIGVycm9yIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSA9PSAwVSkgLypoZWFkZXIgcGhhc2UgaXMgIHNraXBwZWQqLworICAgIHsKKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCisgICAgICBpZiAoaGNyeXAtPlNpemUgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKworICAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgfQorICAgICAgZWxzZSBpZiAoaGNyeXAtPlNpemUgPj0gMTZVKQorICAgICAgeworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgICAgaWYgKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAoaGNyeXAtPlNpemUgLyA0VSkpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDYWxsIElucHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KKyAgICAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIC8qIFNpemUgPCAxNkJ5dGVzICA6IGZpcnN0IGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrKi8KKyAgICAgIHsKKyAgICAgICAgLyogV29ya2Fyb3VuZCBub3QgaW1wbGVtZW50ZWQqLworICAgICAgICAvKiBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uOgorICAgICAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgorICAgICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfRW5jcnlwdF9JVCBvdGhlcndpc2UgVEFHIGlzIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb24uICovCisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCisgICAgICAgIG5wYmxiID0gMTZVIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VSAtIG5wYmxiKSAvIDRVKSArIDFVOworICAgICAgICB9CisKKyAgICAgICAgLyogIGxhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemUgOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSA8IDRVKQorICAgIHsKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplIDsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgbG9vcGNvdW50ZXIrKzsKKyAgICAgIH0KKyAgICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAgIC8qIENhbGwgSW5wdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLworICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOworI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpID49IDRVKQorICAgIHsKKyAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTM4NTgsMTQ3ICs0MTQzLDE3NCBAQAogewogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgIHVpbnQzMl90IHdvcmRzaXplOwotICAKLSAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAKLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgICAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCi0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QrMSk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBhbHJlYWR5LCBkbyBpdCBhbmQgc2V0IEtleUlWQ29uZmlnCisgICAgICB0byBrZWVwIHRyYWNrIGl0IHdvbid0IGhhdmUgdG8gYmUgZG9uZSBhZ2FpbiBuZXh0IHRpbWUgKi8KKyAgICAgIGhjcnlwLT5LZXlJVkNvbmZpZyA9IDFVOworICAgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7IC8qIE1lcmVseSBzdG9yZSBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotI2Vsc2UgLyogQUVTICovCi0gIAotICAvKldvcmthcm91bmQgMSA6IG9ubHkgQUVTCi0gIERhdGF0eXBlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSAzMiBiaXRzIGR1cmluZyBJbml0IHBoYXNlLiBPbmx5LCBhZnRlciBJbml0LCBhbmQgYmVmb3JlIHJlCi0gIGVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgZGlmZmVyZW50IGZyb20gMzIgYml0cyBjYW4gYmUgY29uZmlndXJlZC4qLwotICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBDUllQX0RBVEFUWVBFXzMyQik7ICAgCi0gIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciBhbmQgdGhlIGNvdW50ZXIgOiBJbml0aWFsIENvdW50ZXIgQmxvY2sgKElDQikqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCsyKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCszKTsgIAotICAKLSAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KLSAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAKLSAgLyoganVzdCB3YWl0IGZvciBoYXNoIGNvbXB1dGF0aW9uICovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KKyAgZWxzZQogICB7Ci0gICAgY291bnQtLSA7Ci0gICAgaWYoY291bnQgPT0gMFUpCi0gICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9CisgICAgaGNyeXAtPlNpemVzU3VtID0gaGNyeXAtPlNpemU7CiAgIH0KLSAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAKLSAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShoY3J5cCkgIT0gSEFMX09LKQorCisgIGlmIChEb0tleUlWQ29uZmlnID09IDFVKQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOyAgCi0gIAorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKwogI2lmIGRlZmluZWQoQ1JZUCkKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSNlbmRpZiAvKiBDUllQICovIAotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgCi0gIGlmKGhjcnlwLT5TaXplICE9IDBVKQotICB7IAorICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0KTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAzKTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKKworI2Vsc2UgLyogQUVTICovCisKKyAgICAvKldvcmthcm91bmQgMSA6IG9ubHkgQUVTCisgICAgRGF0YXR5cGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIDMyIGJpdHMgZHVyaW5nIEluaXQgcGhhc2UuIE9ubHksIGFmdGVyIEluaXQsIGFuZCBiZWZvcmUgcmUKKyAgICBlbmFibGluZyB0aGUgSVAsIGRhdGF0eXBlIGRpZmZlcmVudCBmcm9tIDMyIGJpdHMgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KKyAgICAvKiBTZWxlY3QgREFUQVRZUEUgMzIgICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIENSWVBfREFUQVRZUEVfMzJCKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFuZCB0aGUgY291bnRlciA6IEluaXRpYWwgQ291bnRlciBCbG9jayAoSUNCKSovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQucEluaXRWZWN0ICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5wSW5pdFZlY3QgKyAyKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LnBJbml0VmVjdCArIDMpOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKiBqdXN0IHdhaXQgZm9yIGhhc2ggY29tcHV0YXRpb24gKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfRE1BKGhjcnlwKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworI2lmIGRlZmluZWQoQ1JZUCkKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyNlbmRpZiAvKiBDUllQICovCisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKworICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCisgIHsKICAgICAvKiBDUllQMSBJUCBWIDwgMi4yLjEgIFNpemUgc2hvdWxkIGJlICU0ICBvdGhlcndpc2UgVGFnIHdpbGwgIGJlIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgR0NNIEVuY3J5cHRpb246Ci0gICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKICAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIERNQSBtb2RlIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIC4gKi8KLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpIAotICAgIHsgIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOyAgICAKKyAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8KKyAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSA9PSAwVSkKKyAgICB7CisgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAoaGNyeXAtPlNpemUgLyA0VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwogICAgIH0KICAgICBlbHNlIC8qdG8gY29tcHV0ZSBsYXN0IHdvcmQ8MTI4Yml0cywgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgKi8KICAgICB7Ci0gICAgICB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpKygxNlUtKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpJTE2VSkpIDsKLSAgICAgIAotICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZS80VSksICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOwotICAgIH0gICAKKyAgICAgIHdvcmRzaXplID0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgKyAoMTZVIC0gKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpICUgMTZVKSkgOworCisgICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCAqLworICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZSAvIDRVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KICAgfQotICBlbHNlIAorICBlbHNlCiAgIHsKICAgICAvKiBQcm9jZXNzIHVuTG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIAogLyoqCi0gICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZSAKKyAgKiBAYnJpZWYgIEFFUyBDQ00gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHByb2Nlc3NpbmcgaW4gcG9sbGluZyBtb2RlCiAgICogICAgICAgICBmb3IgVGlueUFFUyBJUCwgbm8gZW5jcnlwdC9kZWNyeXB0IHBlcmZvcm1lZCwgb25seSBhdXRoZW50aWNhdGlvbiBwcmVwYXJhdGlvbi4KICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKQEAgLTQwMDgsMzk1ICs0MzIwLDQyNSBAQAogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3MoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICB1aW50MzJfdCB3b3Jkc2l6ZT0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvNFU7Ci0gIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLyAgCi0jaWYgZGVmaW5lZChBRVMpIAorICB1aW50MzJfdCB3b3Jkc2l6ZSA9ICh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gNFU7CisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworICB1aW50MzJfdCBEb0tleUlWQ29uZmlnID0gMVU7IC8qIEJ5IGRlZmF1bHQsIGNhcnJ5IG91dCBwZXJpcGhlcmFsIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiAqLworI2lmIGRlZmluZWQoQUVTKQogICB1aW50MzJfdCBsb29wY291bnRlcjsKICAgdWludDMyX3QgbnBibGI7Ci0gIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsgCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKICNlbmRpZiAvKiBBRVMgKi8KLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOyAgICAgCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLENSWVBfUEhBU0VfSU5JVCk7Ci0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7Ci0gIAotICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQ1RSMSBpbmZvcm1hdGlvbiAqLwotICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gaGNyeXAtPkluaXQuQjBbMl07Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpfCAgQ1JZUF9DQ01fQ1RSMV8yOwotICAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7Ci0gIH0KLSAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQotICB7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAvKiBHZXQgdGljayAqLwotICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KLSAgd2hpbGUoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0NSWVBFTikgPT0gQ1JZUF9DUl9DUllQRU4pCisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCiAgIHsKLSAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisKKyAgICAvKiAgUmVzZXQgQ3J5cEhlYWRlckNvdW50ICovCisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOworCisjaWYgZGVmaW5lZChDUllQKQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9JTklUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMExSID0gKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjFfMDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMFJSID0gaGNyeXAtPkluaXQuQjBbMV07CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoaGNyeXAtPkluaXQuQjBbM10gJiBDUllQX0NDTV9DVFIxXzEpIHwgIENSWVBfQ0NNX0NUUjFfMjsKKworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKldyaXRlICBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQotICAgICAgewotICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCi0gICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgIH0KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgIH0KLSAgfSAgCi0jZWxzZSAvKiBBRVMgKi8gCi0gIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLyAKLSAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKLSAgCi0gIC8qIGNvbmZpZ3VyZWQgZW5jcnlwdGlvbiBtb2RlICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsgCi0gIAotICAvKiBTZXQgdGhlIGtleSAqLwotICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7ICAgICAKLSAgCi0gIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLyAKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7Ci0gIAotICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gIAotICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiovCi0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7IAotICAKLSAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLwotICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gIHsgCi0gICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAgICAgICAKLSAgICAKLSAgICAvKiBQcm9jZXNzIHVubG9ja2VkICYgcmV0dXJuIGVycm9yICovCi0gICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAgICAgICAgCi0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgLyogRnJvbSB0aGF0IHBvaW50IHRoZSB3aG9sZSBtZXNzYWdlIG11c3QgYmUgcHJvY2Vzc2VkLCBmaXJzdCB0aGUgSGVhZGVyIHRoZW4gdGhlIHBheWxvYWQuCi0gIEZpcnN0IHRoZSAgSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLwotICAKLSAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpCi0gIHsKLSAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICk9PSAwVSkKLSAgICB7ICAgICAKLSAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8qIFdyaXRlIHRoZSBJbnB1dCBibG9jayBpbiB0aGUgRGF0YSBJbnB1dCByZWdpc3RlciAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ2xlYXIgQ0NGIEZsYWcgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCi0gICAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSwgMTYpOworICAgIH0KKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpKTsKICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKLSAgICAgIC8qV3JpdGUgSGVhZGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPIHdpdGhvdXQgbGFzdCBibG9jayAqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSktKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpKTsgbG9vcGNvdW50ZXIrPTRVKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyk7CisgICAgfQorICAgIC8qIEdldCB0aWNrICovCisgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKQorICAgIHsKKyAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLworICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAotICAgICAgICAKLSAgICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgICB7IAorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKICAgICAgIH0KLSAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKLSAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgICAgICAKLSAgICAgIH0KLSAgICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgICB7IAotICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8gICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAgICAgIAotICAgICAgICBsb29wY291bnRlcisrOwotICAgICAgfSAgICAKLSAgICAgIAotICAgICAgaWYoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKLSAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgIAotICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfQotICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgCiAgICAgfQotICB9CisjZWxzZSAvKiBBRVMgKi8KKyAgICAvKkFFUzJ2MS4xLjEgOiBDQ00gYXV0aGVudGljYXRpb24gOiBubyBpbml0IHBoYXNlLCBvbmx5IGhlYWRlciBhbmQgZmluYWwgcGhhc2UgKi8KKyAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgIC8qIGNvbmZpZ3VyZWQgZW5jcnlwdGlvbiBtb2RlICovCisgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB3aXRoIHplcm8gdmFsdWVzKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjIgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSAwVTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKKworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworCisgICAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLworICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgJiByZXR1cm4gZXJyb3IgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKyAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIEZyb20gdGhhdCBwb2ludCB0aGUgd2hvbGUgbWVzc2FnZSBtdXN0IGJlIHByb2Nlc3NlZCwgZmlyc3QgdGhlIEhlYWRlciB0aGVuIHRoZSBwYXlsb2FkLgorICAgIEZpcnN0IHRoZSAgSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZCB3aXRoIEFzc29jaWF0ZWQgRGF0YSAoQSkqLworCisgICAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpCisgICAgeworICAgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIElucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIENsZWFyIENDRiBGbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICAgIH0KKyAgICB9CisgIH0gLyogaWYgKERvS2V5SVZDb25maWcgPT0gMVUpICovCiAgIC8qIFRoZW4gdGhlIHBheWxvYWQ6IGNsZWFydGV4dCBwYXlsb2FkIChub3QgdGhlIGNpcGhlcnRleHQgcGF5bG9hZCkuCiAgIFdyaXRlIGlucHV0IERhdGEsIG5vIG91dHB1dCBEYXRhIHRvIGdldCAqLwogICBpZiAoaGNyeXAtPlNpemUgIT0gMFUpCiAgIHsKLSAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgCisgICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCiAgICAgewotICAgICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgICAgd29yZHNpemUgPSAgKCh3b3Jkc2l6ZS80VSkqNFUpIDsgCisgICAgICAvKiByZWNhbGN1bGF0ZSAgd29yZHNpemUgKi8KKyAgICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CiAgICAgfQotICAgIAorCiAgICAgLyogR2V0IHRpY2sgKi8KICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCiAgICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAgIAotICAgIHdoaWxlKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQotICAgIHsgICAgICAKKworICAgIHdoaWxlICgoaGNyeXAtPkNyeXBJbkNvdW50IDwgd29yZHNpemUpICYmIChvdXRjb3VudCA8IHdvcmRzaXplKSkKKyAgICB7CiAgICAgICAvKiBXcml0ZSBwbGFpbiBkYXRhIGFuZCBnZXQgY2lwaGVyIGRhdGEgKi8KLSAgICAgIENSWVBfQUVTX1Byb2Nlc3NEYXRhKGhjcnlwLFRpbWVvdXQpOwotICAgICAKLSAgICAvKlRlbXBvcmFyeSBDcnlwT3V0Q291bnQgVmFsdWUqLwotICAgIG91dGNvdW50ID0gaGNyeXAtPkNyeXBPdXRDb3VudDsgCi0gICAgCisgICAgICBDUllQX0FFU19Qcm9jZXNzRGF0YShoY3J5cCwgVGltZW91dCk7CisKKyAgICAgIC8qVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSovCisgICAgICBvdXRjb3VudCA9IGhjcnlwLT5DcnlwT3V0Q291bnQ7CisKICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgIHsKLSAgICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKLSAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkgIAotICAgIHsgCisKKyAgICBpZiAoKGhjcnlwLT5TaXplICUgMTZVKSAhPSAwVSkKKyAgICB7CiAgICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KLSAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkvMTZVKSsxVSkqMTZVKS0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7IAotICAgICAgCisgICAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKKwogICAgICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgICAgIGlmICgobnBibGIlNFUpID09MFUpIAotICAgICAgeyAKLSAgICAgICAgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CQkKLSAgICAgIH0KLSAgICAgIGVsc2UgCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQogICAgICAgewotICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICAgIH0gICAKLSAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLyAgICAKLSAgICAgIGZvcihsb29wY291bnRlcj0wVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKSAgICAgICAgCisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKyAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIgKyspCiAgICAgICB7CiAgICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIH0gICAgCi0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVKQorICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCiAgICAgICB7CiAgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7Ci0gICAgICAgIGxvb3Bjb3VudGVyKys7IAotICAgICAgfSAgIAorICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQogICAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICB7IAorICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICAgIHJldHVybiBIQUxfRVJST1I7ICAgICAgICAgCi0gICAgICB9IAorICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CiAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7Ci0gICAgICAKKwogICAgIH0KLSAgfSAgICAgICAKKyAgfQogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkCi0gIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCi0gIAotICBpZihDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZShoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorCisjaWYgZGVmaW5lZChDUllQKQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSGVhZGVyIGJsb2NrKEIxKSA6IGFzc29jaWF0ZWQgZGF0YSBsZW5ndGggZXhwcmVzc2VkIGluIGJ5dGVzIGNvbmNhdGVuYXRlZAorICAgIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCisKKyAgICBpZiAoQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICB9IC8qIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCisgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQogICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfSAgCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAKLSAgCi0gIC8qIFNldCB0aGUgcGhhc2UgKi8KLSAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAKLSAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gIAotICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX1BBWUxPQUQpOyAKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgIAotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpIAotICB7Ci0gICAgLyogcmVjYWxjdWxhdGUgIHdvcmRzaXplICovIAotICAgIHdvcmRzaXplID0gICgod29yZHNpemUvNFUpKjRVKSA7IAorICAgIC8qIHJlY2FsY3VsYXRlICB3b3Jkc2l6ZSAqLworICAgIHdvcmRzaXplID0gKCh3b3Jkc2l6ZSAvIDRVKSAqIDRVKSA7CiAgIH0KICAgLyogR2V0IHRpY2sgKi8KICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAKKwogICAvKiBXcml0ZSBpbnB1dCBkYXRhIGFuZCBnZXQgb3V0cHV0IGRhdGEgKi8KLSAgd2hpbGUoKGhjcnlwLT5DcnlwSW5Db3VudCA8IHdvcmRzaXplKSAmJiAob3V0Y291bnQgPCB3b3Jkc2l6ZSkpCi0gIHsgICAgICAKKyAgd2hpbGUgKChoY3J5cC0+Q3J5cEluQ291bnQgPCB3b3Jkc2l6ZSkgJiYgKG91dGNvdW50IDwgd29yZHNpemUpKQorICB7CiAgICAgLyogV3JpdGUgcGxhaW4gZGF0YSBhbmQgZ2V0IGNpcGhlciBkYXRhICovCi0gICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsVGltZW91dCk7Ci0gICAgCisgICAgQ1JZUF9BRVNfUHJvY2Vzc0RhdGEoaGNyeXAsIFRpbWVvdXQpOworCiAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpKQorICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQogICAgIH0KICAgfQotICAKLSAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpICAKLSAgeyAgCisKKyAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgIT0gMFUpCisgIHsKICAgICAvKiBDUllQIFdvcmthcm91bmQgOiAgQ1JZUDEgZ2VuZXJhdGVzIGNvcnJlY3QgVEFHICBkdXJpbmcgQ0NNIGRlY3J5cHRpb24gb25seSB3aGVuIGNpcGhlcnRleHQgYmxvY2tzIHNpemUgaXMgbXVsdGlwbGUgb2YKICAgICAxMjggYml0cy4gSWYgbHRoZSBzaXplIG9mIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgaXMgaW5mZXJpb3IgdG8gMTI4IGJpdHMsIHdoZW4gQ0NNIGRlY3J5cHRpb24KLSAgICBpcyBzZWxlY3RlZCwgdGhlbiB0aGUgVEFHIG1lc3NhZ2Ugd2lsbCBiZSB3cm9uZy4qLyAgIAotICAgIENSWVBfV29ya2Fyb3VuZChoY3J5cCxUaW1lb3V0KTsKKyAgICBpcyBzZWxlY3RlZCwgdGhlbiB0aGUgVEFHIG1lc3NhZ2Ugd2lsbCBiZSB3cm9uZy4qLworICAgIENSWVBfV29ya2Fyb3VuZChoY3J5cCwgVGltZW91dCk7CiAgIH0KICNlbmRpZiAvKiBDUllQICovCi0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBBRVMgQ0NNIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBwcm9jZXNzIGluIGludGVycnVwdCBtb2RlIAorICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBpbnRlcnJ1cHQgbW9kZQogICAqICAgICAgICAgZm9yIFRpbnlBRVMgSVAsIG5vIGVuY3J5cHQvZGVjcnlwdCBwZXJmb3JtZWQsIG9ubHkgYXV0aGVudGljYXRpb24gcHJlcGFyYXRpb24uCiAgICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCkBAIC00NDA0LDMxMCArNDc0Niw1NjUgQEAKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU0NDTV9Qcm9jZXNzX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCiB7CisgIHVpbnQzMl90IERvS2V5SVZDb25maWcgPSAxVTsgLyogQnkgZGVmYXVsdCwgY2Fycnkgb3V0IHBlcmlwaGVyYWwgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uICovCiAjaWYgZGVmaW5lZChDUllQKQogICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAjZW5kaWYgLyogQ1JZUCAqLwotICAKLSAgLyogIFJlc2V0IENyeXBIZWFkZXJDb3VudCAqLwotICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7Ci0gIAotI2lmIGRlZmluZWQoQ1JZUCkKLSAgCi0gIC8qKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKiovCi0gIAotICBDUllQX1NFVF9QSEFTRShoY3J5cCxDUllQX1BIQVNFX0lOSVQpOwotICAKLSAgLyogU2V0IHRoZSBrZXkgKi8KLSAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOwotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKXwgIENSWVBfQ0NNX0NUUjFfMjsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7Ci0gIH0KLSAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQotICB7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzIpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOworICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCisgICAgeworICAgICAgLyogSWYgdGhlIEtleSBhbmQgSVYgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSBvbmx5IG9uY2UKKyAgICAgIGFuZCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsIHNraXAgaXQgKi8KKyAgICAgIERvS2V5SVZDb25maWcgPSAwVTsKKyAgICAgIGhjcnlwLT5TaXplc1N1bSArPSBoY3J5cC0+U2l6ZTsgLyogQ29tcHV0ZSBtZXNzYWdlIHRvdGFsIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsxKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsKKyAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsKICAgfQotICAvKldhaXQgZm9yIHRoZSBDUllQRU4gYml0IHRvIGJlIGNsZWFyZWQqLwotICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7Ci0gIGRvCisKKyAgLyogQ29uZmlndXJlIEtleSwgSVYgYW5kIHByb2Nlc3MgbWVzc2FnZSAoaGVhZGVyIGFuZCBwYXlsb2FkKSAqLworICBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkKICAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKioqKioqKioqKioqIEluaXQgcGhhc2UgKioqKioqKioqKioqLworCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSU5JVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIChJVikgd2l0aCBDVFIxIGluZm9ybWF0aW9uICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjBSUiA9IGhjcnlwLT5Jbml0LkIwWzFdOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxTFIgPSBoY3J5cC0+SW5pdC5CMFsyXTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKSB8ICBDUllQX0NDTV9DVFIxXzI7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7Ci0gICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOwogICAgIH0KLSAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMiksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpLCAxNik7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKKyAgICB9CisgICAgLypXYWl0IGZvciB0aGUgQ1JZUEVOIGJpdCB0byBiZSBjbGVhcmVkKi8KKyAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01JTklUUEhBU0U7CisgICAgZG8KKyAgICB7CisgICAgICBjb3VudC0tIDsKKyAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCisgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKKyAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorICAgIH0gd2hpbGUgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9DUllQRU4pID09IENSWVBfQ1JfQ1JZUEVOKTsKKworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLworCiAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7Ci0gIAorCiAgIC8qIEVuYWJsZSBDUllQICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgCi0gIAotI2Vsc2UgLyogQUVTICovIAotICAKLSAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKLSAgLyogY29uZmlndXJlZCBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KLSAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfTU9ERSwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOyAKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovIAotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKLSAgCi0gIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsgCi0gIAorCisjZWxzZSAvKiBBRVMgKi8KKworICAgIC8qQUVTMnYxLjEuMSA6IENDTSBhdXRoZW50aWNhdGlvbiA6IG5vIGluaXQgcGhhc2UsIG9ubHkgaGVhZGVyIGFuZCBmaW5hbCBwaGFzZSAqLworICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KKyAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCisgICAgLyogY29uZmlndXJlZCBtb2RlIGFuZCBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9NT0RFLCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSAqLworICAgIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIHdpdGggemVybyB2YWx1ZXMqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMyA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMCA9IDBVOworCisgICAgLyogRW5hYmxlIGludGVycnVwdHMgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgLypXcml0ZSB0aGUgQjAgcGFja2V0IGludG8gQ1JZUF9ESU4qLworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMik7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworCisgIH0gLyogZW5kIG9mIGlmIChEb0tleUlWQ29uZmlnID09IDFVKSAqLwogI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBIQUxfT0s7ICAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIC8qKgotICAqIEBicmllZiAgQUVTIENDTSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvY2VzcyBpbiBETUEgbW9kZSAKKyAgKiBAYnJpZWYgIEFFUyBDQ00gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHByb2Nlc3MgaW4gRE1BIG1vZGUKICAgKiAgICAgICAgIGZvciBUaW55QUVTIElQLCBubyBlbmNyeXB0L2RlY3J5cHQgcGVyZm9ybWVkLCBvbmx5IGF1dGhlbnRpY2F0aW9uIHByZXBhcmF0aW9uLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTQ0NNX1Byb2Nlc3NfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17ICAKK3sKICAgdWludDMyX3Qgd29yZHNpemU7CiAgIF9fSU8gdWludDMyX3QgY291bnQgPSAwVTsKLSAgCi0gIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KLSAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCA9IDBVOwotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0IHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAKLSAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsQ1JZUF9QSEFTRV9JTklUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgKElWKSB3aXRoIENUUjEgaW5mb3JtYXRpb24gKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5JVjBMUiA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIxXzA7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVjFMUiA9IGhjcnlwLT5Jbml0LkIwWzJdOwotICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gKGhjcnlwLT5Jbml0LkIwWzNdICYgQ1JZUF9DQ01fQ1RSMV8xKXwgIENSWVBfQ0NNX0NUUjFfMjsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOIFJlZ2lzdGVyKi8KLSAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKyAgdWludDMyX3QgRG9LZXlJVkNvbmZpZyA9IDFVOyAvKiBCeSBkZWZhdWx0LCBjYXJyeSBvdXQgcGVyaXBoZXJhbCBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gKi8KKyNpZiBkZWZpbmVkKEFFUykKKyAgdWludDMyX3QgbG9vcGNvdW50ZXI7CisgIHVpbnQzMl90IG5wYmxiOworICB1aW50MzJfdCBsYXN0d29yZHNpemU7CisjZW5kaWYKKworICBpZiAoaGNyeXAtPkluaXQuS2V5SVZDb25maWdTa2lwID09IENSWVBfS0VZSVZDT05GSUdfT05DRSkKICAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFViggKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpKTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMykpOwotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSksIDE2KTsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSwgMTYpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpLCAxNik7ICAgIAotICB9Ci0gIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKLSAgewotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSkpOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCsyKSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzMpKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMSk7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMyk7Ci0gIH0KLSAgCi0gIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KLSAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQorICAgIGlmIChoY3J5cC0+S2V5SVZDb25maWcgPT0gMVUpCiAgICAgewotICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KLSAgfQotICB3aGlsZSgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7Ci0gIAotI2Vsc2UgLyogQUVTICovIAotICAKLSAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovIAotICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAKLSAgLyogY29uZmlndXJlZCBDQ00gY2hhaW5pbmcgbW9kZSBhbmQgZW5jcnlwdGlvbiBtb2RlICovCi0gIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKLSAgCi0gIC8qIFNldCB0aGUga2V5ICovCi0gIENSWVBfU2V0S2V5KGhjcnlwLCBoY3J5cC0+SW5pdC5LZXlTaXplKTsgICAgIAotICAKLSAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovIAotICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwVTsKLSAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDBVOwotICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwVTsKLSAgCi0gIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKLSAgCi0gIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKTsKLSAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkIwKzEpOwotICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuQjArMik7Ci0gIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5CMCszKTsgCi0gIAotICAvKiAgd2FpdCB1bnRpbCB0aGUgZW5kIG9mIGNvbXB1dGF0aW9uICovCi0gIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKLSAgZG8KLSAgewotICAgIGNvdW50LS0gOwotICAgIGlmKGNvdW50ID09IDBVKQotewotICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgCi0gIC8qIENoYW5nZSBzdGF0ZSAqLwotICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gIAotICAvKiBQcm9jZXNzIFVubG9ja2VkICovICAgICAgICAgIAotICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgcmV0dXJuIEhBTF9FUlJPUjsKLX0KLSAgfQotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7Ci0gIAotICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0jZW5kaWYgLyogQUVTICovCi0gIAotICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCi0gIGlmKENSWVBfR0NNQ0NNX1NldEhlYWRlclBoYXNlX0RNQShoY3J5cCkgIT0gSEFMX09LKQotICB7Ci0gICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfQotICAKLSAgLyoqKioqKioqKioqKioqKioqKioqIFBheWxvYWQgcGhhc2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi0gIAotICAvKiBTZXQgdGhlIHBoYXNlICovCi0gIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsgIAotICAKLSNpZiBkZWZpbmVkKENSWVApICAKLSAgCi0gIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAKLSAgLyogU2VsZWN0IHBheWxvYWQgcGhhc2Ugb25jZSB0aGUgaGVhZGVyIHBoYXNlIGlzIHBlcmZvcm1lZCAqLwotICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgCi0jZW5kaWYgLyogQ1JZUCAqLyAgIAotICAKLSAgaWYoaGNyeXAtPlNpemUgIT0gMFUpCi0gIHsgCi0gICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCi0gICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCi0gICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBIQUxfQ1JZUF9BRVNHQ01fRE1BIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gKi8KLSAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIgKi8gCi0gICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpIAotICAgIHsgIAotICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIGhjcnlwLT5TaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsgICAKKyAgICAgIC8qIElmIHRoZSBLZXkgYW5kIElWIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgb25seSBvbmNlCisgICAgICBhbmQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLCBza2lwIGl0ICovCisgICAgICBEb0tleUlWQ29uZmlnID0gMFU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gKz0gaGNyeXAtPlNpemU7IC8qIENvbXB1dGUgbWVzc2FnZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCAqLwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSsxNlUtKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpICUxNlUpIDsgCi0gICAgICAKLSAgICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciwgcENyeXBPdXRCdWZmUHRyIHNpemUgc2hvdWxkIGJlICU0Ki8gCi0gICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KSggaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKHVpbnQxNl90KXdvcmRzaXplLzRVLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIpKTsKLSAgICB9ICAgCisgICAgICAvKiBJZiB0aGUgS2V5IGFuZCBJViBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBkb25lIG9ubHkgb25jZQorICAgICAgYW5kIGlmIGl0IGhhcyBub3QgYmVlbiBkb25lIGFscmVhZHksIGRvIGl0IGFuZCBzZXQgS2V5SVZDb25maWcKKyAgICAgIHRvIGtlZXAgdHJhY2sgaXQgd29uJ3QgaGF2ZSB0byBiZSBkb25lIGFnYWluIG5leHQgdGltZSAqLworICAgICAgaGNyeXAtPktleUlWQ29uZmlnID0gMVU7CisgICAgICBoY3J5cC0+U2l6ZXNTdW0gPSBoY3J5cC0+U2l6ZTsgLyogTWVyZWx5IHN0b3JlIHBheWxvYWQgbGVuZ3RoICovCisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIGhjcnlwLT5TaXplc1N1bSA9IGhjcnlwLT5TaXplOworICB9CisKKyAgaWYgKERvS2V5SVZDb25maWcgPT0gMVUpCisgIHsKKworICAgIC8qICBSZXNldCBDcnlwSGVhZGVyQ291bnQgKi8KKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ID0gMFU7CisKKyNpZiBkZWZpbmVkKENSWVApCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdCBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0lOSVQpOworCisgICAgLyogU2V0IHRoZSBrZXkgKi8KKyAgICBDUllQX1NldEtleShoY3J5cCwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciAoSVYpIHdpdGggQ1RSMSBpbmZvcm1hdGlvbiAqLworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwTFIgPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMV8wOworICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYwUlIgPSBoY3J5cC0+SW5pdC5CMFsxXTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPklWMUxSID0gaGNyeXAtPkluaXQuQjBbMl07CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVjFSUiA9IChoY3J5cC0+SW5pdC5CMFszXSAmIENSWVBfQ0NNX0NUUjFfMSkgfCAgQ1JZUF9DQ01fQ1RSMV8yOworCisgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICAvKldyaXRlIHRoZSBCMCBwYWNrZXQgaW50byBDUllQX0RJTiBSZWdpc3RlciovCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgeworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAxKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCksIDE2KTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDEpLCAxNik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKSwgMTYpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMyksIDE2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSkpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAyKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDMpOworICAgIH0KKworICAgIC8qV2FpdCBmb3IgdGhlIENSWVBFTiBiaXQgdG8gYmUgY2xlYXJlZCovCisgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgIGRvCisgICAgeworICAgICAgY291bnQtLSA7CisgICAgICBpZiAoY291bnQgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9IHdoaWxlICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQ1JZUEVOKSA9PSBDUllQX0NSX0NSWVBFTik7CisKKyNlbHNlIC8qIEFFUyAqLworCisgICAgLypBRVMydjEuMS4xIDogQ0NNIGF1dGhlbnRpY2F0aW9uIDogbm8gaW5pdCBwaGFzZSwgb25seSBoZWFkZXIgYW5kIGZpbmFsIHBoYXNlICovCisgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKKyAgICAvKiBjb25maWd1cmVkIGVuY3J5cHRpb24gbW9kZSAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKTsKKworICAgIC8qIFNldCB0aGUga2V5ICovCisgICAgQ1JZUF9TZXRLZXkoaGNyeXAsIGhjcnlwLT5Jbml0LktleVNpemUpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3Igd2l0aCB6ZXJvIHZhbHVlcyovCisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIxID0gMFU7CisgICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gMFU7CisKKyAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIC8qV3JpdGUgdGhlIEIwIHBhY2tldCBpbnRvIENSWVBfRElOKi8KKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkIwICsgMSk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5CMCArIDIpOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuQjAgKyAzKTsKKworICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICBkbworICAgIHsKKyAgICAgIGNvdW50LS0gOworICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgeworICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAvKiBTZXQgdGhlIHBoYXNlICovCisgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOworCisgICAgLyogRnJvbSB0aGF0IHBvaW50IHRoZSB3aG9sZSBtZXNzYWdlIG11c3QgYmUgcHJvY2Vzc2VkLCBmaXJzdCB0aGUgSGVhZGVyIHRoZW4gdGhlIHBheWxvYWQuCisgICAgRmlyc3QgdGhlICBIZWFkZXIgYmxvY2soQjEpIDogYXNzb2NpYXRlZCBkYXRhIGxlbmd0aCBleHByZXNzZWQgaW4gYnl0ZXMgY29uY2F0ZW5hdGVkIHdpdGggQXNzb2NpYXRlZCBEYXRhIChBKSovCisKKyAgICBpZiAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkKKyAgICB7CisgICAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgICAgLyogIHdhaXQgdW50aWwgdGhlIGVuZCBvZiBjb21wdXRhdGlvbiAqLworICAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICAgICAgICBkbworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLypXcml0ZSBIZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUlOSVRQSEFTRTsKKyAgICAgICAgICBkbworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50LS0gOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworICAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICAgIH0KKyAgICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQorICAgICAgICB7CisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgICB7CisgICAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKKyAgICAgICAgICBsb29wY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgY291bnQtLSA7CisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgICAgfQorICAgIH0KKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgLyogVGhlbiB0aGUgcGF5bG9hZDogY2xlYXJ0ZXh0IHBheWxvYWQgKG5vdCB0aGUgY2lwaGVydGV4dCBwYXlsb2FkKS4KKyAgV3JpdGUgaW5wdXQgRGF0YSwgbm8gb3V0cHV0IERhdGEgdG8gZ2V0ICovCisgIGlmIChoY3J5cC0+U2l6ZSAhPSAwVSkKKyAgeworICAgIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCisgICAgeworICAgICAgaWYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpCisgICAgICB7CisgICAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIChoY3J5cC0+U2l6ZSAvIDRVKSwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICB9CisgICAgICBlbHNlIC8qdG8gY29tcHV0ZSBsYXN0IHdvcmQ8MTI4Yml0cywgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIGVuY3J5cHRlZC9kZWNyeXB0ZWQgKi8KKyAgICAgIHsKKyAgICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSArICgxNlUgLSAoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgJSAxNlUpKSA7CisKKyAgICAgICAgLyogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3NlcyBhbmQgc3RhcnQgRE1BIHRyYW5zZmVyLCBwQ3J5cE91dEJ1ZmZQdHIgc2l6ZSBzaG91bGQgYmUgJTQgKi8KKyAgICAgICAgQ1JZUF9TZXRETUFDb25maWcoaGNyeXAsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwSW5CdWZmUHRyKSwgKCh1aW50MTZfdCl3b3Jkc2l6ZSAvIDRVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShoY3J5cC0+cENyeXBPdXRCdWZmUHRyKSk7CisgICAgICB9CisgICAgfQorICAgIGlmICgoaGNyeXAtPlNpemUgPCAxNlUpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLworICAgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CisgICAgICB9CisgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyICsrKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IDBVOworICAgICAgICBsb29wY291bnRlcisrOworICAgICAgfQorICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSU5JVFBIQVNFOworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgY291bnQtLSA7CisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSk7CisgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisKKyAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKKyAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICAvKiBQcm9jZXNzIHVuTG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKworICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSBhbmQgcGhhc2UgKi8KKyAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKyAgfQorI2VuZGlmIC8qIEFFUyAqLworI2lmIGRlZmluZWQoQ1JZUCkKKyAgICAvKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoaGNyeXApICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKKworICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLworICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKKyAgfSAvKiBpZiAoRG9LZXlJVkNvbmZpZyA9PSAxVSkgKi8KKyAgaWYgKGhjcnlwLT5TaXplICE9IDBVKQorICB7CisgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIEhBTF9DUllQX0FFU0dDTV9ETUEgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLworICAgIC8qIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzZXMgYW5kIHN0YXJ0IERNQSB0cmFuc2ZlciAqLworICAgIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKQorICAgIHsKKyAgICAgIENSWVBfU2V0RE1BQ29uZmlnKGhjcnlwLCAodWludDMyX3QpKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciksIGhjcnlwLT5TaXplIC8gNFUsICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd29yZHNpemUgPSAodWludDMyX3QpKGhjcnlwLT5TaXplKSArIDE2VSAtICgodWludDMyX3QpKGhjcnlwLT5TaXplKSAlIDE2VSkgOworCisgICAgICAvKiBTZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgYWRkcmVzc2VzIGFuZCBzdGFydCBETUEgdHJhbnNmZXIsIHBDcnlwT3V0QnVmZlB0ciBzaXplIHNob3VsZCBiZSAlNCovCisgICAgICBDUllQX1NldERNQUNvbmZpZyhoY3J5cCwgKHVpbnQzMl90KShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIpLCAodWludDE2X3Qpd29yZHNpemUgLyA0VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoaGNyeXAtPnBDcnlwT3V0QnVmZlB0cikpOworICAgIH0KICAgfQogICBlbHNlIC8qU2l6ZSA9IDAqLwogICB7CiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgYW5kIHBoYXNlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gIH0gICAgICAgICAKLSAgCisgIH0KKyNlbmRpZiAvKiBDUllQICovCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTQ3MTUsNTE2ICs1MzEyLDUyNSBAQAogLyoqCiAgICogQGJyaWVmICBTZXRzIHRoZSBwYXlsb2FkIHBoYXNlIGluIGl0ZXJydXB0IG1vZGUKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUgIAorICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgICogQHJldHZhbCBzdGF0ZQogICAqLwogc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0UGF5bG9hZFBoYXNlX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCi17ICAKK3sKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIHVpbnQzMl90IHRlbXA7ICAvKiBUZW1wb3JhcnkgQ3J5cE91dEJ1ZmYgKi8KLSAgdWludDMyX3QgbGFzdHdvcmRzaXplOyAKLSAgdWludDMyX3QgbnBibGI7CQotICNpZiBkZWZpbmVkKEFFUykgCi0gIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLyAKLSNlbmRpZiAvKiBBRVMgKi8gCi0gIAorICB1aW50MzJfdCB0ZW1wWzRdOyAgLyogVGVtcG9yYXJ5IENyeXBPdXRCdWZmICovCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgbnBibGI7CisgIHVpbnQzMl90IGk7CisjaWYgZGVmaW5lZChBRVMpCisgIHVpbnQxNl90IG91dGNvdW50OyAgLyogVGVtcG9yYXJ5IENyeXBPdXRDb3VudCBWYWx1ZSAqLworI2VuZGlmIC8qIEFFUyAqLworCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQYXlsb2FkIHBoYXNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICBpZihoY3J5cC0+U2l6ZSA9PSAwVSkKLSAgeyAgICAgCisKKyNpZiBkZWZpbmVkKENSWVApCisgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgewogICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkl8IENSWVBfSVRfT1VUSSk7Ci0gICAgCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwotICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAgIAotICB9ICAgIAotICAKLSAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZS80VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCi0gIHsgCisgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisgIH0KKworICBlbHNlIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkpID49IDRVKQorICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAKLSAgICBpZigoKGhjcnlwLT5TaXplLzRVKSA9PSBoY3J5cC0+Q3J5cEluQ291bnQpICYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpCi0gICAgeyAgICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBpZiAoKChoY3J5cC0+U2l6ZSAvIDRVKSA9PSBoY3J5cC0+Q3J5cEluQ291bnQpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgICAgCisKICAgICAgIC8qIENhbGwgdGhlIGlucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7CiAjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAgIH0gICAgCi0gICAgaWYoaGNyeXAtPkNyeXBPdXRDb3VudCA8IChoY3J5cC0+U2l6ZS80VSkpICAgICAgICAKKyAgICB9CisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPCAoaGNyeXAtPlNpemUgLyA0VSkpCiAgICAgewotICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciAgKi8gCi0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsgICAgICAKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgICAgCi0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAgCi0gICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSA9IHRlbXA7ICAgICAgCi0gICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gICAgICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgICAKLSAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpID0gdGVtcDsKLSAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgICAgIGlmICgoKGhjcnlwLT5TaXplLzRVKSA9PSBoY3J5cC0+Q3J5cE91dENvdW50KSYmKChoY3J5cC0+U2l6ZSAlMTZVICk9PSAwVSkpCi0gICAgICB7ICAgICAKKyAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCisgICAgICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgICAgICB7CisgICAgICAgIHRlbXBbaV0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgICB9CisgICAgICBpID0gMFU7CisgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDRVKSkKKyAgICAgIHsKKyAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICAgIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpID09IGhjcnlwLT5DcnlwT3V0Q291bnQpICYmICgoaGNyeXAtPlNpemUgJSAxNlUpID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9PVVRJKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgICAKKwogICAgICAgICAvKiBEaXNhYmxlIENSWVAgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDYWxsIG91dHB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICAgIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgCi0gICAgICB9ICAgIAotICAgIH0gICAgICAKLSAgfSAgIAotICBlbHNlIGlmICgoaGNyeXAtPlNpemUgJTE2VSApIT0gMFUpCi0gIHsgICAKLSAgICAvKiBTaXplIHNob3VsZCBiZSAlNCBpbiB3b3JkIGFuZCAlMTYgaW4gYnl0ZSAgb3RoZXJ3aXNlIFRBRyB3aWxsICBiZSBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24KLSAgICBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZiAKLSAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfQUVTR0NNX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQuICovCi0gICAgCi0gICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCi0gICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKLSAgICAKLSAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwotICAgIGlmICgobnBibGIlNFUpID09MFUpIAotICAgIHsgCi0gICAgICBsYXN0d29yZHNpemUgPSAoMTZVLW5wYmxiKS80VTsJCQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICAgIH0KICAgICB9Ci0gICAgZWxzZSAKKyAgfQorICBlbHNlIGlmICgoaGNyeXAtPlNpemUgJSAxNlUpICE9IDBVKQorICB7CisgICAgLyogU2l6ZSBzaG91bGQgYmUgJTQgaW4gd29yZCBhbmQgJTE2IGluIGJ5dGUgIG90aGVyd2lzZSBUQUcgd2lsbCAgYmUgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uCisgICAgV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YKKyAgICBwYXlsb2FkIDwxMjhiaXQgZG9uJ3QgdXNlIENSWVBfQUVTR0NNX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQuICovCisKKyAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpIC8gMTZVKSArIDFVKSAqIDE2VSkgLSAodWludDMyX3QpKGhjcnlwLT5TaXplKTsKKworICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCisgICAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKICAgICB7Ci0gICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICB9CQotICAgIAorICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgIH0KLSAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICB7IAotICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsgICAgICAgICAKKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsKICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgfQogICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9JTkkpOwotICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAKKworICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQogICAgIHsKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IDRVOyBsb29wY291bnRlcisrKSAgICAgICAgCi0gICAgICB7ICAKLSAgICAgICAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyICovCi0gICAgICAgIHRlbXA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgCi0gICAgICAgIAotICAgICAgICAvKmdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIgICovCi0gICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9dGVtcDsgCi0gICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgICAKLSAgICAgIH0gICAgIAotICAgIH0gICAgICAgICAKLSAgICBpZihoY3J5cC0+Q3J5cE91dENvdW50ID49ICAoaGNyeXAtPlNpemUvNFUpKQotICAgIHsgICAgICAgICAgICAgIAorICAgICAgZm9yIChpID0gMFU7IGkgPCA0VTsgaSsrKQorICAgICAgeworICAgICAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgICAgfQorICAgICAgaWYgKCgoaGNyeXAtPlNpemUpIC8gNFUpID09IDBVKQorICAgICAgeworICAgICAgICBmb3IgKGkgPSAwVTsgaSA8ICgodWludDMyX3QpKGhjcnlwLT5TaXplKSAlIDRVKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaSA9IDB4MFU7CisgICAgICB3aGlsZSAoKChoY3J5cC0+Q3J5cE91dENvdW50IDwgKChoY3J5cC0+U2l6ZSkgLyA0VSkpKSAmJiAoaSA8IDRVKSkKKyAgICAgIHsKKyAgICAgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gKGhjcnlwLT5TaXplIC8gNFUpKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX09VVEl8Q1JZUF9JVF9JTkkpOwotICAgICAgCisgICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfT1VUSSB8IENSWVBfSVRfSU5JKTsKKwogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBPdXRwdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKLSAgICB9ICAgCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgIH0KICNlbHNlIC8qIEFFUyAqLwotICAKLSAgLyogUmVhZCB0aGUgb3V0cHV0IGJsb2NrIGZyb20gdGhlIG91dHB1dCBGSUZPIGFuZCBwdXQgdGhlbSBpbiB0ZW1wb3JhcnkgYnVmZmVyIHRoZW4gZ2V0IENyeXBPdXRCdWZmIGZyb20gdGVtcG9yYXJ5IGJ1ZmZlciovIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPXRlbXA7Ci0gIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKLSAgdGVtcCAgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cE91dENvdW50KSAgID10ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgIAotICB0ZW1wICA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSB0ZW1wOyAgICAgIAotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7Ci0gIHRlbXAgID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsgCi0gICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIGhjcnlwLT5DcnlwT3V0Q291bnQpICAgPSB0ZW1wOwotICBoY3J5cC0+Q3J5cE91dENvdW50Kys7IAorCisgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyBhbmQgcHV0IHRoZW0gaW4gdGVtcG9yYXJ5IGJ1ZmZlciB0aGVuIGdldCBDcnlwT3V0QnVmZiBmcm9tIHRlbXBvcmFyeSBidWZmZXIqLworICBmb3IgKGkgPSAwVTsgaSA8IDRVOyBpKyspCisgIHsKKyAgICB0ZW1wW2ldID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgfQorICBpID0gMFU7CisgIHdoaWxlICgoaGNyeXAtPkNyeXBPdXRDb3VudCA8ICgoaGNyeXAtPlNpemUgKyAzVSkgLyA0VSkpICYmIChpIDwgNFUpKQorICB7CisgICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgaGNyeXAtPkNyeXBPdXRDb3VudCkgPSB0ZW1wW2ldOworICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICBpKys7CisgIH0KICAgLypUZW1wb3JhcnkgQ3J5cE91dENvdW50IFZhbHVlKi8KICAgb3V0Y291bnQgPSBoY3J5cC0+Q3J5cE91dENvdW50OwotICAKLSAgaWYoKGhjcnlwLT5DcnlwT3V0Q291bnQgPj0gIChoY3J5cC0+U2l6ZS80VSkpICYmICgob3V0Y291bnQqNFUpID49ICBoY3J5cC0+U2l6ZSkgKQorCisgIGlmICgoaGNyeXAtPkNyeXBPdXRDb3VudCA+PSAoaGNyeXAtPlNpemUgLyA0VSkpICYmICgob3V0Y291bnQgKiA0VSkgPj0gIGhjcnlwLT5TaXplKSkKICAgewogICAgIC8qIERpc2FibGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBhbmQgZXJyb3JzIGludGVycnVwdHMgKi8KLSAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsQ1JZUF9JVF9DQ0ZJRXxDUllQX0lUX0VSUklFKTsKLSAgICAKKyAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUUgfCBDUllQX0lUX0VSUklFKTsKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgIAorCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgCi0gICAgICAgIC8qIENhbGwgb3V0cHV0IHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCi0gICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCi0gICAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2soaGNyeXApOworCisgICAgLyogQ2FsbCBvdXRwdXQgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgIC8qQ2FsbCByZWdpc3RlcmVkIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQotICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgT3V0cHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KLSAgICAgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAKLSAgfSAgIAotICAKLSAgZWxzZSBpZiAoKChoY3J5cC0+U2l6ZS80VSkgLSAoaGNyeXAtPkNyeXBJbkNvdW50KSkgPj0gNFUpCi0gIHsgCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIE91dHB1dCBjb21wbGV0ZSBjYWxsYmFjayovCisgICAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKworICBlbHNlIGlmICgoKGhjcnlwLT5TaXplIC8gNFUpIC0gKGhjcnlwLT5DcnlwSW5Db3VudCkpID49IDRVKQorICB7CiAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOyAgCi0gICAgaWYoKGhjcnlwLT5DcnlwSW5Db3VudCA9PSAgaGNyeXAtPlNpemUpICYmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpKQotICAgIHsgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOworICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09ICBoY3J5cC0+U2l6ZSkgJiYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykpCisgICAgewogICAgICAgLyogQ2FsbCBJbnB1dCB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAorI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBJbnB1dCBjb21wbGV0ZSBjYWxsYmFjayovCiAgICAgICBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAgICAgIAotICAgIH0gCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KICAgfQogICBlbHNlIC8qIExhc3QgYmxvY2sgb2YgcGF5bG9hZCA8IDEyOGJpdCovCi0gIHsgICAgCisgIHsKICAgICAvKiBXb3JrYXJvdW5kIG5vdCBpbXBsZW1lbnRlZCwgU2l6ZSBzaG91bGQgYmUgJTQgIG90aGVyd2lzZSBUYWcgd2lsbCAgYmUgaW5jb3JyZWN0bHkKLSAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uICYgQ0NNIERlY3J5cHRpb24uIFdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQgaW4gcG9sbGluZyBtb2RlLCBzbyBpZiBsYXN0IGJsb2NrIG9mIAotICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiAqLyAgCi0gICAgCisgICAgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgorICAgIHBheWxvYWQgPDEyOGJpdCBkb24ndCB1c2UgQ1JZUF9FbmNyeXB0X0lUIG90aGVyd2lzZSBUQUcgaXMgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbiAmIENDTSBEZWNyeXB0aW9uLiAqLworCiAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovCi0gICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7Ci0gCi0gICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCB3b3JkcyAobGFzdHdvcmRzaXplKSBpbiBsYXN0IGJsb2NrICovCi0gICAgaWYgKChucGJsYiU0VSkgPT0wVSkgCi0gICAgeyAKLSAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCisgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKKyAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLworICAgIGlmICgobnBibGIgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgbGFzdHdvcmRzaXplID0gKDE2VSAtIG5wYmxiKSAvIDRVOwogICAgIH0KLSAgICBlbHNlIAorICAgIGVsc2UKICAgICB7Ci0gICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICB9CQotICAgIAorICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICB9CisKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgZm9yIChsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IGxhc3R3b3Jkc2l6ZTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOwogICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDwgNFUgKQotICAgIHsgCi0gICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8gICAgIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsgICAgICAgICAKKyAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICB7CisgICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICBsb29wY291bnRlcisrOwogICAgIH0KLSAgfSAKLSNlbmRpZiAvKiBBRVMgKi8gCisgIH0KKyNlbmRpZiAvKiBBRVMgKi8KIAotfSAKK30KIAogCiAvKioKICAgKiBAYnJpZWYgIFNldHMgdGhlIGhlYWRlciBwaGFzZSBpbiBwb2xsaW5nIG1vZGUKICAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUgICAKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIHN0YXRlCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2UoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIAorCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgcGhhc2UgZm9yIEdDTS9HTUFDIG9yIENDTSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotICBpZigoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAhPSAwVSkpCisKKyAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKICAgewotICAgIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICAgIAorCisjaWYgZGVmaW5lZChDUllQKQorCiAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLwotICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgIAorICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7CisKICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgICAgCi0gICAgCi0gICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApPT0gMFUpCi0gICAgeyAKLSAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8gCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIAotICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLwotICAgICAgICBpZihDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgICAgeyAKLSAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgIAotICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgIAotICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKS0oaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSkpOyBsb29wY291bnRlcis9IDRVKQotICAgICAgeyAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICAKLSAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KLSAgICAgICAgaWYoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCi0gICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpOyBsb29wY291bnRlcisrKQotICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgCi0gICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQotICAgICAgeyAKLSAgICAgICAgLyogcGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOyAgICAgICAgIAotICAgICAgICBsb29wY291bnRlcisrOwotICAgICAgfQotICAgICAgLyogV2FpdCBmb3IgQ0NGIElGRU0gdG8gYmUgcmFpc2VkICovCi0gICAgICBpZihDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgIHsgCi0gICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwotICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKLSAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgICAgfSAgICAgICAgICAKLSAgICB9ICAgICAKLSAgICAvKiBXYWl0IHVudGlsIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgIHsgCi0gICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKLSAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgIAotICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLwotICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgICAgICAgICAgCi0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KLSAgICAKLSNlbHNlIC8qIEFFUyAqLyAKLSAgICAKLSAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOworCisgICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpID09IDBVKQogICAgIHsKLSAgICAgIC8qIFdvcmthcm91bmQgMSA6b25seSBBRVMgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAotICAgICAgCi0gICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOwotICAgICAgCi0gICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwotICAgICAgCi0gICAgfQotICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKT09IDBVKQotICAgIHsgICAgIAotICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLyAKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPSA0VSkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCi0gICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCi0gICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKKyAgICAgIC8qIEhlYWRlclNpemUgJTQsIG5vIHBhZGRpbmcgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICAgewotICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIAotICAgICAgICBpZihDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgICAgIHsgCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKiBXYWl0IGZvciBJRkVNIHRvIGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoQ1JZUF9XYWl0T25JRkVNRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLypXcml0ZSBoZWFkZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8gd2l0aG91dCBsYXN0IGJsb2NrICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8ICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgLSAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSkpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCisgICAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCisgICAgICAgIGlmIChDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIHsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgfQorICAgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgICB7CisgICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7CisgICAgICAgIGxvb3Bjb3VudGVyKys7CisgICAgICB9CisgICAgICAvKiBXYWl0IGZvciBDQ0YgSUZFTSB0byBiZSByYWlzZWQgKi8KKyAgICAgIGlmIChDUllQX1dhaXRPbklGRU1GbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLworICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKyAgICB9CisgICAgLyogV2FpdCB1bnRpbCB0aGUgY29tcGxldGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KKyAgICBpZiAoQ1JZUF9XYWl0T25CVVNZRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKKworICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAmIHJldHVybiBlcnJvciAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisjZWxzZSAvKiBBRVMgKi8KKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgeworICAgICAgLyogV29ya2Fyb3VuZCAxIDpvbmx5IEFFUyBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLworICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsKKworICAgICAgLyogU2VsZWN0IGhlYWRlciBwaGFzZSAqLworICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKworICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KKyAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKworICAgIH0KKyAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgZGF0YSBpbnB1dCByZWdpc3RlciAqLworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLworICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CisKKyAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KKyAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAKKyAgICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQorICAgICAgeworICAgICAgICAvKiBXcml0ZSB0aGUgaW5wdXQgYmxvY2sgaW4gdGhlIGRhdGEgaW5wdXQgcmVnaXN0ZXIgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgaWYgKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KKyAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOworCisgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCisgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOworICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLworICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgIH0KICAgICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKTsgbG9vcGNvdW50ZXIrKykKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpOyBsb29wY291bnRlcisrKQogICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAgICAgIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwogICAgICAgfQotICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPCA0VSApCi0gICAgICB7IAotICAgICAgICAvKlBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgICAgICAgCisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLypQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgICAgbG9vcGNvdW50ZXIrKzsKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICAgIHsgCisgICAgICB9CisKKyAgICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgIAotICAgIH0gICAgICAKLSNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8gCisgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKKyAgICB9CisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAgIH0KICAgZWxzZQogICB7Ci0jaWYgZGVmaW5lZChBRVMpIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKLSAgICB7IAorI2lmIGRlZmluZWQoQUVTKQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgewogICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7CisKICAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgICAgCisgICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCiAgICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSNlbmRpZiAvKiBBRVMgKi8gICAgIAorI2VuZGlmIC8qIEFFUyAqLwogICB9CiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKQEAgLTUyMzMsMTA3ICs1ODM5LDEwNSBAQAogLyoqCiAgICogQGJyaWVmICBTZXRzIHRoZSBoZWFkZXIgcGhhc2Ugd2hlbiB1c2luZyBETUEgaW4gcHJvY2VzcwogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZShIZWFkZXIgJiBIZWFkZXJTaXplKSAgCisgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUoSGVhZGVyICYgSGVhZGVyU2l6ZSkKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0dDTUNDTV9TZXRIZWFkZXJQaGFzZV9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgX19JTyB1aW50MzJfdCBjb3VudCAgPSAwVTsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0gIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgCi0gIGlmKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICE9IDBVKSkKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIHBoYXNlIGZvciBHQ00vR01BQyBvciBDQ00gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgIT0gMFUpKQogICB7Ci0gICAgCi0jaWYgZGVmaW5lZChDUllQKSAgCi0gICAgCisKKyNpZiBkZWZpbmVkKENSWVApCisKICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsgCi0gICAgCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKwogICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCi0gICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOyAgICAKLSAgICAKLSAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICk9PSAwVSkKLSAgICB7IAotICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLyAKLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIrPTRVKQotICAgICAgeyAgICAgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CisKKyAgICBpZiAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkgPT0gMFUpCisgICAgeworICAgICAgLyogSGVhZGVyU2l6ZSAlNCwgbm8gcGFkZGluZyAqLworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCBoY3J5cC0+SW5pdC5IZWFkZXJTaXplKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgCisKICAgICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KICAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgIGRvCiAgICAgICAgIHsKICAgICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICAgewogICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7ICAgICAgICAKKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKKyAgICB7CiAgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKLSAgICAgIHsgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSkpKTsgbG9vcGNvdW50ZXIgKz0gNFUpCisgICAgICB7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7IAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOwotICAgICAgICAKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworCiAgICAgICAgIC8qIFdhaXQgZm9yIElGRU0gdG8gYmUgcmFpc2VkICovCiAgICAgICAgIGNvdW50ID0gQ1JZUF9USU1FT1VUX0dDTUNDTUhFQURFUlBIQVNFOwogICAgICAgICBkbwogICAgICAgICB7CiAgICAgICAgICAgY291bnQtLSA7Ci0gICAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsgCisgICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7CiAgICAgICB9CiAgICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKSk7IGxvb3Bjb3VudGVyKyspCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKTsgbG9vcGNvdW50ZXIrKykKICAgICAgIHsKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAgIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8IDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMHgwVTsgICAgICAgICAKKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAweDBVOwogICAgICAgICBsb29wY291bnRlcisrOwogICAgICAgfQogICAgICAgLyogV2FpdCBmb3IgSUZFTSB0byBiZSByYWlzZWQgKi8KQEAgLTUzNDEsMTg5ICs1OTQ1LDE4NCBAQAogICAgICAgZG8KICAgICAgIHsKICAgICAgICAgY291bnQtLSA7Ci0gICAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgIHsKICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgIAorCiAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAKLSAgICAgICAgICAKLSAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAorICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgfQotICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0lGRU0pKTsgICAgICAgICAKLSAgICB9ICAgICAKKyAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSk7CisgICAgfQogICAgIC8qIFdhaXQgdW50aWwgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkICovCiAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgZG8KICAgICB7CiAgICAgICBjb3VudC0tIDsKLSAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgaWYgKGNvdW50ID09IDBVKQogICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAKLSAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUoSEFMX0lTX0JJVF9TRVQoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX0JVU1kpKTsgICAgIAotICAgIAotI2Vsc2UgLyogQUVTICovIAotICAgIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKKyAgICB9IHdoaWxlIChIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpOworCisjZWxzZSAvKiBBRVMgKi8KKworICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCiAgICAgewogICAgICAgLyogV29ya2Fyb3VuZCAxOiBvbmx5IEFFUywgYmVmb3JlIHJlLWVuYWJsaW5nIHRoZSBJUCwgZGF0YXR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQuKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7IAotICAgICAgCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRSwgaGNyeXAtPkluaXQuRGF0YVR5cGUpOworCiAgICAgICAvKiBTZWxlY3QgaGVhZGVyIHBoYXNlICovCi0gICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOyAKLSAgICAgIAorICAgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfSEVBREVSKTsKKwogICAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKICAgICB9Ci0gICAgaWYgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApPT0gMFUpCi0gICAgeyAgICAgCi0gICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovIAotICAgICAgZm9yKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlcis9NFUpCi0gICAgICB7ICAgICAgIAorICAgIGlmICgoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSA9PSAwVSkKKyAgICB7CisgICAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IChsb29wY291bnRlciA8IGhjcnlwLT5Jbml0LkhlYWRlclNpemUpOyBsb29wY291bnRlciArPSA0VSkKKyAgICAgIHsKICAgICAgICAgLyogV3JpdGUgdGhlIGlucHV0IGJsb2NrIGluIHRoZSBkYXRhIGlucHV0IHJlZ2lzdGVyICovCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7ICAKLSAgICAgICAgCi0gICAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAorICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKworICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLwogICAgICAgICBjb3VudCA9IENSWVBfVElNRU9VVF9HQ01DQ01IRUFERVJQSEFTRTsKICAgICAgICAgZG8KICAgICAgICAgewogICAgICAgICAgIGNvdW50LS0gOwotICAgICAgICAgIGlmKGNvdW50ID09IDBVKQorICAgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgICB7CiAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOwotICAgICAgICAKKyAgICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCiAgICAgICAgIC8qIENsZWFyIENDRiBmbGFnICovCi0gICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOyAgICAgICAgIAorICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZQotICAgIHsgICAKKyAgICB7CiAgICAgICAvKldyaXRlIGhlYWRlciBibG9jayBpbiB0aGUgSU4gRklGTyB3aXRob3V0IGxhc3QgYmxvY2sgKi8KLSAgICAgIGZvcihsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpLShoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApKSk7IGxvb3Bjb3VudGVyKz00VSkKKyAgICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKChoY3J5cC0+SW5pdC5IZWFkZXJTaXplKSAtIChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICUgNFUpKSk7IGxvb3Bjb3VudGVyICs9IDRVKQogICAgICAgewogICAgICAgICAvKiBXcml0ZSB0aGUgSW5wdXQgYmxvY2sgaW4gdGhlIERhdGEgSW5wdXQgcmVnaXN0ZXIgKi8KLSAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgIAotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwotICAgICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgOyAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgCi0gICAgICAgIAotICAgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLyAKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CisKKyAgICAgICAgLypXYWl0IG9uIENDRiBmbGFnKi8KICAgICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICAgIGRvCiAgICAgICAgIHsKICAgICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgICBpZihjb3VudCA9PSAwVSkKKyAgICAgICAgICBpZiAoY291bnQgPT0gMFUpCiAgICAgICAgICAgewogICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIGNsb2NrICovCiAgICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovICAgICAgICAgIAotICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgICAgCisgICAgICAgIH0gd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKKwogICAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICAgICAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgICAgCisgICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAgfQogICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgKGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJTRVICkpOyBsb29wY291bnRlcisrKQorICAgICAgZm9yIChsb29wY291bnRlciA9IDBVOyAobG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKSk7IGxvb3Bjb3VudGVyKyspCiAgICAgICB7Ci0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKLSAgICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgICB9Ci0gICAgICB3aGlsZShsb29wY291bnRlciA8NFUgKQotICAgICAgeyAKLSAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovICAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgICAgICAKKyAgICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgICAgeworICAgICAgICAvKiBQYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KKyAgICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgICAgbG9vcGNvdW50ZXIrKzsKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIC8qV2FpdCBvbiBDQ0YgZmxhZyovIAorICAgICAgfQorCisgICAgICAvKldhaXQgb24gQ0NGIGZsYWcqLwogICAgICAgY291bnQgPSBDUllQX1RJTUVPVVRfR0NNQ0NNSEVBREVSUEhBU0U7CiAgICAgICBkbwogICAgICAgewogICAgICAgICBjb3VudC0tIDsKLSAgICAgICAgaWYoY291bnQgPT0gMFUpCisgICAgICAgIGlmIChjb3VudCA9PSAwVSkKICAgICAgICAgewogICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKTsKLSAgICAgIAorICAgICAgfSB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpOworCiAgICAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwotICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7ICAKLSAgICB9ICAgICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICAqLyAKKyAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworICAgIH0KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCiAgIH0KICAgZWxzZQogICB7Ci0jaWYgZGVmaW5lZChBRVMpIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKLSAgICB7IAorI2lmIGRlZmluZWQoQUVTKQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgewogICAgICAgLypXb3JrYXJvdW5kIDE6IG9ubHkgQUVTLCBiZWZvcmUgcmUtZW5hYmxpbmcgdGhlIElQLCBkYXRhdHlwZSBjYW4gYmUgY29uZmlndXJlZC4qLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEUsIGhjcnlwLT5Jbml0LkRhdGFUeXBlKTsgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0RBVEFUWVBFLCBoY3J5cC0+SW5pdC5EYXRhVHlwZSk7CisKICAgICAgIC8qIFNlbGVjdCBoZWFkZXIgcGhhc2UgKi8KLSAgICAgIENSWVBfU0VUX1BIQVNFKGhjcnlwLCBDUllQX1BIQVNFX0hFQURFUik7IAotICAgICAgCisgICAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9IRUFERVIpOworCiAgICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSNlbmRpZiAvKiBBRVMgKi8gICAgIAorI2VuZGlmIC8qIEFFUyAqLwogICB9CiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKQEAgLTU1MzgsNjQ4ICs2MTM3LDc3MyBAQAogc3RhdGljIHZvaWQgQ1JZUF9HQ01DQ01fU2V0SGVhZGVyUGhhc2VfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKICAgdWludDMyX3QgbG9vcGNvdW50ZXI7Ci0jaWYgZGVmaW5lZChBRVMpIAotICB1aW50MzJfdCBsYXN0d29yZHNpemU7IAotICB1aW50MzJfdCBucGJsYjsJCi0jZW5kaWYgCisjaWYgZGVmaW5lZChBRVMpCisgIHVpbnQzMl90IGxhc3R3b3Jkc2l6ZTsKKyAgdWludDMyX3QgbnBibGI7CisjZW5kaWYKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEhlYWRlciBwaGFzZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIAotI2lmIGRlZmluZWQoQ1JZUCkgIAotICBpZihoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQotICB7ICAgICAKKworI2lmIGRlZmluZWQoQ1JZUCkKKyAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCisgIHsKICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfSU5JICk7Ci0gICAgCisgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSk7CisKICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgIAorCiAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgIGhjcnlwLT5QaGFzZSA9IENSWVBfUEhBU0VfUFJPQ0VTUzsKLSAgICAKKwogICAgIC8qIFNlbGVjdCBwYXlsb2FkIHBoYXNlIG9uY2UgdGhlIGhlYWRlciBwaGFzZSBpcyBwZXJmb3JtZWQgKi8KLSAgICBDUllQX1NFVF9QSEFTRShoY3J5cCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsgCi0gICAgCisgICAgQ1JZUF9TRVRfUEhBU0UoaGNyeXAsIENSWVBfUEhBU0VfUEFZTE9BRCk7CisKICAgICAvKiBFbmFibGUgSW50ZXJydXB0cyAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSApOwotICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFX0lUKGhjcnlwLCBDUllQX0lUX0lOSSB8IENSWVBfSVRfT1VUSSk7CisKICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwotICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsgIAotICB9ICAgIAorICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKKyAgfQogICBlbHNlIGlmICgoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpKSA+PSA0VSkKLSAgICAKLSAgeyAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovICAgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgCi0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrICA7ICAgICAgIAotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworCisgIHsKKyAgICAvKiBIZWFkZXJTaXplICU0LCBubyBwYWRkaW5nICovCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOwogICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90KikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7Ci0gICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsgICAgICAgICAgIAorICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKKyAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KysgIDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrIDsKICAgfQogICBlbHNlCi0gIHsgICAgICAKKyAgewogICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLwotICAgIGZvcihsb29wY291bnRlciA9IDBVOyBsb29wY291bnRlciA8IChoY3J5cC0+SW5pdC5IZWFkZXJTaXplICU0VSApOyBsb29wY291bnRlcisrKQorICAgIGZvciAobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlIDRVKTsgbG9vcGNvdW50ZXIrKykKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShoY3J5cC0+SW5pdC5IZWFkZXIrIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgeyAKLSAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7ICAgICAgICAgCisgICAgd2hpbGUgKGxvb3Bjb3VudGVyIDwgNFUpCisgICAgeworICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDB4MFU7CiAgICAgICBsb29wY291bnRlcisrOwotICAgIH0gICAgICAgICAKLSAgfSAgICAgICAgICAKLSNlbHNlIC8qIEFFUyAqLyAgCi0gIAotICBpZihoY3J5cC0+SW5pdC5IZWFkZXJTaXplID09ICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KQorICAgIH0KKyAgfQorI2Vsc2UgLyogQUVTICovCisKKyAgaWYgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgPT0gIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpCiAgIHsKICAgICAvKiBTZXQgdGhlIHBoYXNlICovCiAgICAgaGNyeXAtPlBoYXNlID0gQ1JZUF9QSEFTRV9QUk9DRVNTOwotICAgIAorCiAgICAgLyogIFBheWxvYWQgcGhhc2Ugbm90IHN1cHBvcnRlZCBpbiBDQ00gQUVTMiAgKi8KLSAgICBpZihoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfR0NNX0dNQUMpCisgICAgaWYgKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19HQ01fR01BQykKICAgICB7CiAgICAgICAvKiBTZWxlY3QgcGF5bG9hZCBwaGFzZSBvbmNlIHRoZSBoZWFkZXIgcGhhc2UgaXMgcGVyZm9ybWVkICovCiAgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9QQVlMT0FEKTsKLSAgICB9ICAgIAotICAgIGlmKGhjcnlwLT5Jbml0LkFsZ29yaXRobSA9PSBDUllQX0FFU19DQ00pCisgICAgfQorICAgIGlmIChoY3J5cC0+SW5pdC5BbGdvcml0aG0gPT0gQ1JZUF9BRVNfQ0NNKQogICAgIHsKICAgICAgIC8qIEluY3JlbWVudCBDcnlwSGVhZGVyQ291bnQgdG8gcGFzcyBpbiBDUllQX0dDTUNDTV9TZXRQYXlsb2FkUGhhc2VfSVQgKi8KLSAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAgCi0gICAgfSAgICAgICAgICAgIAotICAgIC8qIFdyaXRlIHRoZSBwYXlsb2FkIElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovIAotICAgIGlmKGhjcnlwLT5TaXplID09IDBVKQotICAgIHsgICAgIAorICAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIH0KKyAgICAvKiBXcml0ZSB0aGUgcGF5bG9hZCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLworICAgIGlmIChoY3J5cC0+U2l6ZSA9PSAwVSkKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLSAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRXwgQ1JZUF9JVF9FUlJJRSk7Ci0gICAgICAKKyAgICAgIF9fSEFMX0NSWVBfRElTQUJMRV9JVChoY3J5cCwgQ1JZUF9JVF9DQ0ZJRSB8IENSWVBfSVRfRVJSSUUpOworCiAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0gICAgfSAgICAgICAgICAgIAorICAgIH0KICAgICBlbHNlIGlmIChoY3J5cC0+U2l6ZSA+PSAxNlUpCi0gICAgeyAgICAgICAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIHsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOwotICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7ICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgICAgCi0gICAgICBpZigoaGNyeXAtPkNyeXBJbkNvdW50ID09ICAoaGNyeXAtPlNpemUvNFUpKSAmJigoaGNyeXAtPlNpemUgJTE2VSApPT0gMFUpKSAgICAgICAKLSAgICAgIHsgICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQpOworICAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7CisKKyAgICAgIGlmICgoaGNyeXAtPkNyeXBJbkNvdW50ID09IChoY3J5cC0+U2l6ZSAvIDRVKSkgJiYgKChoY3J5cC0+U2l6ZSAlIDE2VSkgPT0gMFUpKQorICAgICAgewogICAgICAgICAvKiBDYWxsIHRoZSBpbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkgCisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgSW5wdXQgY29tcGxldGUgY2FsbGJhY2sqLwogICAgICAgICBoY3J5cC0+SW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2Vsc2UKICAgICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIElucHV0IGNvbXBsZXRlIGNhbGxiYWNrKi8KICAgICAgICAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soaGNyeXApOwogI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIH0gCisgICAgICB9CiAgICAgfQogICAgIGVsc2UgLyogU2l6ZSA8IDQgd29yZHMgIDogZmlyc3QgYmxvY2sgaXMgdGhlIGxhc3QgYmxvY2sqLwogICAgIHsKICAgICAgIC8qIFdvcmthcm91bmQgbm90IGltcGxlbWVudGVkLCBTaXplIHNob3VsZCBiZSAlNCAgb3RoZXJ3aXNlIFRhZyB3aWxsICBiZSBpbmNvcnJlY3RseQotICAgICAgZ2VuZXJhdGVkIGZvciBHQ00gRW5jcnlwdGlvbi4gV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBpbiBwb2xsaW5nIG1vZGUsIHNvIGlmIGxhc3QgYmxvY2sgb2YgCisgICAgICBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGluIHBvbGxpbmcgbW9kZSwgc28gaWYgbGFzdCBibG9jayBvZgogICAgICAgcGF5bG9hZCA8MTI4Yml0IGRvbid0IHVzZSBDUllQX0VuY3J5cHRfSVQgb3RoZXJ3aXNlIFRBRyBpcyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIEdDTSBFbmNyeXB0aW9uLiAqLwotICAgICAgCisKICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGluIGxhc3QgYmxvY2sgb2YgcGF5bG9hZCAqLwotICAgICAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKS8xNlUpKzFVKSoxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7Ci0gICAgICAKKyAgICAgIG5wYmxiID0gKCgoKHVpbnQzMl90KShoY3J5cC0+U2l6ZSkgLyAxNlUpICsgMVUpICogMTZVKSAtICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOworCiAgICAgICAvKiBOdW1iZXIgb2YgdmFsaWQgd29yZHMgKGxhc3R3b3Jkc2l6ZSkgaW4gbGFzdCBibG9jayAqLwotICAgICAgaWYgKChucGJsYiAlIDRVKSA9PTBVKSAKLSAgICAgIHsgCi0gICAgICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUtbnBibGIpLzRVOwkJCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDBVKQorICAgICAgeworICAgICAgICBsYXN0d29yZHNpemUgPSAoMTZVIC0gbnBibGIpIC8gNFU7CiAgICAgICB9Ci0gICAgICBlbHNlIAorICAgICAgZWxzZQogICAgICAgewotICAgICAgICBsYXN0d29yZHNpemUgPSAoKDE2VS1ucGJsYikvNFUpICsxVTsKLSAgICAgIH0JCi0gICAgICAKKyAgICAgICAgbGFzdHdvcmRzaXplID0gKCgxNlUgLSBucGJsYikgLyA0VSkgKyAxVTsKKyAgICAgIH0KKwogICAgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCi0gICAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCBsYXN0d29yZHNpemU7IGxvb3Bjb3VudGVyKyspCisgICAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgbGFzdHdvcmRzaXplOyBsb29wY291bnRlcisrKQogICAgICAgewotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwogICAgICAgfQotICAgICAgd2hpbGUobG9vcGNvdW50ZXIgPDRVICkKLSAgICAgIHsgCi0gICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7ICAgICAgICAgCisgICAgICB3aGlsZSAobG9vcGNvdW50ZXIgPCA0VSkKKyAgICAgIHsKKyAgICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDB4MFU7CiAgICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgICB9CiAgICAgfQotICB9ICAKKyAgfQogICBlbHNlIGlmICgoKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpIC0gKGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpKSA+PSA0VSkKLSAgeyAKKyAgewogICAgIC8qIFdyaXRlIHRoZSBpbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKKyAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7Ci0gICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCApOwotICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsgICAKLSAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50ICk7CisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CiAgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQgKTsKLSAgICBoY3J5cC0+Q3J5cEhlYWRlckNvdW50Kys7ICAgICAgICAgCisgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QgKikoaGNyeXAtPkluaXQuSGVhZGVyICsgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCk7CisgICAgaGNyeXAtPkNyeXBIZWFkZXJDb3VudCsrOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOworICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKzsKICAgfQogICBlbHNlIC8qSGVhZGVyU2l6ZSA8IDQgb3IgSGVhZGVyU2l6ZSA+NCAmIEhlYWRlclNpemUgJTQgIT0gMCovCi0gIHsgCisgIHsKICAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KLSAgICBmb3IobG9vcGNvdW50ZXIgPSAwVTsgbG9vcGNvdW50ZXIgPCAoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSAlNFUgKTsgbG9vcGNvdW50ZXIrKykKKyAgICBmb3IgKGxvb3Bjb3VudGVyID0gMFU7IGxvb3Bjb3VudGVyIDwgKGhjcnlwLT5Jbml0LkhlYWRlclNpemUgJSA0VSk7IGxvb3Bjb3VudGVyKyspCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGhjcnlwLT5Jbml0LkhlYWRlciArIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQpOyAgIAorICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShoY3J5cC0+SW5pdC5IZWFkZXIgKyBoY3J5cC0+Q3J5cEhlYWRlckNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSGVhZGVyQ291bnQrKyA7CiAgICAgfQotICAgIHdoaWxlKGxvb3Bjb3VudGVyIDw0VSApCi0gICAgeyAKLSAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLyAgICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAweDBVOyAgICAgICAgIAorICAgIHdoaWxlIChsb29wY291bnRlciA8IDRVKQorICAgIHsKKyAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMHgwVTsKICAgICAgIGxvb3Bjb3VudGVyKys7CiAgICAgfQotICB9ICAgICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotfSAgICAgICAgICAgCisgIH0KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KK30KIAogCiAvKioKLSAgKiBAYnJpZWYgIFdvcmthcm91bmQgdXNlZCBmb3IgR0NNL0NDTSBtb2RlLiAKKyAgKiBAYnJpZWYgIFdvcmthcm91bmQgdXNlZCBmb3IgR0NNL0NDTSBtb2RlLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQotICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlIAorICAqIEBwYXJhbSAgVGltZW91dDogc3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCApCitzdGF0aWMgdm9pZCBDUllQX1dvcmthcm91bmQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgbGFzdHdvcmRzaXplOwotICB1aW50MzJfdCBucGJsYjsJICAKLSNpZiBkZWZpbmVkKENSWVApIAorICB1aW50MzJfdCBucGJsYjsKKyNpZiBkZWZpbmVkKENSWVApCiAgIHVpbnQzMl90ICBpdjF0ZW1wOwogICB1aW50MzJfdCAgdGVtcFs0XSA9IHswfTsKLSAgdWludDMyX3QgIHRlbXAyWzRdPSB7MH07CisgIHVpbnQzMl90ICB0ZW1wMls0XSA9IHswfTsKICNlbmRpZiAvKiBDUllQICovCi0gIHVpbnQzMl90IGludGVybWVkaWF0ZV9kYXRhWzRdPXswfTsKKyAgdWludDMyX3QgaW50ZXJtZWRpYXRlX2RhdGFbNF0gPSB7MH07CiAgIHVpbnQzMl90IGluZGV4OwotICAKLSAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaW4gbGFzdCBibG9jayBvZiBwYXlsb2FkICovIAotICBucGJsYiA9ICgoKCh1aW50MzJfdCkoaGNyeXAtPlNpemUpLzE2VSkrMVUpKjE2VSktICh1aW50MzJfdCkoaGNyeXAtPlNpemUpOwotICAKKworICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpbiBsYXN0IGJsb2NrIG9mIHBheWxvYWQgKi8KKyAgbnBibGIgPSAoKCgodWludDMyX3QpKGhjcnlwLT5TaXplKSAvIDE2VSkgKyAxVSkgKiAxNlUpIC0gKHVpbnQzMl90KShoY3J5cC0+U2l6ZSk7CisKICAgLyogTnVtYmVyIG9mIHZhbGlkIHdvcmRzIChsYXN0d29yZHNpemUpIGluIGxhc3QgYmxvY2sgKi8KLSAgaWYgKChucGJsYiU0VSkgPT0wVSkgCi0gIHsgbGFzdHdvcmRzaXplID0gKDE2VS1ucGJsYikvNFU7CQkKKyAgaWYgKChucGJsYiAlIDRVKSA9PSAwVSkKKyAgeworICAgIGxhc3R3b3Jkc2l6ZSA9ICgxNlUgLSBucGJsYikgLyA0VTsKICAgfQotICBlbHNlIAotICB7bGFzdHdvcmRzaXplID0gKCgxNlUtbnBibGIpLzRVKSArMVU7CisgIGVsc2UKKyAgeworICAgIGxhc3R3b3Jkc2l6ZSA9ICgoMTZVIC0gbnBibGIpIC8gNFUpICsgMVU7CiAgIH0KLSAgCi0jaWYgZGVmaW5lZChDUllQKSAgICAJCi0gIAorCisjaWYgZGVmaW5lZChDUllQKQorCiAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBHQ00gZW5jcnlwdGlvbiAqLwogICBpZiAoaGNyeXAtPkluaXQuQWxnb3JpdGhtID09IENSWVBfQUVTX0dDTSkKICAgewotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKLSAgICB7LypXb3JrYXJvdW5kIGluIG9yZGVyIHRvIHByb3Blcmx5IGNvbXB1dGUgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZwotICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCkKKyAgICB7CisgICAgICAvKldvcmthcm91bmQgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZSBhdXRoZW50aWNhdGlvbiB0YWdzIHdoaWxlIGRvaW5nCisgICAgICAgYSBHQ00gZW5jcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCiAgICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKkxvYWQgQ1JZUF9JVjFSIHJlZ2lzdGVyIGNvbnRlbnQgaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUuIERlY3JlbWVudCB0aGUgdmFsdWUKLSAgICAgIGJ5IDEgYW5kIHJlaW5zZXJ0IHRoZSByZXN1bHQgaW4gQ1JZUF9JVjFSIHJlZ2lzdGVyKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAweDVVOwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19DVFIpOyAKLSAgICAgIAorCisgICAgICAvKlVwZGF0ZSBDUllQX0lWMVIgcmVnaXN0ZXIgYW5kIEFMR09NT0RFKi8KKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+SVYxUlIgPSAoKGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ003UikgLSAxVSk7CisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0NUUik7CisKICAgICAgIC8qIEVuYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgICAgX19IQUxfQ1JZUF9FTkFCTEUoaGNyeXApOwogICAgIH0KLSAgICAvKiAgTGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gICAgCi0gICAgZm9yKGluZGV4PTA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykgICAgICAgIAorICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICAgewogICAgICAgLyogV3JpdGUgdGhlIGxhc3QgaW5wdXQgYmxvY2sgaW4gdGhlIElOIEZJRk8gKi8KLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50ICk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgICBoY3J5cC0+Q3J5cEluQ291bnQrKzsKLSAgICB9ICAgIAotICAgIHdoaWxlKGluZGV4IDwgNFUpCisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IDRVKQogICAgIHsKICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gMFU7Ci0gICAgICBpbmRleCsrOyAKLSAgICB9ICAgCisgICAgICBpbmRleCsrOworICAgIH0KICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gICAgaWYoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKSAgCi0gICAgeyAKKyAgICBpZiAoQ1JZUF9XYWl0T25PRk5FRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAKKyAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCisgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOworI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCiAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiAjZWxzZQogICAgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KICAgICAgIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2soaGNyeXApOwotI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gCi0gICAgfSAgICAKLSAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FICkgIT0gMHgwVSkKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQogICAgIHsKLSAgICAgIGZvcihpbmRleD0wVTsgaW5kZXg8IDRVO2luZGV4KyspICAgICAgICAKLSAgICAgIHsgCisgICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCisgICAgICB7CiAgICAgICAgIC8qIFJlYWQgdGhlIG91dHB1dCBibG9jayBmcm9tIHRoZSBvdXRwdXQgRklGTyAqLwotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7IAotICAgICAgICAKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworCiAgICAgICAgIC8qIEludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluIGZvciB0aGUgd29ya2Fyb3VuZCovCi0gICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSk9aW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwotICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7ICAgCi0gICAgICB9ICAgICAKLSAgICB9ICAKLSAgICAKLSAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpCisgICAgICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07CisgICAgICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogICAgIHsKICAgICAgIC8qd29ya2Fyb3VuZCBpbiBvcmRlciB0byBwcm9wZXJseSBjb21wdXRlIGF1dGhlbnRpY2F0aW9uIHRhZ3Mgd2hpbGUgZG9pbmcKICAgICAgIGEgR0NNIGVuY3J5cHRpb24gd2l0aCB0aGUgbGFzdCBibG9jayBvZiBwYXlsb2FkIHNpemUgaW5mZXJpb3IgdG8gMTI4IGJpdHMqLwogICAgICAgLyogQ2hhbmdlIHRoZSBBRVMgbW9kZSB0byBHQ00gbW9kZSBhbmQgU2VsZWN0IEZpbmFsIHBoYXNlICovCiAgICAgICAvKiBjb25maWd1cmVkICBDSE1PRCBHQ00gICAqLwotICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19HQ00pOyAKLSAgICAgIAorICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0FMR09NT0RFLCBDUllQX0FFU19HQ00pOworCiAgICAgICAvKiBjb25maWd1cmVkICBmaW5hbCBwaGFzZSAgKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAKLSAgICAgIAotICAgICAgZm9yIChpbmRleD0wVTsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKQorICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKKyAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMzJCKQorICAgICAgeworICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkZGRkZGMDBVOworICAgICAgICB9CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGMDAwMFU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGMDAwMDAwVTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzhCKQorICAgICAgeworICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDFVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkVWKDB4RkZGRkZGMDBVKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkVWKDB4RkZGRjAwMDBVKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkVWKDB4RkYwMDAwMDBVKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0RBVEFUWVBFKSA9PSBDUllQX0RBVEFUWVBFXzE2QikKKyAgICAgIHsKKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGRkYwMFUpLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAyVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRjAwMDAwMFUpLCAxNik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgLypDUllQX0RBVEFUWVBFXzFCKi8KKyAgICAgIHsKKyAgICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKKyAgICAgICAgeworICAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JCSVQoMHhGRkZGRkYwMFUpOworICAgICAgICB9CisgICAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRjAwMDBVKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgICB7CisgICAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkJJVCgweEZGMDAwMDAwVSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKQogICAgICAgewogICAgICAgICAvKldyaXRlIHRoZSBpbnRlcm1lZGlhdGVfZGF0YSBpbiB0aGUgSU4gRklGTyAqLwotICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTj1pbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07Ci0gICAgICB9ICAgIAotICAgICAgd2hpbGUoaW5kZXggPCA0VSkgICAgICAgICAgCisgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOworICAgICAgfQorICAgICAgd2hpbGUgKGluZGV4IDwgNFUpCiAgICAgICB7CiAgICAgICAgIC8qIFBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAweDBVOwotICAgICAgICBpbmRleCsrOyAKLSAgICAgIH0gICAgICAKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgIH0KICAgICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgICAgIGlmKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKKyAgICAgIGlmIChDUllQX1dhaXRPbk9GTkVGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7IAotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpIAotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOworCisgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorICAgICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBlcnJvciBjYWxsYmFjayovCisgICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCi0gICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKLSAgICAgIH0gCi0gICAgICAKLSAgICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKSAKLSAgICAgIHsgIAotICAgICAgICBmb3IoIGluZGV4PTBVOyBpbmRleDwgNFU7aW5kZXgrKykKLSAgICAgICAgeyAKLSAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF09aGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgICAgICB9ICAgIAorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgICB9CisKKyAgICAgIGlmICgoaGNyeXAtPkluc3RhbmNlLT5TUiAmIENSWVBfRkxBR19PRk5FKSAhPSAweDBVKQorICAgICAgeworICAgICAgICBmb3IgKGluZGV4ID0gMFU7IGluZGV4IDwgNFU7IGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0gLyogRW5kIG9mIEdDTSBlbmNyeXB0aW9uICovCi0gIGVsc2V7ICAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBDQ00gZGVjcnlwdGlvbiwgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZQotICAgIGF1dGhlbnRpY2F0aW9uIHRhZ3Mgd2hpbGUgZG9pbmcgYSBDQ00gZGVjcnlwdGlvbiB3aXRoIHRoZSBsYXN0IGJsb2NrCi0gICAgb2YgcGF5bG9hZCBzaXplIGluZmVyaW9yIHRvIDEyOCBiaXRzKi8KLSAgICAKLSAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICAgICAgCisgIGVsc2UKKyAgeworICAgIC8qIFdvcmthcm91bmQgMiwgY2FzZSBDQ00gZGVjcnlwdGlvbiwgaW4gb3JkZXIgdG8gcHJvcGVybHkgY29tcHV0ZQorICAgICAgYXV0aGVudGljYXRpb24gdGFncyB3aGlsZSBkb2luZyBhIENDTSBkZWNyeXB0aW9uIHdpdGggdGhlIGxhc3QgYmxvY2sKKyAgICAgIG9mIHBheWxvYWQgc2l6ZSBpbmZlcmlvciB0byAxMjggYml0cyovCisKKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBDUllQX0NSX0FMR09ESVIpID09IENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUKQogICAgIHsKLSAgICAgIGl2MXRlbXAgPSBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNN1I7IAotICAgICAgCisgICAgICBpdjF0ZW1wID0gaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTdSOworCiAgICAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICB0ZW1wWzBdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTBSOwotICAgICAgdGVtcFsxXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00xUjsKLSAgICAgIHRlbXBbMl09ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMlI7Ci0gICAgICB0ZW1wWzNdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTNSOwotICAgICAgCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSPSBpdjF0ZW1wOwotICAgICAgCisKKyAgICAgIHRlbXBbMF0gPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTBSOworICAgICAgdGVtcFsxXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMVI7CisgICAgICB0ZW1wWzJdID0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00yUjsKKyAgICAgIHRlbXBbM10gPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTNSOworCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPklWMVJSID0gaXYxdGVtcDsKKwogICAgICAgLyogQ29uZmlndXJlZCAgQ0hNT0QgQ1RSICAgKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ1RSKTsgICAgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9BTEdPTU9ERSwgQ1JZUF9BRVNfQ1RSKTsKKwogICAgICAgLyogRW5hYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CiAgICAgfQotICAgIC8qICBMYXN0IGJsb2NrIG9wdGlvbmFsbHkgcGFkIHRoZSBkYXRhIHdpdGggemVyb3MqLyAKLSAgICBmb3IoaW5kZXg9MDsgaW5kZXggPCBsYXN0d29yZHNpemU7IGluZGV4ICsrKSAgICAgICAgCisgICAgLyogIExhc3QgYmxvY2sgb3B0aW9uYWxseSBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyovCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGFzdHdvcmRzaXplOyBpbmRleCArKykKICAgICB7CiAgICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gID0gKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBJbkJ1ZmZQdHIgKyBoY3J5cC0+Q3J5cEluQ291bnQgKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9ICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwSW5CdWZmUHRyICsgaGNyeXAtPkNyeXBJbkNvdW50KTsKICAgICAgIGhjcnlwLT5DcnlwSW5Db3VudCsrOwotICAgIH0gICAgCi0gICAgd2hpbGUoaW5kZXggPCA0VSkKKyAgICB9CisgICAgd2hpbGUgKGluZGV4IDwgNFUpCiAgICAgewogICAgICAgLyogUGFkIHRoZSBkYXRhIHdpdGggemVyb3MgdG8gaGF2ZSBhIGNvbXBsZXRlIGJsb2NrICovCiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiAgPSAwVTsKLSAgICAgIGluZGV4Kys7IAorICAgICAgaW5kZXgrKzsKICAgICB9CiAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgIGlmKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgIHsgCisgICAgaWYgKENSWVBfV2FpdE9uT0ZORUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7Ci0gICAgICAKKwogICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKLSAgICB9ICAgIAotICAgIAotICAgIGlmKChoY3J5cC0+SW5zdGFuY2UtPlNSICYgQ1JZUF9GTEFHX09GTkUgKSAhPSAweDBVKQorI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisKKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+U1IgJiBDUllQX0ZMQUdfT0ZORSkgIT0gMHgwVSkKICAgICB7Ci0gICAgICBmb3IoaW5kZXg9MFU7IGluZGV4PCA0VTtpbmRleCsrKSAgICAgICAgCi0gICAgICB7ICAKKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKKyAgICAgIHsKICAgICAgICAgLyogUmVhZCB0aGUgT3V0cHV0IGJsb2NrIGZyb20gdGhlIE91dHB1dCBGSUZPICovCi0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsgCi0gICAgICAgIAorICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF0gPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisKICAgICAgICAgLyppbnRlcm1lZGlhdGUgZGF0YSBidWZmZXIgdG8gYmUgdXNlZCBpbiBmb3IgdGhlIHdvcmthcm91bmQqLwotICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpPWludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKLSAgICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOyAgIAotICAgICAgfSAgICAgCi0gICAgfSAKLSAgICAKLSAgICBpZigoaGNyeXAtPkluc3RhbmNlLT5DUiAmIENSWVBfQ1JfQUxHT0RJUikgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0RFQ1JZUFQpICAgICAgCi0gICAgeyAgICAgCi0gICAgICB0ZW1wMlswXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00wUjsKLSAgICAgIHRlbXAyWzFdPSAgaGNyeXAtPkluc3RhbmNlLT5DU0dDTUNDTTFSOwotICAgICAgdGVtcDJbMl09ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMlI7Ci0gICAgICB0ZW1wMlszXT0gIGhjcnlwLT5JbnN0YW5jZS0+Q1NHQ01DQ00zUjsKLSAgICAgIAorICAgICAgICAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cE91dEJ1ZmZQdHIgKyAoaGNyeXAtPkNyeXBPdXRDb3VudCkpID0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOworICAgICAgICBoY3J5cC0+Q3J5cE91dENvdW50Kys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQ1JZUF9DUl9BTEdPRElSKSA9PSBDUllQX09QRVJBVElOR01PREVfREVDUllQVCkKKyAgICB7CisgICAgICB0ZW1wMlswXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMFI7CisgICAgICB0ZW1wMlsxXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMVI7CisgICAgICB0ZW1wMlsyXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNMlI7CisgICAgICB0ZW1wMlszXSA9ICBoY3J5cC0+SW5zdGFuY2UtPkNTR0NNQ0NNM1I7CisKICAgICAgIC8qIGNvbmZpZ3VyZWQgIENITU9EIENDTSAgICovCi0gICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0NDTSk7IAotICAgICAgCisgICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfQUxHT01PREUsIENSWVBfQUVTX0NDTSk7CisKICAgICAgIC8qIGNvbmZpZ3VyZWQgIEhlYWRlciBwaGFzZSAgKi8KLSAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfSEVBREVSKTsgCi0gICAgICAKKyAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfSEVBREVSKTsKKwogICAgICAgLypzZXQgdG8gemVybyB0aGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWRkZWQgYml0cyovCi0gICAgICBmb3IoaW5kZXggPSBsYXN0d29yZHNpemU7IGluZGV4PDRVOyBpbmRleCArKykgICAgICAgIAorICAgICAgZm9yIChpbmRleCA9IGxhc3R3b3Jkc2l6ZTsgaW5kZXggPCA0VTsgaW5kZXggKyspCiAgICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9MFU7Ci0gICAgICB9ICAgICAKLSAgICAgIGlmICgobnBibGIgJTRVKT09MVUpCi0gICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRkZGRkYwMFU7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IDBVOwogICAgICAgfQotICAgICAgaWYgKChucGJsYiAlNFUpPT0yVSkKKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCiAgICAgICB7Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZS0xVV0gJj0gMHhGRkZGMDAwMFU7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkZGRjAwVTsKICAgICAgIH0KLSAgICAgIGlmICgobnBibGIgJTRVKT09M1UpCisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQogICAgICAgewotICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUtMVVdICY9IDB4RkYwMDAwMDBVOworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gMHhGRkZGMDAwMFU7CiAgICAgICB9Ci0gICAgICBmb3IoaW5kZXg9MFU7IGluZGV4IDwgNFUgOyBpbmRleCArKykgICAgICAgIAotICAgICAgeyAgICAgICAgICAgICAgIAorICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAzVSkKKyAgICAgIHsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IDB4RkYwMDAwMDBVOworICAgICAgfQorICAgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVIDsgaW5kZXggKyspCisgICAgICB7CiAgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSBePSAgdGVtcFtpbmRleF07Ci0gICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSBePSAgdGVtcDJbaW5kZXhdOyAKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdIF49ICB0ZW1wMltpbmRleF07CiAgICAgICB9Ci0gICAgICBmb3IoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXggKyspICAgICAgICAKKyAgICAgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXggKyspCiAgICAgICB7CiAgICAgICAgIC8qIFdyaXRlIHRoZSBsYXN0IElucHV0IGJsb2NrIGluIHRoZSBJTiBGSUZPICovCiAgICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOICA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA7Ci0gICAgICB9IAotICAgICAgCisgICAgICB9CisKICAgICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByYWlzZWQgKi8KLSAgICAgIGlmKENSWVBfV2FpdE9uQlVTWUZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykgIAotICAgICAgeyAKKyAgICAgIGlmIChDUllQX1dhaXRPbkJVU1lGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spCisgICAgICB7CiAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKLSAgICAgICAgCi0gICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7ICAgICAgIAotI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKSAKLSAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KLSAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKworICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KKyAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwogI2Vsc2UKLSAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCi0gICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorICAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLworICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQotICB9IC8qIEVuZCBvZiBDQ00gV0tBKi8gIAotICAKKyAgfSAvKiBFbmQgb2YgQ0NNIFdLQSovCisKICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwotICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSAgCisgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisKICNlbHNlIC8qIEFFUyAqLwotICAKLSAgLypXb3JrYXJvdW5kIDI6IGNhc2UgR0NNIGVuY3J5cHRpb24sIGR1cmluZyBwYXlsb2FkIHBoYXNlIGFuZCBiZWZvcmUgaW5zZXJ0aW5nIAotICB0aGUgbGFzdCBibG9jayBvZiBwYXlsYW9kLCB3aGljaCBzaXplIGlzIGluZmVyaW9yIHRvICAxMjggYml0cyAgKi8gICAKLSAgCi0gIGlmKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKSAgICAKKworICAvKldvcmthcm91bmQgMjogY2FzZSBHQ00gZW5jcnlwdGlvbiwgZHVyaW5nIHBheWxvYWQgcGhhc2UgYW5kIGJlZm9yZSBpbnNlcnRpbmcKKyAgdGhlIGxhc3QgYmxvY2sgb2YgcGF5bGFvZCwgd2hpY2ggc2l6ZSBpcyBpbmZlcmlvciB0byAgMTI4IGJpdHMgICovCisKKyAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQogICB7CiAgICAgLyogY29uZmlndXJlZCAgQ0hNT0QgQ1RSICAgKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9DSE1PRCwgQ1JZUF9BRVNfQ1RSKTsgIAotICB9IAotICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8gICAgCi0gIGZvcihpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspICAgICAgICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9DSE1PRCwgQ1JZUF9BRVNfQ1RSKTsKKyAgfQorICAvKiAgbGFzdCBibG9jayBvcHRpb25hbGx5IHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zKi8KKyAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgIHsKICAgICAvKiBXcml0ZSB0aGUgbGFzdCBJbnB1dCBibG9jayBpbiB0aGUgSU4gRklGTyAqLwotICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCApOworICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiAgPSAqKHVpbnQzMl90ICopKGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArIGhjcnlwLT5DcnlwSW5Db3VudCk7CiAgICAgaGNyeXAtPkNyeXBJbkNvdW50Kys7Ci0gIH0gICAgCi0gIHdoaWxlKGluZGV4IDwgNFUpCisgIH0KKyAgd2hpbGUgKGluZGV4IDwgNFUpCiAgIHsKICAgICAvKiBwYWQgdGhlIGRhdGEgd2l0aCB6ZXJvcyB0byBoYXZlIGEgY29tcGxldGUgYmxvY2sgKi8KICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgID0gMFU7Ci0gICAgaW5kZXgrKzsgCi0gIH0gICAKLSAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCi0gIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgeyAKLSAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgICAgICAgIAotICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7Ci0jaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpIAotICAgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLwotICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwotI2Vsc2UKLSAgICAgIC8qQ2FsbCBsZWdhY3kgd2VhayBlcnJvciBjYWxsYmFjayovCi0gICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorICAgIGluZGV4Kys7CiAgIH0KLSAgCisgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLworICBpZiAoQ1JZUF9XYWl0T25DQ0ZsYWcoaGNyeXAsIFRpbWVvdXQpICE9IEhBTF9PSykKKyAgeworICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CisjaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgLypDYWxsIHJlZ2lzdGVyZWQgZXJyb3IgY2FsbGJhY2sqLworICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbHNlCisgICAgLypDYWxsIGxlZ2FjeSB3ZWFrIGVycm9yIGNhbGxiYWNrKi8KKyAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgIH0KKwogICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKLSAgCi0gIGZvcihpbmRleCA9IDBVOyBpbmRleDwgNFU7aW5kZXgrKykgICAgICAgIAotICB7ICAKLSAgICAvKiBSZWFkIHRoZSBPdXRwdXQgYmxvY2sgZnJvbSB0aGUgT3V0cHV0IEZJRk8gKi8gIAotICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7IAotICAgIAorCisgIGZvciAoaW5kZXggPSAwVTsgaW5kZXggPCA0VTsgaW5kZXgrKykKKyAgeworICAgIC8qIFJlYWQgdGhlIE91dHB1dCBibG9jayBmcm9tIHRoZSBPdXRwdXQgRklGTyAqLworICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisKICAgICAvKmludGVybWVkaWF0ZSBkYXRhIGJ1ZmZlciB0byBiZSB1c2VkIGluICB0aGUgd29ya2Fyb3VuZCovCi0gICAgKih1aW50MzJfdCAqKShoY3J5cC0+cENyeXBPdXRCdWZmUHRyICsgKGhjcnlwLT5DcnlwT3V0Q291bnQpKT0gaW50ZXJtZWRpYXRlX2RhdGFbaW5kZXhdOwotICAgIGhjcnlwLT5DcnlwT3V0Q291bnQrKzsgCi0gIH0gIAotICAKLSAgaWYoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfTU9ERSkgPT0gQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpIAotICB7ICAgIAorICAgICoodWludDMyX3QgKikoaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArIChoY3J5cC0+Q3J5cE91dENvdW50KSkgPSBpbnRlcm1lZGlhdGVfZGF0YVtpbmRleF07CisgICAgaGNyeXAtPkNyeXBPdXRDb3VudCsrOworICB9CisKKyAgaWYgKChoY3J5cC0+SW5zdGFuY2UtPkNSICYgQUVTX0NSX01PREUpID09IENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUKQorICB7CiAgICAgLyogY29uZmlndXJlZCAgQ0hNT0QgR0NNICAgKi8KICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9DSE1PRCwgQ1JZUF9BRVNfR0NNX0dNQUMpOwotICAgIAorCiAgICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfR0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOyAgICAgICAKLSAgICAKLSAgICAvKldyaXRlIHRoZSBpbnRlcm1lZGlhdGVfZGF0YSBpbiB0aGUgSU4gRklGTyAqLyAgIAotICAgIGZvcihpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspICAgICAgICAKKyAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CisKKyAgICBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfMzJCKQorICAgIHsKKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMVUpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkZGRjAwVTsKKyAgICAgIH0KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGRkYwMDAwVTsKKyAgICAgIH0KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSAweEZGMDAwMDAwVTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGhjcnlwLT5JbnN0YW5jZS0+Q1IgJiBBRVNfQ1JfREFUQVRZUEUpID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgeworICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkVWKDB4RkZGRkZGMDBVKTsKKyAgICAgIH0KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JFVigweEZGRkYwMDAwVSk7CisgICAgICB9CisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgeworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SRVYoMHhGRjAwMDAwMFUpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoaGNyeXAtPkluc3RhbmNlLT5DUiAmIEFFU19DUl9EQVRBVFlQRSkgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgeworICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUk9SKCgweEZGRkZGRjAwVSksIDE2KTsKKyAgICAgIH0KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gMlUpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JPUigoMHhGRkZGMDAwMFUpLCAxNik7CisgICAgICB9CisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDNVKQorICAgICAgeworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19ST1IoKDB4RkYwMDAwMDBVKSwgMTYpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qQ1JZUF9EQVRBVFlQRV8xQiovCisgICAgeworICAgICAgaWYgKChucGJsYiAlIDRVKSA9PSAxVSkKKyAgICAgIHsKKyAgICAgICAgaW50ZXJtZWRpYXRlX2RhdGFbbGFzdHdvcmRzaXplIC0gMVVdICY9IF9fUkJJVCgweEZGRkZGRjAwVSk7CisgICAgICB9CisgICAgICBpZiAoKG5wYmxiICUgNFUpID09IDJVKQorICAgICAgeworICAgICAgICBpbnRlcm1lZGlhdGVfZGF0YVtsYXN0d29yZHNpemUgLSAxVV0gJj0gX19SQklUKDB4RkZGRjAwMDBVKTsKKyAgICAgIH0KKyAgICAgIGlmICgobnBibGIgJSA0VSkgPT0gM1UpCisgICAgICB7CisgICAgICAgIGludGVybWVkaWF0ZV9kYXRhW2xhc3R3b3Jkc2l6ZSAtIDFVXSAmPSBfX1JCSVQoMHhGRjAwMDAwMFUpOworICAgICAgfQorICAgIH0KKworICAgIC8qV3JpdGUgdGhlIGludGVybWVkaWF0ZV9kYXRhIGluIHRoZSBJTiBGSUZPICovCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IGxhc3R3b3Jkc2l6ZTsgaW5kZXggKyspCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9IGludGVybWVkaWF0ZV9kYXRhW2luZGV4XTsKLSAgICB9ICAgIAotICAgIHdoaWxlKGluZGV4IDwgNFUpCisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IDRVKQogICAgIHsKICAgICAgIC8qIHBhZCB0aGUgZGF0YSB3aXRoIHplcm9zIHRvIGhhdmUgYSBjb21wbGV0ZSBibG9jayAqLwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7Ci0gICAgICBpbmRleCsrOyAKKyAgICAgIGluZGV4Kys7CiAgICAgfQogICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwotICAgIGlmKENSWVBfV2FpdE9uQ0NGbGFnKGhjcnlwLCBUaW1lb3V0KSAhPSBIQUxfT0spICAKLSAgICB7IAorICAgIGlmIChDUllQX1dhaXRPbkNDRmxhZyhoY3J5cCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBjbG9jayAqLwogICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAKLSAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKLSNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkgCisgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKKyNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIC8qQ2FsbCByZWdpc3RlcmVkIGVycm9yIGNhbGxiYWNrKi8KICAgICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrKGhjcnlwKTsKICNlbHNlCiAgICAgICAvKkNhbGwgbGVnYWN5IHdlYWsgZXJyb3IgY2FsbGJhY2sqLwogICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLyAKLSAgICB9ICAgICAgCisjZW5kaWYgLyogVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyAqLworICAgIH0KICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwotICAgIAotICAgIGZvciggaW5kZXggPSAwVTsgaW5kZXg8IDRVO2luZGV4KyspCi0gICAgeyAKLSAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XT1oY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCisgICAgZm9yIChpbmRleCA9IDBVOyBpbmRleCA8IDRVOyBpbmRleCsrKQorICAgIHsKKyAgICAgIGludGVybWVkaWF0ZV9kYXRhW2luZGV4XSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICAgfQotICB9LypFbmQgb2YgV29ya2Fyb3VuZCAyKi8gCi0gIAotI2VuZGlmIC8qIEVuZCBBRVMgb3IgQ1JZUCAqLyAgICAgIAorICB9LypFbmQgb2YgV29ya2Fyb3VuZCAyKi8KKyNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KIH0KIAotI2lmIGRlZmluZWQgKENSWVApICAKKyNpZiBkZWZpbmVkIChDUllQKQogCiAvKioKICAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBJRkVNIGZsYWcgdG8gYmUgcmFpc2VkLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25JRkVNRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQogewogICB1aW50MzJfdCB0aWNrc3RhcnQ7Ci0gIAorCiAgIC8qIEdldCB0aW1lb3V0ICovCiAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfSUZFTSkpCisKKyAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19JRkVNKSkKICAgewogICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgIHsKLSAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKLSAgICAgIHsgCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9Ci0gIH0gIAotICByZXR1cm4gSEFMX09LOyAKKyAgfQorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBCVVNZIGZsYWcgdG8gYmUgcmFpc2VkLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25CVVNZRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQogewogICB1aW50MzJfdCB0aWNrc3RhcnQ7Ci0gIAorCiAgIC8qIEdldCB0aW1lb3V0ICovCiAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAotICB3aGlsZShIQUxfSVNfQklUX1NFVChoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfQlVTWSkpCisKKyAgd2hpbGUgKEhBTF9JU19CSVRfU0VUKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19CVVNZKSkKICAgewogICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgIHsKLSAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKLSAgICAgIHsgICAgICAKKyAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQogICAgIH0KICAgfQotICByZXR1cm4gSEFMX09LOyAKKyAgcmV0dXJuIEhBTF9PSzsKIH0KIAogCiAvKioKICAgKiBAYnJpZWYgIEhhbmRsZSBDUllQIGhhcmR3YXJlIGJsb2NrIFRpbWVvdXQgd2hlbiB3YWl0aW5nIGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25PRk5FRmxhZyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCBUaW1lb3V0KQogewogICB1aW50MzJfdCB0aWNrc3RhcnQ7Ci0gIAorCiAgIC8qIEdldCB0aW1lb3V0ICovCiAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAotICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCisKKyAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19PRk5FKSkKICAgewogICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwotICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgIHsKLSAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKLSAgICAgIHsgICAgICAgCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEhBTF9PSzsgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKICNlbHNlIC8qIEFFUyAqLwpAQCAtNjE4NywyOSArNjkxMSwyOSBAQAogLyoqCiAgICogQGJyaWVmICBIYW5kbGUgQ1JZUCBoYXJkd2FyZSBibG9jayBUaW1lb3V0IHdoZW4gd2FpdGluZyBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkLgogICAqIEBwYXJhbSAgaGNyeXA6IHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKLSAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4gICAgICAKKyAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgQ1JZUF9XYWl0T25DQ0ZsYWcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDMyX3QgdGlja3N0YXJ0OwotICAKKwogICAvKiBHZXQgdGltZW91dCAqLwogICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKLSAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCi0gIHsgICAgCisKKyAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICB7CiAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQorICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgewotICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KXx8KFRpbWVvdXQgPT0gMFUpICkKLSAgICAgIHsgICAgCisgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKKyAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEhBTF9PSzsgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKICNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgICovCkBAIC02MjE3LDggKzY5NDEsOCBAQAogCiAvKioKICAgKiBAfQotICAqLyAKLSAgCisgICovCisKIAogCiAvKioKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX2NyeXBfZXguYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2NyeXBfZXguYwppbmRleCAyMTNjYTc0Li4xYTdhNmI5IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9jcnlwX2V4LmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfY3J5cF9leC5jCkBAIC0zLDE3ICszLDE3IEBACiAgICogQGZpbGUgICAgc3RtMzJmN3h4X2hhbF9jcnlwX2V4LmMKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIEV4dGVuZGVkIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIKLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgQ1JZUCBleHRlbnNpb24gcGVyaXBoZXJhbDoKLSAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMgICAgIAotICAqICAKKyAgKiAgICAgICAgICAgKyBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKKyAgKgogICBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KICAgICBUaGUgQ1JZUCBleHRlbnNpb24gSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgotICAgICgjKUFmdGVyIEFFUy1HQ00gb3IgQUVTLUNDTSAgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIHVzZXIgY2FuIHN0YXJ0IGZvbGxvd2luZyBBUEkgCisgICAgKCMpQWZ0ZXIgQUVTLUdDTSBvciBBRVMtQ0NNICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdXNlciBjYW4gc3RhcnQgZm9sbG93aW5nIEFQSQogICAgICAgIHRvIGdldCB0aGUgIGF1dGhlbnRpY2F0aW9uIG1lc3NhZ2VzIDoKICAgICAgICgjIykgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICAoIyMpIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwpAQCAtMjIsMTYgKzIyLDE2IEBACiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KICAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgICoKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKLSAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKi8gCisgICovCiAKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2hhbC5oIgpAQCAtNTUsMTAgKzU1LDEwIEBACiAgICogQHsKICAgKi8KICNpZiBkZWZpbmVkKEFFUykKLSNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovIAotI2RlZmluZSBDUllQX1BIQVNFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMCAgICAgICAgICAvKiE8IEdDTS9HTUFDIG9yIENDTSBoZWFkZXIgcGhhc2UgKi8gCi0jZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8xICAgICAgICAgIC8qITwgR0NNKC9DQ00pIHBheWxvYWQgcGhhc2UgICAqLyAKLSNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLyAKKyNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCisjZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19DUl9HQ01QSF8wICAgICAgICAgIC8qITwgR0NNL0dNQUMgb3IgQ0NNIGhlYWRlciBwaGFzZSAqLworI2RlZmluZSBDUllQX1BIQVNFX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfQ1JfR0NNUEhfMSAgICAgICAgICAvKiE8IEdDTSgvQ0NNKSBwYXlsb2FkIHBoYXNlICAgKi8KKyNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLwogCiAjZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9FTkNSWVBUICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBVICAgICAgICAgICAgIC8qITwgRW5jcnlwdGlvbiBtb2RlICAgKi8KICNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLwpAQCAtNzcsMTEgKzc3LDExIEBACiAjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCiAKICNkZWZpbmUgIENSWVBFeF9QSEFTRV9QUk9DRVNTICAgICAgIDB4MDJVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCi0jZGVmaW5lICBDUllQRXhfUEhBU0VfRklOQUwgICAgICAgICAweDAzVSAgICAgLyohPCBDUllQIHBlcmlwaGVyYWwgaXMgaW4gZmluYWwgcGhhc2UgdGhpcyBpcyByZWxldmFudCBvbmx5IHdpdGggQ0NNIGFuZCBHQ00gbW9kZXMgKi8gICAKKyNkZWZpbmUgIENSWVBFeF9QSEFTRV9GSU5BTCAgICAgICAgIDB4MDNVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBmaW5hbCBwaGFzZSB0aGlzIGlzIHJlbGV2YW50IG9ubHkgd2l0aCBDQ00gYW5kIEdDTSBtb2RlcyAqLwogCi0gLyogIENUUjAgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMF8wICAgICAgICAgICAgMHgwN0ZGRkZGRlUgICAgICAgICAKLSNkZWZpbmUgQ1JZUF9DQ01fQ1RSMF8zICAgICAgICAgICAgMHhGRkZGRkYwMFUgICAgICAgICAKKy8qICBDVFIwIGluZm9ybWF0aW9uIHRvIHVzZSBpbiBDQ00gYWxnb3JpdGhtICovCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMCAgICAgICAgICAgIDB4MDdGRkZGRkZVCisjZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVCiAKIAogLyoqCkBAIC05OSwxNSArOTksMTUgQEAKICAgKiBAewogICAqLwogCi0vKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAKLSAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4gCi0gKgotQHZlcmJhdGltICAgCisvKiogQGRlZmdyb3VwIENSWVBFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKyAgKgorQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAjIyMjIyBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKLSAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGdlbmVyYXRlIHRoZSBhdXRoZW50aWNhdGlvbiAKLSAgICAgICAgICBUQUcgaW4gUG9sbGluZyBtb2RlIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGdlbmVyYXRlIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICAgIFRBRyBpbiBQb2xsaW5nIG1vZGUKICAgICAgICgjKUhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgKCMpSEFMX0NSWVBFeF9BRVNDQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCkBAIC0xMjcsNzkgKzEyNyw3OSBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQogewotICB1aW50MzJfdCB0aWNrc3RhcnQ7ICAgIAorICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgIHVpbnQ2NF90IGhlYWRlcmxlbmd0aCA9ICh1aW50NjRfdCkoaGNyeXAtPkluaXQuSGVhZGVyU2l6ZSkgKiAzMlU7IC8qIEhlYWRlciBsZW5ndGggaW4gYml0cyAqLwotICB1aW50NjRfdCBpbnB1dGxlbmd0aCA9ICh1aW50NjRfdCkoaGNyeXAtPlNpemUpICogOFU7IC8qIGlucHV0IGxlbmd0aCBpbiBiaXRzICovCi0gIHVpbnQzMl90IHRhZ2FkZHIgPSAodWludDMyX3QpQXV0aFRhZzsgIAotICAKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQotICB7ICAKKyAgdWludDY0X3QgaW5wdXRsZW5ndGggPSAodWludDY0X3QpaGNyeXAtPlNpemVzU3VtICogOFU7IC8qIGlucHV0IGxlbmd0aCBpbiBiaXRzICovCisgIHVpbnQzMl90IHRhZ2FkZHIgPSAodWludDMyX3QpQXV0aFRhZzsKKworICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICB7CiAgICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgICBfX0hBTF9MT0NLKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkICovCi0gICAgaWYoaGNyeXAtPlBoYXNlID09IENSWVBFeF9QSEFTRV9QUk9DRVNTKQorICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCiAgICAgewogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCiAgICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CiAgICAgfQogICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCi0gICAgeyAKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgCi0gICAgICAvKiBTZXF1ZW5jZSBlcnJvciBjb2RlIGZpZWxkICovIAotICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsgCi0gICAgICAKKworICAgICAgLyogU2VxdWVuY2UgZXJyb3IgY29kZSBmaWVsZCAqLworICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsKKwogICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KLSAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgICAKLSAgICAgIAorICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogI2lmIGRlZmluZWQoQ1JZUCkKLSAgICAKKwogICAgIC8qIERpc2FibGUgQ1JZUCB0byBzdGFydCB0aGUgZmluYWwgcGhhc2UgKi8KICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgIAotICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLyAgCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7ICAKLSAgICAKLSAgICAvKkFMR09ESVIgYml0IG11c3QgYmUgc2V0IHRvIJEwki4qLyAKKworICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEgsIENSWVBfUEhBU0VfRklOQUwpOworCisgICAgLypBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuKi8KICAgICBoY3J5cC0+SW5zdGFuY2UtPkNSICY9ICB+Q1JZUF9DUl9BTEdPRElSOwotICAgIAorCiAgICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7Ci0gICAgCisKICAgICAvKiBXcml0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gaGVhZGVyICg2NCBiaXRzKSBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKICAgICBpbiB0aGUgcGF5bG9hZCAqLwotICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKSk7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOyAgICAKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgIHsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdCloZWFkZXJsZW5ndGgsIDE2VSk7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigodWludDMyX3QpaW5wdXRsZW5ndGgsIDE2VSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpOwpAQCAtMjEwLDY4ICsyMTAsNjggQEAKICAgICB7CiAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICAgfQotICAgIAorCiAgICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgICAgewogICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICAgewotICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCi0gICAgICAgIHsgICAgICAgCisgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQorICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBQZXJpcGhlcmFsIENsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKLSAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsgIAotICAgICAgICAgIAotICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8gICAgICAgICAgCi0gICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsgCisgICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSAgICAgICAgICAKLSAgICAKKyAgICB9CisKICAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCi0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOyAgICAgIAotICAgIAorICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisKICNlbHNlIC8qIEFFUyovCi0gICAgCisKICAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgKi8KLSAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7ICAgIAotICAgIAorICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBDUllQX1BIQVNFX0ZJTkFMKTsKKwogICAgIC8qIFdyaXRlIHRoZSBudW1iZXIgb2YgYml0cyBpbiBoZWFkZXIgKDY0IGJpdHMpIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgYml0cwotICAgIGluIHRoZSBwYXlsb2FkICovIAotICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCisgICAgaW4gdGhlIHBheWxvYWQgKi8KKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgICB7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCh1aW50MzJfdCkoaGVhZGVybGVuZ3RoKSk7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsgICAgCisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigodWludDMyX3QpaGVhZGVybGVuZ3RoLCAxNlUpOwogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigodWludDMyX3QpaW5wdXRsZW5ndGgsIDE2VSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICAgewogICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAodWludDMyX3QpKGhlYWRlcmxlbmd0aCk7CkBAIC0yODQsNTYgKzI4NCw1NiBAQAogICAgIH0KICAgICAvKiBXYWl0IGZvciBDQ0YgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAgIHdoaWxlKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQorICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICAgICB7CiAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgICB7Ci0gICAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKLSAgICAgICAgeyAgICAgICAKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCisgICAgICAgIHsKICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwotICAgICAgICAgIAorCiAgICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwotICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOyAgCi0gICAgICAgICAgCi0gICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLyAgICAgICAgICAKLSAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOyAKKyAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICB9ICAgICAgICAgCi0gICAgCisgICAgfQorCiAgICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7IAotICAgIAorICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworCiAgICAgLyogQ2xlYXIgQ0NGIGZsYWcgKi8KLSAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsgICAgICAgCi0gICAgCi0jZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovIAotICAgIAorICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOworCisjZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCisKICAgICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCiAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKLSAgICAKKwogICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCi0gICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7ICAgIAotICAgIAorICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOworCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCi0gICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOyAKKyAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0JVU1k7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgfSAgIAorICB9CiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTM0OSwxMSArMzQ5LDExIEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUEV4X0FFU0NDTV9HZW5lcmF0ZUF1dGhUQUcoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDMyX3QgKkF1dGhUYWcsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHRhZ2FkZHIgPSAodWludDMyX3QpQXV0aFRhZzsKLSAgdWludDMyX3QgY3RyMCBbNF09ezB9OworICB1aW50MzJfdCBjdHIwIFs0XSA9IHswfTsKICAgdWludDMyX3QgY3RyMGFkZHIgPSAodWludDMyX3QpY3RyMDsKICAgdWludDMyX3QgdGlja3N0YXJ0OwogCi0gIGlmKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICAgewogICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICAgX19IQUxfTE9DSyhoY3J5cCk7CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9CVVNZOwogCiAgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KLSAgICBpZihoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCisgICAgaWYgKGhjcnlwLT5QaGFzZSA9PSBDUllQRXhfUEhBU0VfUFJPQ0VTUykKICAgICB7CiAgICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGhhc2UgKi8KICAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBFeF9QSEFTRV9GSU5BTDsKQEAgLTM4Myw3MiArMzgzLDcyIEBACiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KIAotI2lmIGRlZmluZWQoQ1JZUCkgCisjaWYgZGVmaW5lZChDUllQKQogCiAgICAgLyogRGlzYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CiAKICAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgJiBBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuICovCi0gICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSHxDUllQX0NSX0FMR09ESVIsIENSWVBfUEhBU0VfRklOQUx8Q1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOworICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQ1JZUF9DUl9HQ01fQ0NNUEggfCBDUllQX0NSX0FMR09ESVIsIENSWVBfUEhBU0VfRklOQUwgfCBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCk7CiAKICAgICAvKiBFbmFibGUgdGhlIENSWVAgcGVyaXBoZXJhbCAqLwogICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKIAogICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgICBkYXRhIGhhcyB0byBiZSBzd2FwcGVkIGFjY29yZGluZyB0byB0aGUgREFUQVRZUEUqLwotICAgIGN0cjBbMF09KGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMDsKLSAgICBjdHIwWzFdPWhjcnlwLT5Jbml0LkIwWzFdOwotICAgIGN0cjBbMl09aGNyeXAtPkluaXQuQjBbMl07Ci0gICAgY3RyMFszXT1oY3J5cC0+SW5pdC5CMFszXSAmICBDUllQX0NDTV9DVFIwXzM7CisgICAgY3RyMFswXSA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7CisgICAgY3RyMFsxXSA9IGhjcnlwLT5Jbml0LkIwWzFdOworICAgIGN0cjBbMl0gPSBoY3J5cC0+SW5pdC5CMFsyXTsKKyAgICBjdHIwWzNdID0gaGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOwogCi0gICAgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKKyAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgfQotICAgIGVsc2UgaWYoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQorICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICAgewotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgIH0KICAgICAvKiBXYWl0IGZvciBPRk5FIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCisgICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIENSWVBfRkxBR19PRk5FKSkKICAgICB7CiAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KLSAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKKyAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgICB7Ci0gICAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gVGltZW91dCl8fChUaW1lb3V0ID09IDBVKSkKKyAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgIHsKICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgQ2xvY2sgKi8KICAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwpAQCAtNDY1LDEzICs0NjUsMTMgQEAKICAgICB9CiAKICAgICAvKiBSZWFkIHRoZSBBdXRoIFRBRyBpbiB0aGUgSU4gRklGTyAqLwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogCiAjZWxzZSAvKiBBRVMgKi8KIApAQCAtNDgwLDc1ICs0ODAsNzUgQEAKIAogICAgIC8qIFdyaXRlIHRoZSBjb3VudGVyIGJsb2NrIGluIHRoZSBJTiBGSUZPLCBDVFIwIGluZm9ybWF0aW9uIGZyb20gQjAKICAgICBkYXRhIGhhcyB0byBiZSBzd2FwcGVkIGFjY29yZGluZyB0byB0aGUgREFUQVRZUEUqLwotICAgIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCisgICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfOEIpCiAgICAgewotICAgICAgY3RyMFswXT0oX19SRVYoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wKTsKLSAgICAgIGN0cjBbMV09X19SRVYoaGNyeXAtPkluaXQuQjBbMV0pOwotICAgICAgY3RyMFsyXT1fX1JFVihoY3J5cC0+SW5pdC5CMFsyXSk7Ci0gICAgICBjdHIwWzNdPShfX1JFVihoY3J5cC0+SW5pdC5CMFszXSkmIENSWVBfQ0NNX0NUUjBfMyk7CisgICAgICBjdHIwWzBdID0gKF9fUkVWKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMCk7CisgICAgICBjdHIwWzFdID0gX19SRVYoaGNyeXAtPkluaXQuQjBbMV0pOworICAgICAgY3RyMFsyXSA9IF9fUkVWKGhjcnlwLT5Jbml0LkIwWzJdKTsKKyAgICAgIGN0cjBbM10gPSAoX19SRVYoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOwogCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QqKShjdHIwYWRkcikpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCopKGN0cjBhZGRyKSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICB9Ci0gICAgZWxzZSBpZihoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKKyAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgICB7Ci0gICAgICBjdHIwWzBdPSAoIF9fUk9SKChoY3J5cC0+SW5pdC5CMFswXSksIDE2VSkmIENSWVBfQ0NNX0NUUjBfMCk7Ci0gICAgICBjdHIwWzFdPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsxXSksIDE2VSk7Ci0gICAgICBjdHIwWzJdPSAgIF9fUk9SKChoY3J5cC0+SW5pdC5CMFsyXSksIDE2VSk7Ci0gICAgICBjdHIwWzNdPSAoIF9fUk9SKChoY3J5cC0+SW5pdC5CMFszXSksIDE2VSkmIENSWVBfQ0NNX0NUUjBfMyk7CisgICAgICBjdHIwWzBdID0gKF9fUk9SKChoY3J5cC0+SW5pdC5CMFswXSksIDE2VSkmIENSWVBfQ0NNX0NUUjBfMCk7CisgICAgICBjdHIwWzFdID0gICBfX1JPUigoaGNyeXAtPkluaXQuQjBbMV0pLCAxNlUpOworICAgICAgY3RyMFsyXSA9ICAgX19ST1IoKGhjcnlwLT5Jbml0LkIwWzJdKSwgMTZVKTsKKyAgICAgIGN0cjBbM10gPSAoX19ST1IoKGhjcnlwLT5Jbml0LkIwWzNdKSwgMTZVKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKIAotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QqKShjdHIwYWRkciksIDE2VSk7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90KikoY3RyMGFkZHIpLCAxNlUpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgIH0KLSAgICBlbHNlIGlmKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCisgICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgICB7Ci0gICAgICBjdHIwWzBdPShfX1JCSVQoaGNyeXAtPkluaXQuQjBbMF0pJiBDUllQX0NDTV9DVFIwXzApOwotICAgICAgY3RyMFsxXT1fX1JCSVQoaGNyeXAtPkluaXQuQjBbMV0pOwotICAgICAgY3RyMFsyXT1fX1JCSVQoaGNyeXAtPkluaXQuQjBbMl0pOwotICAgICAgY3RyMFszXT0oX19SQklUKGhjcnlwLT5Jbml0LkIwWzNdKSYgQ1JZUF9DQ01fQ1RSMF8zKTsKKyAgICAgIGN0cjBbMF0gPSAoX19SQklUKGhjcnlwLT5Jbml0LkIwWzBdKSYgQ1JZUF9DQ01fQ1RSMF8wKTsKKyAgICAgIGN0cjBbMV0gPSBfX1JCSVQoaGNyeXAtPkluaXQuQjBbMV0pOworICAgICAgY3RyMFsyXSA9IF9fUkJJVChoY3J5cC0+SW5pdC5CMFsyXSk7CisgICAgICBjdHIwWzNdID0gKF9fUkJJVChoY3J5cC0+SW5pdC5CMFszXSkmIENSWVBfQ0NNX0NUUjBfMyk7CiAKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90KikoY3RyMGFkZHIpKTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBjdHIwWzBdPShoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7Ci0gICAgICBjdHIwWzFdPWhjcnlwLT5Jbml0LkIwWzFdOwotICAgICAgY3RyMFsyXT1oY3J5cC0+SW5pdC5CMFsyXTsKLSAgICAgIGN0cjBbM109aGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOworICAgICAgY3RyMFswXSA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7CisgICAgICBjdHIwWzFdID0gaGNyeXAtPkluaXQuQjBbMV07CisgICAgICBjdHIwWzJdID0gaGNyeXAtPkluaXQuQjBbMl07CisgICAgICBjdHIwWzNdID0gaGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOwogCi0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOwotICAgICAgY3RyMGFkZHIrPTRVOwotICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCopKGN0cjBhZGRyKTsKLSAgICAgIGN0cjBhZGRyKz00VTsKLSAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShjdHIwYWRkcik7Ci0gICAgICBjdHIwYWRkcis9NFU7Ci0gICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoY3RyMGFkZHIpOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CisgICAgICBjdHIwYWRkciArPSA0VTsKKyAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOworICAgICAgY3RyMGFkZHIgKz0gNFU7CisgICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKKyAgICAgIGN0cjBhZGRyICs9IDRVOworICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgfQogCiAgICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgICB3aGlsZShIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKKyAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQUVTX1NSX0NDRikpCiAgICAgewogICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCi0gICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCisgICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICAgewotICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFRpbWVvdXQpfHwoVGltZW91dCA9PSAwVSkpCisgICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgICB7CiAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIENsb2NrICovCiAgICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKQEAgLTU2NSwxMyArNTY1LDEzIEBACiAgICAgfQogCiAgICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7Ci0gICAgdGFnYWRkcis9NFU7Ci0gICAgKih1aW50MzJfdCopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKLSAgICB0YWdhZGRyKz00VTsKLSAgICAqKHVpbnQzMl90KikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwotICAgIHRhZ2FkZHIrPTRVOwotICAgICoodWludDMyX3QqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CisgICAgdGFnYWRkciArPSA0VTsKKyAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKKyAgICB0YWdhZGRyICs9IDRVOworICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOworICAgIHRhZ2FkZHIgKz0gNFU7CisgICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAKICAgICAvKiBDbGVhciBDQ0YgRmxhZyAqLwogICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwpAQCAtNTk0LDcgKzU5NCw3IEBACiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBIQUxfT0s7ICAgCisgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgpAQCAtNjAzLDEyICs2MDMsMTIgQEAKIAogI2lmIGRlZmluZWQgKEFFUykKIC8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgQXV0b0tleURlcml2YXRpb24gZnVuY3Rpb25zIAotICoKKyAgKiAgQGJyaWVmICAgQXV0b0tleURlcml2YXRpb24gZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgIyMjIyMgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gRW5hYmxlIG9yIERpc2FibGUgdGhlCiAgICAgICAgICAgdGhlIEF1dG9LZXlEZXJpdmF0aW9uIHBhcmFtZXRlciBpbiBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlCiAgICAgICAgICAgVGhlc2UgZnVuY3Rpb24gYXJlIGFsbG93ZWQgb25seSBpbiBUaW55QUVTIElQLgpAQCAtNjI0LDE1ICs2MjQsMTUgQEAKICAgKi8KIHZvaWQgIEhBTF9DUllQRXhfRW5hYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQotICB7ICAKKyAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKKyAgewogICAgIGhjcnlwLT5BdXRvS2V5RGVyaXZhdGlvbiA9IEVOQUJMRTsKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0gIH0gCisgICAgaGNyeXAtPkVycm9yQ29kZSA9IEhBTF9DUllQX0VSUk9SX0JVU1k7CisgIH0KIH0KIC8qKgogICAqIEBicmllZiAgQUVTIGRpc2FibGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb25zCkBAIC02NDEsMjIgKzY0MSwyMiBAQAogICAqLwogdm9pZCAgSEFMX0NSWVBFeF9EaXNhYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKIHsKLSAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQorICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogICB7CiAgICAgaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID0gRElTQUJMRTsKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBCdXN5IGVycm9yIGNvZGUgZmllbGQgKi8KLSAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsgCi0gIH0gIAorICAgIGhjcnlwLT5FcnJvckNvZGUgPSBIQUxfQ1JZUF9FUlJPUl9CVVNZOworICB9CiB9CiAKIC8qKgogICAqIEB9CiAgICovCiAKLSNlbmRpZiAvKiBBRVMgKi8gCisjZW5kaWYgLyogQUVTICovCiAjZW5kaWYgLyogSEFMX0NSWVBfTU9EVUxFX0VOQUJMRUQgKi8KIAogLyoqCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9kY21pLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9kY21pLmMKaW5kZXggMWY4ZGNkYy4uMjljMjJmNiAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfZGNtaS5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2RjbWkuYwpAQCAtMywxMyArMywxMyBAQAogICAqIEBmaWxlICAgIHN0bTMyZjd4eF9oYWxfZGNtaS5jCiAgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAgKiBAYnJpZWYgICBEQ01JIEhBTCBtb2R1bGUgZHJpdmVyCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBEaWdpdGFsIENhbWVyYSBJbnRlcmZhY2UgKERDTUkpIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAotICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAgCi0gICogICAgICAgICAgIAorICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgogICBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCkBAIC0yMywxOCArMjMsMTggQEAKIAogICAgICgjKSBQcm9ncmFtIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIHRocm91Z2ggZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgICAgICAgIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHBvbGFyaXR5LCBwaXhlbCBjbG9jayBwb2xhcml0eSwgQ2FwdHVyZSBSYXRlLAotICAgICAgICBTeW5jaHJvbml6YXRpb24gTW9kZSwgY29kZSBvZiB0aGUgZnJhbWUgZGVsaW1pdGVyIGFuZCBkYXRhIHdpZHRoIAorICAgICAgICBTeW5jaHJvbml6YXRpb24gTW9kZSwgY29kZSBvZiB0aGUgZnJhbWUgZGVsaW1pdGVyIGFuZCBkYXRhIHdpZHRoCiAgICAgICAgIHVzaW5nIEhBTF9EQ01JX0luaXQoKSBmdW5jdGlvbi4KIAogICAgICgjKSBDb25maWd1cmUgdGhlIERNQTJfU3RyZWFtMSBjaGFubmVsMSB0byB0cmFuc2ZlciBEYXRhIGZyb20gRENNSSBEUgogICAgICAgICByZWdpc3RlciB0byB0aGUgZGVzdGluYXRpb24gbWVtb3J5IGJ1ZmZlci4KIAogICAgICgjKSBQcm9ncmFtIHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9uIHRocm91Z2ggZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0gICAgICAgIERDTUkgbW9kZSwgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGggCisgICAgICAgIERDTUkgbW9kZSwgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzIGFuZCB0aGUgZGF0YSBsZW5ndGgKICAgICAgICAgYW5kIGVuYWJsZSBjYXB0dXJlIHVzaW5nIEhBTF9EQ01JX1N0YXJ0X0RNQSgpIGZ1bmN0aW9uLgogCiAgICAgKCMpIE9wdGlvbmFsbHksIGNvbmZpZ3VyZSBhbmQgRW5hYmxlIHRoZSBDUk9QIGZlYXR1cmUgdG8gc2VsZWN0IGEgcmVjdGFuZ3VsYXIKLSAgICAgICAgd2luZG93IGZyb20gdGhlIHJlY2VpdmVkIGltYWdlIHVzaW5nIEhBTF9EQ01JX0NvbmZpZ0Nyb3AoKSAKKyAgICAgICAgd2luZG93IGZyb20gdGhlIHJlY2VpdmVkIGltYWdlIHVzaW5nIEhBTF9EQ01JX0NvbmZpZ0Nyb3AoKQogICAgICAgICBhbmQgSEFMX0RDTUlfRW5hYmxlQ1JPUCgpIGZ1bmN0aW9ucwogCiAgICAgKCMpIFRoZSBjYXB0dXJlIGNhbiBiZSBzdG9wcGVkIHVzaW5nIEhBTF9EQ01JX1N0b3AoKSBmdW5jdGlvbi4KQEAgLTQyLDEwICs0MiwxMCBAQAogICAgICgjKSBUbyBjb250cm9sIERDTUkgc3RhdGUgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIEhBTF9EQ01JX0dldFN0YXRlKCkuCiAKICAgICAgKioqIERDTUkgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKLSAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgWy4uXQogICAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gRENNSSBIQUwgZHJpdmVyLgotICAgICAgIAorCiAgICAgICAoKykgX19IQUxfRENNSV9FTkFCTEU6IEVuYWJsZSB0aGUgRENNSSBwZXJpcGhlcmFsLgogICAgICAgKCspIF9fSEFMX0RDTUlfRElTQUJMRTogRGlzYWJsZSB0aGUgRENNSSBwZXJpcGhlcmFsLgogICAgICAgKCspIF9fSEFMX0RDTUlfR0VUX0ZMQUc6IEdldCB0aGUgRENNSSBwZW5kaW5nIGZsYWdzLgpAQCAtNTMsMTAgKzUzLDEwIEBACiAgICAgICAoKykgX19IQUxfRENNSV9FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgc3BlY2lmaWVkIERDTUkgaW50ZXJydXB0cy4KICAgICAgICgrKSBfX0hBTF9EQ01JX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBEQ01JIGludGVycnVwdHMuCiAgICAgICAoKykgX19IQUxfRENNSV9HRVRfSVRfU09VUkNFOiBDaGVjayB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRENNSSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4KLSAKLSAgICAgWy4uXSAKKworICAgICBbLi5dCiAgICAgICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIERDTUkgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCi0JICAgCisKICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgotCQorCiAgIEBlbmR2ZXJiYXRpbQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCkBAIC0xNTUsMTggKzE1NSwxOCBAQAogLyoqIEBkZWZncm91cCBEQ01JX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAgKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAgKgotQHZlcmJhdGltICAgCitAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBEQ01JCi0gICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgRENNSSAKKyAgICAgICgrKSBEZS1pbml0aWFsaXplIHRoZSBEQ01JCiAKIEBlbmR2ZXJiYXRpbQogICAqIEB7CiAgICovCi0gIAorCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBEQ01JIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBEQ01JX0luaXRUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgpAQCAtMTc1LDEzICsxNzUsMTMgQEAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX0luaXQoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSkKLXsgICAgIAorewogICAvKiBDaGVjayB0aGUgRENNSSBwZXJpcGhlcmFsIHN0YXRlICovCi0gIGlmKGhkY21pID09IE5VTEwpCisgIGlmIChoZGNtaSA9PSBOVUxMKQogICB7Ci0gICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKKwogICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19EQ01JX0FMTF9JTlNUQU5DRShoZGNtaS0+SW5zdGFuY2UpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0RDTUlfUENLUE9MQVJJVFkoaGRjbWktPkluaXQuUENLUG9sYXJpdHkpKTsKQEAgLTE5Miw1MyArMTkyLDc0IEBACiAgIGFzc2VydF9wYXJhbShJU19EQ01JX0VYVEVOREVEX0RBVEEoaGRjbWktPkluaXQuRXh0ZW5kZWREYXRhTW9kZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfRENNSV9NT0RFX0pQRUcoaGRjbWktPkluaXQuSlBFR01vZGUpKTsKIAorI2lmZGVmIERDTUlfQ1JfQlNNCiAgIGFzc2VydF9wYXJhbShJU19EQ01JX0JZVEVfU0VMRUNUX01PREUoaGRjbWktPkluaXQuQnl0ZVNlbGVjdE1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0RDTUlfQllURV9TRUxFQ1RfU1RBUlQoaGRjbWktPkluaXQuQnl0ZVNlbGVjdFN0YXJ0KSk7CiAgIGFzc2VydF9wYXJhbShJU19EQ01JX0xJTkVfU0VMRUNUX01PREUoaGRjbWktPkluaXQuTGluZVNlbGVjdE1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0RDTUlfTElORV9TRUxFQ1RfU1RBUlQoaGRjbWktPkluaXQuTGluZVNlbGVjdFN0YXJ0KSk7Ci0gICAgICAgICAgICAgICAgCi0gIGlmKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9SRVNFVCkKKyNlbmRpZgorCisgIGlmIChoZGNtaS0+U3RhdGUgPT0gSEFMX0RDTUlfU1RBVEVfUkVTRVQpCiAgIHsKLSAgLyogSW5pdCB0aGUgRENNSSBDYWxsYmFjayBzZXR0aW5ncyAqLworICAgIC8qIEluaXQgdGhlIERDTUkgQ2FsbGJhY2sgc2V0dGluZ3MgKi8KICNpZiAoVVNFX0hBTF9EQ01JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgIGhkY21pLT5GcmFtZUV2ZW50Q2FsbGJhY2sgPSBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEZyYW1lRXZlbnRDYWxsYmFjayAgKi8gCi0gICAgaGRjbWktPlZzeW5jRXZlbnRDYWxsYmFjayA9IEhBTF9EQ01JX1ZzeW5jRXZlbnRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgVnN5bmNFdmVudENhbGxiYWNrICAqLyAKLSAgICBoZGNtaS0+TGluZUV2ZW50Q2FsbGJhY2sgID0gSEFMX0RDTUlfTGluZUV2ZW50Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBMaW5lRXZlbnRDYWxsYmFjayAgICovICAKLSAgICBoZGNtaS0+RXJyb3JDYWxsYmFjayAgICAgID0gSEFMX0RDTUlfRXJyb3JDYWxsYmFjazsgICAgICAvKiBMZWdhY3kgd2VhayBFcnJvckNhbGxiYWNrICAgICAgICovIAotICAgIAotICAgIGlmKGhkY21pLT5Nc3BJbml0Q2FsbGJhY2sgPT0gTlVMTCkgIAorICAgIGhkY21pLT5GcmFtZUV2ZW50Q2FsbGJhY2sgPSBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEZyYW1lRXZlbnRDYWxsYmFjayAgKi8KKyAgICBoZGNtaS0+VnN5bmNFdmVudENhbGxiYWNrID0gSEFMX0RDTUlfVnN5bmNFdmVudENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayBWc3luY0V2ZW50Q2FsbGJhY2sgICovCisgICAgaGRjbWktPkxpbmVFdmVudENhbGxiYWNrICA9IEhBTF9EQ01JX0xpbmVFdmVudENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgTGluZUV2ZW50Q2FsbGJhY2sgICAqLworICAgIGhkY21pLT5FcnJvckNhbGxiYWNrICAgICAgPSBIQUxfRENNSV9FcnJvckNhbGxiYWNrOyAgICAgIC8qIExlZ2FjeSB3ZWFrIEVycm9yQ2FsbGJhY2sgICAgICAgKi8KKworICAgIGlmIChoZGNtaS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCiAgICAgewogICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCBDYWxsYmFjayAgICAgICAgKi8KICAgICAgIGhkY21pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BJbml0OwogICAgIH0KICAgICAvKiBJbml0aWFsaXplIHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKE1TUCkgKi8KICAgICBoZGNtaS0+TXNwSW5pdENhbGxiYWNrKGhkY21pKTsKLSNlbHNlICAKKyNlbHNlCiAgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLwogICAgIEhBTF9EQ01JX01zcEluaXQoaGRjbWkpOwogI2VuZGlmIC8qIChVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLwotICB9IAotICAKKyAgfQorCiAgIC8qIENoYW5nZSB0aGUgRENNSSBzdGF0ZSAqLwotICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9CVVNZOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uZmlndXJlcyB0aGUgSFMsIFZTLCBERSBhbmQgUEMgcG9sYXJpdHkgKi8KLSAgaGRjbWktPkluc3RhbmNlLT5DUiAmPSB+KERDTUlfQ1JfUENLUE9MIHwgRENNSV9DUl9IU1BPTCAgfCBEQ01JX0NSX1ZTUE9MICB8IERDTUlfQ1JfRURNXzAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERDTUlfQ1JfRURNXzEgIHwgRENNSV9DUl9GQ1JDXzAgfCBEQ01JX0NSX0ZDUkNfMSB8IERDTUlfQ1JfSlBFRyAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERDTUlfQ1JfRVNTIHwgRENNSV9DUl9CU01fMCB8IERDTUlfQ1JfQlNNXzEgfCBEQ01JX0NSX09FQlMgfFwKKyAgaGRjbWktPlN0YXRlID0gSEFMX0RDTUlfU1RBVEVfQlVTWTsKKworI2lmZGVmIERDTUlfQ1JfQlNNCisgIGlmIChoZGNtaS0+SW5pdC5FeHRlbmRlZERhdGFNb2RlICE9IERDTUlfRVhURU5EX0RBVEFfOEIpCisgIHsKKyAgICAvKiBCeXRlIHNlbGVjdCBtb2RlIG11c3QgYmUgcHJvZ3JhbW1lZCB0byB0aGUgcmVzZXQgdmFsdWUgaWYgdGhlIGV4dGVuZGVkIG1vZGUKKyAgICBpcyBub3Qgc2V0IHRvIDgtYml0IGRhdGEgY2FwdHVyZSBvbiBldmVyeSBwaXhlbCBjbG9jayAqLworICAgIGhkY21pLT5Jbml0LkJ5dGVTZWxlY3RNb2RlID0gRENNSV9CU01fQUxMOworICB9CisjZW5kaWYKKyAgLyogQ29uZmlndXJlcyB0aGUgSFMsIFZTLCBERSBhbmQgUEMgcG9sYXJpdHkgKi8KKyNpZmRlZiBEQ01JX0NSX0JTTQorICBoZGNtaS0+SW5zdGFuY2UtPkNSICY9IH4oRENNSV9DUl9QQ0tQT0wgfCBEQ01JX0NSX0hTUE9MICB8IERDTUlfQ1JfVlNQT0wgIHwgRENNSV9DUl9FRE1fMCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERDTUlfQ1JfRURNXzEgIHwgRENNSV9DUl9GQ1JDXzAgfCBEQ01JX0NSX0ZDUkNfMSB8IERDTUlfQ1JfSlBFRyAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ01JX0NSX0VTUyB8IERDTUlfQ1JfQlNNXzAgfCBEQ01JX0NSX0JTTV8xIHwgRENNSV9DUl9PRUJTIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRENNSV9DUl9MU00gfCBEQ01JX0NSX09FTFMpOwogCi0gIGhkY21pLT5JbnN0YW5jZS0+Q1IgfD0gICh1aW50MzJfdCkoaGRjbWktPkluaXQuU3luY2hyb01vZGUgfCBoZGNtaS0+SW5pdC5DYXB0dXJlUmF0ZSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkY21pLT5Jbml0LlZTUG9sYXJpdHkgIHwgaGRjbWktPkluaXQuSFNQb2xhcml0eSAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGNtaS0+SW5pdC5QQ0tQb2xhcml0eSB8IGhkY21pLT5Jbml0LkV4dGVuZGVkRGF0YU1vZGUgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGNtaS0+SW5pdC5KUEVHTW9kZSB8IGhkY21pLT5Jbml0LkJ5dGVTZWxlY3RNb2RlIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjbWktPkluaXQuQnl0ZVNlbGVjdFN0YXJ0IHwgaGRjbWktPkluaXQuTGluZVNlbGVjdE1vZGUgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGNtaS0+SW5pdC5MaW5lU2VsZWN0U3RhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBpZihoZGNtaS0+SW5pdC5TeW5jaHJvTW9kZSA9PSBEQ01JX1NZTkNIUk9fRU1CRURERUQpCisgIGhkY21pLT5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KShoZGNtaS0+SW5pdC5TeW5jaHJvTW9kZSB8IGhkY21pLT5Jbml0LkNhcHR1cmVSYXRlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjbWktPkluaXQuVlNQb2xhcml0eSAgfCBoZGNtaS0+SW5pdC5IU1BvbGFyaXR5ICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkY21pLT5Jbml0LlBDS1BvbGFyaXR5IHwgaGRjbWktPkluaXQuRXh0ZW5kZWREYXRhTW9kZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkY21pLT5Jbml0LkpQRUdNb2RlIHwgaGRjbWktPkluaXQuQnl0ZVNlbGVjdE1vZGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGNtaS0+SW5pdC5CeXRlU2VsZWN0U3RhcnQgfCBoZGNtaS0+SW5pdC5MaW5lU2VsZWN0TW9kZSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkY21pLT5Jbml0LkxpbmVTZWxlY3RTdGFydCk7CisjZWxzZQorICBoZGNtaS0+SW5zdGFuY2UtPkNSICY9IH4oRENNSV9DUl9QQ0tQT0wgfCBEQ01JX0NSX0hTUE9MICB8IERDTUlfQ1JfVlNQT0wgIHwgRENNSV9DUl9FRE1fMCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERDTUlfQ1JfRURNXzEgIHwgRENNSV9DUl9GQ1JDXzAgfCBEQ01JX0NSX0ZDUkNfMSB8IERDTUlfQ1JfSlBFRyk7CisKKyAgaGRjbWktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKGhkY21pLT5Jbml0LlN5bmNocm9Nb2RlIHwgaGRjbWktPkluaXQuQ2FwdHVyZVJhdGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGNtaS0+SW5pdC5WU1BvbGFyaXR5ICB8IGhkY21pLT5Jbml0LkhTUG9sYXJpdHkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjbWktPkluaXQuUENLUG9sYXJpdHkgfCBoZGNtaS0+SW5pdC5FeHRlbmRlZERhdGFNb2RlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRjbWktPkluaXQuSlBFR01vZGUpOworI2VuZGlmCisKKyAgaWYgKGhkY21pLT5Jbml0LlN5bmNocm9Nb2RlID09IERDTUlfU1lOQ0hST19FTUJFRERFRCkKICAgewotICAgIGhkY21pLT5JbnN0YW5jZS0+RVNDUiA9ICgoKHVpbnQzMl90KWhkY21pLT5Jbml0LlN5bmNyb0NvZGUuRnJhbWVTdGFydENvZGUpICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGRjbWktPkluaXQuU3luY3JvQ29kZS5MaW5lU3RhcnRDb2RlIDw8IERDTUlfRVNDUl9MU0NfUG9zKXxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpaGRjbWktPkluaXQuU3luY3JvQ29kZS5MaW5lRW5kQ29kZSA8PCBEQ01JX0VTQ1JfTEVDX1BvcykgfFwKKyAgICBoZGNtaS0+SW5zdGFuY2UtPkVTQ1IgPSAoKCh1aW50MzJfdCloZGNtaS0+SW5pdC5TeW5jcm9Db2RlLkZyYW1lU3RhcnRDb2RlKSAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCloZGNtaS0+SW5pdC5TeW5jcm9Db2RlLkxpbmVTdGFydENvZGUgPDwgRENNSV9FU0NSX0xTQ19Qb3MpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhkY21pLT5Jbml0LlN5bmNyb0NvZGUuTGluZUVuZENvZGUgPDwgRENNSV9FU0NSX0xFQ19Qb3MpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWhkY21pLT5Jbml0LlN5bmNyb0NvZGUuRnJhbWVFbmRDb2RlIDw8IERDTUlfRVNDUl9GRUNfUG9zKSk7CiAKICAgfQpAQCAtMjQ4LDcgKzI2OSw3IEBACiAKICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KICAgaGRjbWktPkVycm9yQ29kZSA9IEhBTF9EQ01JX0VSUk9SX05PTkU7Ci0gIAorCiAgIC8qIEluaXRpYWxpemUgdGhlIERDTUkgc3RhdGUqLwogICBoZGNtaS0+U3RhdGUgID0gSEFMX0RDTUlfU1RBVEVfUkVBRFk7CiAKQEAgLTI2NSw4ICsyODYsOCBAQAogCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9EZUluaXQoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSkKIHsKLSNpZiAoVVNFX0hBTF9EQ01JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKSAgCi0gIGlmKGhkY21pLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKSAgCisjaWYgKFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgaWYgKGhkY21pLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQogICB7CiAgICAgaGRjbWktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0RDTUlfTXNwRGVJbml0OwogICB9CkBAIC0yOTUsMTQgKzMxNiwxNCBAQAogICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBEQ01JLgogICAqIEByZXR2YWwgTm9uZQogICAqLwotX193ZWFrIHZvaWQgSEFMX0RDTUlfTXNwSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pKQorX193ZWFrIHZvaWQgSEFMX0RDTUlfTXNwSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChoZGNtaSk7Ci0gCisKICAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9EQ01JX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gCisgICAqLwogfQogCiAvKioKQEAgLTMxMSwxMSArMzMyLDExIEBACiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuCiAgICogQHJldHZhbCBOb25lCiAgICovCi1fX3dlYWsgdm9pZCBIQUxfRENNSV9Nc3BEZUluaXQoRENNSV9IYW5kbGVUeXBlRGVmKiBoZGNtaSkKK19fd2VhayB2b2lkIEhBTF9EQ01JX01zcERlSW5pdChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChoZGNtaSk7Ci0gCisKICAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9EQ01JX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtMzI0LDE1ICszNDUsMTUgQEAKIC8qKgogICAqIEB9CiAgICovCi0vKiogQGRlZmdyb3VwIERDTUlfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zIAotICogIEBicmllZiAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIAorLyoqIEBkZWZncm91cCBEQ01JX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAgIyMjIyMKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKLSAgICAgICgrKSBDb25maWd1cmUgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBsZW5ndGggYW5kIAorICAgICAgKCspIENvbmZpZ3VyZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBkYXRhIGxlbmd0aCBhbmQKICAgICAgICAgICBFbmFibGVzIERDTUkgRE1BIHJlcXVlc3QgYW5kIGVuYWJsZXMgRENNSSBjYXB0dXJlCiAgICAgICAoKykgU3RvcCB0aGUgRENNSSBjYXB0dXJlLgogICAgICAgKCspIEhhbmRsZXMgRENNSSBpbnRlcnJ1cHQgcmVxdWVzdC4KQEAgLTM0Miw3ICszNjMsNyBAQAogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgIEVuYWJsZXMgRENNSSBETUEgcmVxdWVzdCBhbmQgZW5hYmxlcyBEQ01JIGNhcHR1cmUgIAorICAqIEBicmllZiAgRW5hYmxlcyBEQ01JIERNQSByZXF1ZXN0IGFuZCBlbmFibGVzIERDTUkgY2FwdHVyZQogICAqIEBwYXJhbSAgaGRjbWkgICAgIHBvaW50ZXIgdG8gYSBEQ01JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuCiAgICogQHBhcmFtICBEQ01JX01vZGUgRENNSSBjYXB0dXJlIG1vZGUgc25hcHNob3Qgb3IgY29udGludW91cyBncmFiLgpAQCAtMzUwLDggKzM3MSw4IEBACiAgICogQHBhcmFtICBMZW5ndGggICAgVGhlIGxlbmd0aCBvZiBjYXB0dXJlIHRvIGJlIHRyYW5zZmVycmVkLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3RhcnRfRE1BKERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWksIHVpbnQzMl90IERDTUlfTW9kZSwgdWludDMyX3QgcERhdGEsIHVpbnQzMl90IExlbmd0aCkKLXsgIAorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3RhcnRfRE1BKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWksIHVpbnQzMl90IERDTUlfTW9kZSwgdWludDMyX3QgcERhdGEsIHVpbnQzMl90IExlbmd0aCkKK3sKICAgLyogSW5pdGlhbGl6ZSB0aGUgc2Vjb25kIG1lbW9yeSBhZGRyZXNzICovCiAgIHVpbnQzMl90IFNlY29uZE1lbUFkZHJlc3MgPSAwOwogCkBAIC0zNjAsMTYgKzM4MSwxNiBAQAogCiAgIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaGRjbWkpOwotICAKKwogICAvKiBMb2NrIHRoZSBEQ01JIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgaGRjbWktPlN0YXRlID0gSEFMX0RDTUlfU1RBVEVfQlVTWTsKIAogICAvKiBFbmFibGUgRENNSSBieSBzZXR0aW5nIERDTUlFTiBiaXQgKi8KICAgX19IQUxfRENNSV9FTkFCTEUoaGRjbWkpOwotICAKKwogICAvKiBDb25maWd1cmUgdGhlIERDTUkgTW9kZSAqLwogICBoZGNtaS0+SW5zdGFuY2UtPkNSICY9IH4oRENNSV9DUl9DTSk7Ci0gIGhkY21pLT5JbnN0YW5jZS0+Q1IgfD0gICh1aW50MzJfdCkoRENNSV9Nb2RlKTsKKyAgaGRjbWktPkluc3RhbmNlLT5DUiB8PSAodWludDMyX3QpKERDTUlfTW9kZSk7CiAKICAgLyogU2V0IHRoZSBETUEgbWVtb3J5MCBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgIGhkY21pLT5ETUFfSGFuZGxlLT5YZmVyQ3BsdENhbGxiYWNrID0gRENNSV9ETUFYZmVyQ3BsdDsKQEAgLTM4MCw0MyArNDAxLDUxIEBACiAgIC8qIFNldCB0aGUgZG1hIGFib3J0IGNhbGxiYWNrICovCiAgIGhkY21pLT5ETUFfSGFuZGxlLT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7CiAKLSAgLyogUmVzZXQgdHJhbnNmZXIgY291bnRlcnMgdmFsdWUgKi8gCisgIC8qIFJlc2V0IHRyYW5zZmVyIGNvdW50ZXJzIHZhbHVlICovCiAgIGhkY21pLT5YZmVyQ291bnQgPSAwOwogICBoZGNtaS0+WGZlclRyYW5zZmVyTnVtYmVyID0gMDsKLSAgCi0gIGlmKExlbmd0aCA8PSAweEZGRkYpCisgIGhkY21pLT5YZmVyU2l6ZSA9IDA7CisgIGhkY21pLT5wQnVmZlB0ciA9IDA7CisKKyAgaWYgKExlbmd0aCA8PSAweEZGRkZVKQogICB7CiAgICAgLyogRW5hYmxlIHRoZSBETUEgU3RyZWFtICovCi0gICAgSEFMX0RNQV9TdGFydF9JVChoZGNtaS0+RE1BX0hhbmRsZSwgKHVpbnQzMl90KSZoZGNtaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIExlbmd0aCk7CisgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaGRjbWktPkRNQV9IYW5kbGUsICh1aW50MzJfdCkmaGRjbWktPkluc3RhbmNlLT5EUiwgKHVpbnQzMl90KXBEYXRhLCBMZW5ndGgpICE9IEhBTF9PSykKKyAgICB7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KICAgfQogICBlbHNlIC8qIERDTUlfRE9VQkxFX0JVRkZFUiBNb2RlICovCiAgIHsKICAgICAvKiBTZXQgdGhlIERNQSBtZW1vcnkxIGNvbnZlcnNpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KLSAgICBoZGNtaS0+RE1BX0hhbmRsZS0+WGZlck0xQ3BsdENhbGxiYWNrID0gRENNSV9ETUFYZmVyQ3BsdDsgCisgICAgaGRjbWktPkRNQV9IYW5kbGUtPlhmZXJNMUNwbHRDYWxsYmFjayA9IERDTUlfRE1BWGZlckNwbHQ7CiAKICAgICAvKiBJbml0aWFsaXplIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KICAgICBoZGNtaS0+WGZlckNvdW50ID0gMTsKICAgICBoZGNtaS0+WGZlclNpemUgPSBMZW5ndGg7CiAgICAgaGRjbWktPnBCdWZmUHRyID0gcERhdGE7Ci0gICAgICAKKwogICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIGJ1ZmZlciAqLwotICAgIHdoaWxlKGhkY21pLT5YZmVyU2l6ZSA+IDB4RkZGRikKKyAgICB3aGlsZSAoaGRjbWktPlhmZXJTaXplID4gMHhGRkZGVSkKICAgICB7Ci0gICAgICBoZGNtaS0+WGZlclNpemUgPSAoaGRjbWktPlhmZXJTaXplLzIpOwotICAgICAgaGRjbWktPlhmZXJDb3VudCA9IGhkY21pLT5YZmVyQ291bnQqMjsKKyAgICAgIGhkY21pLT5YZmVyU2l6ZSA9IChoZGNtaS0+WGZlclNpemUgLyAyVSk7CisgICAgICBoZGNtaS0+WGZlckNvdW50ID0gaGRjbWktPlhmZXJDb3VudCAqIDJVOwogICAgIH0KIAogICAgIC8qIFVwZGF0ZSBEQ01JIGNvdW50ZXIgIGFuZCB0cmFuc2ZlciBudW1iZXIqLwotICAgIGhkY21pLT5YZmVyQ291bnQgPSAoaGRjbWktPlhmZXJDb3VudCAtIDIpOworICAgIGhkY21pLT5YZmVyQ291bnQgPSAoaGRjbWktPlhmZXJDb3VudCAtIDJVKTsKICAgICBoZGNtaS0+WGZlclRyYW5zZmVyTnVtYmVyID0gaGRjbWktPlhmZXJDb3VudDsKIAogICAgIC8qIFVwZGF0ZSBzZWNvbmQgbWVtb3J5IGFkZHJlc3MgKi8KLSAgICBTZWNvbmRNZW1BZGRyZXNzID0gKHVpbnQzMl90KShwRGF0YSArICg0KmhkY21pLT5YZmVyU2l6ZSkpOworICAgIFNlY29uZE1lbUFkZHJlc3MgPSAodWludDMyX3QpKHBEYXRhICsgKDQgKiBoZGNtaS0+WGZlclNpemUpKTsKIAogICAgIC8qIFN0YXJ0IERNQSBtdWx0aSBidWZmZXIgdHJhbnNmZXIgKi8KLSAgICBIQUxfRE1BRXhfTXVsdGlCdWZmZXJTdGFydF9JVChoZGNtaS0+RE1BX0hhbmRsZSwgKHVpbnQzMl90KSZoZGNtaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIFNlY29uZE1lbUFkZHJlc3MsIGhkY21pLT5YZmVyU2l6ZSk7CisgICAgaWYgKEhBTF9ETUFFeF9NdWx0aUJ1ZmZlclN0YXJ0X0lUKGhkY21pLT5ETUFfSGFuZGxlLCAodWludDMyX3QpJmhkY21pLT5JbnN0YW5jZS0+RFIsICh1aW50MzJfdClwRGF0YSwgU2Vjb25kTWVtQWRkcmVzcywgaGRjbWktPlhmZXJTaXplKSAhPSBIQUxfT0spCisgICAgeworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CiAgIH0KLSAgCisKICAgLyogRW5hYmxlIENhcHR1cmUgKi8KICAgaGRjbWktPkluc3RhbmNlLT5DUiB8PSBEQ01JX0NSX0NBUFRVUkU7CiAKQEAgLTQyOCwxOSArNDU3LDE5IEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgRGlzYWJsZSBEQ01JIERNQSByZXF1ZXN0IGFuZCBEaXNhYmxlIERDTUkgY2FwdHVyZSAgCisgICogQGJyaWVmICBEaXNhYmxlIERDTUkgRE1BIHJlcXVlc3QgYW5kIERpc2FibGUgRENNSSBjYXB0dXJlCiAgICogQHBhcmFtICBoZGNtaSBwb2ludGVyIHRvIGEgRENNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuIAotICAqIEByZXR2YWwgSEFMIHN0YXR1cyAgICAgCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9TdG9wKERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWkpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9TdG9wKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpCiB7Ci0gIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gSEFMX1RJTUVPVVRfRENNSV9TVE9QICogKFN5c3RlbUNvcmVDbG9jayAvOC8xMDAwKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgY291bnQgPSBIQUxfVElNRU9VVF9EQ01JX1NUT1AgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOFUgLyAxMDAwVSk7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIAogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhkY21pKTsKLSAgCisKICAgLyogTG9jayB0aGUgRENNSSBwZXJpcGhlcmFsIHN0YXRlICovCiAgIGhkY21pLT5TdGF0ZSA9IEhBTF9EQ01JX1NUQVRFX0JVU1k7CiAKQEAgLTQ1MCwyMiArNDc5LDIyIEBACiAgIC8qIENoZWNrIGlmIHRoZSBEQ01JIGNhcHR1cmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQgKi8KICAgZG8KICAgewotICAgIGlmIChjb3VudC0tID09IDApCisgICAgaWYgKGNvdW50LS0gPT0gMFUpCiAgICAgewogICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KICAgICAgIGhkY21pLT5FcnJvckNvZGUgfD0gSEFMX0RDTUlfRVJST1JfVElNRU9VVDsKLSAgICAgIAorCiAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKICAgICAgIGJyZWFrOwotICAgIH0gCisgICAgfQogICB9Ci0gIHdoaWxlKChoZGNtaS0+SW5zdGFuY2UtPkNSICYgRENNSV9DUl9DQVBUVVJFKSAhPSAwKTsKKyAgd2hpbGUgKChoZGNtaS0+SW5zdGFuY2UtPkNSICYgRENNSV9DUl9DQVBUVVJFKSAhPSAwVSk7CiAKICAgLyogRGlzYWJsZSB0aGUgRENNSSAqLwogICBfX0hBTF9EQ01JX0RJU0FCTEUoaGRjbWkpOwogCiAgIC8qIERpc2FibGUgdGhlIERNQSAqLwotICBIQUxfRE1BX0Fib3J0KGhkY21pLT5ETUFfSGFuZGxlKTsKKyAgKHZvaWQpSEFMX0RNQV9BYm9ydChoZGNtaS0+RE1BX0hhbmRsZSk7CiAKICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9OT05FOwpAQCAtNDgxLDIwICs1MTAsMjAgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdXNwZW5kIERDTUkgY2FwdHVyZSAgCisgICogQGJyaWVmICBTdXNwZW5kIERDTUkgY2FwdHVyZQogICAqIEBwYXJhbSAgaGRjbWkgcG9pbnRlciB0byBhIERDTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwotICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBEQ01JLiAKLSAgKiBAcmV0dmFsIEhBTCBzdGF0dXMgICAgIAorICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBEQ01JLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3VzcGVuZChEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RDTUlfU3VzcGVuZChEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKQogewotICByZWdpc3RlciB1aW50MzJfdCBjb3VudCA9IEhBTF9USU1FT1VUX0RDTUlfU1RPUCAqIChTeXN0ZW1Db3JlQ2xvY2sgLzgvMTAwMCk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gSEFMX1RJTUVPVVRfRENNSV9TVE9QICogKFN5c3RlbUNvcmVDbG9jayAvIDhVIC8gMTAwMFUpOwogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoZGNtaSk7CiAKLSAgaWYoaGRjbWktPlN0YXRlID09IEhBTF9EQ01JX1NUQVRFX0JVU1kpCisgIGlmIChoZGNtaS0+U3RhdGUgPT0gSEFMX0RDTUlfU1RBVEVfQlVTWSkKICAgewogICAgIC8qIENoYW5nZSBEQ01JIHN0YXRlICovCiAgICAgaGRjbWktPlN0YXRlID0gSEFMX0RDTUlfU1RBVEVfU1VTUEVOREVEOwpAQCAtNTA1LDQ5ICs1MzQsNDkgQEAKICAgICAvKiBDaGVjayBpZiB0aGUgRENNSSBjYXB0dXJlIGVmZmVjdGl2ZWx5IGRpc2FibGVkICovCiAgICAgZG8KICAgICB7Ci0gICAgICBpZiAoY291bnQtLSA9PSAwKQotICAgICAgeyAgICAgICAgCisgICAgICBpZiAoY291bnQtLSA9PSAwVSkKKyAgICAgIHsKICAgICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KICAgICAgICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9USU1FT1VUOwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2UgRENNSSBzdGF0ZSAqLwogICAgICAgICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9SRUFEWTsKLSAgICAgICAgCisKICAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICB3aGlsZSgoaGRjbWktPkluc3RhbmNlLT5DUiAmIERDTUlfQ1JfQ0FQVFVSRSkgIT0gMCk7Ci0gIH0gICAgCisgICAgd2hpbGUgKChoZGNtaS0+SW5zdGFuY2UtPkNSICYgRENNSV9DUl9DQVBUVVJFKSAhPSAwVSk7CisgIH0KICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaGRjbWkpOwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgotICAqIEBicmllZiAgUmVzdW1lIERDTUkgY2FwdHVyZSAgCisgICogQGJyaWVmICBSZXN1bWUgRENNSSBjYXB0dXJlCiAgICogQHBhcmFtICBoZGNtaSBwb2ludGVyIHRvIGEgRENNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCi0gICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuIAotICAqIEByZXR2YWwgSEFMIHN0YXR1cyAgICAgCisgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIERDTUkuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfRENNSV9SZXN1bWUoRENNSV9IYW5kbGVUeXBlRGVmKiBoZGNtaSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1Jlc3VtZShEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKQogewogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhkY21pKTsKLSAgCi0gIGlmKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9TVVNQRU5ERUQpCisKKyAgaWYgKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9TVVNQRU5ERUQpCiAgIHsKICAgICAvKiBDaGFuZ2UgRENNSSBzdGF0ZSAqLwogICAgIGhkY21pLT5TdGF0ZSA9IEhBTF9EQ01JX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBEaXNhYmxlIENhcHR1cmUgKi8KICAgICBoZGNtaS0+SW5zdGFuY2UtPkNSIHw9IERDTUlfQ1JfQ0FQVFVSRTsKLSAgfSAKKyAgfQogICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhoZGNtaSk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTU1OSw5NiArNTg4LDk5IEBACiAgICogQHJldHZhbCBOb25lCiAgICovCiB2b2lkIEhBTF9EQ01JX0lSUUhhbmRsZXIoRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSkKLXsgIAorewogICB1aW50MzJfdCBpc3JfdmFsdWUgPSBSRUFEX1JFRyhoZGNtaS0+SW5zdGFuY2UtPk1JU1IpOwotICAKKwogICAvKiBTeW5jaHJvbml6YXRpb24gZXJyb3IgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgaWYoKGlzcl92YWx1ZSAmIERDTUlfRkxBR19FUlJSSSkgPT0gRENNSV9GTEFHX0VSUlJJKQorICBpZiAoKGlzcl92YWx1ZSAmIERDTUlfRkxBR19FUlJSSSkgPT0gRENNSV9GTEFHX0VSUlJJKQogICB7CiAgICAgLyogQ2xlYXIgdGhlIFN5bmNocm9uaXphdGlvbiBlcnJvciBmbGFnICovCiAgICAgX19IQUxfRENNSV9DTEVBUl9GTEFHKGhkY21pLCBEQ01JX0ZMQUdfRVJSUkkpOwotICAgIAorCiAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8KICAgICBoZGNtaS0+RXJyb3JDb2RlIHw9IEhBTF9EQ01JX0VSUk9SX1NZTkM7Ci0gICAgCisKICAgICAvKiBDaGFuZ2UgRENNSSBzdGF0ZSAqLwogICAgIGhkY21pLT5TdGF0ZSA9IEhBTF9EQ01JX1NUQVRFX0VSUk9SOwotICAgIAorCiAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gZXJyb3IgY2FsbGJhY2sgKi8KICAgICBoZGNtaS0+RE1BX0hhbmRsZS0+WGZlckFib3J0Q2FsbGJhY2sgPSBEQ01JX0RNQUVycm9yOwotICAgIAorCiAgICAgLyogQWJvcnQgdGhlIERNQSBUcmFuc2ZlciAqLwotICAgIEhBTF9ETUFfQWJvcnRfSVQoaGRjbWktPkRNQV9IYW5kbGUpOyAKKyAgICAodm9pZClIQUxfRE1BX0Fib3J0X0lUKGhkY21pLT5ETUFfSGFuZGxlKTsKICAgfQogICAvKiBPdmVyZmxvdyBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgaWYoKGlzcl92YWx1ZSAmIERDTUlfRkxBR19PVlJSSSkgPT0gRENNSV9GTEFHX09WUlJJKQorICBpZiAoKGlzcl92YWx1ZSAmIERDTUlfRkxBR19PVlJSSSkgPT0gRENNSV9GTEFHX09WUlJJKQogICB7CiAgICAgLyogQ2xlYXIgdGhlIE92ZXJmbG93IGZsYWcgKi8KICAgICBfX0hBTF9EQ01JX0NMRUFSX0ZMQUcoaGRjbWksIERDTUlfRkxBR19PVlJSSSk7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLwogICAgIGhkY21pLT5FcnJvckNvZGUgfD0gSEFMX0RDTUlfRVJST1JfT1ZSOwotICAgIAorCiAgICAgLyogQ2hhbmdlIERDTUkgc3RhdGUgKi8KICAgICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9FUlJPUjsKLSAgICAKKwogICAgIC8qIFNldCB0aGUgb3ZlcmZsb3cgY2FsbGJhY2sgKi8KICAgICBoZGNtaS0+RE1BX0hhbmRsZS0+WGZlckFib3J0Q2FsbGJhY2sgPSBEQ01JX0RNQUVycm9yOwotICAgIAorCiAgICAgLyogQWJvcnQgdGhlIERNQSBUcmFuc2ZlciAqLwotICAgIEhBTF9ETUFfQWJvcnRfSVQoaGRjbWktPkRNQV9IYW5kbGUpOworICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhkY21pLT5ETUFfSGFuZGxlKSAhPSBIQUxfT0spCisgICAgeworICAgICAgRENNSV9ETUFFcnJvcihoZGNtaS0+RE1BX0hhbmRsZSk7CisgICAgfQogICB9CiAgIC8qIExpbmUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBpZigoaXNyX3ZhbHVlICYgRENNSV9GTEFHX0xJTkVSSSkgPT0gRENNSV9GTEFHX0xJTkVSSSkKKyAgaWYgKChpc3JfdmFsdWUgJiBEQ01JX0ZMQUdfTElORVJJKSA9PSBEQ01JX0ZMQUdfTElORVJJKQogICB7Ci0gICAgLyogQ2xlYXIgdGhlIExpbmUgaW50ZXJydXB0IGZsYWcgKi8gIAorICAgIC8qIENsZWFyIHRoZSBMaW5lIGludGVycnVwdCBmbGFnICovCiAgICAgX19IQUxfRENNSV9DTEVBUl9GTEFHKGhkY21pLCBEQ01JX0ZMQUdfTElORVJJKTsKLSAgICAKKwogICAgIC8qIExpbmUgaW50ZXJydXB0IENhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBEQ01JIGxpbmUgZXZlbnQgY2FsbGJhY2sqLwogICAgIGhkY21pLT5MaW5lRXZlbnRDYWxsYmFjayhoZGNtaSk7Ci0jZWxzZSAgCisjZWxzZQogICAgIEhBTF9EQ01JX0xpbmVFdmVudENhbGxiYWNrKGhkY21pKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAgICAKKyNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgIH0KICAgLyogVlNZTkMgaW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIGlmKChpc3JfdmFsdWUgJiBEQ01JX0ZMQUdfVlNZTkNSSSkgPT0gRENNSV9GTEFHX1ZTWU5DUkkpCisgIGlmICgoaXNyX3ZhbHVlICYgRENNSV9GTEFHX1ZTWU5DUkkpID09IERDTUlfRkxBR19WU1lOQ1JJKQogICB7CiAgICAgLyogQ2xlYXIgdGhlIFZTWU5DIGZsYWcgKi8KICAgICBfX0hBTF9EQ01JX0NMRUFSX0ZMQUcoaGRjbWksIERDTUlfRkxBR19WU1lOQ1JJKTsKLSAgICAKKwogICAgIC8qIFZTWU5DIENhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAvKkNhbGwgcmVnaXN0ZXJlZCBEQ01JIHZzeW5jIGV2ZW50IGNhbGxiYWNrKi8KICAgICBoZGNtaS0+VnN5bmNFdmVudENhbGxiYWNrKGhkY21pKTsKLSNlbHNlICAKKyNlbHNlCiAgICAgSEFMX0RDTUlfVnN5bmNFdmVudENhbGxiYWNrKGhkY21pKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovIAorI2VuZGlmIC8qIFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgfQogICAvKiBGUkFNRSBpbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgaWYoKGlzcl92YWx1ZSAmIERDTUlfRkxBR19GUkFNRVJJKSA9PSBEQ01JX0ZMQUdfRlJBTUVSSSkgICAKKyAgaWYgKChpc3JfdmFsdWUgJiBEQ01JX0ZMQUdfRlJBTUVSSSkgPT0gRENNSV9GTEFHX0ZSQU1FUkkpCiAgIHsKICAgICAvKiBXaGVuIHNuYXBzaG90IG1vZGUsIGRpc2FibGUgVnN5bmMsIEVycm9yIGFuZCBPdmVycnVuIGludGVycnVwdHMgKi8KLSAgICBpZigoaGRjbWktPkluc3RhbmNlLT5DUiAmIERDTUlfQ1JfQ00pID09IERDTUlfTU9ERV9TTkFQU0hPVCkKLSAgICB7IAorICAgIGlmICgoaGRjbWktPkluc3RhbmNlLT5DUiAmIERDTUlfQ1JfQ00pID09IERDTUlfTU9ERV9TTkFQU0hPVCkKKyAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBMaW5lLCBWc3luYywgRXJyb3IgYW5kIE92ZXJydW4gaW50ZXJydXB0cyAqLwogICAgICAgX19IQUxfRENNSV9ESVNBQkxFX0lUKGhkY21pLCBEQ01JX0lUX0xJTkUgfCBEQ01JX0lUX1ZTWU5DIHwgRENNSV9JVF9FUlIgfCBEQ01JX0lUX09WUik7CiAgICAgfQotICAgIAorCiAgICAgLyogRGlzYWJsZSB0aGUgRnJhbWUgaW50ZXJydXB0ICovCiAgICAgX19IQUxfRENNSV9ESVNBQkxFX0lUKGhkY21pLCBEQ01JX0lUX0ZSQU1FKTsKLSAgICAKKwogICAgIC8qIENsZWFyIHRoZSBFbmQgb2YgRnJhbWUgZmxhZyAqLwogICAgIF9fSEFMX0RDTUlfQ0xFQVJfRkxBRyhoZGNtaSwgRENNSV9GTEFHX0ZSQU1FUkkpOwotICAgIAorCiAgICAgLyogRnJhbWUgQ2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9EQ01JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgIC8qQ2FsbCByZWdpc3RlcmVkIERDTUkgZnJhbWUgZXZlbnQgY2FsbGJhY2sqLwogICAgIGhkY21pLT5GcmFtZUV2ZW50Q2FsbGJhY2soaGRjbWkpOwotI2Vsc2UgIAorI2Vsc2UKICAgICBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2soaGRjbWkpOwotI2VuZGlmIC8qIFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8gICAgICAKKyNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgIH0KIH0KIApAQCAtNjYyLDcgKzY5NCw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhkY21pKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0RDTUlfRXJyb3JDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtNjkxLDcgKzcyMyw3IEBACiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhkY21pKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0RDTUlfVnN5bmNFdmVudENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCkBAIC03MDcsNyArNzM5LDcgQEAKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGRjbWkpOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KQEAgLTcxOCwxMiArNzUwLDEyIEBACiAgICovCiAKIC8qKiBAZGVmZ3JvdXAgRENNSV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwogICoKLUB2ZXJiYXRpbSAgIAorQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICAgICgrKSBDb25maWd1cmUgdGhlIENST1AgZmVhdHVyZS4KICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgQ1JPUCBmZWF0dXJlLgpAQCAtNzU2LDcgKzc4OCw3IEBACiAgIGFzc2VydF9wYXJhbShJU19EQ01JX1dJTkRPV19IRUlHSFQoWTApKTsKICAgYXNzZXJ0X3BhcmFtKElTX0RDTUlfV0lORE9XX0NPT1JESU5BVEUoWFNpemUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0RDTUlfV0lORE9XX0NPT1JESU5BVEUoWVNpemUpKTsKLQkKKwogICAvKiBDb25maWd1cmUgQ1JPUCAqLwogICBoZGNtaS0+SW5zdGFuY2UtPkNXU0laRVIgPSAoWFNpemUgfCAoWVNpemUgPDwgRENNSV9DV1NJWkVfVkxJTkVfUG9zKSk7CiAgIGhkY21pLT5JbnN0YW5jZS0+Q1dTVFJUUiA9IChYMCB8IChZMCA8PCBEQ01JX0NXU1RSVF9WU1RfUG9zKSk7CkBAIC03ODUsMTUgKzgxNywxNSBAQAogICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9CVVNZOwogCiAgIC8qIERpc2FibGUgRENNSSBDcm9wIGZlYXR1cmUgKi8KLSAgaGRjbWktPkluc3RhbmNlLT5DUiAmPSB+KHVpbnQzMl90KURDTUlfQ1JfQ1JPUDsgIAorICBoZGNtaS0+SW5zdGFuY2UtPkNSICY9IH4odWludDMyX3QpRENNSV9DUl9DUk9QOwogCiAgIC8qIENoYW5nZSB0aGUgRENNSSBzdGF0ZSovCi0gIGhkY21pLT5TdGF0ZSA9IEhBTF9EQ01JX1NUQVRFX1JFQURZOyAgIAorICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9SRUFEWTsKIAogICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhoZGNtaSk7CiAKLSAgcmV0dXJuIEhBTF9PSzsgIAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTgxOSw3ICs4NTEsMzggQEAKICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaGRjbWkpOwogCi0gIHJldHVybiBIQUxfT0s7ICAKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworLyoqCisgICogQGJyaWVmICBTZXQgZW1iZWRkZWQgc3luY2hyb25pemF0aW9uIGRlbGltaXRlcnMgdW5tYXNrcy4KKyAgKiBAcGFyYW0gIGhkY21pIHBvaW50ZXIgdG8gYSBEQ01JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBEQ01JLgorICAqIEBwYXJhbSAgU3luY1VubWFzayBwb2ludGVyIHRvIGEgRENNSV9TeW5jVW5tYXNrVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgICAgICB0aGUgZW1iZWRkZWQgc3luY2hyb25pemF0aW9uIGRlbGltaXRlcnMgdW5tYXNrcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmICBIQUxfRENNSV9Db25maWdTeW5jVW5tYXNrKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWksIERDTUlfU3luY1VubWFza1R5cGVEZWYgKlN5bmNVbm1hc2spCit7CisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaGRjbWkpOworCisgIC8qIExvY2sgdGhlIERDTUkgcGVyaXBoZXJhbCBzdGF0ZSAqLworICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9CVVNZOworCisgIC8qIFdyaXRlIERDTUkgZW1iZWRkZWQgc3luY2hyb25pemF0aW9uIHVubWFzayByZWdpc3RlciAqLworICBoZGNtaS0+SW5zdGFuY2UtPkVTVVIgPSAoKCh1aW50MzJfdClTeW5jVW5tYXNrLT5GcmFtZVN0YXJ0VW5tYXNrKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpU3luY1VubWFzay0+TGluZVN0YXJ0VW5tYXNrIDw8IERDTUlfRVNVUl9MU1VfUG9zKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpU3luY1VubWFzay0+TGluZUVuZFVubWFzayA8PCBEQ01JX0VTVVJfTEVVX1BvcykgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KVN5bmNVbm1hc2stPkZyYW1lRW5kVW5tYXNrIDw8IERDTUlfRVNVUl9GRVVfUG9zKSk7CisKKyAgLyogQ2hhbmdlIHRoZSBEQ01JIHN0YXRlKi8KKyAgaGRjbWktPlN0YXRlID0gSEFMX0RDTUlfU1RBVEVfUkVBRFk7CisKKyAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaGRjbWkpOworCisgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgpAQCAtODI3LDIwICs4OTAsMjAgQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBEQ01JX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCiAgKgotQHZlcmJhdGltICAgCitAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KICAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvCiAgICAgICAoKykgQ2hlY2sgdGhlIERDTUkgc3RhdGUuCi0gICAgICAoKykgR2V0IHRoZSBzcGVjaWZpYyBEQ01JIGVycm9yIGZsYWcuICAKKyAgICAgICgrKSBHZXQgdGhlIHNwZWNpZmljIERDTUkgZXJyb3IgZmxhZy4KIAogQGVuZHZlcmJhdGltCiAgICogQHsKLSAgKi8gCisgICovCiAKIC8qKgogICAqIEBicmllZiAgUmV0dXJuIHRoZSBEQ01JIHN0YXRlCkBAIC04NDgsNyArOTExLDcgQEAKICAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgRENNSS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0ZQogICAqLwotSEFMX0RDTUlfU3RhdGVUeXBlRGVmIEhBTF9EQ01JX0dldFN0YXRlKERDTUlfSGFuZGxlVHlwZURlZiAqaGRjbWkpICAKK0hBTF9EQ01JX1N0YXRlVHlwZURlZiBIQUxfRENNSV9HZXRTdGF0ZShEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pKQogewogICByZXR1cm4gaGRjbWktPlN0YXRlOwogfQpAQCAtODc2LDcwICs5MzksNzAgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1JlZ2lzdGVyQ2FsbGJhY2soRENNSV9IYW5kbGVUeXBlRGVmICpoZGNtaSwgSEFMX0RDTUlfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcERDTUlfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwotICAKLSAgaWYocENhbGxiYWNrID09IE5VTEwpCisKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQogICB7CiAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAgCisgICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICB9CiAgIGVsc2UKICAgewotICAgIGlmKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9SRUFEWSkKKyAgICBpZiAoaGRjbWktPlN0YXRlID09IEhBTF9EQ01JX1NUQVRFX1JFQURZKQogICAgIHsKICAgICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICAgIHsKLSAgICAgIGNhc2UgSEFMX0RDTUlfRlJBTUVfRVZFTlRfQ0JfSUQgOgotICAgICAgICBoZGNtaS0+RnJhbWVFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIEhBTF9EQ01JX1ZTWU5DX0VWRU5UX0NCX0lEIDoKLSAgICAgICAgaGRjbWktPlZzeW5jRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgICAgYnJlYWs7IAotICAgICAgICAKLSAgICAgIGNhc2UgSEFMX0RDTUlfTElORV9FVkVOVF9DQl9JRCA6Ci0gICAgICAgIGhkY21pLT5MaW5lRXZlbnRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgY2FzZSBIQUxfRENNSV9FUlJPUl9DQl9JRCA6Ci0gICAgICAgIGhkY21pLT5FcnJvckNhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIEhBTF9EQ01JX01TUElOSVRfQ0JfSUQgOgotICAgICAgICBoZGNtaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICAgIGhkY21pLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgICAgYnJlYWs7CSAgCi0gICAgICAgIAotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCi0gICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9EQ01JX0ZSQU1FX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgICBoZGNtaS0+RnJhbWVFdmVudENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSEFMX0RDTUlfVlNZTkNfRVZFTlRfQ0JfSUQgOgorICAgICAgICAgIGhkY21pLT5Wc3luY0V2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIQUxfRENNSV9MSU5FX0VWRU5UX0NCX0lEIDoKKyAgICAgICAgICBoZGNtaS0+TGluZUV2ZW50Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIQUxfRENNSV9FUlJPUl9DQl9JRCA6CisgICAgICAgICAgaGRjbWktPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBIQUxfRENNSV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgICBoZGNtaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSEFMX0RDTUlfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgICBoZGNtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYoaGRjbWktPlN0YXRlID09IEhBTF9EQ01JX1NUQVRFX1JFU0VUKQorICAgIGVsc2UgaWYgKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9SRVNFVCkKICAgICB7CiAgICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgICB7Ci0gICAgICBjYXNlIEhBTF9EQ01JX01TUElOSVRfQ0JfSUQgOgotICAgICAgICBoZGNtaS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICBjYXNlIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICAgIGhkY21pLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgICAgYnJlYWs7CSAgCi0gICAgICAgIAotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwotICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQkJCi0gICAgfSAgCisgICAgICAgIGNhc2UgSEFMX0RDTUlfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgICAgaGRjbWktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgICAgaGRjbWktPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICAgIGhkY21pLT5FcnJvckNvZGUgfD0gSEFMX0RDTUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwpAQCAtOTQ4LDcgKzEwMTEsNyBAQAogICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICAgIH0KICAgfQotICAKKwogICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC05NjEsNjMgKzEwMjQsNjMgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9EQ01JX1VuUmVnaXN0ZXJDYWxsYmFjayhEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pLCBIQUxfRENNSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAotICBpZihoZGNtaS0+U3RhdGUgPT0gSEFMX0RDTUlfU1RBVEVfUkVBRFkpCisKKyAgaWYgKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9SRUFEWSkKICAgewogICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7Ci0gICAgY2FzZSBIQUxfRENNSV9GUkFNRV9FVkVOVF9DQl9JRCA6Ci0gICAgICBoZGNtaS0+RnJhbWVFdmVudENhbGxiYWNrID0gSEFMX0RDTUlfRnJhbWVFdmVudENhbGxiYWNrOyAgLyogTGVnYWN5IHdlYWsgIEZyYW1lRXZlbnRDYWxsYmFjayAgKi8gCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0RDTUlfVlNZTkNfRVZFTlRfQ0JfSUQgOgotICAgICAgaGRjbWktPlZzeW5jRXZlbnRDYWxsYmFjayA9IEhBTF9EQ01JX1ZzeW5jRXZlbnRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIFZzeW5jRXZlbnRDYWxsYmFjayAgICAgICAqLyAKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBIQUxfRENNSV9MSU5FX0VWRU5UX0NCX0lEIDoKLSAgICAgIGhkY21pLT5MaW5lRXZlbnRDYWxsYmFjayA9IEhBTF9EQ01JX0xpbmVFdmVudENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBMaW5lRXZlbnRDYWxsYmFjayAgICovCi0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSEFMX0RDTUlfRVJST1JfQ0JfSUQgOgotICAgICAgaGRjbWktPkVycm9yQ2FsbGJhY2sgPSBIQUxfRENNSV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8gCi0gICAgICBicmVhazsgIAotICAgICAgCi0gICAgY2FzZSBIQUxfRENNSV9NU1BJTklUX0NCX0lEIDoKLSAgICAgIGhkY21pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BJbml0OwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICBoZGNtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BEZUluaXQ7Ci0gICAgICBicmVhazsJICAKLSAgICAgIAotICAgIGRlZmF1bHQgOiAKLSAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfRENNSV9GUkFNRV9FVkVOVF9DQl9JRCA6CisgICAgICAgIGhkY21pLT5GcmFtZUV2ZW50Q2FsbGJhY2sgPSBIQUxfRENNSV9GcmFtZUV2ZW50Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayAgRnJhbWVFdmVudENhbGxiYWNrICAqLworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRENNSV9WU1lOQ19FVkVOVF9DQl9JRCA6CisgICAgICAgIGhkY21pLT5Wc3luY0V2ZW50Q2FsbGJhY2sgPSBIQUxfRENNSV9Wc3luY0V2ZW50Q2FsbGJhY2s7ICAvKiBMZWdhY3kgd2VhayBWc3luY0V2ZW50Q2FsbGJhY2sgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0RDTUlfTElORV9FVkVOVF9DQl9JRCA6CisgICAgICAgIGhkY21pLT5MaW5lRXZlbnRDYWxsYmFjayA9IEhBTF9EQ01JX0xpbmVFdmVudENhbGxiYWNrOyAgICAvKiBMZWdhY3kgd2VhayBMaW5lRXZlbnRDYWxsYmFjayAgICovCisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEhBTF9EQ01JX0VSUk9SX0NCX0lEIDoKKyAgICAgICAgaGRjbWktPkVycm9yQ2FsbGJhY2sgPSBIQUxfRENNSV9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXJyb3JDYWxsYmFjayAgICAgICAgKi8KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0RDTUlfTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhkY21pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BJbml0OworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBIQUxfRENNSV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBoZGNtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BEZUluaXQ7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCisgICAgICAgIGhkY21pLT5FcnJvckNvZGUgfD0gSEFMX0RDTUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKKyAgICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgZWxzZSBpZihoZGNtaS0+U3RhdGUgPT0gSEFMX0RDTUlfU1RBVEVfUkVTRVQpCisgIGVsc2UgaWYgKGhkY21pLT5TdGF0ZSA9PSBIQUxfRENNSV9TVEFURV9SRVNFVCkKICAgewogICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7Ci0gICAgY2FzZSBIQUxfRENNSV9NU1BJTklUX0NCX0lEIDoKLSAgICAgIGhkY21pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BJbml0OwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEhBTF9EQ01JX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICBoZGNtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfRENNSV9Nc3BEZUluaXQ7Ci0gICAgICBicmVhazsJICAKLSAgICAgIAotICAgIGRlZmF1bHQgOiAKLSAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaGRjbWktPkVycm9yQ29kZSB8PSBIQUxfRENNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwotICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOwotICAgIH0JCQotICB9ICAgCisgICAgICBjYXNlIEhBTF9EQ01JX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBoZGNtaS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0RDTUlfTXNwSW5pdDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSEFMX0RDTUlfTVNQREVJTklUX0NCX0lEIDoKKyAgICAgICAgaGRjbWktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX0RDTUlfTXNwRGVJbml0OworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLworICAgICAgICBoZGNtaS0+RXJyb3JDb2RlIHw9IEhBTF9EQ01JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CisgICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CiAgIGVsc2UKICAgewogICAgIC8qIHVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwpAQCAtMTAyNSw3ICsxMDg4LDcgQEAKICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgfQotICAKKwogICByZXR1cm4gc3RhdHVzOwogfQogI2VuZGlmIC8qIFVTRV9IQUxfRENNSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KQEAgLTEwMzcsOTYgKzExMDAsOTYgQEAKIC8qKiBAZGVmZ3JvdXAgRENNSV9Qcml2YXRlX0Z1bmN0aW9ucyBEQ01JIFByaXZhdGUgRnVuY3Rpb25zCiAgICogQHsKICAgKi8KLSAgLyoqCi0gICogQGJyaWVmICBETUEgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4gCi0gICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwotICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCi0gICogQHJldHZhbCBOb25lCi0gICovCisvKioKKyogQGJyaWVmICBETUEgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4KKyogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBETUEgbW9kdWxlLgorKiBAcmV0dmFsIE5vbmUKKyovCiBzdGF0aWMgdm9pZCBEQ01JX0RNQVhmZXJDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewogICB1aW50MzJfdCB0bXAgPSAwOwogCi0gIERDTUlfSGFuZGxlVHlwZURlZiogaGRjbWkgPSAoIERDTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OworICBEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pID0gKERDTUlfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OwogCi0gIGlmKGhkY21pLT5YZmVyQ291bnQgIT0gMCkKKyAgaWYgKGhkY21pLT5YZmVyQ291bnQgIT0gMCkKICAgewogICAgIC8qIFVwZGF0ZSBtZW1vcnkgMCBhZGRyZXNzIGxvY2F0aW9uICovCiAgICAgdG1wID0gKChoZGNtaS0+RE1BX0hhbmRsZS0+SW5zdGFuY2UtPkNSKSAmIERNQV9TeENSX0NUKTsKLSAgICBpZigoKGhkY21pLT5YZmVyQ291bnQgJSAyKSA9PSAwKSAmJiAodG1wICE9IDApKQorICAgIGlmICgoKGhkY21pLT5YZmVyQ291bnQgJSAyKSA9PSAwKSAmJiAodG1wICE9IDApKQogICAgIHsKICAgICAgIHRtcCA9IGhkY21pLT5ETUFfSGFuZGxlLT5JbnN0YW5jZS0+TTBBUjsKLSAgICAgIEhBTF9ETUFFeF9DaGFuZ2VNZW1vcnkoaGRjbWktPkRNQV9IYW5kbGUsICh0bXAgKyAoOCpoZGNtaS0+WGZlclNpemUpKSwgTUVNT1JZMCk7CisgICAgICBIQUxfRE1BRXhfQ2hhbmdlTWVtb3J5KGhkY21pLT5ETUFfSGFuZGxlLCAodG1wICsgKDggKiBoZGNtaS0+WGZlclNpemUpKSwgTUVNT1JZMCk7CiAgICAgICBoZGNtaS0+WGZlckNvdW50LS07CiAgICAgfQogICAgIC8qIFVwZGF0ZSBtZW1vcnkgMSBhZGRyZXNzIGxvY2F0aW9uICovCi0gICAgZWxzZSBpZigoaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5DUiAmIERNQV9TeENSX0NUKSA9PSAwKQorICAgIGVsc2UgaWYgKChoZGNtaS0+RE1BX0hhbmRsZS0+SW5zdGFuY2UtPkNSICYgRE1BX1N4Q1JfQ1QpID09IDApCiAgICAgewogICAgICAgdG1wID0gaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5NMUFSOwotICAgICAgSEFMX0RNQUV4X0NoYW5nZU1lbW9yeShoZGNtaS0+RE1BX0hhbmRsZSwgKHRtcCArICg4KmhkY21pLT5YZmVyU2l6ZSkpLCBNRU1PUlkxKTsKKyAgICAgIEhBTF9ETUFFeF9DaGFuZ2VNZW1vcnkoaGRjbWktPkRNQV9IYW5kbGUsICh0bXAgKyAoOCAqIGhkY21pLT5YZmVyU2l6ZSkpLCBNRU1PUlkxKTsKICAgICAgIGhkY21pLT5YZmVyQ291bnQtLTsKICAgICB9CiAgIH0KICAgLyogVXBkYXRlIG1lbW9yeSAwIGFkZHJlc3MgbG9jYXRpb24gKi8KLSAgZWxzZSBpZigoaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5DUiAmIERNQV9TeENSX0NUKSAhPSAwKQorICBlbHNlIGlmICgoaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5DUiAmIERNQV9TeENSX0NUKSAhPSAwKQogICB7CiAgICAgaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5NMEFSID0gaGRjbWktPnBCdWZmUHRyOwogICB9CiAgIC8qIFVwZGF0ZSBtZW1vcnkgMSBhZGRyZXNzIGxvY2F0aW9uICovCi0gIGVsc2UgaWYoKGhkY21pLT5ETUFfSGFuZGxlLT5JbnN0YW5jZS0+Q1IgJiBETUFfU3hDUl9DVCkgPT0gMCkKKyAgZWxzZSBpZiAoKGhkY21pLT5ETUFfSGFuZGxlLT5JbnN0YW5jZS0+Q1IgJiBETUFfU3hDUl9DVCkgPT0gMCkKICAgewogICAgIHRtcCA9IGhkY21pLT5wQnVmZlB0cjsKLSAgICBoZGNtaS0+RE1BX0hhbmRsZS0+SW5zdGFuY2UtPk0xQVIgPSAodG1wICsgKDQqaGRjbWktPlhmZXJTaXplKSk7CisgICAgaGRjbWktPkRNQV9IYW5kbGUtPkluc3RhbmNlLT5NMUFSID0gKHRtcCArICg0ICogaGRjbWktPlhmZXJTaXplKSk7CiAgICAgaGRjbWktPlhmZXJDb3VudCA9IGhkY21pLT5YZmVyVHJhbnNmZXJOdW1iZXI7CiAgIH0KIAogICAvKiBDaGVjayBpZiB0aGUgZnJhbWUgaXMgdHJhbnNmZXJyZWQgKi8KLSAgaWYoaGRjbWktPlhmZXJDb3VudCA9PSBoZGNtaS0+WGZlclRyYW5zZmVyTnVtYmVyKQorICBpZiAoaGRjbWktPlhmZXJDb3VudCA9PSBoZGNtaS0+WGZlclRyYW5zZmVyTnVtYmVyKQogICB7CiAgICAgLyogRW5hYmxlIHRoZSBGcmFtZSBpbnRlcnJ1cHQgKi8KICAgICBfX0hBTF9EQ01JX0VOQUJMRV9JVChoZGNtaSwgRENNSV9JVF9GUkFNRSk7Ci0gICAgCisKICAgICAvKiBXaGVuIHNuYXBzaG90IG1vZGUsIHNldCBkY21pIHN0YXRlIHRvIHJlYWR5ICovCi0gICAgaWYoKGhkY21pLT5JbnN0YW5jZS0+Q1IgJiBEQ01JX0NSX0NNKSA9PSBEQ01JX01PREVfU05BUFNIT1QpCi0gICAgeyAgCi0gICAgICBoZGNtaS0+U3RhdGU9IEhBTF9EQ01JX1NUQVRFX1JFQURZOworICAgIGlmICgoaGRjbWktPkluc3RhbmNlLT5DUiAmIERDTUlfQ1JfQ00pID09IERDTUlfTU9ERV9TTkFQU0hPVCkKKyAgICB7CisgICAgICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9SRUFEWTsKICAgICB9Ci0gIH0gIAorICB9CiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrIAorICAqIEBicmllZiAgRE1BIGVycm9yIGNhbGxiYWNrCiAgICogQHBhcmFtICBoZG1hIHBvaW50ZXIgdG8gYSBETUFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQSBtb2R1bGUuCiAgICogQHJldHZhbCBOb25lCiAgICovCiBzdGF0aWMgdm9pZCBEQ01JX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBEQ01JX0hhbmRsZVR5cGVEZWYqIGhkY21pID0gKCBEQ01JX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKLSAKLSAgaWYoaGRjbWktPkRNQV9IYW5kbGUtPkVycm9yQ29kZSAhPSBIQUxfRE1BX0VSUk9SX0ZFKQorICBEQ01JX0hhbmRsZVR5cGVEZWYgKmhkY21pID0gKERDTUlfSGFuZGxlVHlwZURlZiAqKSgoRE1BX0hhbmRsZVR5cGVEZWYgKiloZG1hKS0+UGFyZW50OworCisgIGlmIChoZGNtaS0+RE1BX0hhbmRsZS0+RXJyb3JDb2RlICE9IEhBTF9ETUFfRVJST1JfRkUpCiAgIHsKICAgICAvKiBJbml0aWFsaXplIHRoZSBEQ01JIHN0YXRlKi8KICAgICBoZGNtaS0+U3RhdGUgPSBIQUxfRENNSV9TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIC8qIFNldCBEQ01JIEVycm9yIENvZGUgKi8KICAgICBoZGNtaS0+RXJyb3JDb2RlIHw9IEhBTF9EQ01JX0VSUk9SX0RNQTsKICAgfQogCiAgIC8qIERDTUkgZXJyb3IgQ2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9EQ01JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgIC8qQ2FsbCByZWdpc3RlcmVkIERDTUkgZXJyb3IgY2FsbGJhY2sqLwotICAgIGhkY21pLT5FcnJvckNhbGxiYWNrKGhkY21pKTsKLSNlbHNlICAKLSAgICBIQUxfRENNSV9FcnJvckNhbGxiYWNrKGhkY21pKTsKLSNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovICAgCisgIC8qQ2FsbCByZWdpc3RlcmVkIERDTUkgZXJyb3IgY2FsbGJhY2sqLworICBoZGNtaS0+RXJyb3JDYWxsYmFjayhoZGNtaSk7CisjZWxzZQorICBIQUxfRENNSV9FcnJvckNhbGxiYWNrKGhkY21pKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0RDTUlfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKIH0KIAogLyoqCiAgICogQH0KICAgKi8KLSAgCisKIC8qKgogICAqIEB9CiAgICovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9kY21pX2V4LmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9kY21pX2V4LmMKaW5kZXggZjQ5ZmYwYS4uOWEwNTliMSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfZGNtaV9leC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2RjbWlfZXguYwpAQCAtNCw5ICs0LDkgQEAKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIEVtcHR5IGZpbGU7IFRoaXMgZmlsZSBpcyBubyBsb25nZXIgdXNlZCB0byBoYW5kbGUgdGhlIEJsYWNrJldoaXRlCiAgICogICAgICAgICAgZmVhdHVyZS4gSXRzIGNvbnRlbnQgaXMgbm93IG1vdmVkIHRvIGNvbW1vbiBmaWxlcwotICAqICAgICAgICAgIChzdG0zMmY3eHhfaGFsX2RjbWkuYy8uaCkgYXMgdGhlcmUncyBubyBkZXZpY2UncyBkZXBlbmRlbmN5IHdpdGhpbiBGNwotICAqICAgICAgICAgIGZhbWlseS4gSXQncyBqdXN0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KLSAgKiAKKyAgKiAgICAgICAgICAoc3RtMzJmN3h4X2hhbF9kY21pLmMvLmgpIGFzIHRoZXJlJ3Mgbm8gZGV2aWNlJ3MgZGVwZW5kZW5jeSB3aXRoaW4KKyAgKiAgICAgICAgICB0aGlzIGZhbWlseS4gSXQncyBqdXN0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX2Rmc2RtLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9kZnNkbS5jCmluZGV4IGRhZWIxZjkuLmRkMjUzZTUgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2Rmc2RtLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfZGZzZG0uYwpAQCAtMTU3LDIzICsxNTcsMjYgQEAKIAogICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQorICAgIFsuLl0KICAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfREZTRE1fUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgotICAgIFVzZSBmdW5jdGlvbnMgQHJlZiBIQUxfREZTRE1fQ2hhbm5lbF9SZWdpc3RlckNhbGxiYWNrKCksCi0gICAgQHJlZiBIQUxfREZTRE1fRmlsdGVyX1JlZ2lzdGVyQ2FsbGJhY2soKSBvcgotICAgIEByZWYgSEFMX0RGU0RNX0ZpbHRlcl9SZWdpc3RlckF3ZENhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIFVzZSBmdW5jdGlvbnMgSEFMX0RGU0RNX0NoYW5uZWxfUmVnaXN0ZXJDYWxsYmFjaygpLAorICAgIEhBTF9ERlNETV9GaWx0ZXJfUmVnaXN0ZXJDYWxsYmFjaygpIG9yCisgICAgSEFMX0RGU0RNX0ZpbHRlcl9SZWdpc3RlckF3ZENhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgogCi0gICAgRnVuY3Rpb24gQHJlZiBIQUxfREZTRE1fQ2hhbm5lbF9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyCisgICAgWy4uXQorICAgIEZ1bmN0aW9uIEhBTF9ERlNETV9DaGFubmVsX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIKICAgICBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgKCspIENrYWJDYWxsYmFjayAgICAgIDogREZTRE0gY2hhbm5lbCBjbG9jayBhYnNlbmNlIGRldGVjdGlvbiBjYWxsYmFjay4KICAgICAgICgrKSBTY2RDYWxsYmFjayAgICAgICA6IERGU0RNIGNoYW5uZWwgc2hvcnQgY2lyY3VpdCBkZXRlY3Rpb24gY2FsbGJhY2suCiAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgOiBERlNETSBjaGFubmVsIE1TUCBpbml0IGNhbGxiYWNrLgogICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrIDogREZTRE0gY2hhbm5lbCBNU1AgZGUtaW5pdCBjYWxsYmFjay4KKyAgICBbLi5dCiAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBDYWxsYmFjayBJRAogICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCiAKLSAgICBGdW5jdGlvbiBAcmVmIEhBTF9ERlNETV9GaWx0ZXJfUmVnaXN0ZXJDYWxsYmFjaygpIGFsbG93cyB0byByZWdpc3RlcgorICAgIFsuLl0KKyAgICBGdW5jdGlvbiBIQUxfREZTRE1fRmlsdGVyX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIKICAgICBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgKCspIFJlZ0NvbnZDcGx0Q2FsbGJhY2sgICAgIDogREZTRE0gZmlsdGVyIHJlZ3VsYXIgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4KICAgICAgICgrKSBSZWdDb252SGFsZkNwbHRDYWxsYmFjayA6IERGU0RNIGZpbHRlciBoYWxmIHJlZ3VsYXIgY29udmVyc2lvbiBjb21wbGV0ZSBjYWxsYmFjay4KQEAgLTE4MiwyNiArMTg1LDMzIEBACiAgICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgICAgICAgOiBERlNETSBmaWx0ZXIgZXJyb3IgY2FsbGJhY2suCiAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgICAgICAgOiBERlNETSBmaWx0ZXIgTVNQIGluaXQgY2FsbGJhY2suCiAgICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgICAgICAgOiBERlNETSBmaWx0ZXIgTVNQIGRlLWluaXQgY2FsbGJhY2suCisgICAgWy4uXQogICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgogCisgICAgWy4uXQogICAgIEZvciBzcGVjaWZpYyBERlNETSBmaWx0ZXIgYW5hbG9nIHdhdGNoZG9nIGNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2s6ICAgCi0gICAgQHJlZiBIQUxfREZTRE1fRmlsdGVyX1JlZ2lzdGVyQXdkQ2FsbGJhY2soKS4KKyAgICBIQUxfREZTRE1fRmlsdGVyX1JlZ2lzdGVyQXdkQ2FsbGJhY2soKS4KIAotICAgIFVzZSBmdW5jdGlvbnMgQHJlZiBIQUxfREZTRE1fQ2hhbm5lbF9VblJlZ2lzdGVyQ2FsbGJhY2soKSBvcgotICAgIEByZWYgSEFMX0RGU0RNX0ZpbHRlcl9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgWy4uXQorICAgIFVzZSBmdW5jdGlvbnMgSEFMX0RGU0RNX0NoYW5uZWxfVW5SZWdpc3RlckNhbGxiYWNrKCkgb3IKKyAgICBIQUxfREZTRE1fRmlsdGVyX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgICB3ZWFrIGZ1bmN0aW9uLgogCi0gICAgQHJlZiBIQUxfREZTRE1fQ2hhbm5lbF9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgWy4uXQorICAgIEhBTF9ERlNETV9DaGFubmVsX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKICAgICBhbmQgdGhlIENhbGxiYWNrIElELgorICAgIFsuLl0KICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgKCspIENrYWJDYWxsYmFjayAgICAgIDogREZTRE0gY2hhbm5lbCBjbG9jayBhYnNlbmNlIGRldGVjdGlvbiBjYWxsYmFjay4KICAgICAgICgrKSBTY2RDYWxsYmFjayAgICAgICA6IERGU0RNIGNoYW5uZWwgc2hvcnQgY2lyY3VpdCBkZXRlY3Rpb24gY2FsbGJhY2suCiAgICAgICAoKykgTXNwSW5pdENhbGxiYWNrICAgOiBERlNETSBjaGFubmVsIE1TUCBpbml0IGNhbGxiYWNrLgogICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrIDogREZTRE0gY2hhbm5lbCBNU1AgZGUtaW5pdCBjYWxsYmFjay4KIAotICAgIEByZWYgSEFMX0RGU0RNX0ZpbHRlcl9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCisgICAgWy4uXQorICAgIEhBTF9ERlNETV9GaWx0ZXJfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAogICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCisgICAgWy4uXQogICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAoKykgUmVnQ29udkNwbHRDYWxsYmFjayAgICAgOiBERlNETSBmaWx0ZXIgcmVndWxhciBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrLgogICAgICAgKCspIFJlZ0NvbnZIYWxmQ3BsdENhbGxiYWNrIDogREZTRE0gZmlsdGVyIGhhbGYgcmVndWxhciBjb252ZXJzaW9uIGNvbXBsZXRlIGNhbGxiYWNrLgpAQCAtMjExLDI5ICsyMjEsMzQgQEAKICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IERGU0RNIGZpbHRlciBNU1AgaW5pdCBjYWxsYmFjay4KICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICA6IERGU0RNIGZpbHRlciBNU1AgZGUtaW5pdCBjYWxsYmFjay4KIAorICAgIFsuLl0KICAgICBGb3Igc3BlY2lmaWMgREZTRE0gZmlsdGVyIGFuYWxvZyB3YXRjaGRvZyBjYWxsYmFjayB1c2UgZGVkaWNhdGVkIHVucmVnaXN0ZXIgY2FsbGJhY2s6Ci0gICAgQHJlZiBIQUxfREZTRE1fRmlsdGVyX1VuUmVnaXN0ZXJBd2RDYWxsYmFjaygpLgorICAgIEhBTF9ERlNETV9GaWx0ZXJfVW5SZWdpc3RlckF3ZENhbGxiYWNrKCkuCiAKKyAgICBbLi5dCiAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIGNhbGwgb2YgaW5pdCBmdW5jdGlvbiBhbmQgaWYgdGhlIHN0YXRlIGlzIFJFU0VUIAogICAgIGFsbCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9uczogCi0gICAgZXhhbXBsZXMgQHJlZiBIQUxfREZTRE1fQ2hhbm5lbFNjZENhbGxiYWNrKCksIEByZWYgSEFMX0RGU0RNX0ZpbHRlckVycm9yQ2FsbGJhY2soKS4KKyAgICBleGFtcGxlcyBIQUxfREZTRE1fQ2hhbm5lbFNjZENhbGxiYWNrKCksIEhBTF9ERlNETV9GaWx0ZXJFcnJvckNhbGxiYWNrKCkuCiAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBhcmUgcmVzcGVjdGl2ZWx5CiAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIGZ1bmN0aW9ucyBpbiB0aGUgaW5pdCBhbmQgZGUtaW5pdCBvbmx5IHdoZW4gdGhlc2UgCiAgICAgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KICAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIGluaXQgYW5kIGRlLWluaXQga2VlcCBhbmQgdXNlCiAgICAgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCiAKKyAgICBbLi5dCiAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgogICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKICAgICBpbiBSRUFEWSBvciBSRVNFVCBzdGF0ZSwgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQKICAgICBkdXJpbmcgdGhlIGluaXQvZGUtaW5pdC4KICAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzIHVzaW5nIAotICAgIEByZWYgSEFMX0RGU0RNX0NoYW5uZWxfUmVnaXN0ZXJDYWxsYmFjaygpIG9yCi0gICAgQHJlZiBIQUxfREZTRE1fRmlsdGVyX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBpbml0IG9yIGRlLWluaXQgZnVuY3Rpb24uCisgICAgSEFMX0RGU0RNX0NoYW5uZWxfUmVnaXN0ZXJDYWxsYmFjaygpIG9yCisgICAgSEFMX0RGU0RNX0ZpbHRlcl9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgaW5pdCBvciBkZS1pbml0IGZ1bmN0aW9uLgogCisgICAgWy4uXQogICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0RGU0RNX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgogICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIAogICAgIGFuZCB3ZWFrIGNhbGxiYWNrcyBhcmUgdXNlZC4KKwogICAgIEBlbmR2ZXJiYXRpbQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9leHRpLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9leHRpLmMKaW5kZXggMWQ4N2JlNC4uZDRmZTA4OSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfZXh0aS5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2V4dGkuYwpAQCAtODUsNyArODUsNiBAQAogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjd4eF9oYWwuaCIKLSNpbmNsdWRlICJzdG0zMmY3eHhfaGFsX2V4dGkuaCIKIAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9IQUxfRHJpdmVyCiAgICogQHsKQEAgLTEwNSw3ICsxMDQsNyBAQAogI2lmZGVmIEhBTF9FWFRJX01PRFVMRV9FTkFCTEVECiAKIC8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBQcml2YXRlIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9Db25zdGFudHMgRVhUSSBQcml2YXRlIENvbnN0YW50cwogICAqIEB7CiAgICovCkBAIC0xNDQsNiArMTQzLDggQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX1NldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykKIHsKICAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKIAogICAvKiBDaGVjayBudWxsIHBvaW50ZXIgKi8KICAgaWYgKChoZXh0aSA9PSBOVUxMKSB8fCAocEV4dGlDb25maWcgPT0gTlVMTCkpCkBAIC0xNTQsMzcgKzE1NSw3NyBAQAogICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUocEV4dGlDb25maWctPkxpbmUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTU9ERShwRXh0aUNvbmZpZy0+TW9kZSkpOwotICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9UUklHR0VSKHBFeHRpQ29uZmlnLT5UcmlnZ2VyKSk7ICAKLSAgCisKICAgLyogQXNzaWduIGxpbmUgbnVtYmVyIHRvIGhhbmRsZSAqLwogICBoZXh0aS0+TGluZSA9IHBFeHRpQ29uZmlnLT5MaW5lOwotICAKLSAgLyogQ2xlYXIgRVhUSSBsaW5lIGNvbmZpZ3VyYXRpb24gKi8KLSAgRVhUSS0+SU1SICY9IH5wRXh0aUNvbmZpZy0+TGluZTsKLSAgRVhUSS0+RU1SICY9IH5wRXh0aUNvbmZpZy0+TGluZTsKLSAgCi0gIC8qIFNlbGVjdCB0aGUgTW9kZSBmb3IgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGludGVycnVwdHMgKi8KLSAgcmVndmFsID0gKHVpbnQzMl90KUVYVElfQkFTRTsKLSAgcmVndmFsICs9IHBFeHRpQ29uZmlnLT5Nb2RlOwotICAqKF9fSU8gdWludDMyX3QgKikgcmVndmFsIHw9IHBFeHRpQ29uZmlnLT5MaW5lOwotICAKLSAgLyogQ2xlYXIgUmlzaW5nIEZhbGxpbmcgZWRnZSBjb25maWd1cmF0aW9uICovCi0gIEVYVEktPlJUU1IgJj0gfnBFeHRpQ29uZmlnLT5MaW5lOwotICBFWFRJLT5GVFNSICY9IH5wRXh0aUNvbmZpZy0+TGluZTsKLSAgCi0gIC8qIFNlbGVjdCB0aGUgdHJpZ2dlciBmb3IgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGludGVycnVwdHMgKi8KLSAgaWYgKHBFeHRpQ29uZmlnLT5UcmlnZ2VyID09IEVYVElfVFJJR0dFUl9SSVNJTkdfRkFMTElORykKKworICAvKiBDb21wdXRlIGxpbmUgbWFzayAqLworICBsaW5lcG9zID0gKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9QSU5fTUFTSyk7CisgIG1hc2tsaW5lID0gKDF1TCA8PCBsaW5lcG9zKTsKKworICAvKiBDb25maWd1cmUgdHJpZ2dlcnMgZm9yIGNvbmZpZ3VyYWJsZSBsaW5lcyAqLworICBpZiAoKHBFeHRpQ29uZmlnLT5MaW5lICYgRVhUSV9DT05GSUcpICE9IDB4MDB1KQogICB7Ci0gICAgLyogUmlzaW5nIEZhbGxpbmcgZWRnZSAqLwotICAgIEVYVEktPlJUU1IgfD0gcEV4dGlDb25maWctPkxpbmU7Ci0gICAgRVhUSS0+RlRTUiB8PSBwRXh0aUNvbmZpZy0+TGluZTsKKyAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9UUklHR0VSKHBFeHRpQ29uZmlnLT5UcmlnZ2VyKSk7CisKKyAgICAvKiBDb25maWd1cmUgcmlzaW5nIHRyaWdnZXIgKi8KKyAgICAvKiBNYXNrIG9yIHNldCBsaW5lICovCisgICAgaWYgKChwRXh0aUNvbmZpZy0+VHJpZ2dlciAmIEVYVElfVFJJR0dFUl9SSVNJTkcpICE9IDB4MDB1KQorICAgIHsKKyAgICAgIEVYVEktPlJUU1IgfD0gbWFza2xpbmU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBFWFRJLT5SVFNSICY9IH5tYXNrbGluZTsKKyAgICB9CisKKyAgICAvKiBDb25maWd1cmUgZmFsbGluZyB0cmlnZ2VyICovCisgICAgLyogTWFzayBvciBzZXQgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPlRyaWdnZXIgJiBFWFRJX1RSSUdHRVJfRkFMTElORykgIT0gMHgwMHUpCisgICAgeworICAgICAgRVhUSS0+RlRTUiB8PSBtYXNrbGluZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIEVYVEktPkZUU1IgJj0gfm1hc2tsaW5lOworICAgIH0KKworCisgICAgLyogQ29uZmlndXJlIGdwaW8gcG9ydCBzZWxlY3Rpb24gaW4gY2FzZSBvZiBncGlvIGV4dGkgbGluZSAqLworICAgIGlmICgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX0dQSU8pID09IEVYVElfR1BJTykKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BPUlQocEV4dGlDb25maWctPkdQSU9TZWwpKTsKKyAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsKKworICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICByZWd2YWwgJj0gfihTWVNDRkdfRVhUSUNSMV9FWFRJMCA8PCAoU1lTQ0ZHX0VYVElDUjFfRVhUSTFfUG9zICogKGxpbmVwb3MgJiAweDAzdSkpKTsKKyAgICAgIHJlZ3ZhbCB8PSAocEV4dGlDb25maWctPkdQSU9TZWwgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7CisgICAgICBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XSA9IHJlZ3ZhbDsKKyAgICB9CisgIH0KKworICAvKiBDb25maWd1cmUgaW50ZXJydXB0IG1vZGUgOiByZWFkIGN1cnJlbnQgbW9kZSAqLworICAvKiBNYXNrIG9yIHNldCBsaW5lICovCisgIGlmICgocEV4dGlDb25maWctPk1vZGUgJiBFWFRJX01PREVfSU5URVJSVVBUKSAhPSAweDAwdSkKKyAgeworICAgIEVYVEktPklNUiB8PSBtYXNrbGluZTsKICAgfQogICBlbHNlCiAgIHsKLSAgICByZWd2YWwgPSAodWludDMyX3QpRVhUSV9CQVNFOwotICAgIHJlZ3ZhbCArPSBwRXh0aUNvbmZpZy0+VHJpZ2dlcjsKLSAgICAqKF9fSU8gdWludDMyX3QgKikgcmVndmFsIHw9IHBFeHRpQ29uZmlnLT5MaW5lOworICAgIEVYVEktPklNUiAmPSB+bWFza2xpbmU7CiAgIH0KKworICAvKiBDb25maWd1cmUgZXZlbnQgbW9kZSA6IHJlYWQgY3VycmVudCBtb2RlICovCisgIC8qIE1hc2sgb3Igc2V0IGxpbmUgKi8KKyAgaWYgKChwRXh0aUNvbmZpZy0+TW9kZSAmIEVYVElfTU9ERV9FVkVOVCkgIT0gMHgwMHUpCisgIHsKKyAgICBFWFRJLT5FTVIgfD0gbWFza2xpbmU7CisgIH0KKyAgZWxzZQorICB7CisgICAgRVhUSS0+RU1SICY9IH5tYXNrbGluZTsKKyAgfQorCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKQEAgLTE5Niw2ICsyMzcsMTAgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0dldENvbmZpZ0xpbmUoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgRVhUSV9Db25maWdUeXBlRGVmICpwRXh0aUNvbmZpZykKIHsKKyAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKKwogICAvKiBDaGVjayBudWxsIHBvaW50ZXIgKi8KICAgaWYgKChoZXh0aSA9PSBOVUxMKSB8fCAocEV4dGlDb25maWcgPT0gTlVMTCkpCiAgIHsKQEAgLTIwOCw0MSArMjUzLDY3IEBACiAgIC8qIFN0b3JlIGhhbmRsZSBsaW5lIG51bWJlciB0byBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwogICBwRXh0aUNvbmZpZy0+TGluZSA9IGhleHRpLT5MaW5lOwogCi0gIC8qIEdldCBFWFRJIG1vZGUgdG8gY29uZmlnaWd1cmF0aW9uIHN0cnVjdHVyZSAqLwotICBpZiAoKEVYVEktPklNUiAmIGhleHRpLT5MaW5lKSA9PSBoZXh0aS0+TGluZSkKKyAgLyogQ29tcHV0ZSBsaW5lIG1hc2sgKi8KKyAgbGluZXBvcyA9IChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfUElOX01BU0spOworICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7CisKKyAgLyogMV0gR2V0IGNvcmUgbW9kZSA6IGludGVycnVwdCAqLworCisgIC8qIENoZWNrIGlmIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgIGlmICgoRVhUSS0+SU1SICYgbWFza2xpbmUpICE9IDB4MDB1KQogICB7CiAgICAgcEV4dGlDb25maWctPk1vZGUgPSBFWFRJX01PREVfSU5URVJSVVBUOwogICB9Ci0gIGVsc2UgaWYgKChFWFRJLT5FTVIgJiBoZXh0aS0+TGluZSkgPT0gaGV4dGktPkxpbmUpCi0gIHsKLSAgICBwRXh0aUNvbmZpZy0+TW9kZSA9IEVYVElfTU9ERV9FVkVOVDsKLSAgfQogICBlbHNlCiAgIHsKLSAgICAvKiBObyBNT0RFIHNlbGVjdGVkICovCi0gICAgcEV4dGlDb25maWctPk1vZGUgPSAweDBCdTsKKyAgICBwRXh0aUNvbmZpZy0+TW9kZSA9IEVYVElfTU9ERV9OT05FOwogICB9CiAKLSAgLyogR2V0IEVYVEkgVHJpZ2dlciB0byBjb25maWdpZ3VyYXRpb24gc3RydWN0dXJlICovCi0gIGlmICgoRVhUSS0+UlRTUiAmIGhleHRpLT5MaW5lKSA9PSBoZXh0aS0+TGluZSkKKyAgLyogR2V0IGV2ZW50IG1vZGUgKi8KKyAgLyogQ2hlY2sgaWYgc2VsZWN0ZWQgbGluZSBpcyBlbmFibGUgKi8KKyAgaWYgKChFWFRJLT5FTVIgJiBtYXNrbGluZSkgIT0gMHgwMHUpCiAgIHsKLSAgICBpZiAoKEVYVEktPkZUU1IgJiBoZXh0aS0+TGluZSkgPT0gaGV4dGktPkxpbmUpCi0gICAgewotICAgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfUklTSU5HX0ZBTExJTkc7Ci0gICAgfQotICAgIGVsc2UKKyAgICBwRXh0aUNvbmZpZy0+TW9kZSB8PSBFWFRJX01PREVfRVZFTlQ7CisgIH0KKworICAvKiAyXSBHZXQgdHJpZ2dlciBmb3IgY29uZmlndXJhYmxlIGxpbmVzIDogcmlzaW5nICovCisgIGlmICgocEV4dGlDb25maWctPkxpbmUgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpCisgIHsKKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChFWFRJLT5SVFNSICYgbWFza2xpbmUpICE9IDB4MDB1KQogICAgIHsKICAgICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gRVhUSV9UUklHR0VSX1JJU0lORzsKICAgICB9Ci0gIH0KLSAgZWxzZSBpZiAoKEVYVEktPkZUU1IgJiBoZXh0aS0+TGluZSkgPT0gaGV4dGktPkxpbmUpCi0gIHsKLSAgICBwRXh0aUNvbmZpZy0+VHJpZ2dlciA9IEVYVElfVFJJR0dFUl9GQUxMSU5HOworICAgIGVsc2UKKyAgICB7CisgICAgICBwRXh0aUNvbmZpZy0+VHJpZ2dlciA9IEVYVElfVFJJR0dFUl9OT05FOworICAgIH0KKworICAgIC8qIEdldCBmYWxsaW5nIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAvKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIG9mIHNlbGVjdGVkIGxpbmUgaXMgZW5hYmxlICovCisgICAgaWYgKChFWFRJLT5GVFNSICYgbWFza2xpbmUpICE9IDB4MDB1KQorICAgIHsKKyAgICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyIHw9IEVYVElfVFJJR0dFUl9GQUxMSU5HOworICAgIH0KKworICAgIC8qIEdldCBHcGlvIHBvcnQgc2VsZWN0aW9uIGZvciBncGlvIGxpbmVzICovCisgICAgaWYgKChwRXh0aUNvbmZpZy0+TGluZSAmIEVYVElfR1BJTykgPT0gRVhUSV9HUElPKQorICAgIHsKKyAgICAgIGFzc2VydF9wYXJhbShJU19FWFRJX0dQSU9fUElOKGxpbmVwb3MpKTsKKworICAgICAgcmVndmFsID0gU1lTQ0ZHLT5FWFRJQ1JbbGluZXBvcyA+PiAydV07CisgICAgICBwRXh0aUNvbmZpZy0+R1BJT1NlbCA9ICgocmVndmFsIDw8IChTWVNDRkdfRVhUSUNSMV9FWFRJMV9Qb3MgKiAoM3VMIC0gKGxpbmVwb3MgJiAweDAzdSkpKSkgPj4gMjQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgcEV4dGlDb25maWctPkdQSU9TZWwgPSAweDAwdTsKKyAgICB9CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogTm8gVHJpZ2dlciBzZWxlY3RlZCAqLwotICAgIHBFeHRpQ29uZmlnLT5UcmlnZ2VyID0gMHgwMHU7CisgICAgcEV4dGlDb25maWctPlRyaWdnZXIgPSBFWFRJX1RSSUdHRVJfTk9ORTsKKyAgICBwRXh0aUNvbmZpZy0+R1BJT1NlbCA9IDB4MDB1OwogICB9CiAKICAgcmV0dXJuIEhBTF9PSzsKQEAgLTI1NSw2ICszMjYsMTAgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9FWFRJX0NsZWFyQ29uZmlnTGluZShFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKQogeworICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IGxpbmVwb3M7CisgIHVpbnQzMl90IG1hc2tsaW5lOworCiAgIC8qIENoZWNrIG51bGwgcG9pbnRlciAqLwogICBpZiAoaGV4dGkgPT0gTlVMTCkKICAgewpAQCAtMjY0LDE1ICszMzksMzIgQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlciAqLwogICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CiAKKyAgLyogY29tcHV0ZSBsaW5lIG1hc2sgKi8KKyAgbGluZXBvcyA9IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spOworICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7CisKICAgLyogMV0gQ2xlYXIgaW50ZXJydXB0IG1vZGUgKi8KLSAgRVhUSS0+SU1SID0gKEVYVEktPklNUiAmIH5oZXh0aS0+TGluZSk7CisgIEVYVEktPklNUiA9IChFWFRJLT5JTVIgJiB+bWFza2xpbmUpOwogCiAgIC8qIDJdIENsZWFyIGV2ZW50IG1vZGUgKi8KLSAgRVhUSS0+RU1SID0gKEVYVEktPkVNUiAmIH5oZXh0aS0+TGluZSk7CisgIEVYVEktPkVNUiA9IChFWFRJLT5FTVIgJiB+bWFza2xpbmUpOwogCi0gIC8qIDNdIENsZWFyIHRyaWdnZXJzICovCi0gIEVYVEktPlJUU1IgPSAoRVhUSS0+UlRTUiAmIH5oZXh0aS0+TGluZSk7Ci0gIEVYVEktPkZUU1IgPSAoRVhUSS0+RlRTUiAmIH5oZXh0aS0+TGluZSk7CisgIC8qIDNdIENsZWFyIHRyaWdnZXJzIGluIGNhc2Ugb2YgY29uZmlndXJhYmxlIGxpbmVzICovCisgIGlmICgoaGV4dGktPkxpbmUgJiBFWFRJX0NPTkZJRykgIT0gMHgwMHUpCisgIHsKKyAgICBFWFRJLT5SVFNSID0gKEVYVEktPlJUU1IgJiB+bWFza2xpbmUpOworICAgIEVYVEktPkZUU1IgPSAoRVhUSS0+RlRTUiAmIH5tYXNrbGluZSk7CisKKyAgICAvKiBHZXQgR3BpbyBwb3J0IHNlbGVjdGlvbiBmb3IgZ3BpbyBsaW5lcyAqLworICAgIGlmICgoaGV4dGktPkxpbmUgJiBFWFRJX0dQSU8pID09IEVYVElfR1BJTykKKyAgICB7CisgICAgICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9HUElPX1BJTihsaW5lcG9zKSk7CisKKyAgICAgIHJlZ3ZhbCA9IFNZU0NGRy0+RVhUSUNSW2xpbmVwb3MgPj4gMnVdOworICAgICAgcmVndmFsICY9IH4oU1lTQ0ZHX0VYVElDUjFfRVhUSTAgPDwgKFNZU0NGR19FWFRJQ1IxX0VYVEkxX1BvcyAqIChsaW5lcG9zICYgMHgwM3UpKSk7CisgICAgICBTWVNDRkctPkVYVElDUltsaW5lcG9zID4+IDJ1XSA9IHJlZ3ZhbDsKKyAgICB9CisgIH0KIAogICByZXR1cm4gSEFMX09LOwogfQpAQCAtMzUyLDE3ICs0NDQsMTggQEAKICAgKi8KIHZvaWQgSEFMX0VYVElfSVJRSGFuZGxlcihFWFRJX0hhbmRsZVR5cGVEZWYgKmhleHRpKQogewotICBfX0lPIHVpbnQzMl90ICpyZWdhZGRyOwogICB1aW50MzJfdCByZWd2YWw7CisgIHVpbnQzMl90IG1hc2tsaW5lOworCisgIC8qIENvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7CiAKICAgLyogR2V0IHBlbmRpbmcgYml0ICAqLwotICByZWdhZGRyID0gKCZFWFRJLT5QUik7Ci0gIHJlZ3ZhbCA9ICgqcmVnYWRkciAmIGhleHRpLT5MaW5lKTsKLQorICByZWd2YWwgPSAoRVhUSS0+UFIgJiBtYXNrbGluZSk7CiAgIGlmIChyZWd2YWwgIT0gMHgwMHUpCiAgIHsKICAgICAvKiBDbGVhciBwZW5kaW5nIGJpdCAqLwotICAgICpyZWdhZGRyID0gaGV4dGktPkxpbmU7CisgICAgRVhUSS0+UFIgPSBtYXNrbGluZTsKIAogICAgIC8qIENhbGwgY2FsbGJhY2sgKi8KICAgICBpZiAoaGV4dGktPlBlbmRpbmdDYWxsYmFjayAhPSBOVUxMKQpAQCAtMzgzLDE5ICs0NzYsMjEgQEAKICAgKi8KIHVpbnQzMl90IEhBTF9FWFRJX0dldFBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkKIHsKLSAgX19JTyB1aW50MzJfdCAqcmVnYWRkcjsKICAgdWludDMyX3QgcmVndmFsOworICB1aW50MzJfdCBsaW5lcG9zOworICB1aW50MzJfdCBtYXNrbGluZTsKIAogICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoaGV4dGktPkxpbmUpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0VYVElfQ09ORklHX0xJTkUoaGV4dGktPkxpbmUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfUEVORElOR19FREdFKEVkZ2UpKTsKIAotICAvKiBHZXQgcGVuZGluZyBiaXQgKi8KLSAgcmVnYWRkciA9ICZFWFRJLT5QUjsKKyAgLyogQ29tcHV0ZSBsaW5lIG1hc2sgKi8KKyAgbGluZXBvcyA9IChoZXh0aS0+TGluZSAmIEVYVElfUElOX01BU0spOworICBtYXNrbGluZSA9ICgxdUwgPDwgbGluZXBvcyk7CiAKICAgLyogcmV0dXJuIDEgaWYgYml0IGlzIHNldCBlbHNlIDAgKi8KLSAgcmVndmFsID0gKCgqcmVnYWRkciAmIGhleHRpLT5MaW5lKSA+PiBQT1NJVElPTl9WQUwoaGV4dGktPkxpbmUpKTsKLQorICByZWd2YWwgPSAoKEVYVEktPlBSICYgbWFza2xpbmUpID4+IGxpbmVwb3MpOwogICByZXR1cm4gcmVndmFsOwogfQogCkBAIC00MTAsMTIgKzUwNSwxOCBAQAogICAqLwogdm9pZCBIQUxfRVhUSV9DbGVhclBlbmRpbmcoRVhUSV9IYW5kbGVUeXBlRGVmICpoZXh0aSwgdWludDMyX3QgRWRnZSkKIHsKKyAgdWludDMyX3QgbWFza2xpbmU7CisKICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9MSU5FKGhleHRpLT5MaW5lKSk7CisgIGFzc2VydF9wYXJhbShJU19FWFRJX0NPTkZJR19MSU5FKGhleHRpLT5MaW5lKSk7CiAgIGFzc2VydF9wYXJhbShJU19FWFRJX1BFTkRJTkdfRURHRShFZGdlKSk7Ci0gIAorCisgIC8qIENvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7CisKICAgLyogQ2xlYXIgUGVuZGluZyBiaXQgKi8KLSAgRVhUSS0+UFIgPSAgaGV4dGktPkxpbmU7CisgIEVYVEktPlBSID0gIG1hc2tsaW5lOwogfQogCiAvKioKQEAgLTQyNSwxMCArNTI2LDE3IEBACiAgICovCiB2b2lkIEhBTF9FWFRJX0dlbmVyYXRlU1dJKEVYVElfSGFuZGxlVHlwZURlZiAqaGV4dGkpCiB7CisgIHVpbnQzMl90IG1hc2tsaW5lOworCiAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShoZXh0aS0+TGluZSkpOworICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9DT05GSUdfTElORShoZXh0aS0+TGluZSkpOwogCi0gIEVYVEktPlNXSUVSID0gaGV4dGktPkxpbmU7CisgIC8qIENvbXB1dGUgbGluZSBtYXNrICovCisgIG1hc2tsaW5lID0gKDF1TCA8PCAoaGV4dGktPkxpbmUgJiBFWFRJX1BJTl9NQVNLKSk7CisKKyAgLyogR2VuZXJhdGUgU29mdHdhcmUgaW50ZXJydXB0ICovCisgIEVYVEktPlNXSUVSID0gbWFza2xpbmU7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfZ3Bpby5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfZ3Bpby5jCmluZGV4IDAyYjcyOWIuLjc1ZTRiNWIgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2dwaW8uYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9ncGlvLmMKQEAgLTE5MCwyNSArMTkwLDYgQEAKICAgICBpZihpb2N1cnJlbnQgPT0gaW9wb3NpdGlvbikKICAgICB7CiAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgLyogSW4gY2FzZSBvZiBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb24gKi8KLSAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX1BQKSB8fCAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9PRCkpCi0gICAgICB7Ci0gICAgICAgIC8qIENoZWNrIHRoZSBBbHRlcm5hdGUgZnVuY3Rpb24gcGFyYW1ldGVyICovCi0gICAgICAgIGFzc2VydF9wYXJhbShJU19HUElPX0FGKEdQSU9fSW5pdC0+QWx0ZXJuYXRlKSk7Ci0gICAgICAgIAotICAgICAgICAvKiBDb25maWd1cmUgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1hcHBlZCB3aXRoIHRoZSBjdXJyZW50IElPICovCi0gICAgICAgIHRlbXAgPSBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNdOwotICAgICAgICB0ZW1wICY9IH4oKHVpbnQzMl90KTB4RiA8PCAoKHVpbnQzMl90KShwb3NpdGlvbiAmICh1aW50MzJfdCkweDA3KSAqIDQpKSA7Ci0gICAgICAgIHRlbXAgfD0gKCh1aW50MzJfdCkoR1BJT19Jbml0LT5BbHRlcm5hdGUpIDw8ICgoKHVpbnQzMl90KXBvc2l0aW9uICYgKHVpbnQzMl90KTB4MDcpICogNCkpOwotICAgICAgICBHUElPeC0+QUZSW3Bvc2l0aW9uID4+IDNdID0gdGVtcDsKLSAgICAgIH0KLQotICAgICAgLyogQ29uZmlndXJlIElPIERpcmVjdGlvbiBtb2RlIChJbnB1dCwgT3V0cHV0LCBBbHRlcm5hdGUgb3IgQW5hbG9nKSAqLwotICAgICAgdGVtcCA9IEdQSU94LT5NT0RFUjsKLSAgICAgIHRlbXAgJj0gfihHUElPX01PREVSX01PREVSMCA8PCAocG9zaXRpb24gKiAyKSk7Ci0gICAgICB0ZW1wIHw9ICgoR1BJT19Jbml0LT5Nb2RlICYgR1BJT19NT0RFKSA8PCAocG9zaXRpb24gKiAyKSk7Ci0gICAgICBHUElPeC0+TU9ERVIgPSB0ZW1wOwotCiAgICAgICAvKiBJbiBjYXNlIG9mIE91dHB1dCBvciBBbHRlcm5hdGUgZnVuY3Rpb24gbW9kZSBzZWxlY3Rpb24gKi8KICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX09VVFBVVF9QUCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfUFApIHx8CiAgICAgICAgICAoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9PVVRQVVRfT0QpIHx8IChHUElPX0luaXQtPk1vZGUgPT0gR1BJT19NT0RFX0FGX09EKSkKQEAgLTIzNCw2ICsyMTUsMjUgQEAKICAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPlB1bGwpIDw8IChwb3NpdGlvbiAqIDIpKTsKICAgICAgIEdQSU94LT5QVVBEUiA9IHRlbXA7CiAKKyAgICAgIC8qIEluIGNhc2Ugb2YgQWx0ZXJuYXRlIGZ1bmN0aW9uIG1vZGUgc2VsZWN0aW9uICovCisgICAgICBpZigoR1BJT19Jbml0LT5Nb2RlID09IEdQSU9fTU9ERV9BRl9QUCkgfHwgKEdQSU9fSW5pdC0+TW9kZSA9PSBHUElPX01PREVfQUZfT0QpKQorICAgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgQWx0ZXJuYXRlIGZ1bmN0aW9uIHBhcmFtZXRlciAqLworICAgICAgICBhc3NlcnRfcGFyYW0oSVNfR1BJT19BRihHUElPX0luaXQtPkFsdGVybmF0ZSkpOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBBbHRlcm5hdGUgZnVuY3Rpb24gbWFwcGVkIHdpdGggdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgICAgdGVtcCA9IEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM107CisgICAgICAgIHRlbXAgJj0gfigodWludDMyX3QpMHhGIDw8ICgodWludDMyX3QpKHBvc2l0aW9uICYgKHVpbnQzMl90KTB4MDcpICogNCkpIDsKKyAgICAgICAgdGVtcCB8PSAoKHVpbnQzMl90KShHUElPX0luaXQtPkFsdGVybmF0ZSkgPDwgKCgodWludDMyX3QpcG9zaXRpb24gJiAodWludDMyX3QpMHgwNykgKiA0KSk7CisgICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM10gPSB0ZW1wOworICAgICAgfQorICAgICAgCisgICAgICAvKiBDb25maWd1cmUgSU8gRGlyZWN0aW9uIG1vZGUgKElucHV0LCBPdXRwdXQsIEFsdGVybmF0ZSBvciBBbmFsb2cpICovCisgICAgICB0ZW1wID0gR1BJT3gtPk1PREVSOworICAgICAgdGVtcCAmPSB+KEdQSU9fTU9ERVJfTU9ERVIwIDw8IChwb3NpdGlvbiAqIDIpKTsKKyAgICAgIHRlbXAgfD0gKChHUElPX0luaXQtPk1vZGUgJiBHUElPX01PREUpIDw8IChwb3NpdGlvbiAqIDIpKTsKKyAgICAgIEdQSU94LT5NT0RFUiA9IHRlbXA7CisKICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYVEkgTW9kZSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KICAgICAgIGlmKChHUElPX0luaXQtPk1vZGUgJiBFWFRJX01PREUpID09IEVYVElfTU9ERSkKQEAgLTMwMCw3ICszMDAsNyBAQAogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19HUElPX0FMTF9JTlNUQU5DRShHUElPeCkpOwotICAKKwogICAvKiBDb25maWd1cmUgdGhlIHBvcnQgcGlucyAqLwogICBmb3IocG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IEdQSU9fTlVNQkVSOyBwb3NpdGlvbisrKQogICB7CkBAIC0zMTYsMTAgKzMxNiw2IEBACiAgICAgICB0bXAgJj0gKCgodWludDMyX3QpMHgwRikgPDwgKDQgKiAocG9zaXRpb24gJiAweDAzKSkpOwogICAgICAgaWYodG1wID09ICgodWludDMyX3QpKEdQSU9fR0VUX0lOREVYKEdQSU94KSkgPDwgKDQgKiAocG9zaXRpb24gJiAweDAzKSkpKQogICAgICAgewotICAgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KLSAgICAgICAgdG1wID0gKCh1aW50MzJfdCkweDBGKSA8PCAoNCAqIChwb3NpdGlvbiAmIDB4MDMpKTsKLSAgICAgICAgU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMl0gJj0gfnRtcDsKLQogICAgICAgICAvKiBDbGVhciBFWFRJIGxpbmUgY29uZmlndXJhdGlvbiAqLwogICAgICAgICBFWFRJLT5JTVIgJj0gfigodWludDMyX3QpaW9jdXJyZW50KTsKICAgICAgICAgRVhUSS0+RU1SICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CkBAIC0zMjcsNiArMzIzLDEwIEBACiAgICAgICAgIC8qIENsZWFyIFJpc2luZyBGYWxsaW5nIGVkZ2UgY29uZmlndXJhdGlvbiAqLwogICAgICAgICBFWFRJLT5SVFNSICY9IH4oKHVpbnQzMl90KWlvY3VycmVudCk7CiAgICAgICAgIEVYVEktPkZUU1IgJj0gfigodWludDMyX3QpaW9jdXJyZW50KTsKKworICAgICAgICAvKiBDb25maWd1cmUgdGhlIEV4dGVybmFsIEludGVycnVwdCBvciBldmVudCBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgICAgdG1wID0gKCh1aW50MzJfdCkweDBGKSA8PCAoNCAqIChwb3NpdGlvbiAmIDB4MDMpKTsKKyAgICAgICAgU1lTQ0ZHLT5FWFRJQ1JbcG9zaXRpb24gPj4gMl0gJj0gfnRtcDsKICAgICAgIH0KICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHUElPIE1vZGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAvKiBDb25maWd1cmUgSU8gRGlyZWN0aW9uIGluIElucHV0IEZsb2F0aW5nIE1vZGUgKi8KQEAgLTMzNSwxNCArMzM1LDE0IEBACiAgICAgICAvKiBDb25maWd1cmUgdGhlIGRlZmF1bHQgQWx0ZXJuYXRlIEZ1bmN0aW9uIGluIGN1cnJlbnQgSU8gKi8KICAgICAgIEdQSU94LT5BRlJbcG9zaXRpb24gPj4gM10gJj0gfigodWludDMyX3QpMHhGIDw8ICgodWludDMyX3QpKHBvc2l0aW9uICYgKHVpbnQzMl90KTB4MDcpICogNCkpIDsKIAotICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBJTyBTcGVlZCAqLwotICAgICAgR1BJT3gtPk9TUEVFRFIgJj0gfihHUElPX09TUEVFREVSX09TUEVFRFIwIDw8IChwb3NpdGlvbiAqIDIpKTsKKyAgICAgIC8qIERlYWN0aXZhdGUgdGhlIFB1bGwtdXAgYW5kIFB1bGwtZG93biByZXNpc3RvciBmb3IgdGhlIGN1cnJlbnQgSU8gKi8KKyAgICAgIEdQSU94LT5QVVBEUiAmPSB+KEdQSU9fUFVQRFJfUFVQRFIwIDw8IChwb3NpdGlvbiAqIDIpKTsKIAogICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIElPIE91dHB1dCBUeXBlICovCiAgICAgICBHUElPeC0+T1RZUEVSICAmPSB+KEdQSU9fT1RZUEVSX09UXzAgPDwgcG9zaXRpb24pIDsKIAotICAgICAgLyogRGVhY3RpdmF0ZSB0aGUgUHVsbC11cCBhbmQgUHVsbC1kb3duIHJlc2lzdG9yIGZvciB0aGUgY3VycmVudCBJTyAqLwotICAgICAgR1BJT3gtPlBVUERSICY9IH4oR1BJT19QVVBEUl9QVVBEUjAgPDwgKHBvc2l0aW9uICogMikpOworICAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBJTyBTcGVlZCAqLworICAgICAgR1BJT3gtPk9TUEVFRFIgJj0gfihHUElPX09TUEVFREVSX09TUEVFRFIwIDw8IChwb3NpdGlvbiAqIDIpKTsKICAgICB9CiAgIH0KIH0KQEAgLTQzMSwxMyArNDMxLDEzIEBACiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19HUElPX1BJTihHUElPX1BpbikpOwogCi0gIGlmICgoR1BJT3gtPk9EUiAmIEdQSU9fUGluKSA9PSBHUElPX1BpbikKKyAgaWYgKChHUElPeC0+T0RSICYgR1BJT19QaW4pICE9IDBYMDB1KQogICB7CiAgICAgR1BJT3gtPkJTUlIgPSAodWludDMyX3QpR1BJT19QaW4gPDwgR1BJT19OVU1CRVI7CiAgIH0KICAgZWxzZQogICB7Ci0gICAgR1BJT3gtPkJTUlIgPSBHUElPX1BpbjsKKyAgICBHUElPeC0+QlNSUiA9ICh1aW50MzJfdClHUElPX1BpbjsKICAgfQogfQogCkBAIC00NjcsMTAgKzQ2NywxMSBAQAogICBHUElPeC0+TENLUiA9IEdQSU9fUGluOwogICAvKiBTZXQgTENLeCBiaXQocyk6IExDS0s9JzEnICsgTENLWzE1LTBdICovCiAgIEdQSU94LT5MQ0tSID0gdG1wOwotICAvKiBSZWFkIExDS0sgYml0Ki8KKyAgLyogUmVhZCBMQ0tSIHJlZ2lzdGVyLiBUaGlzIHJlYWQgaXMgbWFuZGF0b3J5IHRvIGNvbXBsZXRlIGtleSBsb2NrIHNlcXVlbmNlICovCiAgIHRtcCA9IEdQSU94LT5MQ0tSOwogCi0gaWYoKEdQSU94LT5MQ0tSICYgR1BJT19MQ0tSX0xDS0spICE9IFJFU0VUKQorICAvKiBSZWFkIGFnYWluIGluIG9yZGVyIHRvIGNvbmZpcm0gbG9jayBpcyBhY3RpdmUgKi8KKyAgaWYoKEdQSU94LT5MQ0tSICYgR1BJT19MQ0tSX0xDS0spICE9IFJFU0VUKQogICB7CiAgICAgcmV0dXJuIEhBTF9PSzsKICAgfQpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfaGFzaC5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfaGFzaC5jCmluZGV4IDY5YTg2MDcuLmM3NTJlZmEgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2hhc2guYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9oYXNoLmMKQEAgLTU3LDI0ICs1NywyOSBAQAogCiAgICAgKCMpV2hlbiB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgSEFMX0hBU0hfSW5pdCgpLCB0aGUgSEFTSCBwZXJpcGhlcmFsIGlzCiAgICAgICAgaW5pdGlhbGl6ZWQgYW5kIHByb2Nlc3NlcyB0aGUgYnVmZmVyIGZlZCBpbiBpbnB1dC4gV2hlbiB0aGUgaW5wdXQgZGF0YSBoYXZlIGFsbCBiZWVuCi0gICAgICAgZmVkIHRvIHRoZSBJUCwgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gc3RhcnQuCisgICAgICAgZmVkIHRvIHRoZSBQZXJpcGhlcmFsLCB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBzdGFydC4KIAotICAgICgjKU11bHRpLWJ1ZmZlciBwcm9jZXNzaW5nIGlzIHBvc3NpYmxlIGluIHBvbGxpbmcgYW5kIERNQSBtb2RlLgorICAgICgjKU11bHRpLWJ1ZmZlciBwcm9jZXNzaW5nIGlzIHBvc3NpYmxlIGluIHBvbGxpbmcsIGludGVycnVwdCBhbmQgRE1BIG1vZGVzLgogICAgICAgICAoIyMpIEluIHBvbGxpbmcgbW9kZSwgb25seSBtdWx0aS1idWZmZXIgSEFTSCBwcm9jZXNzaW5nIGlzIHBvc3NpYmxlLgogICAgICAgICAgICAgIEFQSSBIQUxfSEFTSF94eHhfQWNjdW11bGF0ZSgpIG11c3QgYmUgY2FsbGVkIGZvciBlYWNoIGlucHV0IGJ1ZmZlciwgZXhjZXB0IGZvciB0aGUgbGFzdCBvbmUuCi0gICAgICAgICAgICAgVXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSF94eHhfU3RhcnQoKSB0byBlbnRlciB0aGUgbGFzdCBvbmUgYW5kIHJldHJpZXZlIGFzCisgICAgICAgICAgICAgVXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSF94eHhfQWNjdW11bGF0ZV9FbmQoKSB0byBlbnRlciB0aGUgbGFzdCBvbmUgYW5kIHJldHJpZXZlIGFzCisgICAgICAgICAgICAgd2VsbCB0aGUgY29tcHV0ZWQgZGlnZXN0LgorCisgICAgICAgICgjIykgSW4gaW50ZXJydXB0IG1vZGUsIEFQSSBIQUxfSEFTSF94eHhfQWNjdW11bGF0ZV9JVCgpIG11c3QgYmUgY2FsbGVkIGZvciBlYWNoIGlucHV0IGJ1ZmZlciwKKyAgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBsYXN0IG9uZS4KKyAgICAgICAgICAgICBVc2VyIG11c3QgcmVzb3J0IHRvIEhBTF9IQVNIX3h4eF9BY2N1bXVsYXRlX0VuZF9JVCgpIHRvIGVudGVyIHRoZSBsYXN0IG9uZSBhbmQgcmV0cmlldmUgYXMKICAgICAgICAgICAgICB3ZWxsIHRoZSBjb21wdXRlZCBkaWdlc3QuCiAKICAgICAgICAgKCMjKSBJbiBETUEgbW9kZSwgbXVsdGktYnVmZmVyIEhBU0ggYW5kIEhNQUMgcHJvY2Vzc2luZyBhcmUgcG9zc2libGUuCiAgICAgICAgICAgICAgICgrKyspIEhBU0ggcHJvY2Vzc2luZzogb25jZSBpbml0aWFsaXphdGlvbiBpcyBkb25lLCBNRE1BVCBiaXQgbXVzdCBiZSBzZXQgdGhydSBfX0hBTF9IQVNIX1NFVF9NRE1BVCgpIG1hY3JvLgotICAgICAgICAgICAgIEZyb20gdGhhdCBwb2ludCwgZWFjaCBidWZmZXIgY2FuIGJlIGZlZCB0byB0aGUgSVAgdGhydSBIQUxfSEFTSF94eHhfU3RhcnRfRE1BKCkgQVBJLgorICAgICAgICAgICAgIEZyb20gdGhhdCBwb2ludCwgZWFjaCBidWZmZXIgY2FuIGJlIGZlZCB0byB0aGUgUGVyaXBoZXJhbCB0aHJ1IEhBTF9IQVNIX3h4eF9TdGFydF9ETUEoKSBBUEkuCiAgICAgICAgICAgICAgQmVmb3JlIGVudGVyaW5nIHRoZSBsYXN0IGJ1ZmZlciwgcmVzZXQgdGhlIE1ETUFUIGJpdCB3aXRoIF9fSEFMX0hBU0hfUkVTRVRfTURNQVQoKQogICAgICAgICAgICAgIG1hY3JvIHRoZW4gd3JhcC11cCB0aGUgSEFTSCBwcm9jZXNzaW5nIGluIGZlZWRpbmcgdGhlIGxhc3QgaW5wdXQgYnVmZmVyIHRocnUgdGhlCiAgICAgICAgICAgICAgc2FtZSBBUEkgSEFMX0hBU0hfeHh4X1N0YXJ0X0RNQSgpLiBUaGUgZGlnZXN0IGNhbiB0aGVuIGJlIHJldHJpZXZlZCB3aXRoIGEgY2FsbCB0bwogICAgICAgICAgICAgIEFQSSBIQUxfSEFTSF94eHhfRmluaXNoKCkuCiAgICAgICAgICAgICAgKCsrKykgSE1BQyBwcm9jZXNzaW5nIChyZXF1aXJlcyB0byByZXNvcnQgdG8gZXh0ZW5kZWQgZnVuY3Rpb25zKToKICAgICAgICAgICAgICBhZnRlciBpbml0aWFsaXphdGlvbiwgdGhlIGtleSBhbmQgdGhlIGZpcnN0IGlucHV0IGJ1ZmZlciBhcmUgZW50ZXJlZAotICAgICAgICAgICAgIGluIHRoZSBJUCB3aXRoIHRoZSBBUEkgSEFMX0hNQUNFeF94eHhfU3RlcDFfMl9ETUEoKS4gVGhpcyBjYXJyaWVzIG91dCBITUFDIHN0ZXAgMSBhbmQKKyAgICAgICAgICAgICBpbiB0aGUgUGVyaXBoZXJhbCB3aXRoIHRoZSBBUEkgSEFMX0hNQUNFeF94eHhfU3RlcDFfMl9ETUEoKS4gVGhpcyBjYXJyaWVzIG91dCBITUFDIHN0ZXAgMSBhbmQKICAgICAgICAgICAgICBzdGFydHMgc3RlcCAyLgogICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgYnVmZmVycyBhcmUgbmV4dCBlbnRlcmVkIHdpdGggdGhlIEFQSSAgSEFMX0hNQUNFeF94eHhfU3RlcDJfRE1BKCkuIEF0IHRoaXMKICAgICAgICAgICAgICBwb2ludCwgdGhlIEhNQUMgcHJvY2Vzc2luZyBpcyBzdGlsbCBjYXJyeWluZyBvdXQgc3RlcCAyLgpAQCAtOTAsMTYgKzk1LDUwIEBACiAgICAgICAgICAgICAgKCsrKykgSEFMX0hBU0hfRE1BRmVlZF9Qcm9jZXNzU3VzcGVuZCgpIHdoZW4gZGF0YSBhcmUgZW50ZXJlZCBieSBETUEuCiAKICAgICAgICAgKCMjKSBXaGVuIEhBU0ggb3IgSE1BQyBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCwgSEFMX0hBU0hfQ29udGV4dFNhdmluZygpIGFsbG93cwotICAgICAgICAgICAgdG8gc2F2ZSBpbiBtZW1vcnkgdGhlIElQIGNvbnRleHQuIFRoaXMgY29udGV4dCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXJ3YXJkcworICAgICAgICAgICAgdG8gc2F2ZSBpbiBtZW1vcnkgdGhlIFBlcmlwaGVyYWwgY29udGV4dC4gVGhpcyBjb250ZXh0IGNhbiBiZSByZXN0b3JlZCBhZnRlcndhcmRzCiAgICAgICAgICAgICB0byByZXN1bWUgdGhlIEhBU0ggcHJvY2Vzc2luZyB0aGFua3MgdG8gSEFMX0hBU0hfQ29udGV4dFJlc3RvcmluZygpLgogCi0gICAgICAgICgjIykgT25jZSB0aGUgSEFTSCBJUCBoYXMgYmVlbiByZXN0b3JlZCB0byB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGFzIHRoYXQgYXQgc3VzcGVuc2lvbgorICAgICAgICAoIyMpIE9uY2UgdGhlIEhBU0ggUGVyaXBoZXJhbCBoYXMgYmVlbiByZXN0b3JlZCB0byB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGFzIHRoYXQgYXQgc3VzcGVuc2lvbgogICAgICAgICAgICAgIHRpbWUsIHByb2Nlc3NpbmcgY2FuIGJlIHJlc3RhcnRlZCB3aXRoIHRoZSBzYW1lIEFQSSBjYWxsIChzYW1lIEFQSSwgc2FtZSBoYW5kbGUsCiAgICAgICAgICAgICAgc2FtZSBwYXJhbWV0ZXJzKSBhcyBkb25lIGJlZm9yZSB0aGUgc3VzcGVuc2lvbi4gUmVsZXZhbnQgcGFyYW1ldGVycyB0byByZXN0YXJ0IGF0CiAgICAgICAgICAgICAgdGhlIHByb3BlciBsb2NhdGlvbiBhcmUgaW50ZXJuYWxseSBzYXZlZCBpbiB0aGUgSEFTSCBoYW5kbGUuCiAKICAgICAoIylDYWxsIEhBTF9IQVNIX0RlSW5pdCgpIHRvIGRlaW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsLgogCisgICAgICoqKiBSZW1hcmtzIG9uIG1lc3NhZ2UgbGVuZ3RoICoqKgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBbLi5dCisgICAgICAoIykgSEFMIGluIGludGVycnVwdGlvbiBtb2RlIChpbnRlcnJ1cHRpb25zIGRyaXZlbikKKworICAgICAgICAoIyMpRHVlIHRvIEhBU0ggcGVyaXBoZXJhbCBoYXJkd2FyZSBkZXNpZ24sIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdGlvbiBpcyB0cmlnZ2VyZWQgZXZlcnkgNjQgYnl0ZXMuCisgICAgICAgIFRoaXMgaXMgd2h5LCBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIHNpbXBsaWNpdHnigJlzIHNha2UsIHVzZXIgaXMgcmVxdWVzdGVkIHRvIGVudGVyIGEgbWVzc2FnZSB0aGUKKyAgICAgICAgbGVuZ3RoIG9mIHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKworICAgICAgICAoIyMpIFdoZW4gdGhlIG1lc3NhZ2UgbGVuZ3RoIChpbiBieXRlcykgaXMgbm90IGEgbXVsdGlwbGUgb2Ygd29yZHMsIGEgc3BlY2lmaWMgZmllbGQgZXhpc3RzIGluIEhBU0hfU1RSCisgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggYml0cyB0byBkaXNjYXJkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgdG8gcHJvY2VzcyBvbmx5IHRoZSBtZXNzYWdlIGJpdHMKKyAgICAgICAgYW5kIG5vdCBleHRyYSBiaXRzLgorCisgICAgICAgICgjIykgSWYgdXNlciBuZWVkcyB0byBwZXJmb3JtIGEgaGFzaCBjb21wdXRhdGlvbiBvZiBhIGxhcmdlIGlucHV0IGJ1ZmZlciB0aGF0IGlzIHNwcmVhZCBhcm91bmQgdmFyaW91cyBwbGFjZXMKKyAgICAgICAgaW4gbWVtb3J5IGFuZCB3aGVyZSBlYWNoIHBpZWNlIG9mIHRoaXMgaW5wdXQgYnVmZmVyIGlzIG5vdCBuZWNlc3NhcmlseSBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgaW4gc2l6ZSwgaXQKKyAgICAgICAgYmVjb21lcyBuZWNlc3NhcnkgdG8gdXNlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBmb3JtYXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkgYmVmb3JlIGZlZWRpbmcgdGhlbSB0byB0aGUgUGVyaXBoZXJhbC4KKyAgICAgICAgSXQgaXMgYWR2aXNlZCB0byB0aGUgdXNlciB0bworICAgICAgICgrKyspIGFjaGlldmUgdGhlIGZpcnN0IGZvcm1hdHRpbmcgb3BlcmF0aW9uIGJ5IHNvZnR3YXJlIHRoZW4gZW50ZXIgdGhlIGRhdGEKKyAgICAgICAoKysrKSB3aGlsZSB0aGUgUGVyaXBoZXJhbCBpcyBwcm9jZXNzaW5nIHRoZSBmaXJzdCBpbnB1dCBzZXQsIGNhcnJ5IG91dCB0aGUgc2Vjb25kIGZvcm1hdHRpbmcgb3BlcmF0aW9uIGJ5IHNvZnR3YXJlLCB0byBiZSByZWFkeSB3aGVuIERJTklTIG9jY3Vycy4KKyAgICAgICAoKysrKSByZXBlYXQgc3RlcCAyIHVudGlsIHRoZSB3aG9sZSBtZXNzYWdlIGlzIHByb2Nlc3NlZC4KKworICAgICBbLi5dCisgICAgICAoIykgSEFMIGluIERNQSBtb2RlCisKKyAgICAgICAgKCMjKSBBZ2FpbiwgZHVlIHRvIGhhcmR3YXJlIGRlc2lnbiwgdGhlIERNQSB0cmFuc2ZlciB0byBmZWVkIHRoZSBkYXRhIGNhbiBvbmx5IGJlIGRvbmUgb24gYSB3b3JkLWJhc2lzLgorICAgICAgICBUaGUgc2FtZSBmaWVsZCBkZXNjcmliZWQgYWJvdmUgaW4gSEFTSF9TVFIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGJpdHMgdG8gZGlzY2FyZCBhdCB0aGUgZW5kIG9mIHRoZSBETUEgdHJhbnNmZXIKKyAgICAgICAgdG8gcHJvY2VzcyBvbmx5IHRoZSBtZXNzYWdlIGJpdHMgYW5kIG5vdCBleHRyYSBiaXRzLiBEdWUgdG8gaGFyZHdhcmUgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgcG9zc2libGUgb25seSBhdCB0aGUKKyAgICAgICAgZW5kIG9mIHRoZSBjb21wbGV0ZSBtZXNzYWdlLiBXaGVuIHNldmVyYWwgRE1BIHRyYW5zZmVycyBhcmUgbmVlZGVkIHRvIGVudGVyIHRoZSBtZXNzYWdlLCB0aGlzIGlzIG5vdCBhcHBsaWNhYmxlIGF0CisgICAgICAgIHRoZSBlbmQgb2YgdGhlIGludGVybWVkaWFyeSB0cmFuc2ZlcnMuCisKKyAgICAgICAgKCMjKSBTaW1pbGFybHkgdG8gdGhlIGludGVycnVwdGlvbi1kcml2ZW4gbW9kZSwgaXQgaXMgc3VnZ2VzdGVkIHRvIHRoZSB1c2VyIHRvIGZvcm1hdCB0aGUgY29uc2VjdXRpdmUgY2h1bmtzIG9mIGRhdGEKKyAgICAgICAgYnkgc29mdHdhcmUgd2hpbGUgdGhlIERNQSB0cmFuc2ZlciBhbmQgcHJvY2Vzc2luZyBpcyBvbi1nb2luZyBmb3IgdGhlIGZpcnN0IHBhcnRzIG9mIHRoZSBtZXNzYWdlLiBEdWUgdG8gdGhlIDMyLWJpdCBhbGlnbm1lbnQKKyAgICAgICAgcmVxdWlyZWQgZm9yIHRoZSBETUEgdHJhbnNmZXIsIGl0IGlzIHVuZGVybGluZWQgdGhhdCB0aGUgc29mdHdhcmUgZm9ybWF0dGluZyBvcGVyYXRpb24gaXMgbW9yZSBjb21wbGV4IHRoYW4gaW4gdGhlIElUIG1vZGUuCisKICAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgWy4uXQpAQCAtMjYwLDcgKzI5OSw3IEBACiAKICAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYXMgd2VsbCBjYWxsIGJhY2sgZnVuY3Rpb25zIGRlZmluaXRpb25zIGZvciB1c2VyCiAgICAgICAgICAgY29kZSB0byBtYW5hZ2U6Ci0gICAgICAoKykgSW5wdXQgZGF0YSB0cmFuc2ZlciB0byBJUCBjb21wbGV0aW9uCisgICAgICAoKykgSW5wdXQgZGF0YSB0cmFuc2ZlciB0byBQZXJpcGhlcmFsIGNvbXBsZXRpb24KICAgICAgICgrKSBDYWxjdWxhdGVkIGRpZ2VzdCByZXRyaWV2YWwgY29tcGxldGlvbgogICAgICAgKCspIEVycm9yIG1hbmFnZW1lbnQKIApAQCAtMjczLDI1ICszMTIsMjUgQEAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQogICAgICAgICAgICAgSEFTSF9IYW5kbGVUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgotICAqIEBub3RlICAgT25seSBNRE1BVCBhbmQgREFUQVRZUEUgYml0cyBvZiBIQVNIIElQIGFyZSBzZXQgYnkgSEFMX0hBU0hfSW5pdCgpLAorICAqIEBub3RlICAgT25seSBNRE1BVCBhbmQgREFUQVRZUEUgYml0cyBvZiBIQVNIIFBlcmlwaGVyYWwgYXJlIHNldCBieSBIQUxfSEFTSF9Jbml0KCksCiAgICogICAgICAgICBvdGhlciBjb25maWd1cmF0aW9uIGJpdHMgYXJlIHNldCBieSBIQVNIIG9yIEhNQUMgcHJvY2Vzc2luZyBBUElzLgogICAqIEBub3RlICAgTURNQVQgYml0IGlzIHN5c3RlbWF0aWNhbGx5IHJlc2V0IGJ5IEhBTF9IQVNIX0luaXQoKS4gVG8gc2V0IGl0IGZvcgogICAqICAgICAgICAgbXVsdGktYnVmZmVyIEhBU0ggcHJvY2Vzc2luZywgdXNlciBuZWVkcyB0byByZXNvcnQgdG8KICAgKiAgICAgICAgIF9fSEFMX0hBU0hfU0VUX01ETUFUKCkgbWFjcm8uIEZvciBITUFDIG11bHRpLWJ1ZmZlciBwcm9jZXNzaW5nLCB0aGUKICAgKiAgICAgICAgIHJlbGV2YW50IEFQSXMgbWFuYWdlIHRoZW1zZWx2ZXMgdGhlIE1ETUFUIGJpdC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZQorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX0luaXQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCkKIHsKLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX0hBU0hfREFUQVRZUEUoaGhhc2gtPkluaXQuRGF0YVR5cGUpKTsKLQogICAvKiBDaGVjayB0aGUgaGFzaCBoYW5kbGUgYWxsb2NhdGlvbiAqLwogICBpZihoaGFzaCA9PSBOVUxMKQogICB7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQorICAKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0hBU0hfREFUQVRZUEUoaGhhc2gtPkluaXQuRGF0YVR5cGUpKTsKIAogI2lmIChVU0VfSEFMX0hBU0hfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIGlmIChoaGFzaC0+U3RhdGUgPT0gSEFMX0hBU0hfU1RBVEVfUkVTRVQpCkBAIC0zMzQsNiArMzczLDggQEAKICAgaGhhc2gtPkRpZ2VzdENhbGN1bGF0aW9uRGlzYWJsZSA9IFJFU0VUOwogICAvKiBTZXQgcGhhc2UgdG8gUkVBRFkgKi8KICAgaGhhc2gtPlBoYXNlID0gSEFMX0hBU0hfUEhBU0VfUkVBRFk7CisgIC8qIFJlc2V0IHN1c3BlbnNpb24gcmVxdWVzdCBmbGFnICovCisgIGhoYXNoLT5TdXNwZW5kUmVxdWVzdCA9IEhBTF9IQVNIX1NVU1BFTkRfTk9ORTsKIAogICAvKiBTZXQgdGhlIGRhdGEgdHlwZSBiaXQgKi8KICAgTU9ESUZZX1JFRyhIQVNILT5DUiwgSEFTSF9DUl9EQVRBVFlQRSwgaGhhc2gtPkluaXQuRGF0YVR5cGUpOwpAQCAtMzU0LDcgKzM5NSw3IEBACiAKIC8qKgogICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX0RlSW5pdChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtNDAxLDEzICs0NDIsMTYgQEAKICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgY29kZSAqLwogICBoaGFzaC0+RXJyb3JDb2RlID0gSEFMX0hBU0hfRVJST1JfTk9ORTsKIAorICAvKiBSZXNldCBtdWx0aSBidWZmZXJzIGFjY3VtdWxhdGlvbiBmbGFnICovCisgIGhoYXNoLT5BY2N1bXVsYXRpb24gPSAwVTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBNU1AuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9IQVNIX01zcEluaXQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCkKQEAgLTQyMiw3ICs0NjYsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgSEFTSCBNU1AuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9IQVNIX01zcERlSW5pdChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtNDM4LDEyICs0ODIsMTIgQEAKIC8qKgogICAqIEBicmllZiAgSW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsIGJhY2suCiAgICogQG5vdGUgICBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjaygpIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wbGV0ZSBpbnB1dCBtZXNzYWdlCi0gICogICAgICAgICBoYXMgYmVlbiBmZWQgdG8gdGhlIElQLiBUaGlzIEFQSSBpcyBpbnZva2VkIG9ubHkgd2hlbiBpbnB1dCBkYXRhIGFyZQorICAqICAgICAgICAgaGFzIGJlZW4gZmVkIHRvIHRoZSBQZXJpcGhlcmFsLiBUaGlzIEFQSSBpcyBpbnZva2VkIG9ubHkgd2hlbiBpbnB1dCBkYXRhIGFyZQogICAqICAgICAgICAgZW50ZXJlZCB1bmRlciBpbnRlcnJ1cHRpb24gb3IgdGhydSBETUEuCiAgICogQG5vdGUgICBJbiBjYXNlIG9mIEhBU0ggb3IgSE1BQyBtdWx0aS1idWZmZXIgRE1BIGZlZWRpbmcgY2FzZSAoTURNQVQgYml0IHNldCksCiAgICogICAgICAgICBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjaygpIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggYnVmZmVyIGZlZWRpbmcKLSAgKiAgICAgICAgIHRvIHRoZSBJUC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiAgICAgICAgIHRvIHRoZSBQZXJpcGhlcmFsLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjayhIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtNDYwLDcgKzUwNCw3IEBACiAgICogQGJyaWVmICBEaWdlc3QgY29tcHV0YXRpb24gY29tcGxldGUgY2FsbCBiYWNrLgogICAqIEBub3RlICAgSEFMX0hBU0hfRGdzdENwbHRDYWxsYmFjaygpIGlzIHVzZWQgdW5kZXIgaW50ZXJydXB0aW9uLCBpcyBub3QKICAgKiAgICAgICAgIHJlbGV2YW50IHdpdGggRE1BLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfSEFTSF9EZ3N0Q3BsdENhbGxiYWNrKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gpCkBAIC00NzcsNyArNTIxLDcgQEAKICAgKiBAYnJpZWYgIEVycm9yIGNhbGxiYWNrLgogICAqIEBub3RlICAgQ29kZSB1c2VyIGNhbiByZXNvcnQgdG8gaGhhc2gtPlN0YXR1cyAoSEFMX0VSUk9SLCBIQUxfVElNRU9VVCwuLi4pCiAgICogICAgICAgICB0byByZXRyaWV2ZSB0aGUgZXJyb3IgdHlwZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX0hBU0hfRXJyb3JDYWxsYmFjayhIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtNjg0LDE3ICs3MjgsMTkgQEAKICAgICAgICAgICB0aGUgaGFzaCB2YWx1ZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBhbGdvcml0aG1zOgogICAgICAgKCspIE1ENQogICAgICAgICAgKCsrKSBIQUxfSEFTSF9NRDVfU3RhcnQoKQotICAgICAgICAgKCsrKSBIQUxfSEFTSF9NRDVfQWNjdW11bGF0ZSgpCisgICAgICAgICAoKyspIEhBTF9IQVNIX01ENV9BY2NtbHQoKQorICAgICAgICAgKCsrKSBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZCgpCiAgICAgICAoKykgU0hBMQogICAgICAgICAgKCsrKSBIQUxfSEFTSF9TSEExX1N0YXJ0KCkKLSAgICAgICAgICgrKykgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hfU0hBMV9BY2NtbHQoKQorICAgICAgICAgKCsrKSBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQoKQogCiAgICAgWy4uXSBGb3IgYSBzaW5nbGUgYnVmZmVyIHRvIGJlIGhhc2hlZCwgdXNlciBjYW4gcmVzb3J0IHRvIEhBTF9IQVNIX3h4eF9TdGFydCgpLgogCiAgICAgWy4uXSAgSW4gY2FzZSBvZiBtdWx0aS1idWZmZXIgSEFTSCBwcm9jZXNzaW5nIChhIHNpbmdsZSBkaWdlc3QgaXMgY29tcHV0ZWQgd2hpbGUKLSAgICAgICAgICBzZXZlcmFsIGJ1ZmZlcnMgYXJlIGZlZCB0byB0aGUgSVApLCB0aGUgdXNlciBjYW4gcmVzb3J0IHRvIHN1Y2Nlc3NpdmUgY2FsbHMKKyAgICAgICAgICBzZXZlcmFsIGJ1ZmZlcnMgYXJlIGZlZCB0byB0aGUgUGVyaXBoZXJhbCksIHRoZSB1c2VyIGNhbiByZXNvcnQgdG8gc3VjY2Vzc2l2ZSBjYWxscwogICAgICAgICAgIHRvIEhBTF9IQVNIX3h4eF9BY2N1bXVsYXRlKCkgYW5kIHdyYXAtdXAgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBieSBhIGNhbGwKLSAgICAgICAgICB0byBIQUxfSEFTSF94eHhfU3RhcnQoKS4KKyAgICAgICAgICB0byBIQUxfSEFTSF94eHhfQWNjdW11bGF0ZV9FbmQoKS4KIAogQGVuZHZlcmJhdGltCiAgICogQHsKQEAgLTcwNCwxMSArNzUwLDExIEBACiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gTUQ1IG1vZGUsIG5leHQgcHJvY2VzcyBwSW5CdWZmZXIgdGhlbgogICAqICAgICAgICAgcmVhZCB0aGUgY29tcHV0ZWQgZGlnZXN0LgogICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDE2IGJ5dGVzLgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZQorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCkBAIC03MTksMzcgKzc2NSw1MiBAQAogLyoqCiAgICogQGJyaWVmICBJZiBub3QgYWxyZWFkeSBkb25lLCBpbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gTUQ1IG1vZGUgdGhlbgogICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlci4KLSAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIX01ENV9BY2N1bXVsYXRlKCkgY2FuIGJlIHVzZWQgdG8gZmVlZAotICAqICAgICAgICAgc2V2ZXJhbCBpbnB1dCBidWZmZXJzIGJhY2stdG8tYmFjayB0byB0aGUgSVAgdGhhdCB3aWxsIHlpZWxkIGEgc2luZ2xlCisgICogQG5vdGUgICBDb25zZWN1dGl2ZSBjYWxscyB0byBIQUxfSEFTSF9NRDVfQWNjbWx0KCkgY2FuIGJlIHVzZWQgdG8gZmVlZAorICAqICAgICAgICAgc2V2ZXJhbCBpbnB1dCBidWZmZXJzIGJhY2stdG8tYmFjayB0byB0aGUgUGVyaXBoZXJhbCB0aGF0IHdpbGwgeWllbGQgYSBzaW5nbGUKICAgKiAgICAgICAgIEhBU0ggc2lnbmF0dXJlIG9uY2UgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGVudGVyZWQuIFdyYXAtdXAgb2YgaW5wdXQKICAgKiAgICAgICAgIGJ1ZmZlcnMgZmVlZGluZyBhbmQgcmV0cmlldmFsIG9mIGRpZ2VzdCBpcyBkb25lIGJ5IGEgY2FsbCB0bwotICAqICAgICAgICAgSEFMX0hBU0hfTUQ1X1N0YXJ0KCkuCisgICogICAgICAgICBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZCgpLgogICAqIEBub3RlICAgRmllbGQgaGhhc2gtPlBoYXNlIG9mIEhBU0ggaGFuZGxlIGlzIHRlc3RlZCB0byBjaGVjayB3aGV0aGVyIG9yIG5vdAotICAqICAgICAgICAgdGhlIElQIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICogQG5vdGUgICBEaWdlc3QgaXMgbm90IHJldHJpZXZlZCBieSB0aGlzIEFQSSwgdXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSF9NRDVfU3RhcnQoKQotICAqICAgICAgICAgdG8gcmVhZCBpdCwgZmVlZGluZyBhdCB0aGUgc2FtZSB0aW1lIHRoZSBsYXN0IGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICB0aGUgUGVyaXBoZXJhbCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqIEBub3RlICAgRGlnZXN0IGlzIG5vdCByZXRyaWV2ZWQgYnkgdGhpcyBBUEksIHVzZXIgbXVzdCByZXNvcnQgdG8gSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmQoKQorICAqICAgICAgICAgdG8gcmVhZCBpdCwgZmVlZGluZyBhdCB0aGUgc2FtZSB0aW1lIHRoZSBsYXN0IGlucHV0IGJ1ZmZlciB0byB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCi0gICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuIE9ubHkgSEFMX0hBU0hfTUQ1X1N0YXJ0KCkgaXMgYWJsZQorICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLiBPbmx5IEhBTF9IQVNIX01ENV9BY2NtbHRfRW5kKCkgaXMgYWJsZQogICAqICAgICAgICAgdG8gbWFuYWdlIHRoZSBlbmRpbmcgYnVmZmVyIHdpdGggYSBsZW5ndGggaW4gYnl0ZXMgbm90IGEgbXVsdGlwbGUgb2YgNC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9BY2N1bXVsYXRlKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9BY2NtbHQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQogewogICByZXR1cm4gIEhBU0hfQWNjdW11bGF0ZShoaGFzaCwgcEluQnVmZmVyLCBTaXplLEhBU0hfQUxHT1NFTEVDVElPTl9NRDUpOwogfQogCiAvKioKKyAgKiBAYnJpZWYgIEVuZCBjb21wdXRhdGlvbiBvZiBhIHNpbmdsZSBIQVNIIHNpZ25hdHVyZSBhZnRlciBzZXZlcmFsIGNhbGxzIHRvIEhBTF9IQVNIX01ENV9BY2NtbHQoKSBBUEkuCisgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAxNiBieXRlcy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KQoreworICByZXR1cm4gSEFTSF9TdGFydChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLCBUaW1lb3V0LCBIQVNIX0FMR09TRUxFQ1RJT05fTUQ1KTsKK30KKworLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMSBtb2RlLCBuZXh0IHByb2Nlc3MgcEluQnVmZmVyIHRoZW4KICAgKiAgICAgICAgIHJlYWQgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyMCBieXRlcy4KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUKKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDIwIGJ5dGVzLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9TSEExX1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKQEAgLTc2MCwyOCArODIxLDQyIEBACiAvKioKICAgKiBAYnJpZWYgIElmIG5vdCBhbHJlYWR5IGRvbmUsIGluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBTSEExIG1vZGUgdGhlbgogICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlci4KLSAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIX1NIQTFfQWNjdW11bGF0ZSgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKLSAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIElQIHRoYXQgd2lsbCB5aWVsZCBhIHNpbmdsZQorICAqIEBub3RlICAgQ29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0hBU0hfU0hBMV9BY2NtbHQoKSBjYW4gYmUgdXNlZCB0byBmZWVkCisgICogICAgICAgICBzZXZlcmFsIGlucHV0IGJ1ZmZlcnMgYmFjay10by1iYWNrIHRvIHRoZSBQZXJpcGhlcmFsIHRoYXQgd2lsbCB5aWVsZCBhIHNpbmdsZQogICAqICAgICAgICAgSEFTSCBzaWduYXR1cmUgb25jZSBhbGwgYnVmZmVycyBoYXZlIGJlZW4gZW50ZXJlZC4gV3JhcC11cCBvZiBpbnB1dAogICAqICAgICAgICAgYnVmZmVycyBmZWVkaW5nIGFuZCByZXRyaWV2YWwgb2YgZGlnZXN0IGlzIGRvbmUgYnkgYSBjYWxsIHRvCi0gICogICAgICAgICBIQUxfSEFTSF9TSEExX1N0YXJ0KCkuCisgICogICAgICAgICBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQoKS4KICAgKiBAbm90ZSAgIEZpZWxkIGhoYXNoLT5QaGFzZSBvZiBIQVNIIGhhbmRsZSBpcyB0ZXN0ZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKLSAgKiAgICAgICAgIHRoZSBJUCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAqIEBub3RlICAgRGlnZXN0IGlzIG5vdCByZXRyaWV2ZWQgYnkgdGhpcyBBUEksIHVzZXIgbXVzdCByZXNvcnQgdG8gSEFMX0hBU0hfU0hBMV9TdGFydCgpCi0gICogICAgICAgICB0byByZWFkIGl0LCBmZWVkaW5nIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGxhc3QgaW5wdXQgYnVmZmVyIHRvIHRoZSBJUC4KKyAgKiAgICAgICAgIHRoZSBQZXJpcGhlcmFsIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICogQG5vdGUgICBEaWdlc3QgaXMgbm90IHJldHJpZXZlZCBieSB0aGlzIEFQSSwgdXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQoKQorICAqICAgICAgICAgdG8gcmVhZCBpdCwgZmVlZGluZyBhdCB0aGUgc2FtZSB0aW1lIHRoZSBsYXN0IGlucHV0IGJ1ZmZlciB0byB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCi0gICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuIE9ubHkgSEFMX0hBU0hfU0hBMV9TdGFydCgpIGlzIGFibGUKKyAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4gT25seSBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmQoKSBpcyBhYmxlCiAgICogICAgICAgICB0byBtYW5hZ2UgdGhlIGVuZGluZyBidWZmZXIgd2l0aCBhIGxlbmd0aCBpbiBieXRlcyBub3QgYSBtdWx0aXBsZSBvZiA0LgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfU0hBMV9BY2N1bXVsYXRlKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfQWNjbWx0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKIHsKICAgcmV0dXJuICBIQVNIX0FjY3VtdWxhdGUoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSxIQVNIX0FMR09TRUxFQ1RJT05fU0hBMSk7CiB9CiAKKy8qKgorICAqIEBicmllZiAgRW5kIGNvbXB1dGF0aW9uIG9mIGEgc2luZ2xlIEhBU0ggc2lnbmF0dXJlIGFmdGVyIHNldmVyYWwgY2FsbHMgdG8gSEFMX0hBU0hfU0hBMV9BY2NtbHQoKSBBUEkuCisgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyMCBieXRlcy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKK3sKKyAgcmV0dXJuIEhBU0hfU3RhcnQoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSwgcE91dEJ1ZmZlciwgVGltZW91dCwgSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTEpOworfQogCiAvKioKICAgKiBAfQpAQCAtNzk4LDEyICs4NzMsMTYgQEAKICAgICAgICAgICB0aGUgaGFzaCB2YWx1ZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBhbGdvcml0aG1zOgogICAgICAgKCspIE1ENQogICAgICAgICAgKCsrKSBIQUxfSEFTSF9NRDVfU3RhcnRfSVQoKQorICAgICAgICAgKCsrKSBIQUxfSEFTSF9NRDVfQWNjbWx0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hfTUQ1X0FjY21sdF9FbmRfSVQoKQogICAgICAgKCspIFNIQTEKICAgICAgICAgICgrKykgSEFMX0hBU0hfU0hBMV9TdGFydF9JVCgpCisgICAgICAgICAoKyspIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kX0lUKCkKIAogICAgIFsuLl0gIEFQSSBIQUxfSEFTSF9JUlFIYW5kbGVyKCkgbWFuYWdlcyBlYWNoIEhBU0ggaW50ZXJydXB0aW9uLgogCi0gICAgWy4uXSBOb3RlIHRoYXQgSEFMX0hBU0hfSVJRSGFuZGxlcigpIG1hbmFnZXMgYXMgd2VsbCBIQVNIIElQIGludGVycnVwdGlvbnMgd2hlbiBpbgorICAgIFsuLl0gTm90ZSB0aGF0IEhBTF9IQVNIX0lSUUhhbmRsZXIoKSBtYW5hZ2VzIGFzIHdlbGwgSEFTSCBQZXJpcGhlcmFsIGludGVycnVwdGlvbnMgd2hlbiBpbgogICAgICAgICAgSE1BQyBwcm9jZXNzaW5nIG1vZGUuCiAKIApAQCAtODE1LDEwICs4OTQsMTAgQEAKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBNRDUgbW9kZSwgbmV4dCBwcm9jZXNzIHBJbkJ1ZmZlciB0aGVuCiAgICogICAgICAgICByZWFkIHRoZSBjb21wdXRlZCBkaWdlc3QgaW4gaW50ZXJydXB0aW9uIG1vZGUuCiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAxNiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpCkBAIC04MjYsMTUgKzkwNSw1MSBAQAogICByZXR1cm4gSEFTSF9TdGFydF9JVChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLEhBU0hfQUxHT1NFTEVDVElPTl9NRDUpOwogfQogCisvKioKKyAgKiBAYnJpZWYgIElmIG5vdCBhbHJlYWR5IGRvbmUsIGluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBNRDUgbW9kZSB0aGVuCisgICogICAgICAgICBwcm9jZXNzZXMgcEluQnVmZmVyIGluIGludGVycnVwdGlvbiBtb2RlLgorICAqIEBub3RlICAgQ29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0hBU0hfTUQ1X0FjY21sdF9JVCgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKKyAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIFBlcmlwaGVyYWwgdGhhdCB3aWxsIHlpZWxkIGEgc2luZ2xlCisgICogICAgICAgICBIQVNIIHNpZ25hdHVyZSBvbmNlIGFsbCBidWZmZXJzIGhhdmUgYmVlbiBlbnRlcmVkLiBXcmFwLXVwIG9mIGlucHV0CisgICogICAgICAgICBidWZmZXJzIGZlZWRpbmcgYW5kIHJldHJpZXZhbCBvZiBkaWdlc3QgaXMgZG9uZSBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9IQVNIX01ENV9BY2NtbHRfRW5kX0lUKCkuCisgICogQG5vdGUgICBGaWVsZCBoaGFzaC0+UGhhc2Ugb2YgSEFTSCBoYW5kbGUgaXMgdGVzdGVkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICB0aGUgUGVyaXBoZXJhbCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqIEBub3RlICAgVGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlLCB0aGUKKyAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4gT25seSBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZF9JVCgpIGlzIGFibGUKKyAgKiAgICAgICAgIHRvIG1hbmFnZSB0aGUgZW5kaW5nIGJ1ZmZlciB3aXRoIGEgbGVuZ3RoIGluIGJ5dGVzIG5vdCBhIG11bHRpcGxlIG9mIDQuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9NRDVfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK3sKKyAgcmV0dXJuICBIQVNIX0FjY3VtdWxhdGVfSVQoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSxIQVNIX0FMR09TRUxFQ1RJT05fTUQ1KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmQgY29tcHV0YXRpb24gb2YgYSBzaW5nbGUgSEFTSCBzaWduYXR1cmUgYWZ0ZXIgc2V2ZXJhbCBjYWxscyB0byBIQUxfSEFTSF9NRDVfQWNjbWx0X0lUKCkgQVBJLgorICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9NRDVfQWNjbWx0X0VuZF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpCit7CisgIHJldHVybiBIQVNIX1N0YXJ0X0lUKGhoYXNoLCBwSW5CdWZmZXIsIFNpemUsIHBPdXRCdWZmZXIsSEFTSF9BTEdPU0VMRUNUSU9OX01ENSk7Cit9CiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIGluIFNIQTEgbW9kZSwgbmV4dCBwcm9jZXNzIHBJbkJ1ZmZlciB0aGVuCiAgICogICAgICAgICByZWFkIHRoZSBjb21wdXRlZCBkaWdlc3QgaW4gaW50ZXJydXB0aW9uIG1vZGUuCiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyMCBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfU3RhcnRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKQpAQCAtODQyLDkgKzk1Nyw0NyBAQAogICByZXR1cm4gSEFTSF9TdGFydF9JVChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLEhBU0hfQUxHT1NFTEVDVElPTl9TSEExKTsKIH0KIAorCisvKioKKyAgKiBAYnJpZWYgIElmIG5vdCBhbHJlYWR5IGRvbmUsIGluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBTSEExIG1vZGUgdGhlbgorICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlciBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIX1NIQTFfQWNjbWx0X0lUKCkgY2FuIGJlIHVzZWQgdG8gZmVlZAorICAqICAgICAgICAgc2V2ZXJhbCBpbnB1dCBidWZmZXJzIGJhY2stdG8tYmFjayB0byB0aGUgUGVyaXBoZXJhbCB0aGF0IHdpbGwgeWllbGQgYSBzaW5nbGUKKyAgKiAgICAgICAgIEhBU0ggc2lnbmF0dXJlIG9uY2UgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGVudGVyZWQuIFdyYXAtdXAgb2YgaW5wdXQKKyAgKiAgICAgICAgIGJ1ZmZlcnMgZmVlZGluZyBhbmQgcmV0cmlldmFsIG9mIGRpZ2VzdCBpcyBkb25lIGJ5IGEgY2FsbCB0bworICAqICAgICAgICAgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kX0lUKCkuCisgICogQG5vdGUgICBGaWVsZCBoaGFzaC0+UGhhc2Ugb2YgSEFTSCBoYW5kbGUgaXMgdGVzdGVkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICB0aGUgUGVyaXBoZXJhbCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqIEBub3RlICAgVGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlLCB0aGUKKyAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4gT25seSBIQUxfSEFTSF9TSEExX0FjY21sdF9FbmRfSVQoKSBpcyBhYmxlCisgICogICAgICAgICB0byBtYW5hZ2UgdGhlIGVuZGluZyBidWZmZXIgd2l0aCBhIGxlbmd0aCBpbiBieXRlcyBub3QgYSBtdWx0aXBsZSBvZiA0LgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfU0hBMV9BY2NtbHRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQoreworICByZXR1cm4gIEhBU0hfQWNjdW11bGF0ZV9JVChoaGFzaCwgcEluQnVmZmVyLCBTaXplLEhBU0hfQUxHT1NFTEVDVElPTl9TSEExKTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmQgY29tcHV0YXRpb24gb2YgYSBzaW5nbGUgSEFTSCBzaWduYXR1cmUgYWZ0ZXIgc2V2ZXJhbCBjYWxscyB0byBIQUxfSEFTSF9TSEExX0FjY21sdF9JVCgpIEFQSS4KKyAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDIwIGJ5dGVzLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfU0hBMV9BY2NtbHRfRW5kX0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlcikKK3sKKyAgcmV0dXJuIEhBU0hfU3RhcnRfSVQoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSwgcE91dEJ1ZmZlcixIQVNIX0FMR09TRUxFQ1RJT05fU0hBMSk7Cit9CisKIC8qKgogICAqIEBicmllZiBIYW5kbGUgSEFTSCBpbnRlcnJ1cHQgcmVxdWVzdC4KLSAgKiBAcGFyYW0gaGhhc2g6IEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSBoaGFzaCBIQVNIIGhhbmRsZS4KICAgKiBAbm90ZSAgSEFMX0hBU0hfSVJRSGFuZGxlcigpIGhhbmRsZXMgaW50ZXJydXB0cyBpbiBITUFDIHByb2Nlc3NpbmcgYXMgd2VsbC4KICAgKiBAbm90ZSAgSW4gY2FzZSBvZiBlcnJvciByZXBvcnRlZCBkdXJpbmcgdGhlIEhBU0ggaW50ZXJydXB0aW9uIHByb2Nlc3NpbmcsCiAgICogICAgICAgIEhBTF9IQVNIX0Vycm9yQ2FsbGJhY2soKSBBUEkgaXMgY2FsbGVkIHNvIHRoYXQgdXNlciBjb2RlIGNhbgpAQCAtODg3LDcgKzEwNDAsNyBAQAogICAgICAgICAgKCsrKSBIQUxfSEFTSF9TSEExX1N0YXJ0X0RNQSgpCiAgICAgICAgICAoKyspIEhBTF9IQVNIX1NIQTFfRmluaXNoKCkKIAotICAgIFsuLl0gIFdoZW4gcmVzb3J0aW5nIHRvIERNQSBtb2RlIHRvIGVudGVyIHRoZSBkYXRhIGluIHRoZSBJUCwgdXNlciBtdXN0IHJlc29ydAorICAgIFsuLl0gIFdoZW4gcmVzb3J0aW5nIHRvIERNQSBtb2RlIHRvIGVudGVyIHRoZSBkYXRhIGluIHRoZSBQZXJpcGhlcmFsLCB1c2VyIG11c3QgcmVzb3J0CiAgICAgICAgICAgdG8gIEhBTF9IQVNIX3h4eF9TdGFydF9ETUEoKSB0aGVuIHJlYWQgdGhlIHJlc3VsdGluZyBkaWdlc3Qgd2l0aAogICAgICAgICAgIEhBTF9IQVNIX3h4eF9GaW5pc2goKS4KICAgICBbLi5dICBJbiBjYXNlIG9mIG11bHRpLWJ1ZmZlciBIQVNIIHByb2Nlc3NpbmcsIE1ETUFUIGJpdCBtdXN0IGZpcnN0IGJlIHNldCBiZWZvcmUKQEAgLTkwMSwxMiArMTA1NCwxMiBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBNRDUgbW9kZSB0aGVuIGluaXRpYXRlIGEgRE1BIHRyYW5zZmVyCi0gICogICAgICAgICB0byBmZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIElQLgorICAqICAgICAgICAgdG8gZmVlZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgT25jZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCBIQUxfSEFTSF9NRDVfRmluaXNoKCkgQVBJIG11c3QKICAgKiAgICAgICAgIGJlIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX01ENV9TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtOTE5LDkgKzEwNzIsOSBAQAogICAqIEBub3RlICAgVGhlIEFQSSB3YWl0cyBmb3IgRENJUyB0byBiZSBzZXQgdGhlbiByZWFkcyB0aGUgY29tcHV0ZWQgZGlnZXN0LgogICAqIEBub3RlICAgSEFMX0hBU0hfTUQ1X0ZpbmlzaCgpIGNhbiBiZSB1c2VkIGFzIHdlbGwgdG8gcmV0cmlldmUgdGhlIGRpZ2VzdCBpbgogICAqICAgICAgICAgSE1BQyBNRDUgbW9kZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCi0gICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9NRDVfRmluaXNoKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCkBAIC05MzEsMTIgKzEwODQsMTIgQEAKIAogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMSBtb2RlIHRoZW4gaW5pdGlhdGUgYSBETUEgdHJhbnNmZXIKLSAgKiAgICAgICAgIHRvIGZlZWQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICB0byBmZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIFBlcmlwaGVyYWwuCiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXIgaXMgZmluaXNoZWQsIEhBTF9IQVNIX1NIQTFfRmluaXNoKCkgQVBJIG11c3QKICAgKiAgICAgICAgIGJlIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIX1NIQTFfU3RhcnRfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTk1MCw5ICsxMTAzLDkgQEAKICAgKiBAbm90ZSAgIFRoZSBBUEkgd2FpdHMgZm9yIERDSVMgdG8gYmUgc2V0IHRoZW4gcmVhZHMgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KICAgKiBAbm90ZSAgIEhBTF9IQVNIX1NIQTFfRmluaXNoKCkgY2FuIGJlIHVzZWQgYXMgd2VsbCB0byByZXRyaWV2ZSB0aGUgZGlnZXN0IGluCiAgICogICAgICAgICBITUFDIFNIQTEgbW9kZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCi0gICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSF9TSEExX0ZpbmlzaChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KQpAQCAtOTg5LDExICsxMTQyLDExIEBACiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCiAgICogQG5vdGUgICBTYW1lIGtleSBpcyB1c2VkIGZvciB0aGUgaW5uZXIgYW5kIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uczsgcG9pbnRlciB0byBrZXkgYW5kCiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDE2IGJ5dGVzLgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDE2IGJ5dGVzLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNfTUQ1X1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKQEAgLTEwMDcsMTEgKzExNjAsMTEgQEAKICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KICAgKiBAbm90ZSAgIFNhbWUga2V5IGlzIHVzZWQgZm9yIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGhhc2ggZnVuY3Rpb25zOyBwb2ludGVyIHRvIGtleSBhbmQKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCi0gICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ19TSEExX1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKQEAgLTEwNDksMTAgKzEyMDIsMTAgQEAKICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KICAgKiBAbm90ZSAgIFNhbWUga2V5IGlzIHVzZWQgZm9yIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGhhc2ggZnVuY3Rpb25zOyBwb2ludGVyIHRvIGtleSBhbmQKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMTYgYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAxNiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ITUFDX01ENV9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpCkBAIC0xMDY2LDEwICsxMjE5LDEwIEBACiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCiAgICogQG5vdGUgICBTYW1lIGtleSBpcyB1c2VkIGZvciB0aGUgaW5uZXIgYW5kIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uczsgcG9pbnRlciB0byBrZXkgYW5kCiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDIwIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjAgYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ19TSEExX1N0YXJ0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlcikKQEAgLTEwOTcsNyArMTI1MCw3IEBACiAgICAgICAoKykgU0hBMQogICAgICAgICAgKCsrKSBIQUxfSE1BQ19TSEExX1N0YXJ0X0RNQSgpCiAKLSAgICBbLi5dICBXaGVuIHJlc29ydGluZyB0byBETUEgbW9kZSB0byBlbnRlciB0aGUgZGF0YSBpbiB0aGUgSVAgZm9yIEhNQUMgcHJvY2Vzc2luZywKKyAgICBbLi5dICBXaGVuIHJlc29ydGluZyB0byBETUEgbW9kZSB0byBlbnRlciB0aGUgZGF0YSBpbiB0aGUgUGVyaXBoZXJhbCBmb3IgSE1BQyBwcm9jZXNzaW5nLAogICAgICAgICAgIHVzZXIgbXVzdCByZXNvcnQgdG8gIEhBTF9ITUFDX3h4eF9TdGFydF9ETUEoKSB0aGVuIHJlYWQgdGhlIHJlc3VsdGluZyBkaWdlc3QKICAgICAgICAgICB3aXRoIEhBTF9IQVNIX3h4eF9GaW5pc2goKS4KIApAQCAtMTEwOCw3ICsxMjYxLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gSE1BQyBNRDUgbW9kZSB0aGVuIGluaXRpYXRlIHRoZSByZXF1aXJlZAotICAqICAgICAgICAgRE1BIHRyYW5zZmVycyB0byBmZWVkIHRoZSBrZXkgYW5kIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIElQLgorICAqICAgICAgICAgRE1BIHRyYW5zZmVycyB0byBmZWVkIHRoZSBrZXkgYW5kIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIFBlcmlwaGVyYWwuCiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXJzIGFyZSBmaW5pc2hlZCAoaW5kaWNhdGVkIGJ5IGhoYXNoLT5TdGF0ZSBzZXQgYmFjawogICAqICAgICAgICAgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkpLCBIQUxfSEFTSF9NRDVfRmluaXNoKCkgQVBJIG11c3QgYmUgY2FsbGVkIHRvIHJldHJpZXZlCiAgICogICAgICAgICB0aGUgY29tcHV0ZWQgZGlnZXN0LgpAQCAtMTEyMCw5ICsxMjczLDkgQEAKICAgKiAgICAgICAgICBGb3IgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIGxhc3QgYnVmZmVyIG9mIHRoZSB0aHJlYWQsIE1ETUFUIGJpdCBtdXN0CiAgICogICAgICAgICAgYmUgcmVzZXQgYW5kIHRoZSBidWZmZXIgbGVuZ3RoIChpbiBieXRlcykgZG9lc24ndCBoYXZlIHRvIGJlIGEKICAgKiAgICAgICAgICBtdWx0aXBsZSBvZiA0LgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ITUFDX01ENV9TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtMTEzMyw3ICsxMjg2LDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gSE1BQyBTSEExIG1vZGUgdGhlbiBpbml0aWF0ZSB0aGUgcmVxdWlyZWQKLSAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMgdG8gZmVlZCB0aGUga2V5IGFuZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBJUC4KKyAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMgdG8gZmVlZCB0aGUga2V5IGFuZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgT25jZSB0aGUgRE1BIHRyYW5zZmVycyBhcmUgZmluaXNoZWQgKGluZGljYXRlZCBieSBoaGFzaC0+U3RhdGUgc2V0IGJhY2sKICAgKiAgICAgICAgIHRvIEhBTF9IQVNIX1NUQVRFX1JFQURZKSwgSEFMX0hBU0hfU0hBMV9GaW5pc2goKSBBUEkgbXVzdCBiZSBjYWxsZWQgdG8gcmV0cmlldmUKICAgKiAgICAgICAgIHRoZSBjb21wdXRlZCBkaWdlc3QuCkBAIC0xMTQ1LDkgKzEyOTgsOSBAQAogICAqICAgICAgICAgIEZvciB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIHRocmVhZCwgTURNQVQgYml0IG11c3QKICAgKiAgICAgICAgICBiZSByZXNldCBhbmQgdGhlIGJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzKSBkb2Vzbid0IGhhdmUgdG8gYmUgYQogICAqICAgICAgICAgIG11bHRpcGxlIG9mIDQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNfU0hBMV9TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtMTE4MCw5ICsxMzMzLDkgQEAKIAogICAgIFsuLl0KICAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvIHN1c3BlbmQgdGhlIEhBU0ggcHJvY2Vzc2luZwotICAgICAgKCspIHdoZW4gaW5wdXQgYXJlIGZlZCB0byB0aGUgSVAgYnkgc29mdHdhcmUKKyAgICAgICgrKSB3aGVuIGlucHV0IGFyZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwgYnkgc29mdHdhcmUKICAgICAgICAgICAoKyspIEhBTF9IQVNIX1N3RmVlZF9Qcm9jZXNzU3VzcGVuZCgpCi0gICAgICAoKykgd2hlbiBpbnB1dCBhcmUgZmVkIHRvIHRoZSBJUCBieSBETUEKKyAgICAgICgrKSB3aGVuIGlucHV0IGFyZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwgYnkgRE1BCiAgICAgICAgICAgKCsrKSBIQUxfSEFTSF9ETUFGZWVkX1Byb2Nlc3NTdXNwZW5kKCkKIAogCkBAIC0xMTk0LDcgKzEzNDcsNyBAQAogLyoqCiAgICogQGJyaWVmICBSZXR1cm4gdGhlIEhBU0ggaGFuZGxlIHN0YXRlLgogICAqIEBub3RlICAgVGhlIEFQSSB5aWVsZHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGhhbmRsZSAoQlVTWSwgUkVBRFksLi4uKS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgSEFMIEhBU0ggc3RhdGUKICAgKi8KIEhBTF9IQVNIX1N0YXRlVHlwZURlZiBIQUxfSEFTSF9HZXRTdGF0ZShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtMTIwNyw3ICsxMzYwLDcgQEAKICAgKiBAYnJpZWYgUmV0dXJuIHRoZSBIQVNIIEhBTCBzdGF0dXMuCiAgICogQG5vdGUgIFRoZSBBUEkgeWllbGRzIHRoZSBIQUwgc3RhdHVzIG9mIHRoZSBoYW5kbGU6IGl0IGlzIHRoZSByZXN1bHQgb2YgdGhlCiAgICogICAgICAgIGxhdGVzdCBIQVNIIHByb2Nlc3NpbmcgYW5kIGFsbG93cyB0byByZXBvcnQgYW55IGlzc3VlIChlLmcuIEhBTF9USU1FT1VUKS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hfR2V0U3RhdHVzKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gpCkBAIC0xMjE3LDggKzEzNzAsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNhdmUgdGhlIEhBU0ggY29udGV4dCBpbiBjYXNlIG9mIHByb2Nlc3Npbmcgc3VzcGVuc2lvbi4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBNZW1CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIgd2hlcmUgdGhlIEhBU0ggY29udGV4dAorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwTWVtQnVmZmVyIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIgd2hlcmUgdGhlIEhBU0ggY29udGV4dAogICAqICAgICAgICAgaXMgc2F2ZWQuCiAgICogQG5vdGUgICBUaGUgSU1SLCBTVFIsIENSIHRoZW4gYWxsIHRoZSBDU1IgcmVnaXN0ZXJzIGFyZSBzYXZlZAogICAqICAgICAgICAgaW4gdGhhdCBvcmRlci4gT25seSB0aGUgci93IGJpdHMgYXJlIHJlYWQgdG8gYmUgcmVzdG9yZWQgbGF0ZXIgb24uCkBAIC0xMjU4LDggKzE0MTEsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFJlc3RvcmUgdGhlIEhBU0ggY29udGV4dCBpbiBjYXNlIG9mIHByb2Nlc3NpbmcgcmVzdW1wdGlvbi4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBNZW1CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIgd2hlcmUgdGhlIEhBU0ggY29udGV4dAorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwTWVtQnVmZmVyIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBidWZmZXIgd2hlcmUgdGhlIEhBU0ggY29udGV4dAogICAqICAgICAgICAgaXMgc3RvcmVkLgogICAqIEBub3RlICAgVGhlIElNUiwgU1RSLCBDUiB0aGVuIGFsbCB0aGUgQ1NSIHJlZ2lzdGVycyBhcmUgcmVzdG9yZWQKICAgKiAgICAgICAgIGluIHRoYXQgb3JkZXIuIE9ubHkgdGhlIHIvdyBiaXRzIGFyZSByZXN0b3JlZC4KQEAgLTEzMDMsNyArMTQ1Niw3IEBACiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhdGUgSEFTSCBwcm9jZXNzaW5nIHN1c3BlbnNpb24gd2hlbiBpbiBwb2xsaW5nIG9yIGludGVycnVwdGlvbiBtb2RlLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCiAgICogQG5vdGUgICBTZXQgdGhlIGhhbmRsZSBmaWVsZCBTdXNwZW5kUmVxdWVzdCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgc28gdGhhdAogICAqICAgICAgICAgdGhlIG9uLWdvaW5nIEhBU0ggcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgYXMgc29vbiBhcyB0aGUgcmVxdWlyZWQKICAgKiAgICAgICAgIGNvbmRpdGlvbnMgYXJlIG1ldC4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgc3VzcGVuc2lvbiBpcyBjYXJyaWVkIG91dApAQCAtMTMxOSw5ICsxNDcyLDkgQEAKIAogLyoqCiAgICogQGJyaWVmICBTdXNwZW5kIHRoZSBIQVNIIHByb2Nlc3Npbmcgd2hlbiBpbiBETUEgbW9kZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEBub3RlICAgV2hlbiBzdXNwZW5zaW9uIGF0dGVtcHQgb2NjdXJzIGF0IHRoZSB2ZXJ5IGVuZCBvZiBhIERNQSB0cmFuc2ZlciBhbmQKLSAgKiAgICAgICAgIGFsbCB0aGUgZGF0YSBoYXZlIGFscmVhZHkgYmVlbiBlbnRlcmVkIGluIHRoZSBJUCwgaGhhc2gtPlN0YXRlIGlzCisgICogICAgICAgICBhbGwgdGhlIGRhdGEgaGF2ZSBhbHJlYWR5IGJlZW4gZW50ZXJlZCBpbiB0aGUgUGVyaXBoZXJhbCwgaGhhc2gtPlN0YXRlIGlzCiAgICogICAgICAgICBzZXQgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkgYW5kIHRoZSBBUEkgcmV0dXJucyBIQUxfRVJST1IuIEl0IGlzCiAgICogICAgICAgICByZWNvbW1lbmRlZCB0byB3cmFwLXVwIHRoZSBwcm9jZXNzaW5nIGluIHJlYWRpbmcgdGhlIGRpZ2VzdCBhcyB1c3VhbC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKQEAgLTEzNDksNyArMTUwMiw3IEBACiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KIAotICAgIC8qIFdhaXQgZm9yIERNQVMgdG8gYmUgcmVzZXQgKi8KKyAgICAvKiBXYWl0IGZvciBCVVNZIGZsYWcgdG8gYmUgcmVzZXQgKi8KICAgICBpZiAoSEFTSF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhoYXNoLCBIQVNIX0ZMQUdfQlVTWSwgU0VULCBIQVNIX1RJTUVPVVRWQUxVRSkgIT0gSEFMX09LKQogICAgIHsKICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CkBAIC0xMzYwLDI2ICsxNTEzLDI2IEBACiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KIAotICAgIC8qIFdhaXQgZm9yIERNQVMgdG8gYmUgc2V0ICovCisgICAgLyogV2FpdCBmb3IgQlVTWSBmbGFnIHRvIGJlIHNldCAqLwogICAgIGlmIChIQVNIX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGhhc2gsIEhBU0hfRkxBR19CVVNZLCBSRVNFVCwgSEFTSF9USU1FT1VUVkFMVUUpICE9IEhBTF9PSykKICAgICB7CiAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgIH0KLQogICAgIC8qIERpc2FibGUgRE1BIGNoYW5uZWwgKi8KLSAgICBpZiAoSEFMX0RNQV9BYm9ydChoaGFzaC0+aGRtYWluKSA9PUhBTF9PSykKLSAgICB7Ci0gICAgICAvKgotICAgICAgTm90ZSB0aGF0IHRoZSBBYm9ydCBmdW5jdGlvbiB3aWxsCisgICAgLyogTm90ZSB0aGF0IHRoZSBBYm9ydCBmdW5jdGlvbiB3aWxsCiAgICAgICAtIENsZWFyIHRoZSB0cmFuc2ZlciBlcnJvciBmbGFncwogICAgICAgLSBVbmxvY2sKICAgICAgIC0gU2V0IHRoZSBTdGF0ZQotICAgICAgKi8KKyAgICAqLworICAgIGlmIChIQUxfRE1BX0Fib3J0KGhoYXNoLT5oZG1haW4pICE9SEFMX09LKQorICAgIHsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQogCiAgICAgLyogQ2xlYXIgRE1BRSBiaXQgKi8KICAgICBDTEVBUl9CSVQoSEFTSC0+Q1IsSEFTSF9DUl9ETUFFKTsKIAorICAgIC8qIFdhaXQgZm9yIEJVU1kgZmxhZyB0byBiZSByZXNldCAqLwogICAgIGlmIChIQVNIX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGhhc2gsIEhBU0hfRkxBR19CVVNZLCBTRVQsIEhBU0hfVElNRU9VVFZBTFVFKSAhPSBIQUxfT0spCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwpAQCAtMTQxMyw4ICsxNTY2LDggQEAKICAgICAgIC8qIENvbXB1dGUgaG93IG1hbnkgd29yZHMgd2VyZSBzdXBwb3NlZCB0byBiZSB0cmFuc2ZlcnJlZCBieSBETUEgKi8KICAgICAgIHRtcF9pbml0aWFsX0RNQVRyYW5zZmVyU2l6ZV9pbldvcmRzID0gKCgoaGhhc2gtPkhhc2hJbkNvdW50JTRVKSE9MFUpID8gICgoaGhhc2gtPkhhc2hJbkNvdW50KzNVKS80VSk6IChoaGFzaC0+SGFzaEluQ291bnQvNFUpKTsKIAotICAgICAgLyogSWYgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlcG9ydGVkIGJ5IERNQSBJUCBhbmQgdGhlIG51bWJlcnMgb2Ygd29yZHMgZW50ZXJlZCBhcyByZXBvcnRlZAotICAgICAgICBieSBIQVNIIElQLCBjb3JyZWN0IGl0ICovCisgICAgICAvKiBJZiBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSBudW1iZXIgb2Ygd29yZHMgcmVwb3J0ZWQgYnkgRE1BIFBlcmlwaGVyYWwgYW5kIHRoZSBudW1iZXJzIG9mIHdvcmRzIGVudGVyZWQgYXMgcmVwb3J0ZWQKKyAgICAgICAgYnkgSEFTSCBQZXJpcGhlcmFsLCBjb3JyZWN0IGl0ICovCiAgICAgICAvKiB0bXBfd29yZHNfYWxyZWFkeV9wdXNoZWQgcmVmbGVjdHMgdGhlIG51bWJlciBvZiB3b3JkcyB0aGF0IHdlcmUgYWxyZWFkeSBwdXNoZWQgYmVmb3JlCiAgICAgICAgICB0aGUgc3RhcnQgb2YgRE1BIHRyYW5zZmVyIChtdWx0aS1idWZmZXIgcHJvY2Vzc2luZyBjYXNlKSAqLwogICAgICAgdG1wX3dvcmRzX2FscmVhZHlfcHVzaGVkID0gaGhhc2gtPk5iV29yZHNBbHJlYWR5UHVzaGVkOwpAQCAtMTQyMyw3ICsxNTc2LDcgQEAKICAgICAgICAgdG1wX3JlbWFpbmluZ19ETUFUcmFuc2ZlclNpemVfaW5Xb3Jkcy0tOyAvKiBvbmUgbGVzcyB3b3JkIHRvIGJlIHRyYW5zZmVycmVkIGFnYWluICovCiAgICAgICB9CiAKLSAgICAgIC8qIEFjY29yZGluZ2x5LCB1cGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgdGhhdCBwb2ludHMgYXQgdGhlIG5leHQgd29yZCB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgSVAgYnkgRE1BICovCisgICAgICAvKiBBY2NvcmRpbmdseSwgdXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyIHRoYXQgcG9pbnRzIGF0IHRoZSBuZXh0IHdvcmQgdG8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIFBlcmlwaGVyYWwgYnkgRE1BICovCiAgICAgICBoaGFzaC0+cEhhc2hJbkJ1ZmZQdHIgKz0gIDRVICogKHRtcF9pbml0aWFsX0RNQVRyYW5zZmVyU2l6ZV9pbldvcmRzIC0gdG1wX3JlbWFpbmluZ19ETUFUcmFuc2ZlclNpemVfaW5Xb3JkcykgOwogCiAgICAgICAvKiBBbmQgc3RvcmUgaW4gSGFzaEluQ291bnQgdGhlIHJlbWFpbmluZyBzaXplIHRvIHRyYW5zZmVyIChpbiBieXRlcykgKi8KQEAgLTE0NDEsNyArMTU5NCw3IEBACiAKIC8qKgogICAqIEBicmllZiAgUmV0dXJuIHRoZSBIQVNIIGhhbmRsZSBlcnJvciBjb2RlLgotICAqIEBwYXJhbSAgaGhhc2g6IHBvaW50ZXIgdG8gYSBIQVNIX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlLgorICAqIEBwYXJhbSAgaGhhc2ggcG9pbnRlciB0byBhIEhBU0hfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUuCiAgICogQHJldHZhbCBIQVNIIEVycm9yIENvZGUKICovCiB1aW50MzJfdCBIQUxfSEFTSF9HZXRFcnJvcihIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoKQpAQCAtMTQ2NCw3ICsxNjE3LDcgQEAKIAogLyoqCiAgICogQGJyaWVmIERNQSBIQVNIIElucHV0IERhdGEgdHJhbnNmZXIgY29tcGxldGlvbiBjYWxsYmFjay4KLSAgKiBAcGFyYW0gaGRtYTogRE1BIGhhbmRsZS4KKyAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlLgogICAqIEBub3RlICBJbiBjYXNlIG9mIEhNQUMgcHJvY2Vzc2luZywgSEFTSF9ETUFYZmVyQ3BsdCgpIGluaXRpYXRlcwogICAqICAgICAgICB0aGUgbmV4dCBETUEgdHJhbnNmZXIgZm9yIHRoZSBmb2xsb3dpbmcgSE1BQyBzdGVwLgogICAqIEByZXR2YWwgTm9uZQpAQCAtMTQ3NSw0MiArMTYyOCw0MiBAQAogICB1aW50MzJfdCBpbnB1dGFkZHI7CiAgIHVpbnQzMl90IGJ1ZmZlcnNpemU7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA7Ci0gIAorCiAgIGlmIChoaGFzaC0+U3RhdGUgIT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKQogICB7Ci0gICAgCisKICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgKi8KICAgICBDTEVBUl9CSVQoSEFTSC0+Q1IsIEhBU0hfQ1JfRE1BRSk7Ci0gICAgCisKICAgICBpZiAoUkVBRF9CSVQoSEFTSC0+Q1IsIEhBU0hfQ1JfTU9ERSkgPT0gMFUpCiAgICAgewogICAgICAgLyogSWYgbm8gSE1BQyBwcm9jZXNzaW5nLCBpbnB1dCBkYXRhIHRyYW5zZmVyIGlzIG5vdyBvdmVyICovCi0gICAgICAKKwogICAgICAgLyogQ2hhbmdlIHRoZSBIQVNIIHN0YXRlIHRvIHJlYWR5ICovCiAgICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBDYWxsIElucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbCBiYWNrICovCiAjaWYgKFVTRV9IQUxfSEFTSF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgIGhoYXNoLT5JbkNwbHRDYWxsYmFjayhoaGFzaCk7CiAjZWxzZQogICAgICAgSEFMX0hBU0hfSW5DcGx0Q2FsbGJhY2soaGhhc2gpOwogI2VuZGlmIC8qIFVTRV9IQUxfSEFTSF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLSAgICAgIAorCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiBITUFDIHByb2Nlc3Npbmc6IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBITUFDIHN0ZXAgYW5kIHdoZXRoZXIgb3IKICAgICAgIG5vdCBtdWx0aS1idWZmZXIgcHJvY2Vzc2luZyBpcyBvbi1nb2luZywgdGhlIG5leHQgc3RlcCBpcyBpbml0aWF0ZWQKICAgICAgIGFuZCBNRE1BVCBiaXQgaXMgc2V0LiAgKi8KLSAgICAgIAotICAgICAgCisKKwogICAgICAgaWYgKGhoYXNoLT5QaGFzZSA9PSBIQUxfSEFTSF9QSEFTRV9ITUFDX1NURVBfMykKICAgICAgIHsKICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIEhNQUMgcHJvY2Vzc2luZyAqLwotICAgICAgICAKKwogICAgICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgdG8gcmVhZHkgKi8KICAgICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfUkVBRFk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENhbGwgSW5wdXQgZGF0YSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsIGJhY2sKICAgICAgICAgKG5vdGUgdGhhdCB0aGUgbGFzdCBETUEgdHJhbnNmZXIgd2FzIHRoYXQgb2YgdGhlIGtleQogICAgICAgICBmb3IgdGhlIG91dGVyIEhBU0ggb3BlcmF0aW9uKS4gKi8KQEAgLTE1MTksNyArMTY3Miw3IEBACiAjZWxzZQogICAgICAgICBIQUxfSEFTSF9JbkNwbHRDYWxsYmFjayhoaGFzaCk7CiAjZW5kaWYgLyogVVNFX0hBTF9IQVNIX1JFR0lTVEVSX0NBTExCQUNLUyAqLwotICAgICAgICAKKwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChoaGFzaC0+UGhhc2UgPT0gSEFMX0hBU0hfUEhBU0VfSE1BQ19TVEVQXzEpCkBAIC0xNTI3LDE3ICsxNjgwLDE3IEBACiAgICAgICAgIGlucHV0YWRkciA9ICh1aW50MzJfdCloaGFzaC0+cEhhc2hNc2dCdWZmUHRyOyAgICAgLyogRE1BIHRyYW5zZmVyIHN0YXJ0IGFkZHJlc3MgKi8KICAgICAgICAgYnVmZmVyc2l6ZSA9IGhoYXNoLT5IYXNoQnVmZlNpemU7ICAgICAgICAgICAgICAgICAvKiBETUEgdHJhbnNmZXIgc2l6ZSAoaW4gYnl0ZXMpICovCiAgICAgICAgIGhoYXNoLT5QaGFzZSA9IEhBTF9IQVNIX1BIQVNFX0hNQUNfU1RFUF8yOyAgICAgICAgLyogTW92ZSBwaGFzZSBmcm9tIFN0ZXAgMSB0byBTdGVwIDIgKi8KLSAgICAgICAgCisKICAgICAgICAgLyogSW4gY2FzZSBvZiBzdXNwZW5zaW9uIHJlcXVlc3QsIHNhdmUgdGhlIG5ldyBzdGFydGluZyBwYXJhbWV0ZXJzICovCiAgICAgICAgIGhoYXNoLT5IYXNoSW5Db3VudCA9IGhoYXNoLT5IYXNoQnVmZlNpemU7ICAgICAgICAgLyogSW5pdGlhbCBETUEgdHJhbnNmZXIgc2l6ZSAoaW4gYnl0ZXMpICovCiAgICAgICAgIGhoYXNoLT5wSGFzaEluQnVmZlB0ciAgPSBoaGFzaC0+cEhhc2hNc2dCdWZmUHRyIDsgLyogRE1BIHRyYW5zZmVyIHN0YXJ0IGFkZHJlc3MgICAgICAgICAgICovCi0gICAgICAgIAorCiAgICAgICAgIGhoYXNoLT5OYldvcmRzQWxyZWFkeVB1c2hlZCA9IDBVOyAgICAgICAgICAgICAgICAgIC8qIFJlc2V0IG51bWJlciBvZiB3b3JkcyBhbHJlYWR5IHB1c2hlZCAqLwogICAgICAgICAvKiBDaGVjayB3aGV0aGVyIG9yIG5vdCBkaWdlc3QgY2FsY3VsYXRpb24gbXVzdCBiZSBkaXNhYmxlZCAoaW4gY2FzZSBvZiBtdWx0aS1idWZmZXIgSE1BQyBwcm9jZXNzaW5nKSAqLwogICAgICAgICBpZiAoaGhhc2gtPkRpZ2VzdENhbGN1bGF0aW9uRGlzYWJsZSAhPSBSRVNFVCkKICAgICAgICAgewogICAgICAgICAgIC8qIERpZ2VzdCBjYWxjdWxhdGlvbiBpcyBkaXNhYmxlZDogU3RlcCAyIG11c3Qgc3RhcnQgd2l0aCBNRE1BVCBiaXQgc2V0LAotICAgICAgICAgIG5vIGRpZ2VzdCBjYWxjdWxhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIgZmVlZGluZyB0byB0aGUgSVAgKi8KKyAgICAgICAgICBubyBkaWdlc3QgY2FsY3VsYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyIGZlZWRpbmcgdG8gdGhlIFBlcmlwaGVyYWwgKi8KICAgICAgICAgICBfX0hBTF9IQVNIX1NFVF9NRE1BVCgpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNTQ1LDcgKzE2OTgsNyBAQAogICAgICAgewogICAgICAgICBpZiAoaGhhc2gtPkRpZ2VzdENhbGN1bGF0aW9uRGlzYWJsZSAhPSBSRVNFVCkKICAgICAgICAgewotICAgICAgICAgIC8qIE5vIGF1dG9tYXRpYyBtb3ZlIHRvIFN0ZXAgMyBhcyBhIG5ldyBtZXNzYWdlIGJ1ZmZlciB3aWxsIGJlIGZlZCB0byB0aGUgSVAKKyAgICAgICAgICAvKiBObyBhdXRvbWF0aWMgbW92ZSB0byBTdGVwIDMgYXMgYSBuZXcgbWVzc2FnZSBidWZmZXIgd2lsbCBiZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwKICAgICAgICAgICAoY2FzZSBvZiBtdWx0aS1idWZmZXIgSE1BQyBwcm9jZXNzaW5nKToKICAgICAgICAgICBEQ0FMIG11c3Qgbm90IGJlIHNldC4KICAgICAgICAgICBQaGFzZSByZW1haW5zIGluIFN0ZXAgMiwgTURNQVQgcmVtYWlucyBzZXQgYXQgdGhpcyBwb2ludC4KQEAgLTE1NjgsMzQgKzE3MjEsMzQgQEAKICAgICAgICAgICAvKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24gcmVxdWVzdCwgc2F2ZSB0aGUgbmV3IHN0YXJ0aW5nIHBhcmFtZXRlcnMgKi8KICAgICAgICAgICBoaGFzaC0+SGFzaEluQ291bnQgPSBoaGFzaC0+SW5pdC5LZXlTaXplOyAgICAgLyogSW5pdGlhbCBzaXplIGZvciBzZWNvbmQgRE1BIHRyYW5zZmVyIChpbnB1dCBkYXRhKSAqLwogICAgICAgICAgIGhoYXNoLT5wSGFzaEluQnVmZlB0ciAgPSBoaGFzaC0+SW5pdC5wS2V5IDsgICAvKiBhZGRyZXNzIHBhc3NlZCB0byBETUEsIG5vdyBlbnRlcmluZyBkYXRhIG1lc3NhZ2UgKi8KLSAgICAgICAgICAKKwogICAgICAgICAgIGhoYXNoLT5OYldvcmRzQWxyZWFkeVB1c2hlZCA9IDBVOyAgICAgICAgICAgICAgLyogUmVzZXQgbnVtYmVyIG9mIHdvcmRzIGFscmVhZHkgcHVzaGVkICovCiAgICAgICAgIH0KICAgICAgIH0KLSAgIAorCiAgICAgLyogQ29uZmlndXJlIHRoZSBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBsYXN0IHdvcmQgb2YgdGhlIG1lc3NhZ2UgKi8KICAgICBfX0hBTF9IQVNIX1NFVF9OQlZBTElEQklUUyhidWZmZXJzaXplKTsKIAogICAgICAgLyogU2V0IHRoZSBIQVNIIERNQSB0cmFuc2ZlcnQgY29tcGxldGlvbiBjYWxsIGJhY2sgKi8KICAgICAgIGhoYXNoLT5oZG1haW4tPlhmZXJDcGx0Q2FsbGJhY2sgPSBIQVNIX0RNQVhmZXJDcGx0OwotICAgICAKKwogICAgICAgLyogRW5hYmxlIHRoZSBETUEgSW4gRE1BIFN0cmVhbSAqLwogICAgIHN0YXR1cyA9IEhBTF9ETUFfU3RhcnRfSVQoaGhhc2gtPmhkbWFpbiwgaW5wdXRhZGRyLCAodWludDMyX3QpJkhBU0gtPkRJTiwgKCgoYnVmZmVyc2l6ZSAlNFUpIT0wVSkgPyAoKGJ1ZmZlcnNpemUrKDRVLShidWZmZXJzaXplICU0VSkpKS80VSk6KGJ1ZmZlcnNpemUvNFUpKSk7CiAKICAgICAvKiBFbmFibGUgRE1BIHJlcXVlc3RzICovCiAgICAgU0VUX0JJVChIQVNILT5DUiwgSEFTSF9DUl9ETUFFKTsKLSAgICAKKwogICAgICAgICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICAgIGlmIChzdGF0dXMgIT0gSEFMX09LKQogICAgICAgewotICAgICAgICAvKiBVcGRhdGUgREFDIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KLSAgICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfRVJST1I7ICAgICAgCisgICAgICAgIC8qIFVwZGF0ZSBIQVNIIHN0YXRlIG1hY2hpbmUgdG8gZXJyb3IgKi8KKyAgICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfRVJST1I7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIC8qIENoYW5nZSBEQUMgc3RhdGUgKi8KKyAgICAgICAgLyogQ2hhbmdlIEhBU0ggc3RhdGUgKi8KICAgICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfUkVBRFk7Ci0gICAgICB9ICAgICAKKyAgICAgIH0KICAgfQogICB9CiAKQEAgLTE2MDQsNyArMTc1Nyw3IEBACiAKIC8qKgogICAqIEBicmllZiBETUEgSEFTSCBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLgotICAqIEBwYXJhbSBoZG1hOiBETUEgaGFuZGxlLgorICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUuCiAgICogQG5vdGUgIEhBU0hfRE1BRXJyb3IoKSBjYWxsYmFjayBpbnZva2VzIEhBTF9IQVNIX0Vycm9yQ2FsbGJhY2soKSB0aGF0CiAgICogICAgICAgIGNhbiBjb250YWluIHVzZXIgY29kZSB0byBtYW5hZ2UgdGhlIGVycm9yLgogICAqIEByZXR2YWwgTm9uZQpAQCAtMTYzMywxMyArMTc4NiwxMyBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgIEZlZWQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSEFTSCBJUC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byBpbnB1dCBidWZmZXIuCi0gICogQHBhcmFtICBTaXplOiB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQGJyaWVmICBGZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIEhBU0ggUGVyaXBoZXJhbC4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyLgorICAqIEBwYXJhbSAgU2l6ZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQG5vdGUgICBIQVNIX1dyaXRlRGF0YSgpIHJlZ3VsYXJseSByZWFkcyBoaGFzaC0+U3VzcGVuZFJlcXVlc3QgdG8gY2hlY2sgd2hldGhlcgogICAqICAgICAgICAgb3Igbm90IHRoZSBIQVNIIHByb2Nlc3NpbmcgbXVzdCBiZSBzdXNwZW5kZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZQotICAqICAgICAgICAgcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgd2hlbiBwb3NzaWJsZSBhbmQgdGhlIElQIGZlZWRpbmcgcG9pbnQgcmVhY2hlZCBhdAorICAqICAgICAgICAgcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgd2hlbiBwb3NzaWJsZSBhbmQgdGhlIFBlcmlwaGVyYWwgZmVlZGluZyBwb2ludCByZWFjaGVkIGF0CiAgICogICAgICAgICBzdXNwZW5zaW9uIHRpbWUgaXMgc3RvcmVkIGluIHRoZSBoYW5kbGUgZm9yIHJlc3VtcHRpb24gbGF0ZXIgb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xNjY1LDcgKzE4MTgsNyBAQAogICAgICAgICAvKiBSZXNldCBTdXNwZW5kUmVxdWVzdCAqLwogICAgICAgICBoaGFzaC0+U3VzcGVuZFJlcXVlc3QgPSBIQUxfSEFTSF9TVVNQRU5EX05PTkU7CiAKLSAgICAgICAgLyogRGVwZW5kaW5nIHdoZXRoZXIgdGhlIGtleSBvciB0aGUgaW5wdXQgZGF0YSB3ZXJlIGZlZCB0byB0aGUgSVAsIHRoZSBmZWVkaW5nIHBvaW50CisgICAgICAgIC8qIERlcGVuZGluZyB3aGV0aGVyIHRoZSBrZXkgb3IgdGhlIGlucHV0IGRhdGEgd2VyZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwsIHRoZSBmZWVkaW5nIHBvaW50CiAgICAgICAgIHJlYWNoZWQgYXQgc3VzcGVuc2lvbiB0aW1lIGlzIG5vdCBzYXZlZCBpbiB0aGUgc2FtZSBoYW5kbGUgZmllbGRzICovCiAgICAgICAgIGlmICgoaGhhc2gtPlBoYXNlID09IEhBTF9IQVNIX1BIQVNFX1BST0NFU1MpIHx8IChoaGFzaC0+UGhhc2UgPT0gSEFMX0hBU0hfUEhBU0VfSE1BQ19TVEVQXzIpKQogICAgICAgICB7CkBAIC0xNjk3LDE0ICsxODUwLDE0IEBACiAgICAgfSAvKiBpZiAoKGhoYXNoLT5TdXNwZW5kUmVxdWVzdCA9PSBIQUxfSEFTSF9TVVNQRU5EKSAmJiAoKGJ1ZmZlcmNvdW50ZXIrNCkgPCBTaXplKSkgKi8KICAgfSAgIC8qIGZvcihidWZmZXJjb3VudGVyID0gMDsgYnVmZmVyY291bnRlciA8IFNpemU7IGJ1ZmZlcmNvdW50ZXIrPTQpICAgICAgICAgICAgICAgICAqLwogCi0gIC8qIEF0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZGF0YSBoYXZlIGJlZW4gZW50ZXJlZCB0byB0aGUgSVA6IGV4aXQgKi8KKyAgLyogQXQgdGhpcyBwb2ludCwgYWxsIHRoZSBkYXRhIGhhdmUgYmVlbiBlbnRlcmVkIHRvIHRoZSBQZXJpcGhlcmFsOiBleGl0ICovCiAgIHJldHVybiAgSEFMX09LOwogfQogCiAvKioKICAgKiBAYnJpZWYgIFJldHJpZXZlIHRoZSBtZXNzYWdlIGRpZ2VzdC4KLSAgKiBAcGFyYW0gIHBNc2dEaWdlc3Q6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4KLSAgKiBAcGFyYW0gIFNpemU6IG1lc3NhZ2UgZGlnZXN0IHNpemUgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwTXNnRGlnZXN0IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4KKyAgKiBAcGFyYW0gIFNpemUgbWVzc2FnZSBkaWdlc3Qgc2l6ZSBpbiBieXRlcy4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIEhBU0hfR2V0RGlnZXN0KHVpbnQ4X3QgKnBNc2dEaWdlc3QsIHVpbnQ4X3QgU2l6ZSkKQEAgLTE3NzUsMTAgKzE5MjgsMTAgQEAKIAogLyoqCiAgICogQGJyaWVmICBIYW5kbGUgSEFTSCBwcm9jZXNzaW5nIFRpbWVvdXQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBGbGFnOiBzcGVjaWZpZXMgdGhlIEhBU0ggZmxhZyB0byBjaGVjay4KLSAgKiBAcGFyYW0gIFN0YXR1czogdGhlIEZsYWcgc3RhdHVzIChTRVQgb3IgUkVTRVQpLgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgRmxhZyBzcGVjaWZpZXMgdGhlIEhBU0ggZmxhZyB0byBjaGVjay4KKyAgKiBAcGFyYW0gIFN0YXR1cyB0aGUgRmxhZyBzdGF0dXMgKFNFVCBvciBSRVNFVCkuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSEFTSF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaW1lb3V0KQpAQCAtMTgzNiwxMCArMTk4OSwxMCBAQAogCiAvKioKICAgKiBAYnJpZWYgIEhBU0ggcHJvY2Vzc2luZyBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEBub3RlICAgSEFTSF9JVCgpIHJlZ3VsYXJseSByZWFkcyBoaGFzaC0+U3VzcGVuZFJlcXVlc3QgdG8gY2hlY2sgd2hldGhlcgogICAqICAgICAgICAgb3Igbm90IHRoZSBIQVNIIHByb2Nlc3NpbmcgbXVzdCBiZSBzdXNwZW5kZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZQotICAqICAgICAgICAgcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgd2hlbiBwb3NzaWJsZSBhbmQgdGhlIElQIGZlZWRpbmcgcG9pbnQgcmVhY2hlZCBhdAorICAqICAgICAgICAgcHJvY2Vzc2luZyBpcyBzdXNwZW5kZWQgd2hlbiBwb3NzaWJsZSBhbmQgdGhlIFBlcmlwaGVyYWwgZmVlZGluZyBwb2ludCByZWFjaGVkIGF0CiAgICogICAgICAgICBzdXNwZW5zaW9uIHRpbWUgaXMgc3RvcmVkIGluIHRoZSBoYW5kbGUgZm9yIHJlc3VtcHRpb24gbGF0ZXIgb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xODYwLDcgKzIwMTMsNyBAQAogICAgIGVsc2UgaWYgKGhoYXNoLT5IYXNoSVRDb3VudGVyID09IDFVKQogICAgIHsKICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBIQVNIX0lULCB0aGUgZmlyc3QgaW5wdXQgZGF0YSBhcmUgYWJvdXQgdG8gYmUKLSAgICAgICAgZW50ZXJlZCBpbiB0aGUgSVAuIEEgc3BlY2lmaWMgcHJvY2Vzc2luZyBpcyBjYXJyaWVkIG91dCBhdCB0aGlzIHBvaW50IHRvCisgICAgICAgIGVudGVyZWQgaW4gdGhlIFBlcmlwaGVyYWwuIEEgc3BlY2lmaWMgcHJvY2Vzc2luZyBpcyBjYXJyaWVkIG91dCBhdCB0aGlzIHBvaW50IHRvCiAgICAgICAgIHN0YXJ0LXVwIHRoZSBwcm9jZXNzaW5nLiAqLwogICAgICAgaGhhc2gtPkhhc2hJVENvdW50ZXIgPSAyVTsKICAgICB9CkBAIC0xODgxLDYgKzIwMzQsOCBAQAogICAgICAgX19IQUxfSEFTSF9ESVNBQkxFX0lUKEhBU0hfSVRfRElOSXxIQVNIX0lUX0RDSSk7CiAgICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgKi8KICAgICAgIGhoYXNoLT5TdGF0ZSA9IEhBTF9IQVNIX1NUQVRFX1JFQURZOworICAgICAgLyogUmVzZXQgSEFTSCBzdGF0ZSBtYWNoaW5lICovCisgICAgICBoaGFzaC0+UGhhc2UgPSBIQUxfSEFTSF9QSEFTRV9SRUFEWTsKICAgICAgIC8qIENhbGwgZGlnZXN0IGNvbXB1dGF0aW9uIGNvbXBsZXRlIGNhbGwgYmFjayAqLwogI2lmIChVU0VfSEFMX0hBU0hfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICBoaGFzaC0+RGdzdENwbHRDYWxsYmFjayhoaGFzaCk7CkBAIC0xODkxLDcgKzIwNDYsNyBAQAogICAgICAgcmV0dXJuIEhBTF9PSzsKICAgICB9CiAKLSAgICAvKiBJZiBJUCByZWFkeSB0byBhY2NlcHQgbmV3IGRhdGEgKi8KKyAgICAvKiBJZiBQZXJpcGhlcmFsIHJlYWR5IHRvIGFjY2VwdCBuZXcgZGF0YSAqLwogICAgIGlmIChfX0hBTF9IQVNIX0dFVF9GTEFHKEhBU0hfRkxBR19ESU5JUykpCiAgICAgewogCkBAIC0xOTExLDcgKzIwNjYsNyBAQAogICAgICAgICByZXR1cm4gSEFMX09LOwogICAgICAgfQogCi0gICAgICAvKiBFbnRlciBpbnB1dCBkYXRhIGluIHRoZSBJUCB0aHJ1IEhBU0hfV3JpdGVfQmxvY2tfRGF0YSgpIGNhbGwgYW5kCisgICAgICAvKiBFbnRlciBpbnB1dCBkYXRhIGluIHRoZSBQZXJpcGhlcmFsIHRocnUgSEFTSF9Xcml0ZV9CbG9ja19EYXRhKCkgY2FsbCBhbmQKICAgICAgICAgY2hlY2sgd2hldGhlciB0aGUgZGlnZXN0IGNhbGN1bGF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCAqLwogICAgICAgaWYgKEhBU0hfV3JpdGVfQmxvY2tfRGF0YShoaGFzaCkgPT0gSEFTSF9ESUdFU1RfQ0FMQ1VMQVRJT05fU1RBUlRFRCkKICAgICAgIHsKQEAgLTE5MjUsNyArMjA4MCw3IEBACiAKICAgICAgICAgaWYgKGhoYXNoLT5QaGFzZSA9PSBIQUxfSEFTSF9QSEFTRV9ITUFDX1NURVBfMSkKICAgICAgICAgewotICAgICAgICAgIC8qIFdhaXQgdW50aWwgSVAgaXMgbm90IGJ1c3kgYW55bW9yZSAqLworICAgICAgICAgIC8qIFdhaXQgdW50aWwgUGVyaXBoZXJhbCBpcyBub3QgYnVzeSBhbnltb3JlICovCiAgICAgICAgICAgaWYgKEhBU0hfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoaGFzaCwgSEFTSF9GTEFHX0JVU1ksIFNFVCwgSEFTSF9USU1FT1VUVkFMVUUpICE9IEhBTF9PSykKICAgICAgICAgICB7CiAgICAgICAgICAgICAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KQEAgLTE5NDIsNyArMjA5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoaGhhc2gtPlBoYXNlID09IEhBTF9IQVNIX1BIQVNFX0hNQUNfU1RFUF8yKQogICAgICAgICB7Ci0gICAgICAgICAgLyogV2FpdCB1bnRpbCBJUCBpcyBub3QgYnVzeSBhbnltb3JlICovCisgICAgICAgICAgLyogV2FpdCB1bnRpbCBQZXJpcGhlcmFsIGlzIG5vdCBidXN5IGFueW1vcmUgKi8KICAgICAgICAgICBpZiAoSEFTSF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhoYXNoLCBIQVNIX0ZMQUdfQlVTWSwgU0VULCBIQVNIX1RJTUVPVVRWQUxVRSkgIT0gSEFMX09LKQogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIERpc2FibGUgSW50ZXJydXB0cyAqLwpAQCAtMTk3NSw4ICsyMTMwLDggQEAKIAogCiAvKioKLSAgKiBAYnJpZWYgIFdyaXRlIGEgYmxvY2sgb2YgZGF0YSBpbiBIQVNIIElQIGluIGludGVycnVwdGlvbiBtb2RlLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgorICAqIEBicmllZiAgV3JpdGUgYSBibG9jayBvZiBkYXRhIGluIEhBU0ggUGVyaXBoZXJhbCBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgogICAqIEBub3RlICAgSEFTSF9Xcml0ZV9CbG9ja19EYXRhKCkgaXMgY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBieSBIQVNIX0lUKCkuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0yMDA1LDcgKzIxNjAsNyBAQAogICAgICAgSEFTSC0+RElOID0gKih1aW50MzJfdCopaW5wdXRhZGRyOwogICAgICAgaWYoaGhhc2gtPkhhc2hJbkNvdW50ID49IDY4VSkKICAgICAgIHsKLSAgICAgICAgLyogVGhlcmUgYXJlIHN0aWxsIGRhdGEgd2FpdGluZyB0byBiZSBlbnRlcmVkIGluIHRoZSBJUC4KKyAgICAgICAgLyogVGhlcmUgYXJlIHN0aWxsIGRhdGEgd2FpdGluZyB0byBiZSBlbnRlcmVkIGluIHRoZSBQZXJpcGhlcmFsLgogICAgICAgICAgICBEZWNyZW1lbnQgYnVmZmVyIGNvdW50ZXIgYW5kIHNldCBwb2ludGVyIHRvIHRoZSBwcm9wZXIKICAgICAgICAgICAgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgbmV4dCBkYXRhIGVudGVyaW5nIHJvdW5kLiAqLwogICAgICAgICBoaGFzaC0+SGFzaEluQ291bnQgLT0gNjhVOwpAQCAtMjA0NCwxMyArMjE5OSwzMyBAQAogICAgICAgSEFTSC0+RElOID0gKih1aW50MzJfdCopaW5wdXRhZGRyOwogICAgICAgaW5wdXRhZGRyKz00VTsKICAgICB9Ci0gICAgLyogU3RhcnQgdGhlIERpZ2VzdCBjYWxjdWxhdGlvbiAqLwotICAgIF9fSEFMX0hBU0hfU1RBUlRfRElHRVNUKCk7Ci0gICAgLyogUmV0dXJuIGluZGljYXRpb24gdGhhdCBkaWdlc3QgY2FsY3VsYXRpb24gaGFzIHN0YXJ0ZWQ6Ci0gICAgICAgdGhpcyByZXR1cm4gdmFsdWUgdHJpZ2dlcnMgdGhlIGNhbGwgdG8gSW5wdXQgZGF0YSB0cmFuc2ZlcgotICAgICAgIGNvbXBsZXRlIGNhbGwgYmFjayBhcyB3ZWxsIGFzIHRoZSBwcm9wZXIgdHJhbnNpdGlvbiBmcm9tCi0gICAgICAgb25lIHN0ZXAgdG8gYW5vdGhlciBpbiBITUFDIG1vZGUuICovCi0gICAgcmV0ID0gSEFTSF9ESUdFU1RfQ0FMQ1VMQVRJT05fU1RBUlRFRDsKKworICAgIGlmIChoaGFzaC0+QWNjdW11bGF0aW9uID09IDFVKQorICAgIHsKKyAgICAgIC8qIEZpZWxkIGFjY3VtdWxhdGlvbiBpcyBzZXQsIEFQSSBvbmx5IGZlZWRzIGRhdGEgdG8gdGhlIFBlcmlwaGVyYWwgYW5kIHVuZGVyIGludGVycnVwdGlvbi4KKyAgICAgICAgIFRoZSBkaWdlc3QgY29tcHV0YXRpb24gd2lsbCBiZSBzdGFydGVkIHdoZW4gdGhlIGxhc3QgYnVmZmVyIGRhdGEgYXJlIGVudGVyZWQuICovCisKKyAgICAgIC8qIFJlc2V0IG11bHRpIGJ1ZmZlcnMgYWNjdW11bGF0aW9uIGZsYWcgKi8KKyAgICAgIGhoYXNoLT5BY2N1bXVsYXRpb24gPSAwVTsKKyAgICAgIC8qIENoYW5nZSB0aGUgSEFTSCBzdGF0ZSAqLworICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfUkVBRFk7CisgICAgICAvKiBDYWxsIElucHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUgY2FsbCBiYWNrICovCisjaWYgKFVTRV9IQUxfSEFTSF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAgICAgaGhhc2gtPkluQ3BsdENhbGxiYWNrKGhoYXNoKTsKKyNlbHNlCisgICAgICAgIEhBTF9IQVNIX0luQ3BsdENhbGxiYWNrKGhoYXNoKTsKKyNlbmRpZiAvKiBVU0VfSEFMX0hBU0hfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBTdGFydCB0aGUgRGlnZXN0IGNhbGN1bGF0aW9uICovCisgICAgICBfX0hBTF9IQVNIX1NUQVJUX0RJR0VTVCgpOworICAgICAgLyogUmV0dXJuIGluZGljYXRpb24gdGhhdCBkaWdlc3QgY2FsY3VsYXRpb24gaGFzIHN0YXJ0ZWQ6CisgICAgICAgICB0aGlzIHJldHVybiB2YWx1ZSB0cmlnZ2VycyB0aGUgY2FsbCB0byBJbnB1dCBkYXRhIHRyYW5zZmVyCisgICAgICAgICBjb21wbGV0ZSBjYWxsIGJhY2sgYXMgd2VsbCBhcyB0aGUgcHJvcGVyIHRyYW5zaXRpb24gZnJvbQorICAgICAgICAgb25lIHN0ZXAgdG8gYW5vdGhlciBpbiBITUFDIG1vZGUuICovCisgICAgICByZXQgPSBIQVNIX0RJR0VTVF9DQUxDVUxBVElPTl9TVEFSVEVEOworICAgIH0KICAgICAvKiBSZXNldCBidWZmZXIgY291bnRlciAqLwogICAgIGhoYXNoLT5IYXNoSW5Db3VudCA9IDA7CiAgIH0KQEAgLTIwNjEsOCArMjIzNiw4IEBACiAKIC8qKgogICAqIEBicmllZiAgSE1BQyBwcm9jZXNzaW5nIGluIHBvbGxpbmcgbW9kZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBITUFDX1Byb2Nlc3NpbmcoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDMyX3QgVGltZW91dCkKQEAgLTIyMDQsNiArMjM3OSw5IEBACiAKICAgICAvKiBSZWFkIHRoZSBtZXNzYWdlIGRpZ2VzdCAqLwogICAgIEhBU0hfR2V0RGlnZXN0KGhoYXNoLT5wSGFzaE91dEJ1ZmZQdHIsIEhBU0hfRElHRVNUX0xFTkdUSCgpKTsKKworICAgIC8qIFJlc2V0IEhBU0ggc3RhdGUgbWFjaGluZSAqLworICAgIGhoYXNoLT5QaGFzZSA9IEhBTF9IQVNIX1BIQVNFX1JFQURZOwogICB9CiAKICAgIC8qIENoYW5nZSB0aGUgSEFTSCBzdGF0ZSAqLwpAQCAtMjIyMSw1OCArMjM5OSw1OCBAQAogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsLCBuZXh0IHByb2Nlc3MgcEluQnVmZmVyIHRoZW4KICAgKiAgICAgICAgIHJlYWQgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZS4KLSAgKiBAcGFyYW0gIEFsZ29yaXRobTogSEFTSCBhbGdvcml0aG0uCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlLgorICAqIEBwYXJhbSAgQWxnb3JpdGhtIEhBU0ggYWxnb3JpdGhtLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFTSF9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQsIHVpbnQzMl90IEFsZ29yaXRobSkKIHsKICAgdWludDhfdCAqcEluQnVmZmVyX3RtcDsgIC8qIGlucHV0IGRhdGEgYWRkcmVzcywgaW5wdXQgcGFyYW1ldGVyIG9mIEhBU0hfV3JpdGVEYXRhKCkgICAgICAgICAqLwogICB1aW50MzJfdCBTaXplX3RtcDsgLyogaW5wdXQgZGF0YSBzaXplIChpbiBieXRlcyksIGlucHV0IHBhcmFtZXRlciBvZiBIQVNIX1dyaXRlRGF0YSgpICovCi0gIEhBTF9IQVNIX1N0YXRlVHlwZURlZiBTdGF0ZV90bXAgPSBoaGFzaC0+U3RhdGU7IAorICBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYgU3RhdGVfdG1wID0gaGhhc2gtPlN0YXRlOwogCi0gIAorCiAgIC8qIEluaXRpYXRlIEhBU0ggcHJvY2Vzc2luZyBpbiBjYXNlIG9mIHN0YXJ0IG9yIHJlc3VtcHRpb24gKi8KIGlmKChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfUkVBRFkpIHx8IChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKSkKLSAgeyAgCisgIHsKICAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgaWYgKChwSW5CdWZmZXIgPT0gTlVMTCkgfHwgKFNpemUgPT0gMFUpIHx8IChwT3V0QnVmZmVyID09IE5VTEwpKQorICAgIGlmICgocEluQnVmZmVyID09IE5VTEwpIHx8IChwT3V0QnVmZmVyID09IE5VTEwpKQogICAgIHsKICAgICAgIGhoYXNoLT5TdGF0ZSA9IEhBTF9IQVNIX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuICBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgICBfX0hBTF9MT0NLKGhoYXNoKTsKLSAgICAKKwogICAgIC8qIENoZWNrIGlmIGluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBhbHJlYWR5IHBlcmZvcm1lZCAqLwogICAgIGlmKGhoYXNoLT5QaGFzZSA9PSBIQUxfSEFTSF9QSEFTRV9SRUFEWSkKICAgICB7CiAgICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgKi8KICAgICAgIGhoYXNoLT5TdGF0ZSA9IEhBTF9IQVNIX1NUQVRFX0JVU1k7Ci0gICAgICAKKwogICAgICAgLyogU2VsZWN0IHRoZSBIQVNIIGFsZ29yaXRobSwgY2xlYXIgSE1BQyBtb2RlIGFuZCBsb25nIGtleSBzZWxlY3Rpb24gYml0LCByZXNldCB0aGUgSEFTSCBwcm9jZXNzb3IgY29yZSAqLwogICAgICAgTU9ESUZZX1JFRyhIQVNILT5DUiwgSEFTSF9DUl9MS0VZfEhBU0hfQ1JfQUxHT3xIQVNIX0NSX01PREV8SEFTSF9DUl9JTklULCBBbGdvcml0aG0gfCBIQVNIX0NSX0lOSVQpOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gbGFzdCB3b3JkIG9mIHRoZSBtZXNzYWdlICovCiAgICAgICBfX0hBTF9IQVNIX1NFVF9OQlZBTElEQklUUyhTaXplKTsKLSAgICAgIAorCiAgICAgICAvKiBwSW5CdWZmZXJfdG1wIGFuZCBTaXplX3RtcCBhcmUgaW5pdGlhbGl6ZWQgdG8gYmUgdXNlZCBhZnRlcndhcmRzIGFzCiAgICAgICBpbnB1dCBwYXJhbWV0ZXJzIG9mIEhBU0hfV3JpdGVEYXRhKCkgKi8KICAgICAgIHBJbkJ1ZmZlcl90bXAgPSBwSW5CdWZmZXI7ICAgLyogcEluQnVmZmVyX3RtcCBpcyBzZXQgdG8gdGhlIGlucHV0IGRhdGEgYWRkcmVzcyAqLwogICAgICAgU2l6ZV90bXAgPSBTaXplOyAgICAgICAgICAgICAvKiBTaXplX3RtcCBjb250YWlucyB0aGUgaW5wdXQgZGF0YSBzaXplIGluIGJ5dGVzICovCi0gICAgICAKKwogICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLwogICAgICAgaGhhc2gtPlBoYXNlID0gSEFMX0hBU0hfUEhBU0VfUFJPQ0VTUzsKICAgICB9CiAgICAgZWxzZSBpZiAoaGhhc2gtPlBoYXNlID09IEhBTF9IQVNIX1BIQVNFX1BST0NFU1MpCiAgICAgewotICAgICAgLyogaWYgdGhlIElQIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIHR3byBjYXNlcyBhcmUgcG9zc2libGUgKi8KLSAgICAgIAorICAgICAgLyogaWYgdGhlIFBlcmlwaGVyYWwgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgdHdvIGNhc2VzIGFyZSBwb3NzaWJsZSAqLworCiAgICAgICAvKiBQcm9jZXNzIHJlc3VtcHRpb24gdGltZSAuLi4gKi8KICAgICAgIGlmIChoaGFzaC0+U3RhdGUgPT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKQogICAgICAgewpAQCAtMjI5OSw0OCArMjQ3Nyw1MSBAQAogICAgIHsKICAgICAgIC8qIFBoYXNlIGVycm9yICovCiAgICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKLSAgICAgIAorCiAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICBfX0hBTF9VTkxPQ0soaGhhc2gpOwotICAgICAgCisKICAgICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAotICAgIAorCisKICAgICAvKiBXcml0ZSBpbnB1dCBidWZmZXIgaW4gRGF0YSByZWdpc3RlciAqLwogICAgIGhoYXNoLT5TdGF0dXMgPSBIQVNIX1dyaXRlRGF0YShoaGFzaCwgcEluQnVmZmVyX3RtcCwgU2l6ZV90bXApOwogICAgIGlmIChoaGFzaC0+U3RhdHVzICE9IEhBTF9PSykKICAgICB7CiAgICAgICByZXR1cm4gaGhhc2gtPlN0YXR1czsKICAgICB9Ci0gICAgCisKICAgICAvKiBJZiB0aGUgcHJvY2VzcyBoYXMgbm90IGJlZW4gc3VzcGVuZGVkLCBjYXJyeSBvbiB0byBkaWdlc3QgY2FsY3VsYXRpb24gKi8KICAgICBpZiAoaGhhc2gtPlN0YXRlICE9IEhBTF9IQVNIX1NUQVRFX1NVU1BFTkRFRCkKICAgICB7CiAgICAgICAvKiBTdGFydCB0aGUgRGlnZXN0IGNhbGN1bGF0aW9uICovCiAgICAgICBfX0hBTF9IQVNIX1NUQVJUX0RJR0VTVCgpOwotICAgICAgCisKICAgICAgIC8qIFdhaXQgZm9yIERDSVMgZmxhZyB0byBiZSBzZXQgKi8KICAgICAgIGlmIChIQVNIX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaGhhc2gsIEhBU0hfRkxBR19EQ0lTLCBSRVNFVCwgVGltZW91dCkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLyogUmVhZCB0aGUgbWVzc2FnZSBkaWdlc3QgKi8KICAgICAgIEhBU0hfR2V0RGlnZXN0KHBPdXRCdWZmZXIsIEhBU0hfRElHRVNUX0xFTkdUSCgpKTsKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgKi8KICAgICAgIGhoYXNoLT5TdGF0ZSA9IEhBTF9IQVNIX1NUQVRFX1JFQURZOwotICAgICAgCisKKyAgICAgIC8qIFJlc2V0IEhBU0ggc3RhdGUgbWFjaGluZSAqLworICAgICAgaGhhc2gtPlBoYXNlID0gSEFMX0hBU0hfUEhBU0VfUkVBRFk7CisKICAgICB9Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhoYXNoKTsKLSAgICAKKwogICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICByZXR1cm4gSEFMX09LOwotICAgIAorCiAgIH0KICAgZWxzZQogICB7CkBAIC0yMzUzLDI3ICsyNTM0LDMwIEBACiAgICogQGJyaWVmICBJZiBub3QgYWxyZWFkeSBkb25lLCBpbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgdGhlbgogICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlci4KICAgKiBAbm90ZSAgIEZpZWxkIGhoYXNoLT5QaGFzZSBvZiBIQVNIIGhhbmRsZSBpcyB0ZXN0ZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKLSAgKiAgICAgICAgIHRoZSBJUCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqICAgICAgICAgdGhlIFBlcmlwaGVyYWwgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCiAgICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCi0gICogQHBhcmFtICBBbGdvcml0aG06IEhBU0ggYWxnb3JpdGhtLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICAqIEBwYXJhbSAgQWxnb3JpdGhtIEhBU0ggYWxnb3JpdGhtLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFTSF9BY2N1bXVsYXRlKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDMyX3QgQWxnb3JpdGhtKQogewogICB1aW50OF90ICpwSW5CdWZmZXJfdG1wOyAgIC8qIGlucHV0IGRhdGEgYWRkcmVzcywgaW5wdXQgcGFyYW1ldGVyIG9mIEhBU0hfV3JpdGVEYXRhKCkgICAgICAgICAqLwogICB1aW50MzJfdCBTaXplX3RtcDsgIC8qIGlucHV0IGRhdGEgc2l6ZSAoaW4gYnl0ZXMpLCBpbnB1dCBwYXJhbWV0ZXIgb2YgSEFTSF9Xcml0ZURhdGEoKSAqLwotICBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYgU3RhdGVfdG1wID0gaGhhc2gtPlN0YXRlOyAKLSAgIAorICBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYgU3RhdGVfdG1wID0gaGhhc2gtPlN0YXRlOworCiAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBpcyBhIG11bHRpcGxlIG9mIDQgKi8KLSAgIGFzc2VydF9wYXJhbShJU19IQVNIX1BPTExJTkdfTVVMVElCVUZGRVJfU0laRShTaXplKSk7CisgIGlmICgoU2l6ZSAlIDRVKSAhPSAwVSkKKyAgeworICAgIHJldHVybiAgSEFMX0VSUk9SOworICB9CiAKICAgLyogSW5pdGlhdGUgSEFTSCBwcm9jZXNzaW5nIGluIGNhc2Ugb2Ygc3RhcnQgb3IgcmVzdW1wdGlvbiAqLwogaWYoKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9SRUFEWSkgfHwgKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9TVVNQRU5ERUQpKQotICB7IAorICB7CiAgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgIGlmICgocEluQnVmZmVyID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKICAgICB7CkBAIC0yNDUwLDIzICsyNjM0LDE1MSBAQAogCiAKIC8qKgorICAqIEBicmllZiAgSWYgbm90IGFscmVhZHkgZG9uZSwgaW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIHRoZW4KKyAgKiAgICAgICAgIHByb2Nlc3NlcyBwSW5CdWZmZXIgaW4gaW50ZXJydXB0aW9uIG1vZGUuCisgICogQG5vdGUgICBGaWVsZCBoaGFzaC0+UGhhc2Ugb2YgSEFTSCBoYW5kbGUgaXMgdGVzdGVkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90CisgICogICAgICAgICB0aGUgUGVyaXBoZXJhbCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqIEBub3RlICAgVGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlLCB0aGUKKyAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KKyAgKiBAcGFyYW0gIEFsZ29yaXRobSBIQVNIIGFsZ29yaXRobS4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBU0hfQWNjdW11bGF0ZV9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQzMl90IEFsZ29yaXRobSkKK3sKKyAgSEFMX0hBU0hfU3RhdGVUeXBlRGVmIFN0YXRlX3RtcCA9IGhoYXNoLT5TdGF0ZTsKKyAgX19JTyB1aW50MzJfdCBpbnB1dGFkZHIgPSAodWludDMyX3QpIHBJbkJ1ZmZlcjsKKyAgdWludDMyX3QgU2l6ZVZhciA9IFNpemU7CisKKyAgLyogTWFrZSBzdXJlIHRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGlzIGEgbXVsdGlwbGUgb2YgNCAqLworICBpZiAoKFNpemUgJSA0VSkgIT0gMFUpCisgIHsKKyAgICByZXR1cm4gIEhBTF9FUlJPUjsKKyAgfQorCisgIC8qIEluaXRpYXRlIEhBU0ggcHJvY2Vzc2luZyBpbiBjYXNlIG9mIHN0YXJ0IG9yIHJlc3VtcHRpb24gKi8KKyAgaWYoKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9SRUFEWSkgfHwgKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9TVVNQRU5ERUQpKQorICB7CisgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIGlmICgocEluQnVmZmVyID09IE5VTEwpIHx8IChTaXplID09IDBVKSkKKyAgICB7CisgICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKKyAgICAgIHJldHVybiAgSEFMX0VSUk9SOworICAgIH0KKworICAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaGhhc2gpOworCisgICAgLyogSWYgcmVzdW1pbmcgdGhlIEhBU0ggcHJvY2Vzc2luZyAqLworICAgIGlmIChoaGFzaC0+U3RhdGUgPT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKQorICAgIHsKKyAgICAgIC8qIENoYW5nZSB0aGUgSEFTSCBzdGF0ZSAqLworICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfQlVTWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIENoYW5nZSB0aGUgSEFTSCBzdGF0ZSAqLworICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfQlVTWTsKKworICAgICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmUgcGVyZm9ybWVkICovCisgICAgICBpZihoaGFzaC0+UGhhc2UgPT0gSEFMX0hBU0hfUEhBU0VfUkVBRFkpCisgICAgICB7CisgICAgICAgIC8qIFNlbGVjdCB0aGUgSEFTSCBhbGdvcml0aG0sIGNsZWFyIEhNQUMgbW9kZSBhbmQgbG9uZyBrZXkgc2VsZWN0aW9uIGJpdCwgcmVzZXQgdGhlIEhBU0ggcHJvY2Vzc29yIGNvcmUgKi8KKyAgICAgICAgTU9ESUZZX1JFRyhIQVNILT5DUiwgSEFTSF9DUl9MS0VZfEhBU0hfQ1JfQUxHT3xIQVNIX0NSX01PREV8SEFTSF9DUl9JTklULCBBbGdvcml0aG0gfCBIQVNIX0NSX0lOSVQpOworICAgICAgICBoaGFzaC0+SGFzaElUQ291bnRlciA9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBoaGFzaC0+SGFzaElUQ291bnRlciA9IDM7IC8qICdjcnVpc2Utc3BlZWQnIHJlYWNoZWQgZHVyaW5nIGEgcHJldmlvdXMgYnVmZmVyIHByb2Nlc3NpbmcgKi8KKyAgICAgIH0KKworICAgICAgLyogU2V0IHRoZSBwaGFzZSAqLworICAgICAgaGhhc2gtPlBoYXNlID0gSEFMX0hBU0hfUEhBU0VfUFJPQ0VTUzsKKworICAgICAgLyogSWYgRElOSVMgaXMgZXF1YWwgdG8gMCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5jb21wbGV0ZSBibG9jayBoYXMgYmVlbiBwcmV2aW91c2x5CisgICAgICAgZmVkIHRvIHRoZSBQZXJpcGhlcmFsKSwgdGhlIERJTklFIGludGVycnVwdGlvbiB3b24ndCBiZSB0cmlnZ2VyZWQgd2hlbiBESU5JRSBpcyBzZXQuCisgICAgICAgVGhlcmVmb3JlLCBmaXJzdCB3b3JkcyBhcmUgbWFudWFsbHkgZW50ZXJlZCB1bnRpbCBESU5JUyByYWlzZXMsIG9yIHVudGlsIHRoZXJlCisgICAgICAgaXMgbm90IG1vcmUgZGF0YSB0byBlbnRlci4gKi8KKyAgICAgIHdoaWxlKCghKF9fSEFMX0hBU0hfR0VUX0ZMQUcoSEFTSF9GTEFHX0RJTklTKSkpICYmIChTaXplVmFyID4gMFUpKQorICAgICAgeworCisgICAgICAgIC8qIFdyaXRlIGlucHV0IGRhdGEgNCBieXRlcyBhdCBhIHRpbWUgKi8KKyAgICAgICAgSEFTSC0+RElOID0gKih1aW50MzJfdCopaW5wdXRhZGRyOworICAgICAgICBpbnB1dGFkZHIrPTRVOworICAgICAgICBTaXplVmFyLT00VTsKKyAgICAgIH0KKworICAgICAgLyogSWYgRElOSVMgaXMgc3RpbGwgbm90IHNldCBvciBpZiBhbGwgdGhlIGRhdGEgaGF2ZSBiZWVuIGZlZCwgc3RvcCBoZXJlICovCisgICAgICBpZiAoKCEoX19IQUxfSEFTSF9HRVRfRkxBRyhIQVNIX0ZMQUdfRElOSVMpKSkgfHwgKFNpemVWYXIgPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgKi8KKyAgICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhoYXNoKTsKKworICAgICAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICB9CisKKyAgICAgIC8qIG90aGVyd2lzZSwgY2Fycnkgb24gaW4gaW50ZXJydXB0LW1vZGUgKi8KKyAgICAgIGhoYXNoLT5IYXNoSW5Db3VudCA9IFNpemVWYXI7ICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZmVkIHRvIHRoZSBQZXJpcGhlcmFsICovCisgICAgICBoaGFzaC0+cEhhc2hJbkJ1ZmZQdHIgPSAodWludDhfdCAqKWlucHV0YWRkcjsgICAgICAgLyogUG9pbnRzIGF0IGRhdGEgd2hpY2ggd2lsbCBiZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5leHQgaW50ZXJydXB0aW9uICovCisgICAgIC8qIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgaGhhc2gtPkhhc2hJbkNvdW50IGFuZCBoaGFzaC0+cEhhc2hJbkJ1ZmZQdHIgY29udGFpbgorICAgICAgICB0aGUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aGVyZSB0aGUgSEFTSCBwcm9jZXNzIGlzIHN0b3BwZWQuCisgICAgICAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBsYXRlciBvbiB0byByZXN1bWUgdGhlIEhBU0ggcHJvY2Vzc2luZyBhdCB0aGUKKyAgICAgICAgY29ycmVjdCBsb2NhdGlvbi4gKi8KKworICAgIH0KKworICAgIC8qIFNldCBtdWx0aSBidWZmZXJzIGFjY3VtdWxhdGlvbiBmbGFnICovCisgICAgaGhhc2gtPkFjY3VtdWxhdGlvbiA9IDFVOworCisgICAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgICBfX0hBTF9VTkxPQ0soaGhhc2gpOworCisgICAgLyogRW5hYmxlIERhdGEgSW5wdXQgaW50ZXJydXB0ICovCisgICAgX19IQUxfSEFTSF9FTkFCTEVfSVQoSEFTSF9JVF9ESU5JKTsKKworICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgICByZXR1cm4gSEFMX09LOworCisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9CisKK30KKworCisKKy8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsLCBuZXh0IHByb2Nlc3MgcEluQnVmZmVyIHRoZW4KICAgKiAgICAgICAgIHJlYWQgdGhlIGNvbXB1dGVkIGRpZ2VzdCBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgQWxnb3JpdGhtOiBIQVNIIGFsZ29yaXRobS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuCisgICogQHBhcmFtICBBbGdvcml0aG0gSEFTSCBhbGdvcml0aG0uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQVNIX1N0YXJ0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgQWxnb3JpdGhtKQogewogICAgSEFMX0hBU0hfU3RhdGVUeXBlRGVmIFN0YXRlX3RtcCA9IGhoYXNoLT5TdGF0ZTsKKyAgX19JTyB1aW50MzJfdCBpbnB1dGFkZHIgPSAodWludDMyX3QpIHBJbkJ1ZmZlcjsKKyAgdWludDMyX3QgcG9sbGluZ19zdGVwID0gMFU7CisgIHVpbnQzMl90IGluaXRpYWxpemF0aW9uX3NraXBwZWQgPSAwVTsKKyAgdWludDMyX3QgU2l6ZVZhciA9IFNpemU7CiAKICAgLyogSWYgU3RhdGUgaXMgcmVhZHkgb3Igc3VzcGVuZGVkLCBzdGFydCBvciByZXN1bWUgSVQtYmFzZWQgSEFTSCBwcm9jZXNzaW5nICovCiBpZigoU3RhdGVfdG1wID09IEhBTF9IQVNIX1NUQVRFX1JFQURZKSB8fCAoU3RhdGVfdG1wID09IEhBTF9IQVNIX1NUQVRFX1NVU1BFTkRFRCkpCi0gIHsgICAgIAorICB7CiAgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgIGlmICgocEluQnVmZmVyID09IE5VTEwpIHx8IChTaXplID09IDBVKSB8fCAocE91dEJ1ZmZlciA9PSBOVUxMKSkKICAgICB7CkBAIC0yNDkwLDEyICsyODAyLDEyIEBACiAgICAgICBNT0RJRllfUkVHKEhBU0gtPkNSLCBIQVNIX0NSX0xLRVl8SEFTSF9DUl9BTEdPfEhBU0hfQ1JfTU9ERXxIQVNIX0NSX0lOSVQsIEFsZ29yaXRobSB8IEhBU0hfQ1JfSU5JVCk7CiAKICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gbGFzdCB3b3JkIG9mIHRoZSBtZXNzYWdlICovCi0gICAgIF9fSEFMX0hBU0hfU0VUX05CVkFMSURCSVRTKFNpemUpOworICAgICBfX0hBTF9IQVNIX1NFVF9OQlZBTElEQklUUyhTaXplVmFyKTsKIAogCi0gICAgICBoaGFzaC0+SGFzaEluQ291bnQgPSBTaXplOyAgICAgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGZlZCB0byB0aGUgSVAgKi8KLSAgICAgIGhoYXNoLT5wSGFzaEluQnVmZlB0ciA9IHBJbkJ1ZmZlcjsgICAgICAgLyogUG9pbnRzIGF0IGRhdGEgd2hpY2ggd2lsbCBiZSBmZWQgdG8gdGhlIElQIGF0CisgICAgICBoaGFzaC0+SGFzaEluQ291bnQgPSBTaXplVmFyOyAgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCB0byBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGZlZCB0byB0aGUgUGVyaXBoZXJhbCAqLworICAgICAgaGhhc2gtPnBIYXNoSW5CdWZmUHRyID0gcEluQnVmZmVyOyAgICAgICAvKiBQb2ludHMgYXQgZGF0YSB3aGljaCB3aWxsIGJlIGZlZCB0byB0aGUgUGVyaXBoZXJhbCBhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV4dCBpbnRlcnJ1cHRpb24gKi8KICAgICAgLyogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCBoaGFzaC0+SGFzaEluQ291bnQgYW5kIGhoYXNoLT5wSGFzaEluQnVmZlB0ciBjb250YWluCiAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHdoZXJlIHRoZSBIQVNIIHByb2Nlc3MgaXMgc3RvcHBlZC4KQEAgLTI1MDQsMTAgKzI4MTYsODIgQEAKIAogICAgICAgaGhhc2gtPnBIYXNoT3V0QnVmZlB0ciA9IHBPdXRCdWZmZXI7ICAgICAvKiBQb2ludHMgYXQgdGhlIGNvbXB1dGVkIGRpZ2VzdCAqLwogICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaW5pdGlhbGl6YXRpb25fc2tpcHBlZCA9IDE7IC8qIGluZm8gdXNlciBsYXRlciBvbiBpbiBjYXNlIG9mIG11bHRpLWJ1ZmZlciAqLworICAgIH0KIAogICAgIC8qIFNldCB0aGUgcGhhc2UgKi8KICAgICBoaGFzaC0+UGhhc2UgPSBIQUxfSEFTSF9QSEFTRV9QUk9DRVNTOwogCisgICAvKiBJZiBESU5JUyBpcyBlcXVhbCB0byAwIChmb3IgZXhhbXBsZSBpZiBhbiBpbmNvbXBsZXRlIGJsb2NrIGhhcyBiZWVuIHByZXZpb3VzbHkKKyAgICAgZmVkIHRvIHRoZSBQZXJpcGhlcmFsKSwgdGhlIERJTklFIGludGVycnVwdGlvbiB3b24ndCBiZSB0cmlnZ2VyZWQgd2hlbiBESU5JRSBpcyBzZXQuCisgICAgIFRoZXJlZm9yZSwgZmlyc3Qgd29yZHMgYXJlIG1hbnVhbGx5IGVudGVyZWQgdW50aWwgRElOSVMgcmFpc2VzLiAqLworICAgIHdoaWxlKCghKF9fSEFMX0hBU0hfR0VUX0ZMQUcoSEFTSF9GTEFHX0RJTklTKSkpICYmIChTaXplVmFyID4gM1UpKQorICAgIHsKKyAgICAgIHBvbGxpbmdfc3RlcCA9IDFVOyAvKiBub3RlIHRoYXQgc29tZSB3b3JkcyBhcmUgZW50ZXJlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIGludGVycnVwdCAqLworCisgICAgICAvKiBXcml0ZSBpbnB1dCBkYXRhIDQgYnl0ZXMgYXQgYSB0aW1lICovCisgICAgICBIQVNILT5ESU4gPSAqKHVpbnQzMl90KilpbnB1dGFkZHI7CisgICAgICBpbnB1dGFkZHIrPTRVOworICAgICAgU2l6ZVZhci09NFU7CisgICAgfQorCisgICAgaWYgKHBvbGxpbmdfc3RlcCA9PSAxVSkKKyAgICB7CisgICAgICBpZiAoU2l6ZVZhciA9PSAwVSkKKyAgICAgIHsKKyAgICAgICAgLyogSWYgYWxsIHRoZSBkYXRhIGhhdmUgYmVlbiBlbnRlcmVkIGF0IHRoaXMgcG9pbnQsIGl0IG9ubHkgcmVtYWlucyB0bworICAgICAgICAgcmVhZCB0aGUgZGlnZXN0ICovCisgICAgICAgIGhoYXNoLT5wSGFzaE91dEJ1ZmZQdHIgPSBwT3V0QnVmZmVyOyAgICAgLyogUG9pbnRzIGF0IHRoZSBjb21wdXRlZCBkaWdlc3QgKi8KKworICAgICAgICAvKiBTdGFydCB0aGUgRGlnZXN0IGNhbGN1bGF0aW9uICovCisgICAgICAgICBfX0hBTF9IQVNIX1NUQVJUX0RJR0VTVCgpOworICAgICAgICAvKiBQcm9jZXNzIFVubG9jayAqLworICAgICAgICBfX0hBTF9VTkxPQ0soaGhhc2gpOworCisgICAgICAgIC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisgICAgICAgIF9fSEFMX0hBU0hfRU5BQkxFX0lUKEhBU0hfSVRfRENJKTsKKworICAgICAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCisgICAgICAgIHJldHVybiBIQUxfT0s7CisgICAgICB9CisgICAgICBlbHNlIGlmIChfX0hBTF9IQVNIX0dFVF9GTEFHKEhBU0hfRkxBR19ESU5JUykpCisgICAgICB7CisgICAgICAgIC8qIEl0IHJlbWFpbnMgZGF0YSB0byBlbnRlciBhbmQgdGhlIFBlcmlwaGVyYWwgaXMgcmVhZHkgdG8gdHJpZ2dlciBESU5JRSwKKyAgICAgICAgICAgY2Fycnkgb24gYXMgdXN1YWwuCisgICAgICAgICAgIFVwZGF0ZSBIYXNoSW5Db3VudCBhbmQgcEhhc2hJbkJ1ZmZQdHIgYWNjb3JkaW5nbHkuICovCisgICAgICAgIGhoYXNoLT5IYXNoSW5Db3VudCA9IFNpemVWYXI7CisgICAgICAgIGhoYXNoLT5wSGFzaEluQnVmZlB0ciA9ICh1aW50OF90ICopaW5wdXRhZGRyOworICAgICAgICBfX0hBTF9IQVNIX1NFVF9OQlZBTElEQklUUyhTaXplVmFyKTsgIC8qIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gbGFzdCB3b3JkIG9mIHRoZSBtZXNzYWdlICovCisgICAgICAgIGhoYXNoLT5wSGFzaE91dEJ1ZmZQdHIgPSBwT3V0QnVmZmVyOyAgLyogUG9pbnRzIGF0IHRoZSBjb21wdXRlZCBkaWdlc3QgKi8KKyAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uX3NraXBwZWQgPT0gMVUpCisgICAgICAgIHsKKyAgICAgICAgICBoaGFzaC0+SGFzaElUQ291bnRlciA9IDM7IC8qICdjcnVpc2Utc3BlZWQnIHJlYWNoZWQgZHVyaW5nIGEgcHJldmlvdXMgYnVmZmVyIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBESU5JUyBpcyBub3Qgc2V0IGJ1dCBpdCByZW1haW5zIGEgZmV3IGRhdGEgdG8gZW50ZXIgKG5vdCBlbm91Z2ggZm9yIGEgZnVsbCB3b3JkKS4KKyAgICAgICAgICAgTWFudWFsbHkgZW50ZXIgdGhlIGxhc3QgYnl0ZXMgYmVmb3JlIGVuYWJsaW5nIERDSUUuICovCisgICAgICAgIF9fSEFMX0hBU0hfU0VUX05CVkFMSURCSVRTKFNpemVWYXIpOworICAgICAgICBIQVNILT5ESU4gPSAqKHVpbnQzMl90KilpbnB1dGFkZHI7CisKKyAgICAgICAgIC8qIFN0YXJ0IHRoZSBEaWdlc3QgY2FsY3VsYXRpb24gKi8KKyAgICAgICAgaGhhc2gtPnBIYXNoT3V0QnVmZlB0ciA9IHBPdXRCdWZmZXI7ICAgICAvKiBQb2ludHMgYXQgdGhlIGNvbXB1dGVkIGRpZ2VzdCAqLworICAgICAgICAgX19IQUxfSEFTSF9TVEFSVF9ESUdFU1QoKTsKKyAgICAgICAgLyogUHJvY2VzcyBVbmxvY2sgKi8KKyAgICAgICAgX19IQUxfVU5MT0NLKGhoYXNoKTsKKworICAgICAgICAvKiBFbmFibGUgSW50ZXJydXB0cyAqLworICAgICAgICBfX0hBTF9IQVNIX0VOQUJMRV9JVChIQVNIX0lUX0RDSSk7CisKKyAgICAgICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLworICAgICAgICByZXR1cm4gSEFMX09LOworICAgICAgfQorICAgIH0gLyogIGlmIChwb2xsaW5nX3N0ZXAgPT0gMSkgKi8KKworCiAgICAgLyogUHJvY2VzcyBVbmxvY2sgKi8KICAgICBfX0hBTF9VTkxPQ0soaGhhc2gpOwogCkBAIC0yNTI3LDE3ICsyOTExLDE3IEBACiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIHRoZW4gaW5pdGlhdGUgYSBETUEgdHJhbnNmZXIKLSAgKiAgICAgICAgIHRvIGZlZWQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICB0byBmZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIFBlcmlwaGVyYWwuCiAgICogQG5vdGUgICBJZiBNRE1BVCBiaXQgaXMgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKG11bHRpLWJ1ZmZlcgogICAqICAgICAgICAgIEhBU0ggcHJvY2Vzc2luZyBjYXNlKSwgdGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZQogICAqICAgICAgICAgIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZSBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuCiAgICogICAgICAgICAgRm9yIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBsYXN0IGJ1ZmZlciBvZiB0aGUgdGhyZWFkLCBNRE1BVCBiaXQgbXVzdAogICAqICAgICAgICAgIGJlIHJlc2V0IGFuZCB0aGUgYnVmZmVyIGxlbmd0aCAoaW4gYnl0ZXMpIGRvZXNuJ3QgaGF2ZSB0byBiZSBhCiAgICogICAgICAgICAgbXVsdGlwbGUgb2YgNC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgQWxnb3JpdGhtOiBIQVNIIGFsZ29yaXRobS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgQWxnb3JpdGhtIEhBU0ggYWxnb3JpdGhtLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFTSF9TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50MzJfdCBBbGdvcml0aG0pCkBAIC0yNTU0LDcgKzI5MzgsNyBAQAogCiAgICAvKiBJZiBTdGF0ZSBpcyByZWFkeSBvciBzdXNwZW5kZWQsIHN0YXJ0IG9yIHJlc3VtZSBwb2xsaW5nLWJhc2VkIEhBU0ggcHJvY2Vzc2luZyAqLwogaWYoKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9SRUFEWSkgfHwgKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9TVVNQRU5ERUQpKQotICB7IAorICB7CiAgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgIGlmICggKHBJbkJ1ZmZlciA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpIHx8CiAgICAgLyogQ2hlY2sgcGhhc2UgY29oZXJlbmN5LiBQaGFzZSBtdXN0IGJlCkBAIC0yNjI0LDM5ICszMDA4LDM0IEBACiAKICAgICAvKiBFbmFibGUgdGhlIERNQSBJbiBETUEgU3RyZWFtICovCiAgICAgc3RhdHVzID0gSEFMX0RNQV9TdGFydF9JVChoaGFzaC0+aGRtYWluLCBpbnB1dGFkZHIsICh1aW50MzJfdCkmSEFTSC0+RElOLCAoKChpbnB1dFNpemUgJTRVKSE9MFUpID8gKChpbnB1dFNpemUrKDRVLShpbnB1dFNpemUgJTRVKSkpLzRVKTooaW5wdXRTaXplLzRVKSkpOwotICAgIAorCiAgICAgLyogRW5hYmxlIERNQSByZXF1ZXN0cyAqLwogICAgIFNFVF9CSVQoSEFTSC0+Q1IsIEhBU0hfQ1JfRE1BRSk7Ci0gICAgCisKICAgICAvKiBQcm9jZXNzIFVubG9jayAqLwogICAgIF9fSEFMX1VOTE9DSyhoaGFzaCk7Ci0gICAgCisKICAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgICAgaWYgKHN0YXR1cyAhPSBIQUxfT0spCiAgICAgewogICAgICAgLyogVXBkYXRlIEhBU0ggc3RhdGUgbWFjaGluZSB0byBlcnJvciAqLwotICAgICAgaGhhc2gtPlN0YXRlID0gSEFMX0hBU0hfU1RBVEVfRVJST1I7ICAgICAgCisgICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9FUlJPUjsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSBIQVNIIHN0YXRlICovCi0gICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKLSAgICB9Ci0gICAgCisKICAgICByZXR1cm4gc3RhdHVzOwogICB9CiAgIGVsc2UKICAgewogICAgIHJldHVybiBIQUxfQlVTWTsKLSAgfSAKKyAgfQogfQogCiAvKioKICAgKiBAYnJpZWYgIFJldHVybiB0aGUgY29tcHV0ZWQgZGlnZXN0LgogICAqIEBub3RlICAgVGhlIEFQSSB3YWl0cyBmb3IgRENJUyB0byBiZSBzZXQgdGhlbiByZWFkcyB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQVNIX0ZpbmlzaChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KQpAQCAtMjY4OCw2ICszMDY3LDkgQEAKICAgICAvKiBDaGFuZ2UgdGhlIEhBU0ggc3RhdGUgdG8gcmVhZHkgKi8KICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKIAorICAgIC8qIFJlc2V0IEhBU0ggc3RhdGUgbWFjaGluZSAqLworICAgIGhoYXNoLT5QaGFzZSA9IEhBTF9IQVNIX1BIQVNFX1JFQURZOworCiAgICAgLyogUHJvY2VzcyBVbkxvY2sgKi8KICAgICBfX0hBTF9VTkxPQ0soaGhhc2gpOwogCkBAIC0yNzA5LDIxICszMDkxLDIxIEBACiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCiAgICogQG5vdGUgICBTYW1lIGtleSBpcyB1c2VkIGZvciB0aGUgaW5uZXIgYW5kIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uczsgcG9pbnRlciB0byBrZXkgYW5kCiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlLgotICAqIEBwYXJhbSAgQWxnb3JpdGhtOiBIQVNIIGFsZ29yaXRobS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCisgICogQHBhcmFtICBBbGdvcml0aG0gSEFTSCBhbGdvcml0aG0uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBITUFDX1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCwgdWludDMyX3QgQWxnb3JpdGhtKQogewotICAgIEhBTF9IQVNIX1N0YXRlVHlwZURlZiBTdGF0ZV90bXAgPSBoaGFzaC0+U3RhdGU7IAotICAKKyAgICBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYgU3RhdGVfdG1wID0gaGhhc2gtPlN0YXRlOworCiAgICAvKiBJZiBTdGF0ZSBpcyByZWFkeSBvciBzdXNwZW5kZWQsIHN0YXJ0IG9yIHJlc3VtZSBwb2xsaW5nLWJhc2VkIEhBU0ggcHJvY2Vzc2luZyAqLwogaWYoKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9SRUFEWSkgfHwgKFN0YXRlX3RtcCA9PSBIQUxfSEFTSF9TVEFURV9TVVNQRU5ERUQpKQotICB7IAorICB7CiAgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgIGlmICgocEluQnVmZmVyID09IE5VTEwpIHx8IChTaXplID09IDBVKSB8fCAoaGhhc2gtPkluaXQucEtleSA9PSBOVUxMKSB8fCAoaGhhc2gtPkluaXQuS2V5U2l6ZSA9PSAwVSkgfHwgKHBPdXRCdWZmZXIgPT0gTlVMTCkpCiAgICAgewpAQCAtMjc1MSw3ICszMTMzLDcgQEAKICAgICAgIH0KICAgICAgIC8qIFNldCB0aGUgcGhhc2UgdG8gU3RlcCAxICovCiAgICAgICBoaGFzaC0+UGhhc2UgPSBIQUxfSEFTSF9QSEFTRV9ITUFDX1NURVBfMTsKLSAgICAgIC8qIFJlc29ydCB0byBoaGFzaCBpbnRlcm5hbCBmaWVsZHMgdG8gZmVlZCB0aGUgSVAuCisgICAgICAvKiBSZXNvcnQgdG8gaGhhc2ggaW50ZXJuYWwgZmllbGRzIHRvIGZlZWQgdGhlIFBlcmlwaGVyYWwuCiAgICAgICAgICBQYXJhbWV0ZXJzIHdpbGwgYmUgdXBkYXRlZCBpbiBjYXNlIG9mIHN1c3BlbnNpb24gdG8gY29udGFpbiB0aGUgcHJvcGVyCiAgICAgICAgICBpbmZvcm1hdGlvbiBhdCByZXN1bXB0aW9uIHRpbWUuICovCiAgICAgICBoaGFzaC0+cEhhc2hPdXRCdWZmUHRyICA9IHBPdXRCdWZmZXI7ICAgICAgICAgICAgLyogT3V0cHV0IGRpZ2VzdCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNzgwLDIwICszMTYyLDIwIEBACiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCiAgICogQG5vdGUgICBTYW1lIGtleSBpcyB1c2VkIGZvciB0aGUgaW5uZXIgYW5kIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uczsgcG9pbnRlciB0byBrZXkgYW5kCiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBBbGdvcml0aG06IEhBU0ggYWxnb3JpdGhtLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4KKyAgKiBAcGFyYW0gIEFsZ29yaXRobSBIQVNIIGFsZ29yaXRobS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhNQUNfU3RhcnRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBBbGdvcml0aG0pCiB7Ci0gICAgSEFMX0hBU0hfU3RhdGVUeXBlRGVmIFN0YXRlX3RtcCA9IGhoYXNoLT5TdGF0ZTsgCi0gICAgCisgICAgSEFMX0hBU0hfU3RhdGVUeXBlRGVmIFN0YXRlX3RtcCA9IGhoYXNoLT5TdGF0ZTsKKwogICAvKiBJZiBTdGF0ZSBpcyByZWFkeSBvciBzdXNwZW5kZWQsIHN0YXJ0IG9yIHJlc3VtZSBJVC1iYXNlZCBIQVNIIHByb2Nlc3NpbmcgKi8KIGlmKChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfUkVBRFkpIHx8IChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKSkKLSAgeyAKKyAgewogICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KICAgICBpZiAoKHBJbkJ1ZmZlciA9PSBOVUxMKSB8fCAoU2l6ZSA9PSAwVSkgfHwgKGhoYXNoLT5Jbml0LnBLZXkgPT0gTlVMTCkgfHwgKGhoYXNoLT5Jbml0LktleVNpemUgPT0gMFUpIHx8IChwT3V0QnVmZmVyID09IE5VTEwpKQogICAgIHsKQEAgLTI4MjQsNyArMzIwNiw3IEBACiAgICAgICB9CiAKICAgICAgIC8qIFJlc29ydCB0byBoaGFzaCBpbnRlcm5hbCBmaWVsZHMgaGhhc2gtPnBIYXNoSW5CdWZmUHRyIGFuZCBoaGFzaC0+SGFzaEluQ291bnQKLSAgICAgICAgIHRvIGZlZWQgdGhlIElQIHdoYXRldmVyIHRoZSBITUFDIHN0ZXAuCisgICAgICAgICB0byBmZWVkIHRoZSBQZXJpcGhlcmFsIHdoYXRldmVyIHRoZSBITUFDIHN0ZXAuCiAgICAgICAgICBMaW5lcyBiZWxvdyBhcmUgc2V0IHRvIHN0YXJ0IEhNQUMgU3RlcCAxIHByb2Nlc3Npbmcgd2hlcmUga2V5IGlzIGVudGVyZWQgZmlyc3QuICovCiAgICAgICBoaGFzaC0+SGFzaEluQ291bnQgICAgID0gaGhhc2gtPkluaXQuS2V5U2l6ZTsgLyogS2V5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgIGhoYXNoLT5wSGFzaEluQnVmZlB0ciAgPSBoaGFzaC0+SW5pdC5wS2V5IDsgICAvKiBLZXkgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjg4MSwxNyArMzI2MywxNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBITUFDIG1vZGUgdGhlbiBpbml0aWF0ZSB0aGUgcmVxdWlyZWQKLSAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMgdG8gZmVlZCB0aGUga2V5IGFuZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBJUC4KKyAgKiAgICAgICAgIERNQSB0cmFuc2ZlcnMgdG8gZmVlZCB0aGUga2V5IGFuZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgU2FtZSBrZXkgaXMgdXNlZCBmb3IgdGhlIGlubmVyIGFuZCB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbnM7IHBvaW50ZXIgdG8ga2V5IGFuZAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KICAgKiBAbm90ZSAgIEluIGNhc2Ugb2YgbXVsdGktYnVmZmVyIEhNQUMgcHJvY2Vzc2luZywgdGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdAogICAqICAgICAgICAgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4KICAgKiAgICAgICAgIE9ubHkgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIHRocmVhZCBkb2Vzbid0IGhhdmUgdG8gYmUgYQogICAqICAgICAgICAgbXVsdGlwbGUgb2YgNC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgQWxnb3JpdGhtOiBIQVNIIGFsZ29yaXRobS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgQWxnb3JpdGhtIEhBU0ggYWxnb3JpdGhtLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSE1BQ19TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50MzJfdCBBbGdvcml0aG0pCkBAIC0yODk5LDEzICszMjgxLDEzIEBACiAgIHVpbnQzMl90IGlucHV0YWRkcjsKICAgdWludDMyX3QgaW5wdXRTaXplOwogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgOwotICBIQUxfSEFTSF9TdGF0ZVR5cGVEZWYgU3RhdGVfdG1wID0gaGhhc2gtPlN0YXRlOyAgCisgIEhBTF9IQVNIX1N0YXRlVHlwZURlZiBTdGF0ZV90bXAgPSBoaGFzaC0+U3RhdGU7CiAgICAvKiBNYWtlIHN1cmUgdGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgaXMgYSBtdWx0aXBsZSBvZiA0IHdoZW4gZGlnZXN0IGNhbGN1bGF0aW9uCiAgICAgICBpcyBkaXNhYmxlZCAobXVsdGktYnVmZmVyIEhNQUMgcHJvY2Vzc2luZywgTURNQVQgYml0IHRvIGJlIHNldCkgKi8KICAgIGFzc2VydF9wYXJhbShJU19ITUFDX0RNQV9NVUxUSUJVRkZFUl9TSVpFKGhoYXNoLCBTaXplKSk7CiAgIC8qIElmIFN0YXRlIGlzIHJlYWR5IG9yIHN1c3BlbmRlZCwgc3RhcnQgb3IgcmVzdW1lIERNQS1iYXNlZCBIQVNIIHByb2Nlc3NpbmcgKi8KIGlmKChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfUkVBRFkpIHx8IChTdGF0ZV90bXAgPT0gSEFMX0hBU0hfU1RBVEVfU1VTUEVOREVEKSkKLSAgeyAgIAorICB7CiAgICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgIGlmICgocEluQnVmZmVyID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkgfHwgKGhoYXNoLT5Jbml0LnBLZXkgPT0gTlVMTCApIHx8IChoaGFzaC0+SW5pdC5LZXlTaXplID09IDBVKSB8fAogICAgLyogQ2hlY2sgcGhhc2UgY29oZXJlbmN5LiBQaGFzZSBtdXN0IGJlCkBAIC0zMDIwLDIwICszNDAyLDE2IEBACiAKICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGhoYXNoKTsKLSAgICAKKwogICAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKICAgICB7CiAgICAgICAvKiBVcGRhdGUgSEFTSCBzdGF0ZSBtYWNoaW5lIHRvIGVycm9yICovCiAgICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9FUlJPUjsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoYW5nZSBIQVNIIHN0YXRlICovCi0gICAgICBoaGFzaC0+U3RhdGUgPSBIQUxfSEFTSF9TVEFURV9SRUFEWTsKLSAgICB9CisKICAgICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gICAgcmV0dXJuIHN0YXR1czsgCisgICAgcmV0dXJuIHN0YXR1czsKICAgfQogICBlbHNlCiAgIHsKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX2hhc2hfZXguYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2hhc2hfZXguYwppbmRleCBlNjY2ZDBhLi5mZDYxODE0IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9oYXNoX2V4LmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfaGFzaF9leC5jCkBAIC0zMywxNiArMzMsMjEgQEAKICAgICAgICAgICAgICAgICBlLmcuIEhBTF9IQVNIRXhfeHh4X1N0YXJ0X0RNQSgpLiBOb3RlIHRoYXQgaW4gRE1BIG1vZGUsIGEgY2FsbCB0bwogICAgICAgICAgICAgICAgIEhBTF9IQVNIRXhfeHh4X0ZpbmlzaCgpIGlzIHRoZW4gcmVxdWlyZWQgdG8gcmV0cmlldmUgdGhlIGRpZ2VzdC4KIAotICAgKCMpTXVsdGktYnVmZmVyIHByb2Nlc3NpbmcgaXMgcG9zc2libGUgaW4gcG9sbGluZyBhbmQgRE1BIG1vZGUuCisgICAoIylNdWx0aS1idWZmZXIgcHJvY2Vzc2luZyBpcyBwb3NzaWJsZSBpbiBwb2xsaW5nLCBpbnRlcnJ1cHQgYW5kIERNQSBtb2Rlcy4KICAgICAgICAgKCMjKSBJbiBwb2xsaW5nIG1vZGUsIG9ubHkgbXVsdGktYnVmZmVyIEhBU0ggcHJvY2Vzc2luZyBpcyBwb3NzaWJsZS4KICAgICAgICAgICAgICBBUEkgSEFMX0hBU0hFeF94eHhfQWNjdW11bGF0ZSgpIG11c3QgYmUgY2FsbGVkIGZvciBlYWNoIGlucHV0IGJ1ZmZlciwgZXhjZXB0IGZvciB0aGUgbGFzdCBvbmUuCi0gICAgICAgICAgICAgVXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSEV4X3h4eF9TdGFydCgpIHRvIGVudGVyIHRoZSBsYXN0IG9uZSBhbmQgcmV0cmlldmUgYXMKKyAgICAgICAgICAgICBVc2VyIG11c3QgcmVzb3J0IHRvIEhBTF9IQVNIRXhfeHh4X0FjY3VtdWxhdGVfRW5kKCkgdG8gZW50ZXIgdGhlIGxhc3Qgb25lIGFuZCByZXRyaWV2ZSBhcworICAgICAgICAgICAgIHdlbGwgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KKworICAgICAgICAoIyMpIEluIGludGVycnVwdCBtb2RlLCBBUEkgSEFMX0hBU0hFeF94eHhfQWNjdW11bGF0ZV9JVCgpIG11c3QgYmUgY2FsbGVkIGZvciBlYWNoIGlucHV0IGJ1ZmZlciwgCisgICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgbGFzdCBvbmUuCisgICAgICAgICAgICAgVXNlciBtdXN0IHJlc29ydCB0byBIQUxfSEFTSEV4X3h4eF9BY2N1bXVsYXRlX0VuZF9JVCgpIHRvIGVudGVyIHRoZSBsYXN0IG9uZSBhbmQgcmV0cmlldmUgYXMKICAgICAgICAgICAgICB3ZWxsIHRoZSBjb21wdXRlZCBkaWdlc3QuCiAKICAgICAgICAgKCMjKSBJbiBETUEgbW9kZSwgbXVsdGktYnVmZmVyIEhBU0ggYW5kIEhNQUMgcHJvY2Vzc2luZyBhcmUgcG9zc2libGUuCiAKICAgICAgICAgICAgICAgKCsrKykgSEFTSCBwcm9jZXNzaW5nOiBvbmNlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUsIE1ETUFUIGJpdCBtdXN0IGJlIHNldCB0aHJ1IF9fSEFMX0hBU0hfU0VUX01ETUFUKCkgbWFjcm8uCi0gICAgICAgICAgICAgRnJvbSB0aGF0IHBvaW50LCBlYWNoIGJ1ZmZlciBjYW4gYmUgZmVkIHRvIHRoZSBJUCB0aHJ1IEhBTF9IQVNIRXhfeHh4X1N0YXJ0X0RNQSgpIEFQSS4KKyAgICAgICAgICAgICBGcm9tIHRoYXQgcG9pbnQsIGVhY2ggYnVmZmVyIGNhbiBiZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwgdGhydSBIQUxfSEFTSEV4X3h4eF9TdGFydF9ETUEoKSBBUEkuCiAgICAgICAgICAgICAgQmVmb3JlIGVudGVyaW5nIHRoZSBsYXN0IGJ1ZmZlciwgcmVzZXQgdGhlIE1ETUFUIGJpdCB3aXRoIF9fSEFMX0hBU0hfUkVTRVRfTURNQVQoKQogICAgICAgICAgICAgIG1hY3JvIHRoZW4gd3JhcC11cCB0aGUgSEFTSCBwcm9jZXNzaW5nIGluIGZlZWRpbmcgdGhlIGxhc3QgaW5wdXQgYnVmZmVyIHRocnUgdGhlCiAgICAgICAgICAgICAgc2FtZSBBUEkgSEFMX0hBU0hFeF94eHhfU3RhcnRfRE1BKCkuIFRoZSBkaWdlc3QgY2FuIHRoZW4gYmUgcmV0cmlldmVkIHdpdGggYSBjYWxsIHRvCkBAIC01MCw3ICs1NSw3IEBACiAKICAgICAgICAgICAgICAoKysrKSBITUFDIHByb2Nlc3NpbmcgKE1ELTUsIFNIQS0xLCBTSEEtMjI0IGFuZCBTSEEtMjU2IG11c3QgYWxsIHJlc29ydCB0bwogICAgICAgICAgICAgIGV4dGVuZGVkIGZ1bmN0aW9ucyk6IGFmdGVyIGluaXRpYWxpemF0aW9uLCB0aGUga2V5IGFuZCB0aGUgZmlyc3QgaW5wdXQgYnVmZmVyIGFyZSBlbnRlcmVkCi0gICAgICAgICAgICAgaW4gdGhlIElQIHdpdGggdGhlIEFQSSBIQUxfSE1BQ0V4X3h4eF9TdGVwMV8yX0RNQSgpLiBUaGlzIGNhcnJpZXMgb3V0IEhNQUMgc3RlcCAxIGFuZAorICAgICAgICAgICAgIGluIHRoZSBQZXJpcGhlcmFsIHdpdGggdGhlIEFQSSBIQUxfSE1BQ0V4X3h4eF9TdGVwMV8yX0RNQSgpLiBUaGlzIGNhcnJpZXMgb3V0IEhNQUMgc3RlcCAxIGFuZAogICAgICAgICAgICAgIHN0YXJ0cyBzdGVwIDIuCiAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBidWZmZXJzIGFyZSBuZXh0IGVudGVyZWQgd2l0aCB0aGUgQVBJICBIQUxfSE1BQ0V4X3h4eF9TdGVwMl9ETUEoKS4gQXQgdGhpcwogICAgICAgICAgICAgIHBvaW50LCB0aGUgSE1BQyBwcm9jZXNzaW5nIGlzIHN0aWxsIGNhcnJ5aW5nIG91dCBzdGVwIDIuCkBAIC0xMTIsMTcgKzExNywxOSBAQAogICAgICAgICAgIHRoZSBoYXNoIHZhbHVlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIGFsZ29yaXRobXM6CiAgICAgICAoKykgU0hBMjI0CiAgICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjI0X1N0YXJ0KCkKLSAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyMjRfQWNjdW11bGF0ZSgpCisgICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdCgpCisgICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmQoKQogICAgICAgKCspIFNIQTI1NgogICAgICAgICAgKCsrKSBIQUxfSEFTSEV4X1NIQTI1Nl9TdGFydCgpCi0gICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGUoKQorICAgICAgICAgKCsrKSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHQoKQorICAgICAgICAgKCsrKSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kKCkKIAogICAgIFsuLl0gRm9yIGEgc2luZ2xlIGJ1ZmZlciB0byBiZSBoYXNoZWQsIHVzZXIgY2FuIHJlc29ydCB0byBIQUxfSEFTSF94eHhfU3RhcnQoKS4KIAogICAgIFsuLl0gIEluIGNhc2Ugb2YgbXVsdGktYnVmZmVyIEhBU0ggcHJvY2Vzc2luZyAoYSBzaW5nbGUgZGlnZXN0IGlzIGNvbXB1dGVkIHdoaWxlCi0gICAgICAgICAgc2V2ZXJhbCBidWZmZXJzIGFyZSBmZWQgdG8gdGhlIElQKSwgdGhlIHVzZXIgY2FuIHJlc29ydCB0byBzdWNjZXNzaXZlIGNhbGxzCisgICAgICAgICAgc2V2ZXJhbCBidWZmZXJzIGFyZSBmZWQgdG8gdGhlIFBlcmlwaGVyYWwpLCB0aGUgdXNlciBjYW4gcmVzb3J0IHRvIHN1Y2Nlc3NpdmUgY2FsbHMKICAgICAgICAgICB0byBIQUxfSEFTSEV4X3h4eF9BY2N1bXVsYXRlKCkgYW5kIHdyYXAtdXAgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBieSBhIGNhbGwKLSAgICAgICAgICB0byBIQUxfSEFTSEV4X3h4eF9TdGFydCgpLgorICAgICAgICAgIHRvIEhBTF9IQVNIRXhfeHh4X0FjY3VtdWxhdGVfRW5kKCkuCiAKIEBlbmR2ZXJiYXRpbQogICAqIEB7CkBAIC0xMzMsMTEgKzE0MCwxMSBAQAogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIGluIFNIQTIyNCBtb2RlLCBuZXh0IHByb2Nlc3MgcEluQnVmZmVyIHRoZW4KICAgKiAgICAgICAgIHJlYWQgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyOCBieXRlcy4KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUKKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDI4IGJ5dGVzLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCkBAIC0xNDgsMzcgKzE1NSw1MiBAQAogLyoqCiAgICogQGJyaWVmICBJZiBub3QgYWxyZWFkeSBkb25lLCBpbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMjI0IG1vZGUgdGhlbgogICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlci4KLSAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIRXhfU0hBMjI0X0FjY3VtdWxhdGUoKSBjYW4gYmUgdXNlZCB0byBmZWVkCi0gICogICAgICAgICBzZXZlcmFsIGlucHV0IGJ1ZmZlcnMgYmFjay10by1iYWNrIHRvIHRoZSBJUCB0aGF0IHdpbGwgeWllbGQgYSBzaW5nbGUKKyAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdCgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKKyAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIFBlcmlwaGVyYWwgdGhhdCB3aWxsIHlpZWxkIGEgc2luZ2xlCiAgICogICAgICAgICBIQVNIIHNpZ25hdHVyZSBvbmNlIGFsbCBidWZmZXJzIGhhdmUgYmVlbiBlbnRlcmVkLiBXcmFwLXVwIG9mIGlucHV0CiAgICogICAgICAgICBidWZmZXJzIGZlZWRpbmcgYW5kIHJldHJpZXZhbCBvZiBkaWdlc3QgaXMgZG9uZSBieSBhIGNhbGwgdG8KLSAgKiAgICAgICAgIEhBTF9IQVNIRXhfU0hBMjI0X1N0YXJ0KCkuCisgICogICAgICAgICBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfRW5kKCkuCiAgICogQG5vdGUgICBGaWVsZCBoaGFzaC0+UGhhc2Ugb2YgSEFTSCBoYW5kbGUgaXMgdGVzdGVkIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90Ci0gICogICAgICAgICB0aGUgSVAgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLSAgKiBAbm90ZSAgIERpZ2VzdCBpcyBub3QgcmV0cmlldmVkIGJ5IHRoaXMgQVBJLCB1c2VyIG11c3QgcmVzb3J0IHRvIEhBTF9IQVNIRXhfU0hBMjI0X1N0YXJ0KCkKLSAgKiAgICAgICAgIHRvIHJlYWQgaXQsIGZlZWRpbmcgYXQgdGhlIHNhbWUgdGltZSB0aGUgbGFzdCBpbnB1dCBidWZmZXIgdG8gdGhlIElQLgorICAqICAgICAgICAgdGhlIFBlcmlwaGVyYWwgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgKiBAbm90ZSAgIERpZ2VzdCBpcyBub3QgcmV0cmlldmVkIGJ5IHRoaXMgQVBJLCB1c2VyIG11c3QgcmVzb3J0IHRvIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmQoKQorICAqICAgICAgICAgdG8gcmVhZCBpdCwgZmVlZGluZyBhdCB0aGUgc2FtZSB0aW1lIHRoZSBsYXN0IGlucHV0IGJ1ZmZlciB0byB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCi0gICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuIE9ubHkgSEFMX0hBU0hFeF9TSEEyMjRfU3RhcnQoKSBpcyBhYmxlCisgICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuIE9ubHkgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0VuZCgpIGlzIGFibGUKICAgKiAgICAgICAgIHRvIG1hbmFnZSB0aGUgZW5kaW5nIGJ1ZmZlciB3aXRoIGEgbGVuZ3RoIGluIGJ5dGVzIG5vdCBhIG11bHRpcGxlIG9mIDQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9BY2N1bXVsYXRlKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpCiB7CiAgIHJldHVybiAgSEFTSF9BY2N1bXVsYXRlKGhoYXNoLCBwSW5CdWZmZXIsIFNpemUsSEFTSF9BTEdPU0VMRUNUSU9OX1NIQTIyNCk7CiB9CiAKIC8qKgorICAqIEBicmllZiAgRW5kIGNvbXB1dGF0aW9uIG9mIGEgc2luZ2xlIEhBU0ggc2lnbmF0dXJlIGFmdGVyIHNldmVyYWwgY2FsbHMgdG8gSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0KCkgQVBJLgorICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjggYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUKKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KQoreworICByZXR1cm4gSEFTSF9TdGFydChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLCBUaW1lb3V0LCBIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjI0KTsKK30KKworLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMjU2IG1vZGUsIG5leHQgcHJvY2VzcyBwSW5CdWZmZXIgdGhlbgogICAqICAgICAgICAgcmVhZCB0aGUgY29tcHV0ZWQgZGlnZXN0LgogICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDMyIGJ5dGVzLgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZQorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMzIgYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjU2X1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKQEAgLTE4OSwyOCArMjExLDQyIEBACiAvKioKICAgKiBAYnJpZWYgIElmIG5vdCBhbHJlYWR5IGRvbmUsIGluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBTSEEyNTYgbW9kZSB0aGVuCiAgICogICAgICAgICBwcm9jZXNzZXMgcEluQnVmZmVyLgotICAqIEBub3RlICAgQ29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0hBU0hFeF9TSEEyNTZfQWNjdW11bGF0ZSgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKLSAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIElQIHRoYXQgd2lsbCB5aWVsZCBhIHNpbmdsZQorICAqIEBub3RlICAgQ29uc2VjdXRpdmUgY2FsbHMgdG8gSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0KCkgY2FuIGJlIHVzZWQgdG8gZmVlZAorICAqICAgICAgICAgc2V2ZXJhbCBpbnB1dCBidWZmZXJzIGJhY2stdG8tYmFjayB0byB0aGUgUGVyaXBoZXJhbCB0aGF0IHdpbGwgeWllbGQgYSBzaW5nbGUKICAgKiAgICAgICAgIEhBU0ggc2lnbmF0dXJlIG9uY2UgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIGVudGVyZWQuIFdyYXAtdXAgb2YgaW5wdXQKICAgKiAgICAgICAgIGJ1ZmZlcnMgZmVlZGluZyBhbmQgcmV0cmlldmFsIG9mIGRpZ2VzdCBpcyBkb25lIGJ5IGEgY2FsbCB0bwotICAqICAgICAgICAgSEFMX0hBU0hFeF9TSEEyNTZfU3RhcnQoKS4KKyAgKiAgICAgICAgIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmQoKS4KICAgKiBAbm90ZSAgIEZpZWxkIGhoYXNoLT5QaGFzZSBvZiBIQVNIIGhhbmRsZSBpcyB0ZXN0ZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKLSAgKiAgICAgICAgIHRoZSBJUCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAqIEBub3RlICAgRGlnZXN0IGlzIG5vdCByZXRyaWV2ZWQgYnkgdGhpcyBBUEksIHVzZXIgbXVzdCByZXNvcnQgdG8gSEFMX0hBU0hFeF9TSEEyNTZfU3RhcnQoKQotICAqICAgICAgICAgdG8gcmVhZCBpdCwgZmVlZGluZyBhdCB0aGUgc2FtZSB0aW1lIHRoZSBsYXN0IGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICB0aGUgUGVyaXBoZXJhbCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAqIEBub3RlICAgRGlnZXN0IGlzIG5vdCByZXRyaWV2ZWQgYnkgdGhpcyBBUEksIHVzZXIgbXVzdCByZXNvcnQgdG8gSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0VuZCgpCisgICogICAgICAgICB0byByZWFkIGl0LCBmZWVkaW5nIGF0IHRoZSBzYW1lIHRpbWUgdGhlIGxhc3QgaW5wdXQgYnVmZmVyIHRvIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgVGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlLCB0aGUKLSAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4gT25seSBIQUxfSEFTSEV4X1NIQTI1Nl9TdGFydCgpIGlzIGFibGUKKyAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4gT25seSBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfRW5kKCkgaXMgYWJsZQogICAqICAgICAgICAgdG8gbWFuYWdlIHRoZSBlbmRpbmcgYnVmZmVyIHdpdGggYSBsZW5ndGggaW4gYnl0ZXMgbm90IGEgbXVsdGlwbGUgb2YgNC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjU2X0FjY3VtdWxhdGUoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKIHsKICAgcmV0dXJuICBIQVNIX0FjY3VtdWxhdGUoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSxIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjU2KTsKIH0KIAorLyoqCisgICogQGJyaWVmICBFbmQgY29tcHV0YXRpb24gb2YgYSBzaW5nbGUgSEFTSCBzaWduYXR1cmUgYWZ0ZXIgc2V2ZXJhbCBjYWxscyB0byBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHQoKSBBUEkuCisgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0VuZChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCit7CisgIHJldHVybiBIQVNIX1N0YXJ0KGhoYXNoLCBwSW5CdWZmZXIsIFNpemUsIHBPdXRCdWZmZXIsIFRpbWVvdXQsIEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYpOworfQogCiAvKioKICAgKiBAfQpAQCAtMjI3LDggKzI2MywxMiBAQAogICAgICAgICAgIHRoZSBoYXNoIHZhbHVlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIGFsZ29yaXRobXM6CiAgICAgICAoKykgU0hBMjI0CiAgICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjI0X1N0YXJ0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0VuZF9JVCgpCiAgICAgICAoKykgU0hBMjU2CiAgICAgICAgICAoKyspIEhBTF9IQVNIRXhfU0hBMjU2X1N0YXJ0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0lUKCkKKyAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0VuZF9JVCgpCiAKIEBlbmR2ZXJiYXRpbQogICAqIEB7CkBAIC0yMzksMTAgKzI3OSwxMCBAQAogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIGluIFNIQTIyNCBtb2RlLCBuZXh0IHByb2Nlc3MgcEluQnVmZmVyIHRoZW4KICAgKiAgICAgICAgIHJlYWQgdGhlIGNvbXB1dGVkIGRpZ2VzdCBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyOCBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDI4IGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfU3RhcnRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKQpAQCAtMjUxLDEzICsyOTEsNTAgQEAKIH0KIAogLyoqCisgICogQGJyaWVmICBJZiBub3QgYWxyZWFkeSBkb25lLCBpbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMjI0IG1vZGUgdGhlbgorICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlciBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9JVCgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKKyAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIFBlcmlwaGVyYWwgdGhhdCB3aWxsIHlpZWxkIGEgc2luZ2xlCisgICogICAgICAgICBIQVNIIHNpZ25hdHVyZSBvbmNlIGFsbCBidWZmZXJzIGhhdmUgYmVlbiBlbnRlcmVkLiBXcmFwLXVwIG9mIGlucHV0CisgICogICAgICAgICBidWZmZXJzIGZlZWRpbmcgYW5kIHJldHJpZXZhbCBvZiBkaWdlc3QgaXMgZG9uZSBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmRfSVQoKS4KKyAgKiBAbm90ZSAgIEZpZWxkIGhoYXNoLT5QaGFzZSBvZiBIQVNIIGhhbmRsZSBpcyB0ZXN0ZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIHRoZSBQZXJpcGhlcmFsIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQorICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLiBPbmx5IEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmRfSVQoKSBpcyBhYmxlCisgICogICAgICAgICB0byBtYW5hZ2UgdGhlIGVuZGluZyBidWZmZXIgd2l0aCBhIGxlbmd0aCBpbiBieXRlcyBub3QgYSBtdWx0aXBsZSBvZiA0LgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK3sKKyAgcmV0dXJuICBIQVNIX0FjY3VtdWxhdGVfSVQoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSxIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjI0KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmQgY29tcHV0YXRpb24gb2YgYSBzaW5nbGUgSEFTSCBzaWduYXR1cmUgYWZ0ZXIgc2V2ZXJhbCBjYWxscyB0byBIQUxfSEFTSEV4X1NIQTIyNF9BY2NtbHRfSVQoKSBBUEkuCisgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAyOCBieXRlcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjI0X0FjY21sdF9FbmRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKQoreworICByZXR1cm4gSEFTSF9TdGFydF9JVChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyMjQpOworfQorCisvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBTSEEyNTYgbW9kZSwgbmV4dCBwcm9jZXNzIHBJbkJ1ZmZlciB0aGVuCiAgICogICAgICAgICByZWFkIHRoZSBjb21wdXRlZCBkaWdlc3QgaW4gaW50ZXJydXB0aW9uIG1vZGUuCiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMzIgYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjU2X1N0YXJ0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlcikKQEAgLTI2Niw2ICszNDMsNDMgQEAKIH0KIAogLyoqCisgICogQGJyaWVmICBJZiBub3QgYWxyZWFkeSBkb25lLCBpbml0aWFsaXplIHRoZSBIQVNIIHBlcmlwaGVyYWwgaW4gU0hBMjU2IG1vZGUgdGhlbgorICAqICAgICAgICAgcHJvY2Vzc2VzIHBJbkJ1ZmZlciBpbiBpbnRlcnJ1cHRpb24gbW9kZS4KKyAgKiBAbm90ZSAgIENvbnNlY3V0aXZlIGNhbGxzIHRvIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9JVCgpIGNhbiBiZSB1c2VkIHRvIGZlZWQKKyAgKiAgICAgICAgIHNldmVyYWwgaW5wdXQgYnVmZmVycyBiYWNrLXRvLWJhY2sgdG8gdGhlIFBlcmlwaGVyYWwgdGhhdCB3aWxsIHlpZWxkIGEgc2luZ2xlCisgICogICAgICAgICBIQVNIIHNpZ25hdHVyZSBvbmNlIGFsbCBidWZmZXJzIGhhdmUgYmVlbiBlbnRlcmVkLiBXcmFwLXVwIG9mIGlucHV0CisgICogICAgICAgICBidWZmZXJzIGZlZWRpbmcgYW5kIHJldHJpZXZhbCBvZiBkaWdlc3QgaXMgZG9uZSBieSBhIGNhbGwgdG8KKyAgKiAgICAgICAgIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmRfSVQoKS4KKyAgKiBAbm90ZSAgIEZpZWxkIGhoYXNoLT5QaGFzZSBvZiBIQVNIIGhhbmRsZSBpcyB0ZXN0ZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiAgICAgICAgIHRoZSBQZXJpcGhlcmFsIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQorICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLiBPbmx5IEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmRfSVQoKSBpcyBhYmxlCisgICogICAgICAgICB0byBtYW5hZ2UgdGhlIGVuZGluZyBidWZmZXIgd2l0aCBhIGxlbmd0aCBpbiBieXRlcyBub3QgYSBtdWx0aXBsZSBvZiA0LgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfQWNjbWx0X0lUKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKK3sKKyAgcmV0dXJuICBIQVNIX0FjY3VtdWxhdGVfSVQoaGhhc2gsIHBJbkJ1ZmZlciwgU2l6ZSxIQVNIX0FMR09TRUxFQ1RJT05fU0hBMjU2KTsKK30KKworLyoqCisgICogQGJyaWVmICBFbmQgY29tcHV0YXRpb24gb2YgYSBzaW5nbGUgSEFTSCBzaWduYXR1cmUgYWZ0ZXIgc2V2ZXJhbCBjYWxscyB0byBIQUxfSEFTSEV4X1NIQTI1Nl9BY2NtbHRfSVQoKSBBUEkuCisgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KKyAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKi8KK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjU2X0FjY21sdF9FbmRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKQoreworICByZXR1cm4gSEFTSF9TdGFydF9JVChoaGFzaCwgcEluQnVmZmVyLCBTaXplLCBwT3V0QnVmZmVyLEhBU0hfQUxHT1NFTEVDVElPTl9TSEEyNTYpOworfQorCisvKioKICAgKiBAfQogICAqLwogCkBAIC0yODUsNyArMzk5LDcgQEAKICAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyNTZfU3RhcnRfRE1BKCkKICAgICAgICAgICgrKykgSEFMX0hBU0hFeF9TSEEyNTZfRmluaXNoKCkKIAotICAgIFsuLl0gIFdoZW4gcmVzb3J0aW5nIHRvIERNQSBtb2RlIHRvIGVudGVyIHRoZSBkYXRhIGluIHRoZSBJUCwgdXNlciBtdXN0IHJlc29ydAorICAgIFsuLl0gIFdoZW4gcmVzb3J0aW5nIHRvIERNQSBtb2RlIHRvIGVudGVyIHRoZSBkYXRhIGluIHRoZSBQZXJpcGhlcmFsLCB1c2VyIG11c3QgcmVzb3J0CiAgICAgICAgICAgdG8gIEhBTF9IQVNIRXhfeHh4X1N0YXJ0X0RNQSgpIHRoZW4gcmVhZCB0aGUgcmVzdWx0aW5nIGRpZ2VzdCB3aXRoCiAgICAgICAgICAgSEFMX0hBU0hFeF94eHhfRmluaXNoKCkuCiAKQEAgLTMwMywxMiArNDE3LDEyIEBACiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgSEFTSCBwZXJpcGhlcmFsIGluIFNIQTIyNCBtb2RlIHRoZW4gaW5pdGlhdGUgYSBETUEgdHJhbnNmZXIKLSAgKiAgICAgICAgIHRvIGZlZWQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICB0byBmZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIFBlcmlwaGVyYWwuCiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXIgaXMgZmluaXNoZWQsIEhBTF9IQVNIRXhfU0hBMjI0X0ZpbmlzaCgpIEFQSSBtdXN0CiAgICogICAgICAgICBiZSBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSEFTSEV4X1NIQTIyNF9TdGFydF9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtMzIxLDkgKzQzNSw5IEBACiAgICogQG5vdGUgICBUaGUgQVBJIHdhaXRzIGZvciBEQ0lTIHRvIGJlIHNldCB0aGVuIHJlYWRzIHRoZSBjb21wdXRlZCBkaWdlc3QuCiAgICogQG5vdGUgICBIQUxfSEFTSEV4X1NIQTIyNF9GaW5pc2goKSBjYW4gYmUgdXNlZCBhcyB3ZWxsIHRvIHJldHJpZXZlIHRoZSBkaWdlc3QgaW4KICAgKiAgICAgICAgIEhNQUMgU0hBMjI0IG1vZGUuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDI4IGJ5dGVzLgotICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCB2YWx1ZS4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDI4IGJ5dGVzLgorICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IHZhbHVlLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyMjRfRmluaXNoKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCkBAIC0zMzMsMTIgKzQ0NywxMiBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBTSEEyNTYgbW9kZSB0aGVuIGluaXRpYXRlIGEgRE1BIHRyYW5zZmVyCi0gICogICAgICAgICB0byBmZWVkIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIElQLgorICAqICAgICAgICAgdG8gZmVlZCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgT25jZSB0aGUgRE1BIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCBIQUxfSEFTSEV4X1NIQTI1Nl9GaW5pc2goKSBBUEkgbXVzdAogICAqICAgICAgICAgYmUgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hBU0hFeF9TSEEyNTZfU3RhcnRfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTM1MSw5ICs0NjUsOSBAQAogICAqIEBub3RlICAgVGhlIEFQSSB3YWl0cyBmb3IgRENJUyB0byBiZSBzZXQgdGhlbiByZWFkcyB0aGUgY29tcHV0ZWQgZGlnZXN0LgogICAqIEBub3RlICAgSEFMX0hBU0hFeF9TSEEyNTZfRmluaXNoKCkgY2FuIGJlIHVzZWQgYXMgd2VsbCB0byByZXRyaWV2ZSB0aGUgZGlnZXN0IGluCiAgICogICAgICAgICBITUFDIFNIQTI1NiBtb2RlLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9IQVNIRXhfU0hBMjU2X0ZpbmlzaChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90KiBwT3V0QnVmZmVyLCB1aW50MzJfdCBUaW1lb3V0KQpAQCAtMzkxLDExICs1MDUsMTEgQEAKICAgKiBAbm90ZSAgIERpZ2VzdCBpcyBhdmFpbGFibGUgaW4gcE91dEJ1ZmZlci4KICAgKiBAbm90ZSAgIFNhbWUga2V5IGlzIHVzZWQgZm9yIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGhhc2ggZnVuY3Rpb25zOyBwb2ludGVyIHRvIGtleSBhbmQKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KLSAgKiBAcGFyYW0gIHBPdXRCdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjggYnl0ZXMuCi0gICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IHZhbHVlLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjggYnl0ZXMuCisgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgdmFsdWUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTIyNF9TdGFydChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIsIHVpbnQzMl90IFRpbWVvdXQpCkBAIC00MDksMTEgKzUyMywxMSBAQAogICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgogICAqIEBub3RlICAgU2FtZSBrZXkgaXMgdXNlZCBmb3IgdGhlIGlubmVyIGFuZCB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbnM7IHBvaW50ZXIgdG8ga2V5IGFuZAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KLSAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgdmFsdWUuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIHBPdXRCdWZmZXIgcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCB2YWx1ZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ITUFDRXhfU0hBMjU2X1N0YXJ0KEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSwgdWludDhfdCogcE91dEJ1ZmZlciwgdWludDMyX3QgVGltZW91dCkKQEAgLTQ1MiwxMCArNTY2LDEwIEBACiAgICogQG5vdGUgICBEaWdlc3QgaXMgYXZhaWxhYmxlIGluIHBPdXRCdWZmZXIuCiAgICogQG5vdGUgICBTYW1lIGtleSBpcyB1c2VkIGZvciB0aGUgaW5uZXIgYW5kIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uczsgcG9pbnRlciB0byBrZXkgYW5kCiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKGJ1ZmZlciB0byBiZSBoYXNoZWQpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCi0gICogQHBhcmFtICBwT3V0QnVmZmVyOiBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDI4IGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBwT3V0QnVmZmVyIHBvaW50ZXIgdG8gdGhlIGNvbXB1dGVkIGRpZ2VzdC4gRGlnZXN0IHNpemUgaXMgMjggYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTIyNF9TdGFydF9JVChIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUsIHVpbnQ4X3QqIHBPdXRCdWZmZXIpCkBAIC00NjksMTAgKzU4MywxMCBAQAogICAqIEBub3RlICAgRGlnZXN0IGlzIGF2YWlsYWJsZSBpbiBwT3V0QnVmZmVyLgogICAqIEBub3RlICAgU2FtZSBrZXkgaXMgdXNlZCBmb3IgdGhlIGlubmVyIGFuZCB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbnM7IHBvaW50ZXIgdG8ga2V5IGFuZAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChidWZmZXIgdG8gYmUgaGFzaGVkKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgotICAqIEBwYXJhbSAgcE91dEJ1ZmZlcjogcG9pbnRlciB0byB0aGUgY29tcHV0ZWQgZGlnZXN0LiBEaWdlc3Qgc2l6ZSBpcyAzMiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgcE91dEJ1ZmZlciBwb2ludGVyIHRvIHRoZSBjb21wdXRlZCBkaWdlc3QuIERpZ2VzdCBzaXplIGlzIDMyIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9TSEEyNTZfU3RhcnRfSVQoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplLCB1aW50OF90KiBwT3V0QnVmZmVyKQpAQCAtNTAyLDcgKzYxNiw3IEBACiAgICAgICAoKykgU0hBMjU2CiAgICAgICAgICAoKyspIEhBTF9ITUFDRXhfU0hBMjU2X1N0YXJ0X0RNQSgpCiAKLSAgICBbLi5dICBXaGVuIHJlc29ydGluZyB0byBETUEgbW9kZSB0byBlbnRlciB0aGUgZGF0YSBpbiB0aGUgSVAgZm9yIEhNQUMgcHJvY2Vzc2luZywKKyAgICBbLi5dICBXaGVuIHJlc29ydGluZyB0byBETUEgbW9kZSB0byBlbnRlciB0aGUgZGF0YSBpbiB0aGUgUGVyaXBoZXJhbCBmb3IgSE1BQyBwcm9jZXNzaW5nLAogICAgICAgICAgIHVzZXIgbXVzdCByZXNvcnQgdG8gIEhBTF9ITUFDRXhfeHh4X1N0YXJ0X0RNQSgpIHRoZW4gcmVhZCB0aGUgcmVzdWx0aW5nIGRpZ2VzdAogICAgICAgICAgIHdpdGggSEFMX0hBU0hFeF94eHhfRmluaXNoKCkuCiAKQEAgLTUxNSw3ICs2MjksNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBITUFDIFNIQTIyNCBtb2RlIHRoZW4gaW5pdGlhdGUgdGhlIHJlcXVpcmVkCi0gICogICAgICAgICBETUEgdHJhbnNmZXJzIHRvIGZlZWQgdGhlIGtleSBhbmQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICBETUEgdHJhbnNmZXJzIHRvIGZlZWQgdGhlIGtleSBhbmQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIE9uY2UgdGhlIERNQSB0cmFuc2ZlcnMgYXJlIGZpbmlzaGVkIChpbmRpY2F0ZWQgYnkgaGhhc2gtPlN0YXRlIHNldCBiYWNrCiAgICogICAgICAgICB0byBIQUxfSEFTSF9TVEFURV9SRUFEWSksIEhBTF9IQVNIRXhfU0hBMjI0X0ZpbmlzaCgpIEFQSSBtdXN0IGJlIGNhbGxlZCB0byByZXRyaWV2ZQogICAqICAgICAgICAgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KQEAgLTUyNyw5ICs2NDEsOSBAQAogICAqICAgICAgICAgIEZvciB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIHRocmVhZCwgTURNQVQgYml0IG11c3QKICAgKiAgICAgICAgICBiZSByZXNldCBhbmQgdGhlIGJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzKSBkb2Vzbid0IGhhdmUgdG8gYmUgYQogICAqICAgICAgICAgIG11bHRpcGxlIG9mIDQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9TSEEyMjRfU3RhcnRfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTUzOSw3ICs2NTMsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIEhBU0ggcGVyaXBoZXJhbCBpbiBITUFDIFNIQTIyNCBtb2RlIHRoZW4gaW5pdGlhdGUgdGhlIHJlcXVpcmVkCi0gICogICAgICAgICBETUEgdHJhbnNmZXJzIHRvIGZlZWQgdGhlIGtleSBhbmQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgSVAuCisgICogICAgICAgICBETUEgdHJhbnNmZXJzIHRvIGZlZWQgdGhlIGtleSBhbmQgdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIE9uY2UgdGhlIERNQSB0cmFuc2ZlcnMgYXJlIGZpbmlzaGVkIChpbmRpY2F0ZWQgYnkgaGhhc2gtPlN0YXRlIHNldCBiYWNrCiAgICogICAgICAgICB0byBIQUxfSEFTSF9TVEFURV9SRUFEWSksIEhBTF9IQVNIRXhfU0hBMjU2X0ZpbmlzaCgpIEFQSSBtdXN0IGJlIGNhbGxlZCB0byByZXRyaWV2ZQogICAqICAgICAgICAgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KQEAgLTU1MSw5ICs2NjUsOSBAQAogICAqICAgICAgICAgIEZvciB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbGFzdCBidWZmZXIgb2YgdGhlIHRocmVhZCwgTURNQVQgYml0IG11c3QKICAgKiAgICAgICAgICBiZSByZXNldCBhbmQgdGhlIGJ1ZmZlciBsZW5ndGggKGluIGJ5dGVzKSBkb2Vzbid0IGhhdmUgdG8gYmUgYQogICAqICAgICAgICAgIG11bHRpcGxlIG9mIDQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAoYnVmZmVyIHRvIGJlIGhhc2hlZCkuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9TSEEyNTZfU3RhcnRfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTU5NywxMyArNzExLDEzIEBACiAgICAgICAgICAgY2FsbGluZyBIQUxfSE1BQ0V4X3h4eF9TdGVwMV8yX0RNQSgpLiBUaGlzIGNhcnJpZXMgb3V0IEhNQUMgc3RlcCAxIGFuZAogICAgICAgICAgIGludGlhdGVzIHN0ZXAgMiB3aXRoIHRoZSBmaXJzdCBpbnB1dCBidWZmZXIuCiAKLSAgICBbLi5dICBUaGUgZm9sbG93aW5nIGJ1ZmZlcnMgYXJlIG5leHQgZmVkIHRvIHRoZSBJUCB3aXRoIGEgY2FsbCB0byB0aGUgQVBJCisgICAgWy4uXSAgVGhlIGZvbGxvd2luZyBidWZmZXJzIGFyZSBuZXh0IGZlZCB0byB0aGUgUGVyaXBoZXJhbCB3aXRoIGEgY2FsbCB0byB0aGUgQVBJCiAgICAgICAgICAgSEFMX0hNQUNFeF94eHhfU3RlcDJfRE1BKCkuIFRoZXJlIG1heSBiZSBzZXZlcmFsIGNvbnNlY3V0aXZlIGNhbGxzCiAgICAgICAgICAgdG8gdGhpcyBBUEkuCiAKICAgICBbLi5dICBNdWx0aS1idWZmZXIgRE1BLWJhc2VkIEhNQUMgY29tcHV0YXRpb24gaXMgd3JhcHBlZCB1cCBieSBhIGNhbGwgdG8KICAgICAgICAgICBIQUxfSE1BQ0V4X3h4eF9TdGVwMl8zX0RNQSgpLiBUaGlzIGZpbmlzaGVzIHN0ZXAgMiBpbiBmZWVkaW5nIHRoZSBsYXN0IGlucHV0Ci0gICAgICAgICAgYnVmZmVyIHRvIHRoZSBJUCB0aGVuIGNhcnJpZXMgb3V0IHN0ZXAgMy4KKyAgICAgICAgICBidWZmZXIgdG8gdGhlIFBlcmlwaGVyYWwgdGhlbiBjYXJyaWVzIG91dCBzdGVwIDMuCiAKICAgICBbLi5dICBEaWdlc3QgaXMgcmV0cmlldmVkIGJ5IGEgY2FsbCB0byBIQUxfSEFTSF94eHhfRmluaXNoKCkgZm9yIE1ELTUgb3IKICAgICAgICAgICBTSEEtMSwgdG8gSEFMX0hBU0hFeF94eHhfRmluaXNoKCkgZm9yIFNIQS0yMjQgb3IgU0hBLTI1Ni4KQEAgLTYxOCwxOCArNzMyLDE4IEBACiAKIC8qKgogICAqIEBicmllZiAgTUQ1IEhNQUMgc3RlcCAxIGNvbXBsZXRpb24gYW5kIHN0ZXAgMiBzdGFydCBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDEgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgaW5uZXIgaGFzaCBmdW5jdGlvbiBrZXkgaW4gdGhlIElQLAorICAqIEBub3RlICAgU3RlcCAxIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIGlubmVyIGhhc2ggZnVuY3Rpb24ga2V5IGluIHRoZSBQZXJpcGhlcmFsLAogICAqICAgICAgICAgc3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dC4KICAgKiBAbm90ZSAgIFRoZSBBUEkgY2FycmllcyBvdXQgdGhlIEhNQUMgc3RlcCAxIHRoZW4gc3RhcnRzIHN0ZXAgMiB3aXRoCi0gICogICAgICAgICB0aGUgZmlyc3QgYnVmZmVyIGVudGVyZWQgdG8gdGhlIElQLiBEQ0FMIGJpdCBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIKKyAgKiAgICAgICAgIHRoZSBmaXJzdCBidWZmZXIgZW50ZXJlZCB0byB0aGUgUGVyaXBoZXJhbC4gRENBTCBiaXQgaXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IGFmdGVyCiAgICogICAgICAgICB0aGUgbWVzc2FnZSBidWZmZXIgZmVlZGluZywgYWxsb3dpbmcgb3RoZXIgbWVzc2FnZXMgRE1BIHRyYW5zZmVycyB0byBvY2N1ci4KICAgKiBAbm90ZSAgIFNhbWUga2V5IGlzIHVzZWQgZm9yIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGhhc2ggZnVuY3Rpb25zOyBwb2ludGVyIHRvIGtleSBhbmQKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCiAgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQogICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9NRDVfU3RlcDFfMl9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtNjQwLDcgKzc1NCw3IEBACiAKIC8qKgogICAqIEBicmllZiAgTUQ1IEhNQUMgc3RlcCAyIGluIG11bHRpLWJ1ZmZlciBETUEgbW9kZS4KLSAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIElQLgorICAqIEBub3RlICAgU3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dCBpbiB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIFRoZSBBUEkgY2FycmllcyBvbiB0aGUgSE1BQyBzdGVwIDIsIGFwcGxpZWQgdG8gdGhlIGJ1ZmZlciBlbnRlcmVkIGFzIGlucHV0CiAgICogICAgICAgICBwYXJhbWV0ZXIuIERDQUwgYml0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhZnRlciB0aGUgbWVzc2FnZSBidWZmZXIgZmVlZGluZywKICAgKiAgICAgICAgIGFsbG93aW5nIG90aGVyIG1lc3NhZ2VzIERNQSB0cmFuc2ZlcnMgdG8gb2NjdXIuCkBAIC02NDgsOSArNzYyLDkgQEAKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCiAgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQogICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9NRDVfU3RlcDJfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTY2NCw3ICs3NzgsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIE1ENSBITUFDIHN0ZXAgMiB3cmFwLXVwIGFuZCBzdGVwIDMgY29tcGxldGlvbiBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBJUCwKKyAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIFBlcmlwaGVyYWwsCiAgICogICAgICAgICBzdGVwIDMgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbiBrZXkuCiAgICogQG5vdGUgICBUaGUgQVBJIHdyYXBzIHVwIHRoZSBITUFDIHN0ZXAgMiBpbiBwcm9jZXNzaW5nIHRoZSBidWZmZXIgZW50ZXJlZCBhcyBpbnB1dAogICAqICAgICAgICAgcGFyYW1ldGVyICh0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgdGhlIGxhc3Qgb25lIG9mIHRoZSBtdWx0aS1idWZmZXIgdGhyZWFkKQpAQCAtNjc0LDkgKzc4OCw5IEBACiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXJzIGFyZSBmaW5pc2hlZCAoaW5kaWNhdGVkIGJ5IGhoYXNoLT5TdGF0ZSBzZXQgYmFjawogICAqICAgICAgICAgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkpLCBIQUxfSEFTSEV4X1NIQTI1Nl9GaW5pc2goKSBBUEkgbXVzdCBiZSBjYWxsZWQgdG8gcmV0cmlldmUKICAgKiAgICAgICAgIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X01ENV9TdGVwMl8zX0RNQShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpCkBAIC02ODgsMTggKzgwMiwxOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNIQTEgSE1BQyBzdGVwIDEgY29tcGxldGlvbiBhbmQgc3RlcCAyIHN0YXJ0IGluIG11bHRpLWJ1ZmZlciBETUEgbW9kZS4KLSAgKiBAbm90ZSAgIFN0ZXAgMSBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBpbm5lciBoYXNoIGZ1bmN0aW9uIGtleSBpbiB0aGUgSVAsCisgICogQG5vdGUgICBTdGVwIDEgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgaW5uZXIgaGFzaCBmdW5jdGlvbiBrZXkgaW4gdGhlIFBlcmlwaGVyYWwsCiAgICogICAgICAgICBzdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0LgogICAqIEBub3RlICAgVGhlIEFQSSBjYXJyaWVzIG91dCB0aGUgSE1BQyBzdGVwIDEgdGhlbiBzdGFydHMgc3RlcCAyIHdpdGgKLSAgKiAgICAgICAgIHRoZSBmaXJzdCBidWZmZXIgZW50ZXJlZCB0byB0aGUgSVAuIERDQUwgYml0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhZnRlcgorICAqICAgICAgICAgdGhlIGZpcnN0IGJ1ZmZlciBlbnRlcmVkIHRvIHRoZSBQZXJpcGhlcmFsLiBEQ0FMIGJpdCBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIKICAgKiAgICAgICAgIHRoZSBtZXNzYWdlIGJ1ZmZlciBmZWVkaW5nLCBhbGxvd2luZyBvdGhlciBtZXNzYWdlcyBETUEgdHJhbnNmZXJzIHRvIG9jY3VyLgogICAqIEBub3RlICAgU2FtZSBrZXkgaXMgdXNlZCBmb3IgdGhlIGlubmVyIGFuZCB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbnM7IHBvaW50ZXIgdG8ga2V5IGFuZAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCiAgICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTFfU3RlcDFfMl9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtNzEwLDcgKzgyNCw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU0hBMSBITUFDIHN0ZXAgMiBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBJUC4KKyAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIFBlcmlwaGVyYWwuCiAgICogQG5vdGUgICBUaGUgQVBJIGNhcnJpZXMgb24gdGhlIEhNQUMgc3RlcCAyLCBhcHBsaWVkIHRvIHRoZSBidWZmZXIgZW50ZXJlZCBhcyBpbnB1dAogICAqICAgICAgICAgcGFyYW1ldGVyLiBEQ0FMIGJpdCBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIgdGhlIG1lc3NhZ2UgYnVmZmVyIGZlZWRpbmcsCiAgICogICAgICAgICBhbGxvd2luZyBvdGhlciBtZXNzYWdlcyBETUEgdHJhbnNmZXJzIHRvIG9jY3VyLgpAQCAtNzE4LDkgKzgzMiw5IEBACiAgICogICAgICAgICBrZXkgc2l6ZSBhcmUgcmVzcGVjdGl2ZWx5IHN0b3JlZCBpbiBoaGFzaC0+SW5pdC5wS2V5IGFuZCBoaGFzaC0+SW5pdC5LZXlTaXplLgogICAqIEBub3RlICAgVGhlIGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgb3RoZXJ3aXNlLCB0aGUKICAgKiAgICAgICAgIEhBU0ggZGlnZXN0IGNvbXB1dGF0aW9uIGlzIGNvcnJ1cHRlZC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ITUFDRXhfU0hBMV9TdGVwMl9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtNzM0LDcgKzg0OCw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU0hBMSBITUFDIHN0ZXAgMiB3cmFwLXVwIGFuZCBzdGVwIDMgY29tcGxldGlvbiBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBJUCwKKyAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIFBlcmlwaGVyYWwsCiAgICogICAgICAgICBzdGVwIDMgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbiBrZXkuCiAgICogQG5vdGUgICBUaGUgQVBJIHdyYXBzIHVwIHRoZSBITUFDIHN0ZXAgMiBpbiBwcm9jZXNzaW5nIHRoZSBidWZmZXIgZW50ZXJlZCBhcyBpbnB1dAogICAqICAgICAgICAgcGFyYW1ldGVyICh0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgdGhlIGxhc3Qgb25lIG9mIHRoZSBtdWx0aS1idWZmZXIgdGhyZWFkKQpAQCAtNzQ0LDkgKzg1OCw5IEBACiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXJzIGFyZSBmaW5pc2hlZCAoaW5kaWNhdGVkIGJ5IGhoYXNoLT5TdGF0ZSBzZXQgYmFjawogICAqICAgICAgICAgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkpLCBIQUxfSEFTSEV4X1NIQTI1Nl9GaW5pc2goKSBBUEkgbXVzdCBiZSBjYWxsZWQgdG8gcmV0cmlldmUKICAgKiAgICAgICAgIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTFfU3RlcDJfM19ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtNzU3LDE4ICs4NzEsMTggQEAKIAogLyoqCiAgICogQGJyaWVmICBTSEEyMjQgSE1BQyBzdGVwIDEgY29tcGxldGlvbiBhbmQgc3RlcCAyIHN0YXJ0IGluIG11bHRpLWJ1ZmZlciBETUEgbW9kZS4KLSAgKiBAbm90ZSAgIFN0ZXAgMSBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBpbm5lciBoYXNoIGZ1bmN0aW9uIGtleSBpbiB0aGUgSVAsCisgICogQG5vdGUgICBTdGVwIDEgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgaW5uZXIgaGFzaCBmdW5jdGlvbiBrZXkgaW4gdGhlIFBlcmlwaGVyYWwsCiAgICogICAgICAgICBzdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0LgogICAqIEBub3RlICAgVGhlIEFQSSBjYXJyaWVzIG91dCB0aGUgSE1BQyBzdGVwIDEgdGhlbiBzdGFydHMgc3RlcCAyIHdpdGgKLSAgKiAgICAgICAgIHRoZSBmaXJzdCBidWZmZXIgZW50ZXJlZCB0byB0aGUgSVAuIERDQUwgYml0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhZnRlcgorICAqICAgICAgICAgdGhlIGZpcnN0IGJ1ZmZlciBlbnRlcmVkIHRvIHRoZSBQZXJpcGhlcmFsLiBEQ0FMIGJpdCBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIKICAgKiAgICAgICAgIHRoZSBtZXNzYWdlIGJ1ZmZlciBmZWVkaW5nLCBhbGxvd2luZyBvdGhlciBtZXNzYWdlcyBETUEgdHJhbnNmZXJzIHRvIG9jY3VyLgogICAqIEBub3RlICAgU2FtZSBrZXkgaXMgdXNlZCBmb3IgdGhlIGlubmVyIGFuZCB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbnM7IHBvaW50ZXIgdG8ga2V5IGFuZAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCiAgICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTIyNF9TdGVwMV8yX0RNQShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpCkBAIC03NzksNyArODkzLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBTSEEyMjQgSE1BQyBzdGVwIDIgaW4gbXVsdGktYnVmZmVyIERNQSBtb2RlLgotICAqIEBub3RlICAgU3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dCBpbiB0aGUgSVAuCisgICogQG5vdGUgICBTdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBQZXJpcGhlcmFsLgogICAqIEBub3RlICAgVGhlIEFQSSBjYXJyaWVzIG9uIHRoZSBITUFDIHN0ZXAgMiwgYXBwbGllZCB0byB0aGUgYnVmZmVyIGVudGVyZWQgYXMgaW5wdXQKICAgKiAgICAgICAgIHBhcmFtZXRlci4gRENBTCBiaXQgaXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IGFmdGVyIHRoZSBtZXNzYWdlIGJ1ZmZlciBmZWVkaW5nLAogICAqICAgICAgICAgYWxsb3dpbmcgb3RoZXIgbWVzc2FnZXMgRE1BIHRyYW5zZmVycyB0byBvY2N1ci4KQEAgLTc4Nyw5ICs5MDEsOSBAQAogICAqICAgICAgICAga2V5IHNpemUgYXJlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4gaGhhc2gtPkluaXQucEtleSBhbmQgaGhhc2gtPkluaXQuS2V5U2l6ZS4KICAgKiBAbm90ZSAgIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IG90aGVyd2lzZSwgdGhlCiAgICogICAgICAgICBIQVNIIGRpZ2VzdCBjb21wdXRhdGlvbiBpcyBjb3JydXB0ZWQuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTIyNF9TdGVwMl9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtODAzLDcgKzkxNyw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU0hBMjI0IEhNQUMgc3RlcCAyIHdyYXAtdXAgYW5kIHN0ZXAgMyBjb21wbGV0aW9uIGluIG11bHRpLWJ1ZmZlciBETUEgbW9kZS4KLSAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIElQLAorICAqIEBub3RlICAgU3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dCBpbiB0aGUgUGVyaXBoZXJhbCwKICAgKiAgICAgICAgIHN0ZXAgMyBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBvdXRlciBoYXNoIGZ1bmN0aW9uIGtleS4KICAgKiBAbm90ZSAgIFRoZSBBUEkgd3JhcHMgdXAgdGhlIEhNQUMgc3RlcCAyIGluIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciBlbnRlcmVkIGFzIGlucHV0CiAgICogICAgICAgICBwYXJhbWV0ZXIgKHRoZSBpbnB1dCBidWZmZXIgbXVzdCBiZSB0aGUgbGFzdCBvbmUgb2YgdGhlIG11bHRpLWJ1ZmZlciB0aHJlYWQpCkBAIC04MTMsOSArOTI3LDkgQEAKICAgKiBAbm90ZSAgIE9uY2UgdGhlIERNQSB0cmFuc2ZlcnMgYXJlIGZpbmlzaGVkIChpbmRpY2F0ZWQgYnkgaGhhc2gtPlN0YXRlIHNldCBiYWNrCiAgICogICAgICAgICB0byBIQUxfSEFTSF9TVEFURV9SRUFEWSksIEhBTF9IQVNIRXhfU0hBMjU2X0ZpbmlzaCgpIEFQSSBtdXN0IGJlIGNhbGxlZCB0byByZXRyaWV2ZQogICAqICAgICAgICAgdGhlIGNvbXB1dGVkIGRpZ2VzdC4KLSAgKiBAcGFyYW0gIGhoYXNoOiBIQVNIIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBJbkJ1ZmZlcjogcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCi0gICogQHBhcmFtICBTaXplOiBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KKyAgKiBAcGFyYW0gIGhoYXNoIEhBU0ggaGFuZGxlLgorICAqIEBwYXJhbSAgcEluQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgorICAqIEBwYXJhbSAgU2l6ZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBieXRlcy4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ITUFDRXhfU0hBMjI0X1N0ZXAyXzNfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTgyNiwxOCArOTQwLDE4IEBACiAKIC8qKgogICAqIEBicmllZiAgU0hBMjU2IEhNQUMgc3RlcCAxIGNvbXBsZXRpb24gYW5kIHN0ZXAgMiBzdGFydCBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDEgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgaW5uZXIgaGFzaCBmdW5jdGlvbiBrZXkgaW4gdGhlIElQLAorICAqIEBub3RlICAgU3RlcCAxIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIGlubmVyIGhhc2ggZnVuY3Rpb24ga2V5IGluIHRoZSBQZXJpcGhlcmFsLAogICAqICAgICAgICAgc3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dC4KICAgKiBAbm90ZSAgIFRoZSBBUEkgY2FycmllcyBvdXQgdGhlIEhNQUMgc3RlcCAxIHRoZW4gc3RhcnRzIHN0ZXAgMiB3aXRoCi0gICogICAgICAgICB0aGUgZmlyc3QgYnVmZmVyIGVudGVyZWQgdG8gdGhlIElQLiBEQ0FMIGJpdCBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYWZ0ZXIKKyAgKiAgICAgICAgIHRoZSBmaXJzdCBidWZmZXIgZW50ZXJlZCB0byB0aGUgUGVyaXBoZXJhbC4gRENBTCBiaXQgaXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IGFmdGVyCiAgICogICAgICAgICB0aGUgbWVzc2FnZSBidWZmZXIgZmVlZGluZywgYWxsb3dpbmcgb3RoZXIgbWVzc2FnZXMgRE1BIHRyYW5zZmVycyB0byBvY2N1ci4KICAgKiBAbm90ZSAgIFNhbWUga2V5IGlzIHVzZWQgZm9yIHRoZSBpbm5lciBhbmQgdGhlIG91dGVyIGhhc2ggZnVuY3Rpb25zOyBwb2ludGVyIHRvIGtleSBhbmQKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCiAgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQogICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9TSEEyNTZfU3RlcDFfMl9ETUEoSEFTSF9IYW5kbGVUeXBlRGVmICpoaGFzaCwgdWludDhfdCAqcEluQnVmZmVyLCB1aW50MzJfdCBTaXplKQpAQCAtODQ4LDcgKzk2Miw3IEBACiAKIC8qKgogICAqIEBicmllZiAgU0hBMjU2IEhNQUMgc3RlcCAyIGluIG11bHRpLWJ1ZmZlciBETUEgbW9kZS4KLSAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIElQLgorICAqIEBub3RlICAgU3RlcCAyIGNvbnNpc3RzIGluIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGV4dCBpbiB0aGUgUGVyaXBoZXJhbC4KICAgKiBAbm90ZSAgIFRoZSBBUEkgY2FycmllcyBvbiB0aGUgSE1BQyBzdGVwIDIsIGFwcGxpZWQgdG8gdGhlIGJ1ZmZlciBlbnRlcmVkIGFzIGlucHV0CiAgICogICAgICAgICBwYXJhbWV0ZXIuIERDQUwgYml0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHNldCBhZnRlciB0aGUgbWVzc2FnZSBidWZmZXIgZmVlZGluZywKICAgKiAgICAgICAgIGFsbG93aW5nIG90aGVyIG1lc3NhZ2VzIERNQSB0cmFuc2ZlcnMgdG8gb2NjdXIuCkBAIC04NTYsOSArOTcwLDkgQEAKICAgKiAgICAgICAgIGtleSBzaXplIGFyZSByZXNwZWN0aXZlbHkgc3RvcmVkIGluIGhoYXNoLT5Jbml0LnBLZXkgYW5kIGhoYXNoLT5Jbml0LktleVNpemUuCiAgICogQG5vdGUgICBUaGUgaW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBvdGhlcndpc2UsIHRoZQogICAqICAgICAgICAgSEFTSCBkaWdlc3QgY29tcHV0YXRpb24gaXMgY29ycnVwdGVkLgotICAqIEBwYXJhbSAgaGhhc2g6IEhBU0ggaGFuZGxlLgotICAqIEBwYXJhbSAgcEluQnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KLSAgKiBAcGFyYW0gIFNpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICAqIEBwYXJhbSAgaGhhc2ggSEFTSCBoYW5kbGUuCisgICogQHBhcmFtICBwSW5CdWZmZXIgcG9pbnRlciB0byB0aGUgaW5wdXQgYnVmZmVyIChtZXNzYWdlIGJ1ZmZlcikuCisgICogQHBhcmFtICBTaXplIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hNQUNFeF9TSEEyNTZfU3RlcDJfRE1BKEhBU0hfSGFuZGxlVHlwZURlZiAqaGhhc2gsIHVpbnQ4X3QgKnBJbkJ1ZmZlciwgdWludDMyX3QgU2l6ZSkKQEAgLTg3Miw3ICs5ODYsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNIQTI1NiBITUFDIHN0ZXAgMiB3cmFwLXVwIGFuZCBzdGVwIDMgY29tcGxldGlvbiBpbiBtdWx0aS1idWZmZXIgRE1BIG1vZGUuCi0gICogQG5vdGUgICBTdGVwIDIgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgbWVzc2FnZSB0ZXh0IGluIHRoZSBJUCwKKyAgKiBAbm90ZSAgIFN0ZXAgMiBjb25zaXN0cyBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHRleHQgaW4gdGhlIFBlcmlwaGVyYWwsCiAgICogICAgICAgICBzdGVwIDMgY29uc2lzdHMgaW4gd3JpdGluZyB0aGUgb3V0ZXIgaGFzaCBmdW5jdGlvbiBrZXkuCiAgICogQG5vdGUgICBUaGUgQVBJIHdyYXBzIHVwIHRoZSBITUFDIHN0ZXAgMiBpbiBwcm9jZXNzaW5nIHRoZSBidWZmZXIgZW50ZXJlZCBhcyBpbnB1dAogICAqICAgICAgICAgcGFyYW1ldGVyICh0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgdGhlIGxhc3Qgb25lIG9mIHRoZSBtdWx0aS1idWZmZXIgdGhyZWFkKQpAQCAtODgyLDkgKzk5Niw5IEBACiAgICogQG5vdGUgICBPbmNlIHRoZSBETUEgdHJhbnNmZXJzIGFyZSBmaW5pc2hlZCAoaW5kaWNhdGVkIGJ5IGhoYXNoLT5TdGF0ZSBzZXQgYmFjawogICAqICAgICAgICAgdG8gSEFMX0hBU0hfU1RBVEVfUkVBRFkpLCBIQUxfSEFTSEV4X1NIQTI1Nl9GaW5pc2goKSBBUEkgbXVzdCBiZSBjYWxsZWQgdG8gcmV0cmlldmUKICAgKiAgICAgICAgIHRoZSBjb21wdXRlZCBkaWdlc3QuCi0gICogQHBhcmFtICBoaGFzaDogSEFTSCBoYW5kbGUuCi0gICogQHBhcmFtICBwSW5CdWZmZXI6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAobWVzc2FnZSBidWZmZXIpLgotICAqIEBwYXJhbSAgU2l6ZTogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCisgICogQHBhcmFtICBoaGFzaCBIQVNIIGhhbmRsZS4KKyAgKiBAcGFyYW0gIHBJbkJ1ZmZlciBwb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgKG1lc3NhZ2UgYnVmZmVyKS4KKyAgKiBAcGFyYW0gIFNpemUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIgaW4gYnl0ZXMuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSE1BQ0V4X1NIQTI1Nl9TdGVwMl8zX0RNQShIQVNIX0hhbmRsZVR5cGVEZWYgKmhoYXNoLCB1aW50OF90ICpwSW5CdWZmZXIsIHVpbnQzMl90IFNpemUpCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9oY2QuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2hjZC5jCmluZGV4IDkyYTYyNzcuLjczNWQ3ZDEgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX2hjZC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX2hjZC5jCkBAIC00MiwxMSArNDIsNyBAQAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKiBAYXR0ZW50aW9uCiAgICoKLSAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KLSAgKgotICAqIEBhdHRlbnRpb24KLSAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIFlZWVkgU1RNaWNyb2VsZWN0cm9uaWNzLgorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAgKgogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLApAQCAtMTE0LDYgKzExMCw4IEBACiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSENEX0luaXQoSENEX0hhbmRsZVR5cGVEZWYgKmhoY2QpCiB7CisgIFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeDsKKwogICAvKiBDaGVjayB0aGUgSENEIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgIGlmIChoaGNkID09IE5VTEwpCiAgIHsKQEAgLTEyMyw2ICsxMjEsOCBAQAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfSENEX0FMTF9JTlNUQU5DRShoaGNkLT5JbnN0YW5jZSkpOwogCisgIFVTQnggPSBoaGNkLT5JbnN0YW5jZTsKKwogICBpZiAoaGhjZC0+U3RhdGUgPT0gSEFMX0hDRF9TVEFURV9SRVNFVCkKICAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KQEAgLTE1MSw2ICsxNTEsMTIgQEAKIAogICBoaGNkLT5TdGF0ZSA9IEhBTF9IQ0RfU1RBVEVfQlVTWTsKIAorICAvKiBEaXNhYmxlIERNQSBtb2RlIGZvciBGUyBpbnN0YW5jZSAqLworICBpZiAoKFVTQngtPkNJRCAmICgweDFVIDw8IDgpKSA9PSAwVSkKKyAgeworICAgIGhoY2QtPkluaXQuZG1hX2VuYWJsZSA9IDBVOworICB9CisKICAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0cyAqLwogICBfX0hBTF9IQ0RfRElTQUJMRShoaGNkKTsKIApAQCAtMzY3LDE0ICszNzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkb19waW5nKQogewotICBVTlVTRUQoZG9fcGluZyk7Ci0KICAgaGhjZC0+aGNbY2hfbnVtXS5lcF9pc19pbiA9IGRpcmVjdGlvbjsKICAgaGhjZC0+aGNbY2hfbnVtXS5lcF90eXBlICA9IGVwX3R5cGU7CiAKICAgaWYgKHRva2VuID09IDBVKQogICB7CiAgICAgaGhjZC0+aGNbY2hfbnVtXS5kYXRhX3BpZCA9IEhDX1BJRF9TRVRVUDsKKyAgICBoaGNkLT5oY1tjaF9udW1dLmRvX3BpbmcgPSBkb19waW5nOwogICB9CiAgIGVsc2UKICAgewpAQCAtNTI4LDIwICs1MzMsMTkgQEAKICAgICAvKiBIYW5kbGUgSG9zdCBEaXNjb25uZWN0IEludGVycnVwdHMgKi8KICAgICBpZiAoX19IQUxfSENEX0dFVF9GTEFHKGhoY2QsIFVTQl9PVEdfR0lOVFNUU19ESVNDSU5UKSkKICAgICB7CisgICAgICBfX0hBTF9IQ0RfQ0xFQVJfRkxBRyhoaGNkLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7CiAKLSAgICAgIC8qIENsZWFudXAgSFBSVCAqLwotICAgICAgVVNCeF9IUFJUMCAmPSB+KFVTQl9PVEdfSFBSVF9QRU5BIHwgVVNCX09UR19IUFJUX1BDREVUIHwgXAotICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfSFBSVF9QRU5DSE5HIHwgVVNCX09UR19IUFJUX1BPQ0NITkcpOwotCi0gICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IERpc2Nvbm5lY3QgSW50ZXJydXB0ICovCisgICAgICBpZiAoKFVTQnhfSFBSVDAgJiBVU0JfT1RHX0hQUlRfUENTVFMpID09IDBVKQorICAgICAgeworICAgICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IERpc2Nvbm5lY3QgSW50ZXJydXB0ICovCiAjaWYgKFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKLSAgICAgIGhoY2QtPkRpc2Nvbm5lY3RDYWxsYmFjayhoaGNkKTsKKyAgICAgICAgaGhjZC0+RGlzY29ubmVjdENhbGxiYWNrKGhoY2QpOwogI2Vsc2UKLSAgICAgIEhBTF9IQ0RfRGlzY29ubmVjdF9DYWxsYmFjayhoaGNkKTsKKyAgICAgICAgSEFMX0hDRF9EaXNjb25uZWN0X0NhbGxiYWNrKGhoY2QpOwogI2VuZGlmIC8qIFVTRV9IQUxfSENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCi0gICAgICAodm9pZClVU0JfSW5pdEZTTFNQQ2xrU2VsKGhoY2QtPkluc3RhbmNlLCBIQ0ZHXzQ4X01IWik7Ci0gICAgICBfX0hBTF9IQ0RfQ0xFQVJfRkxBRyhoaGNkLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7CisgICAgICAgICh2b2lkKVVTQl9Jbml0RlNMU1BDbGtTZWwoaGhjZC0+SW5zdGFuY2UsIEhDRkdfNDhfTUhaKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBIYW5kbGUgSG9zdCBQb3J0IEludGVycnVwdHMgKi8KQEAgLTEwMDMsNiArMTAwNyw3IEBACiAgIF9fSEFMX0hDRF9FTkFCTEUoaGhjZCk7CiAgICh2b2lkKVVTQl9Ecml2ZVZidXMoaGhjZC0+SW5zdGFuY2UsIDFVKTsKICAgX19IQUxfVU5MT0NLKGhoY2QpOworCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKQEAgLTEwMTcsNiArMTAyMiw3IEBACiAgIF9fSEFMX0xPQ0soaGhjZCk7CiAgICh2b2lkKVVTQl9TdG9wSG9zdChoaGNkLT5JbnN0YW5jZSk7CiAgIF9fSEFMX1VOTE9DSyhoaGNkKTsKKwogICByZXR1cm4gSEFMX09LOwogfQogCkBAIC0xMTY0LDYgKzExNzAsMTMgQEAKICAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9BSEJFUlIpOwogICAgIF9fSEFMX0hDRF9VTk1BU0tfSEFMVF9IQ19JTlQoY2hfbnVtKTsKICAgfQorICBlbHNlIGlmICgoVVNCeF9IQyhjaF9udW0pLT5IQ0lOVCAmIFVTQl9PVEdfSENJTlRfQkJFUlIpID09IFVTQl9PVEdfSENJTlRfQkJFUlIpCisgIHsKKyAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9CQkVSUik7CisgICAgaGhjZC0+aGNbY2hfbnVtXS5zdGF0ZSA9IEhDX0JCTEVSUjsKKyAgICBfX0hBTF9IQ0RfVU5NQVNLX0hBTFRfSENfSU5UKGNoX251bSk7CisgICAgKHZvaWQpVVNCX0hDX0hhbHQoaGhjZC0+SW5zdGFuY2UsICh1aW50OF90KWNoX251bSk7CisgIH0KICAgZWxzZSBpZiAoKFVTQnhfSEMoY2hfbnVtKS0+SENJTlQgJiBVU0JfT1RHX0hDSU5UX0FDSykgPT0gVVNCX09UR19IQ0lOVF9BQ0spCiAgIHsKICAgICBfX0hBTF9IQ0RfQ0xFQVJfSENfSU5UKGNoX251bSwgVVNCX09UR19IQ0lOVF9BQ0spOwpAQCAtMTIyNSw2ICsxMjM4LDE3IEBACiAgICAgICBIQUxfSENEX0hDX05vdGlmeVVSQkNoYW5nZV9DYWxsYmFjayhoaGNkLCAodWludDhfdCljaF9udW0sIGhoY2QtPmhjW2NoX251bV0udXJiX3N0YXRlKTsKICNlbmRpZiAvKiBVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9CisgICAgZWxzZSBpZiAoaGhjZC0+aGNbY2hfbnVtXS5lcF90eXBlID09IEVQX1RZUEVfSVNPQykKKyAgICB7CisgICAgICBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSA9IFVSQl9ET05FOworICAgICAgaGhjZC0+aGNbY2hfbnVtXS50b2dnbGVfaW4gXj0gMVU7CisKKyNpZiAoVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgaGhjZC0+SENfTm90aWZ5VVJCQ2hhbmdlQ2FsbGJhY2soaGhjZCwgKHVpbnQ4X3QpY2hfbnVtLCBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSk7CisjZWxzZQorICAgICAgSEFMX0hDRF9IQ19Ob3RpZnlVUkJDaGFuZ2VfQ2FsbGJhY2soaGhjZCwgKHVpbnQ4X3QpY2hfbnVtLCBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSk7CisjZW5kaWYgLyogVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiAuLi4gKi8KQEAgLTEyNzMsNiArMTI5NywxMSBAQAogICAgICAgdG1wcmVnIHw9IFVTQl9PVEdfSENDSEFSX0NIRU5BOwogICAgICAgVVNCeF9IQyhjaF9udW0pLT5IQ0NIQVIgPSB0bXByZWc7CiAgICAgfQorICAgIGVsc2UgaWYgKGhoY2QtPmhjW2NoX251bV0uc3RhdGUgPT0gSENfQkJMRVJSKQorICAgIHsKKyAgICAgIGhoY2QtPmhjW2NoX251bV0uRXJyQ250Kys7CisgICAgICBoaGNkLT5oY1tjaF9udW1dLnVyYl9zdGF0ZSA9IFVSQl9FUlJPUjsKKyAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIC4uLiAqLwpAQCAtMTMwMCw2ICsxMzI5LDcgQEAKICAgICAgICAgICAgICAoaGhjZC0+aGNbY2hfbnVtXS5lcF90eXBlID09IEVQX1RZUEVfQlVMSykpCiAgICAgewogICAgICAgaGhjZC0+aGNbY2hfbnVtXS5FcnJDbnQgPSAwVTsKKwogICAgICAgaWYgKGhoY2QtPkluaXQuZG1hX2VuYWJsZSA9PSAwVSkKICAgICAgIHsKICAgICAgICAgaGhjZC0+aGNbY2hfbnVtXS5zdGF0ZSA9IEhDX05BSzsKQEAgLTE1NDgsOCArMTU3OCw2IEBACiAgIHsKICAgICBpZiAoKGhwcnQwICYgVVNCX09UR19IUFJUX1BDU1RTKSA9PSBVU0JfT1RHX0hQUlRfUENTVFMpCiAgICAgewotICAgICAgVVNCX01BU0tfSU5URVJSVVBUKGhoY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7Ci0KICNpZiAoVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgaGhjZC0+Q29ubmVjdENhbGxiYWNrKGhoY2QpOwogI2Vsc2UKQEAgLTE1ODYsMTAgKzE2MTQsOCBAQAogICAgICAgfQogI2lmIChVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICBoaGNkLT5Qb3J0RW5hYmxlZENhbGxiYWNrKGhoY2QpOwotICAgICAgaGhjZC0+Q29ubmVjdENhbGxiYWNrKGhoY2QpOwogI2Vsc2UKICAgICAgIEhBTF9IQ0RfUG9ydEVuYWJsZWRfQ2FsbGJhY2soaGhjZCk7Ci0gICAgICBIQUxfSENEX0Nvbm5lY3RfQ2FsbGJhY2soaGhjZCk7CiAjZW5kaWYgLyogVVNFX0hBTF9IQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKICAgICB9CkBAIC0xNjAwLDEyICsxNjI2LDYgQEAKICNlbHNlCiAgICAgICBIQUxfSENEX1BvcnREaXNhYmxlZF9DYWxsYmFjayhoaGNkKTsKICNlbmRpZiAvKiBVU0VfSEFMX0hDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLQotICAgICAgLyogQ2xlYW51cCBIUFJUICovCi0gICAgICBVU0J4X0hQUlQwICY9IH4oVVNCX09UR19IUFJUX1BFTkEgfCBVU0JfT1RHX0hQUlRfUENERVQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgVVNCX09UR19IUFJUX1BFTkNITkcgfCBVU0JfT1RHX0hQUlRfUE9DQ0hORyk7Ci0KLSAgICAgIFVTQl9VTk1BU0tfSU5URVJSVVBUKGhoY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfRElTQ0lOVCk7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX2kyYy5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfaTJjLmMKaW5kZXggZDc0YmIxZC4uNGIzY2VlNCAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfaTJjLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfaTJjLmMKQEAgLTIyMywxMiArMjIzLDEyIEBACiAKICAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KKyAgICBbLi5dCiAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfSTJDX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCiAgICAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCiAgICAgIFVzZSBGdW5jdGlvbnMgQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBvciBAcmVmIEhBTF9JMkNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQogICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCi0KKyAgICBbLi5dCiAgICAgIEZ1bmN0aW9uIEByZWYgSEFMX0kyQ19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAgKCspIE1hc3RlclR4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyLgogICAgICAgICgrKSBNYXN0ZXJSeENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBNYXN0ZXIgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2Zlci4KQEAgLTI0Myw5ICsyNDMsOSBAQAogICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgogICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECiAgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0KKyAgICBbLi5dCiAgICAgIEZvciBzcGVjaWZpYyBjYWxsYmFjayBBZGRyQ2FsbGJhY2sgdXNlIGRlZGljYXRlZCByZWdpc3RlciBjYWxsYmFja3MgOiBAcmVmIEhBTF9JMkNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKS4KLQorICAgIFsuLl0KICAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0kyQ19VblJlZ2lzdGVyQ2FsbGJhY2sgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAogICAgICB3ZWFrIGZ1bmN0aW9uLgogICAgICBAcmVmIEhBTF9JMkNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKQEAgLTI2Miw5ICsyNjIsOSBAQAogICAgICAgICgrKSBBYm9ydENwbHRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBhYm9ydCBjb21wbGV0aW9uIHByb2Nlc3MuCiAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgogICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgotCisgICAgWy4uXQogICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfSTJDX1VuUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKS4KLQorICAgIFsuLl0KICAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX0kyQ19Jbml0KCkgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVAogICAgICBhbGwgY2FsbGJhY2tzIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnM6CiAgICAgIGV4YW1wbGVzIEByZWYgSEFMX0kyQ19NYXN0ZXJUeENwbHRDYWxsYmFjaygpLCBAcmVmIEhBTF9JMkNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4KQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9JMkNfSW5pdCgpLyBAcmVmIEhBTF9JMkNfRGVJbml0KCkKICAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKSB3aGF0ZXZlciB0aGUgc3RhdGUuCi0KKyAgICBbLi5dCiAgICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIHN0YXRlIG9ubHkuCiAgICAgIEV4Y2VwdGlvbiBkb25lIE1zcEluaXQvTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAogICAgICBpbiBAcmVmIEhBTF9JMkNfU1RBVEVfUkVBRFkgb3IgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUIHN0YXRlLApAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgIFRoZW4sIHRoZSB1c2VyIGZpcnN0IHJlZ2lzdGVycyB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKICAgICAgdXNpbmcgQHJlZiBIQUxfSTJDX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9JMkNfRGVJbml0KCkKICAgICAgb3IgQHJlZiBIQUxfSTJDX0luaXQoKSBmdW5jdGlvbi4KLQorICAgIFsuLl0KICAgICAgV2hlbiB0aGUgY29tcGlsYXRpb24gZmxhZyBVU0VfSEFMX0kyQ19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKICAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCiAgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCkBAIC00NzM3LDYgKzQ3MzcsMTMgQEAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoaTJjKTsKIAorICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KKyAgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCisgIHsKKyAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCisgICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIHRtcElURmxhZ3MpOworICB9CisKICAgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19BRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX05BQ0tJKSAhPSBSRVNFVCkpCiAgIHsKICAgICAvKiBDaGVjayB0aGF0IEkyQyB0cmFuc2ZlciBmaW5pc2hlZCAqLwpAQCAtNDc4OCw5ICs0Nzk1LDYgQEAKICAgewogICAgIGlmIChoaTJjLT5YZmVyQ291bnQgPiAwVSkKICAgICB7Ci0gICAgICAvKiBSZW1vdmUgUlhORSBmbGFnIG9uIHRlbXBvcmFyeSB2YXJpYWJsZSBhcyByZWFkIGRvbmUgKi8KLSAgICAgIHRtcElURmxhZ3MgJj0gfkkyQ19GTEFHX1JYTkU7Ci0KICAgICAgIC8qIFJlYWQgZGF0YSBmcm9tIFJYRFIgKi8KICAgICAgICpoaTJjLT5wQnVmZlB0ciA9ICh1aW50OF90KWhpMmMtPkluc3RhbmNlLT5SWERSOwogCkBAIC00ODQ0LDEzICs0ODQ4LDYgQEAKICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgIH0KIAotICAvKiBDaGVjayBpZiBTVE9QRiBpcyBzZXQgKi8KLSAgaWYgKChJMkNfQ0hFQ0tfRkxBRyh0bXBJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCi0gIHsKLSAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCi0gICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIHRtcElURmxhZ3MpOwotICB9Ci0KICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaGkyYyk7CiAKQEAgLTUwMDgsNiArNTAwNSwxMyBAQAogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhpMmMpOwogCisgIC8qIENoZWNrIGlmIFNUT1BGIGlzIHNldCAqLworICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX1NUT1BGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfU1RPUEkpICE9IFJFU0VUKSkKKyAgeworICAgIC8qIENhbGwgSTJDIFNsYXZlIGNvbXBsZXRlIHByb2Nlc3MgKi8KKyAgICBJMkNfSVRTbGF2ZUNwbHQoaGkyYywgSVRGbGFncyk7CisgIH0KKwogICBpZiAoKEkyQ19DSEVDS19GTEFHKElURmxhZ3MsIEkyQ19GTEFHX0FGKSAhPSBSRVNFVCkgJiYgKEkyQ19DSEVDS19JVF9TT1VSQ0UoSVRTb3VyY2VzLCBJMkNfSVRfTkFDS0kpICE9IFJFU0VUKSkKICAgewogICAgIC8qIENoZWNrIHRoYXQgSTJDIHRyYW5zZmVyIGZpbmlzaGVkICovCkBAIC01MDkyLDExICs1MDk2LDYgQEAKICAgewogICAgIEkyQ19JVEFkZHJDcGx0KGhpMmMsIElURmxhZ3MpOwogICB9Ci0gIGVsc2UgaWYgKChJMkNfQ0hFQ0tfRkxBRyhJVEZsYWdzLCBJMkNfRkxBR19TVE9QRikgIT0gUkVTRVQpICYmIChJMkNfQ0hFQ0tfSVRfU09VUkNFKElUU291cmNlcywgSTJDX0lUX1NUT1BJKSAhPSBSRVNFVCkpCi0gIHsKLSAgICAvKiBDYWxsIEkyQyBTbGF2ZSBjb21wbGV0ZSBwcm9jZXNzICovCi0gICAgSTJDX0lUU2xhdmVDcGx0KGhpMmMsIElURmxhZ3MpOwotICB9CiAgIGVsc2UKICAgewogICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX2lyZGEuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2lyZGEuYwppbmRleCBlNzk0NzZmLi4wMzY3NWNiIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9pcmRhLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfaXJkYS5jCkBAIC0yMDYsNyArMjA2LDcgQEAKICNkZWZpbmUgSVJEQV9URUFDS19SRUFDS19USU1FT1VUICAgICAgICAgICAgMTAwMFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSVJEQSBUWCBvciBSWCBlbmFibGUgYWNrbm93bGVkZ2UgdGltZS1vdXQgdmFsdWUgICovCiAKICNkZWZpbmUgSVJEQV9DUjFfRklFTERTICAoKHVpbnQzMl90KShVU0FSVF9DUjFfTSB8IFVTQVJUX0NSMV9QQ0UgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBJUkRBX1NldENvbmZpZyBBUEkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVTQVJUX0NSMV9QUyB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSkpICAvKiE8IFVBUlQgb3IgVVNBUlQgQ1IxIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHNldCBieSBJUkRBX1NldENvbmZpZyBBUEkgKi8KIAogI2RlZmluZSBVU0FSVF9CUlJfTUlOICAgIDB4MTBVICAgICAgICAvKiE8IFVTQVJUIEJSUiBtaW5pbXVtIGF1dGhvcml6ZWQgdmFsdWUgKi8KIApAQCAtMjM5LDcgKzIzOSw4IEBACiAjZW5kaWYgLyogVVNFX0hBTF9JUkRBX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfU2V0Q29uZmlnKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpOwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfQ2hlY2tJZGxlU3RhdGUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSk7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgSVJEQV9XYWl0T25GbGFnVW50aWxUaW1lb3V0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKIHN0YXRpYyB2b2lkIElSREFfRW5kVHhUcmFuc2ZlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKIHN0YXRpYyB2b2lkIElSREFfRW5kUnhUcmFuc2ZlcihJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKTsKIHN0YXRpYyB2b2lkIElSREFfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKQEAgLTQ3NSw3ICs0NzYsOCBAQAogICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBJUkRBX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9SZWdpc3RlckNhbGxiYWNrKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIEhBTF9JUkRBX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJUkRBX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIApAQCAtNzE0LDYgKzcxNiw3IEBACiAgICAgV2hpbGUgcmVjZWl2aW5nIGRhdGEsIHRyYW5zbWlzc2lvbiBzaG91bGQgYmUgYXZvaWRlZCBhcyB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZAogICAgIGNvdWxkIGJlIGNvcnJ1cHRlZC4KIAorICBbLi5dCiAgICAgKCMpIFRoZXJlIGFyZSB0d28gbW9kZXMgb2YgdHJhbnNmZXI6CiAgICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogdGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4KICAgICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCkBAIC03NTEsMjggKzc1NCwyOCBAQAogICAgICAgICAoKyspIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKQogCiAgICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycyBjb3VsZCBiZSBhYm9ydGVkIHVzaW5nIEFib3J0IEFQSSdzIDoKLSAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0KCkKLSAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXQoKQotICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlKCkKLSAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0X0lUKCkKLSAgICAgICAgKCspIEhBTF9JUkRBX0Fib3J0VHJhbnNtaXRfSVQoKQotICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydCgpCisgICAgICAgICgrKykgSEFMX0lSREFfQWJvcnRUcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydF9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX0lSREFfQWJvcnRSZWNlaXZlX0lUKCkKIAogICAgICgjKSBGb3IgQWJvcnQgc2VydmljZXMgYmFzZWQgb24gaW50ZXJydXB0cyAoSEFMX0lSREFfQWJvcnR4eHhfSVQpLCBhIHNldCBvZiBBYm9ydCBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkOgotICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRDcGx0Q2FsbGJhY2soKQotICAgICAgICAoKykgSEFMX0lSREFfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjaygpCi0gICAgICAgICgrKSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9JUkRBX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfSVJEQV9BYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2soKQogCiAgICAgKCMpIEluIE5vbi1CbG9ja2luZyBtb2RlIHRyYW5zZmVycywgcG9zc2libGUgZXJyb3JzIGFyZSBzcGxpdCBpbnRvIDIgY2F0ZWdvcmllcy4KICAgICAgICAgRXJyb3JzIGFyZSBoYW5kbGVkIGFzIGZvbGxvd3MgOgotICAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcwotICAgICAgICAgICAgdG8gYmUgZXZhbHVhdGVkIGJ5IHVzZXIgOiB0aGlzIGNvbmNlcm5zIEZyYW1lIEVycm9yLCBQYXJpdHkgRXJyb3Igb3IgTm9pc2UgRXJyb3IgaW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIC4KLSAgICAgICAgICAgIFJlY2VpdmVkIGNoYXJhY3RlciBpcyB0aGVuIHJldHJpZXZlZCBhbmQgc3RvcmVkIGluIFJ4IGJ1ZmZlciwgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLAotICAgICAgICAgICAgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gSVJEQSBzaWRlLgotICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgotICAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBCbG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuCi0gICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgotICAgICAgICAgICAgRXJyb3IgY29kZSBpcyBzZXQgdG8gYWxsb3cgdXNlciB0byBpZGVudGlmeSBlcnJvciB0eXBlLCBhbmQgSEFMX0lSREFfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisgICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcworICAgICAgICAgICAgIHRvIGJlIGV2YWx1YXRlZCBieSB1c2VyIDogdGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciwgUGFyaXR5IEVycm9yIG9yIE5vaXNlIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiAuCisgICAgICAgICAgICAgUmVjZWl2ZWQgY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsCisgICAgICAgICAgICAgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLiBUcmFuc2ZlciBpcyBrZXB0IG9uZ29pbmcgb24gSVJEQSBzaWRlLgorICAgICAgICAgICAgIElmIHVzZXIgd2FudHMgdG8gYWJvcnQgaXQsIEFib3J0IHNlcnZpY2VzIHNob3VsZCBiZSBjYWxsZWQgYnkgdXNlci4KKyAgICAgICAgKCsrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIEJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZCBwcm9wZXJseSBhbmQgaXMgYWJvcnRlZC4KKyAgICAgICAgICAgICBUaGlzIGNvbmNlcm5zIE92ZXJydW4gRXJyb3IgSW4gSW50ZXJydXB0IG1vZGUgcmVjZXB0aW9uIGFuZCBhbGwgZXJyb3JzIGluIERNQSBtb2RlLgorICAgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9JUkRBX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLgogCiBAZW5kdmVyYmF0aW0KICAgKiBAewpAQCAtNzgwLDEwICs3ODMsMTMgQEAKIAogLyoqCiAgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAbm90ZSAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgIHRoZSBzZW50IGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IHJlZmxlY3QgdGhlIG51bWJlcgorICAqICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcERhdGEuCiAgICogQHBhcmFtIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIElSREEgbW9kdWxlLgotICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50LgogICAqIEBwYXJhbSBUaW1lb3V0IFNwZWNpZnkgdGltZW91dCB2YWx1ZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTg2NiwxMCArODcyLDEzIEBACiAKIC8qKgogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgcmVmbGVjdCB0aGUgbnVtYmVyCisgICogICAgICAgIG9mIHUxNiBhdmFpbGFibGUgdGhyb3VnaCBwRGF0YS4KICAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHJlY2VpdmVkLgogICAqIEBwYXJhbSBUaW1lb3V0IFNwZWNpZnkgdGltZW91dCB2YWx1ZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTk1NCwxMCArOTYzLDEzIEBACiAKIC8qKgogICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgdGhlIHNlbnQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgcmVmbGVjdCB0aGUgbnVtYmVyCisgICogICAgICAgIG9mIHUxNiBhdmFpbGFibGUgdGhyb3VnaCBwRGF0YS4KICAgKiBAcGFyYW0gIGhpcmRhIFBvaW50ZXIgdG8gYSBJUkRBX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgc2VudC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1RyYW5zbWl0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQpAQCAtOTk2LDEwICsxMDA4LDEzIEBACiAKIC8qKgogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IHJlZmxlY3QgdGhlIG51bWJlcgorICAqICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcERhdGEuCiAgICogQHBhcmFtICBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCi0gICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCi0gICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX1JlY2VpdmVfSVQoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMDQ1LDEwICsxMDYwLDEzIEBACiAKIC8qKgogICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgdGhlIHNlbnQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgcmVmbGVjdCB0aGUgbnVtYmVyCisgICogICAgICAgIG9mIHUxNiBhdmFpbGFibGUgdGhyb3VnaCBwRGF0YS4KICAgKiBAcGFyYW0gaGlyZGEgUG9pbnRlciB0byBhIElSREFfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSVJEQSBtb2R1bGUuCi0gICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIuCi0gICogQHBhcmFtIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9UcmFuc21pdF9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMTIwLDEyICsxMTM4LDE1IEBACiAKIC8qKgogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgdGhlIHJlY2VpdmVkIGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IHJlZmxlY3QgdGhlIG51bWJlcgorICAqICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcERhdGEuCiAgICogQG5vdGUgICBXaGVuIHRoZSBJUkRBIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSwgdGhlIHJlY2VpdmVkIGRhdGEgY29udGFpbnMKICAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgogICAqIEBwYXJhbSBoaXJkYSBQb2ludGVyIHRvIGEgSVJEQV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBJUkRBIG1vZHVsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSBTaXplIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHJlY2VpdmVkLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfUmVjZWl2ZV9ETUEoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMzUzLDcgKzEzNzQsNyBAQAogICAqICAgICAgICAgICAtIFNldCBoYW5kbGUgU3RhdGUgdG8gUkVBRFkKICAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIGJsb2NraW5nIG1vZGUgOiB3aGVuIGV4aXRpbmcgZnVuY3Rpb24sIEFib3J0IGlzIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwotKi8KKyAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCiB7CiAgIC8qIERpc2FibGUgVFhFSUUsIFRDSUUsIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLwpAQCAtMTQzOSw3ICsxNDYwLDcgQEAKICAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKLSovCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFRyYW5zbWl0KElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCiB7CiAgIC8qIERpc2FibGUgVFhFSUUgYW5kIFRDSUUgaW50ZXJydXB0cyAqLwpAQCAtMTQ5MSw3ICsxNTEyLDcgQEAKICAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKLSovCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSVJEQV9BYm9ydFJlY2VpdmUoSVJEQV9IYW5kbGVUeXBlRGVmICpoaXJkYSkKIHsKICAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KQEAgLTE1NDksNyArMTU3MCw3IEBACiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQogICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwotKi8KKyAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0X0lUKElSREFfSGFuZGxlVHlwZURlZiAqaGlyZGEpCiB7CiAgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOwpAQCAtMTY4MSw3ICsxNzAyLDcgQEAKICAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCiAgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0lSREFfQWJvcnRUcmFuc21pdF9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQogewogICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KQEAgLTE3NTksNyArMTc4MCw3IEBACiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQogICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwotKi8KKyAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9JUkRBX0Fib3J0UmVjZWl2ZV9JVChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQogewogICAvKiBEaXNhYmxlIFJYTkUsIFBFIGFuZCBFUlIgKEZyYW1lIGVycm9yLCBub2lzZSBlcnJvciwgb3ZlcnJ1biBlcnJvcikgaW50ZXJydXB0cyAqLwpAQCAtMjE1MCw3ICsyMTcxLDggQEAKIEhBTF9JUkRBX1N0YXRlVHlwZURlZiBIQUxfSVJEQV9HZXRTdGF0ZShJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhKQogewogICAvKiBSZXR1cm4gSVJEQSBoYW5kbGUgc3RhdGUgKi8KLSAgdWludDMyX3QgdGVtcDEsIHRlbXAyOworICB1aW50MzJfdCB0ZW1wMTsKKyAgdWludDMyX3QgdGVtcDI7CiAgIHRlbXAxID0gKHVpbnQzMl90KWhpcmRhLT5nU3RhdGU7CiAgIHRlbXAyID0gKHVpbnQzMl90KWhpcmRhLT5SeFN0YXRlOwogCkBAIC0yMjEyLDYgKzIyMzQsNyBAQAogICB1aW50MzJfdCB0bXByZWc7CiAgIElSREFfQ2xvY2tTb3VyY2VUeXBlRGVmIGNsb2Nrc291cmNlOwogICBIQUxfU3RhdHVzVHlwZURlZiByZXQgPSBIQUxfT0s7CisgIHVpbnQzMl90IHBjbGs7CiAKICAgLyogQ2hlY2sgdGhlIGNvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfSVJEQV9CQVVEUkFURShoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOwpAQCAtMjIzNSw3ICsyMjU4LDcgQEAKIAogCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgR1RQUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+R1RQUiwgKHVpbnQxNl90KVVTQVJUX0dUUFJfUFNDLCBoaXJkYS0+SW5pdC5QcmVzY2FsZXIpOworICBNT0RJRllfUkVHKGhpcmRhLT5JbnN0YW5jZS0+R1RQUiwgKHVpbnQxNl90KVVTQVJUX0dUUFJfUFNDLCAodWludDE2X3QpaGlyZGEtPkluaXQuUHJlc2NhbGVyKTsKIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgSVJEQV9HRVRDTE9DS1NPVVJDRShoaXJkYSwgY2xvY2tzb3VyY2UpOwpAQCAtMjI0MywxNiArMjI2NiwxOSBAQAogICBzd2l0Y2ggKGNsb2Nrc291cmNlKQogICB7CiAgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX1BDTEsxOgotICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzFGcmVxKCksIGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKTsKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihwY2xrLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX1BDTEsyOgotICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzJGcmVxKCksIGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKTsKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihwY2xrLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX0hTSToKICAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihIU0lfVkFMVUUsIGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIElSREFfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgotICAgICAgdG1wcmVnID0gKHVpbnQxNl90KShJUkRBX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGhpcmRhLT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBwY2xrID0gSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKTsKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNihwY2xrLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBJUkRBX0NMT0NLU09VUkNFX0xTRToKICAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoSVJEQV9ESVZfU0FNUExJTkcxNigodWludDMyX3QpTFNFX1ZBTFVFLCBoaXJkYS0+SW5pdC5CYXVkUmF0ZSkpOwpAQCAtMjMyMiw3ICsyMzQ4LDggQEAKICAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIElSREFfV2FpdE9uRmxhZ1VudGlsVGltZW91dChJUkRBX0hhbmRsZVR5cGVEZWYgKmhpcmRhLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQogewogICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCiAgIHdoaWxlICgoX19IQUxfSVJEQV9HRVRfRkxBRyhoaXJkYSwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfbHB0aW0uYyBiL1NyYy9zdG0zMmY3eHhfaGFsX2xwdGltLmMKaW5kZXggMWI5YTAxNC4uMDlmZWQ5YSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfbHB0aW0uYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9scHRpbS5jCkBAIC0zLDE0ICszLDE0IEBACiAgICogQGZpbGUgICAgc3RtMzJmN3h4X2hhbF9scHRpbS5jCiAgICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAgKiBAYnJpZWYgICBMUFRJTSBIQUwgbW9kdWxlIGRyaXZlci4KLSAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nIAorICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIExvdyBQb3dlciBUaW1lciAoTFBUSU0pIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KICAgKiAgICAgICAgICAgKyBTdGFydC9TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgaW4gcG9sbGluZyBtb2RlLgogICAqICAgICAgICAgICArIFN0YXJ0L1N0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyBpbiBpbnRlcnJ1cHQgbW9kZS4KICAgKiAgICAgICAgICAgKyBSZWFkaW5nIG9wZXJhdGlvbiBmdW5jdGlvbnMuCiAgICogICAgICAgICAgICsgUGVyaXBoZXJhbCBTdGF0ZSBmdW5jdGlvbnMuCi0gICogICAgICAgICAKKyAgKgogICBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCkBAIC0yMCwxMTYgKzIwLDEyMCBAQAogCiAgICAgICAoIylJbml0aWFsaXplIHRoZSBMUFRJTSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUKICAgICAgICAgSEFMX0xQVElNX01zcEluaXQoKToKLSAgICAgICAgICgjIykgRW5hYmxlIHRoZSBMUFRJTSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19MUFRJTXhfQ0xLX0VOQUJMRSgpLgotICAgICAgICAgKCMjKSBJbiBjYXNlIG9mIHVzaW5nIGludGVycnVwdHMgKGUuZy4gSEFMX0xQVElNX1BXTV9TdGFydF9JVCgpKToKKyAgICAgICAgICgrKykgRW5hYmxlIHRoZSBMUFRJTSBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0xQVElNeF9DTEtfRU5BQkxFKCkuCisgICAgICAgICAoKyspIEluIGNhc2Ugb2YgdXNpbmcgaW50ZXJydXB0cyAoZS5nLiBIQUxfTFBUSU1fUFdNX1N0YXJ0X0lUKCkpOgogICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgTFBUSU0gaW50ZXJydXB0IHByaW9yaXR5IHVzaW5nIEhBTF9OVklDX1NldFByaW9yaXR5KCkuCiAgICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBMUFRJTSBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKS4KICAgICAgICAgICAgICAoKysrKSBJbiBMUFRJTSBJUlEgaGFuZGxlciwgY2FsbCBIQUxfTFBUSU1fSVJRSGFuZGxlcigpLgotICAgIAorCiAgICAgICAoIylJbml0aWFsaXplIHRoZSBMUFRJTSBIQUwgdXNpbmcgSEFMX0xQVElNX0luaXQoKS4gVGhpcyBmdW5jdGlvbgogICAgICAgICAgY29uZmlndXJlcyBtYWlubHk6Ci0gICAgICAgICAoIyMpIFRoZSBpbnN0YW5jZTogTFBUSU0xLgotICAgICAgICAgKCMjKSBDbG9jazogdGhlIGNvdW50ZXIgY2xvY2suCi0gICAgICAgICAgICAgICAoKysrKSBTb3VyY2U6IGl0IGNhbiBiZSBlaXRoZXIgdGhlIFVMUFRJTSBpbnB1dCAoSU4xKSBvciBvbmUgb2YKKyAgICAgICAgICgrKykgVGhlIGluc3RhbmNlOiBMUFRJTTEuCisgICAgICAgICAoKyspIENsb2NrOiB0aGUgY291bnRlciBjbG9jay4KKyAgICAgICAgICAgICAoKysrKSBTb3VyY2UgICA6IGl0IGNhbiBiZSBlaXRoZXIgdGhlIFVMUFRJTSBpbnB1dCAoSU4xKSBvciBvbmUgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBjbG9jazsgKEFQQiwgTFNFLCBMU0kgb3IgTVNJKS4KLSAgICAgICAgICAgICAgICgrKyspIFByZXNjYWxlcjogc2VsZWN0IHRoZSBjbG9jayBkaXZpZGVyLgotICAgICAgICAgKCMjKSAgVWx0cmFMb3dQb3dlckNsb2NrIDogVG8gYmUgdXNlZCBvbmx5IGlmIHRoZSBVTFBUSU0gaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgICAoKysrKSBQcmVzY2FsZXI6IHNlbGVjdCB0aGUgY2xvY2sgZGl2aWRlci4KKyAgICAgICAgICgrKykgIFVsdHJhTG93UG93ZXJDbG9jayA6IFRvIGJlIHVzZWQgb25seSBpZiB0aGUgVUxQVElNIGlzIHNlbGVjdGVkCiAgICAgICAgICAgICAgICBhcyBjb3VudGVyIGNsb2NrIHNvdXJjZS4KLSAgICAgICAgICAgICAgICgrKyspIFBvbGFyaXR5OiAgIHBvbGFyaXR5IG9mIHRoZSBhY3RpdmUgZWRnZSBmb3IgdGhlIGNvdW50ZXIgdW5pdAorICAgICAgICAgICAgICgrKyspIFBvbGFyaXR5OiAgIHBvbGFyaXR5IG9mIHRoZSBhY3RpdmUgZWRnZSBmb3IgdGhlIGNvdW50ZXIgdW5pdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBVTFBUSU0gaW5wdXQgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICAgICAoKysrKSBTYW1wbGVUaW1lOiBjbG9jayBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgY2xvY2sgZ2xpdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLiAgICAgICAgICAgICAgCi0gICAgICAgICAoIyMpIFRyaWdnZXI6IEhvdyB0aGUgY291bnRlciBzdGFydC4KLSAgICAgICAgICAgICAgKCsrKykgU291cmNlOiB0cmlnZ2VyIGNhbiBiZSBzb2Z0d2FyZSBvciBvbmUgb2YgdGhlIGhhcmR3YXJlIHRyaWdnZXJzLgotICAgICAgICAgICAgICAoKysrKSBBY3RpdmVFZGdlOiBvbmx5IGZvciBoYXJkd2FyZSB0cmlnZ2VyLgotICAgICAgICAgICAgICAoKysrKSBTYW1wbGVUaW1lOiB0cmlnZ2VyIHNhbXBsaW5nIHRpbWUgdG8gY29uZmlndXJlIHRoZSB0cmlnZ2VyCisgICAgICAgICAgICAgKCsrKykgU2FtcGxlVGltZTogY2xvY2sgc2FtcGxpbmcgdGltZSB0byBjb25maWd1cmUgdGhlIGNsb2NrIGdsaXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci4KKyAgICAgICAgICgrKykgVHJpZ2dlcjogSG93IHRoZSBjb3VudGVyIHN0YXJ0LgorICAgICAgICAgICAgICgrKyspIFNvdXJjZTogdHJpZ2dlciBjYW4gYmUgc29mdHdhcmUgb3Igb25lIG9mIHRoZSBoYXJkd2FyZSB0cmlnZ2Vycy4KKyAgICAgICAgICAgICAoKysrKSBBY3RpdmVFZGdlIDogb25seSBmb3IgaGFyZHdhcmUgdHJpZ2dlci4KKyAgICAgICAgICAgICAoKysrKSBTYW1wbGVUaW1lIDogdHJpZ2dlciBzYW1wbGluZyB0aW1lIHRvIGNvbmZpZ3VyZSB0aGUgdHJpZ2dlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbGl0Y2ggZmlsdGVyLgotICAgICAgICAgKCMjKSBPdXRwdXRQb2xhcml0eTogMiBvcHBvc2l0ZSBwb2xhcml0aWVzIGFyZSBwb3NzaWJsZXMuCi0gICAgICAgICAoIyMpIFVwZGF0ZU1vZGU6IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB1cGRhdGUgb2YgdGhlIGF1dG9yZWxvYWQgYW5kCisgICAgICAgICAoKyspIE91dHB1dFBvbGFyaXR5IDogMiBvcHBvc2l0ZSBwb2xhcml0aWVzIGFyZSBwb3NzaWJsZS4KKyAgICAgICAgICgrKykgVXBkYXRlTW9kZTogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHVwZGF0ZSBvZiB0aGUgYXV0b3JlbG9hZCBhbmQKICAgICAgICAgICAgICAgdGhlIGNvbXBhcmUgdmFsdWVzIGlzIGRvbmUgaW1tZWRpYXRlbHkgb3IgYWZ0ZXIgdGhlIGVuZCBvZiBjdXJyZW50Ci0gICAgICAgICAgICAgIHBlcmlvZC4gICAKLSAgICAKKyAgICAgICAgICAgICAgcGVyaW9kLgorCiAgICAgICAoIylTaXggbW9kZXMgYXJlIGF2YWlsYWJsZToKLSAgICAgIAotICAgICAgICAgKCMjKSBQV00gTW9kZTogVG8gZ2VuZXJhdGUgYSBQV00gc2lnbmFsIHdpdGggc3BlY2lmaWVkIHBlcmlvZCBhbmQgcHVsc2UsCisKKyAgICAgICAgICgrKykgUFdNIE1vZGU6IFRvIGdlbmVyYXRlIGEgUFdNIHNpZ25hbCB3aXRoIHNwZWNpZmllZCBwZXJpb2QgYW5kIHB1bHNlLAogICAgICAgICAgY2FsbCBIQUxfTFBUSU1fUFdNX1N0YXJ0KCkgb3IgSEFMX0xQVElNX1BXTV9TdGFydF9JVCgpIGZvciBpbnRlcnJ1cHRpb24KICAgICAgICAgIG1vZGUuCi0gICAgICAgICAKLSAgICAgICAgICgjIykgT25lIFB1bHNlIE1vZGU6IFRvIGdlbmVyYXRlIHB1bHNlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGluIHJlc3BvbnNlCisKKyAgICAgICAgICgrKykgT25lIFB1bHNlIE1vZGU6IFRvIGdlbmVyYXRlIHB1bHNlIHdpdGggc3BlY2lmaWVkIHdpZHRoIGluIHJlc3BvbnNlCiAgICAgICAgICB0byBhIHN0aW11bHVzLCBjYWxsIEhBTF9MUFRJTV9PbmVQdWxzZV9TdGFydCgpIG9yCiAgICAgICAgICBIQUxfTFBUSU1fT25lUHVsc2VfU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uIG1vZGUuCi0gICAgICAgICAKLSAgICAgICAgICgjIykgU2V0IG9uY2UgTW9kZTogSW4gdGhpcyBtb2RlLCB0aGUgb3V0cHV0IGNoYW5nZXMgdGhlIGxldmVsIChmcm9tCisKKyAgICAgICAgICgrKykgU2V0IG9uY2UgTW9kZTogSW4gdGhpcyBtb2RlLCB0aGUgb3V0cHV0IGNoYW5nZXMgdGhlIGxldmVsIChmcm9tCiAgICAgICAgICBsb3cgbGV2ZWwgdG8gaGlnaCBsZXZlbCBpZiB0aGUgb3V0cHV0IHBvbGFyaXR5IGlzIGNvbmZpZ3VyZWQgaGlnaCwgZWxzZQotICAgICAgICAgdGhlIG9wcG9zaXRlKSB3aGVuIGEgY29tcGFyZSBtYXRjaCBvY2N1cnMuIFRvIHN0YXJ0IHRoaXMgbW9kZSwgY2FsbCAKKyAgICAgICAgIHRoZSBvcHBvc2l0ZSkgd2hlbiBhIGNvbXBhcmUgbWF0Y2ggb2NjdXJzLiBUbyBzdGFydCB0aGlzIG1vZGUsIGNhbGwKICAgICAgICAgIEhBTF9MUFRJTV9TZXRPbmNlX1N0YXJ0KCkgb3IgSEFMX0xQVElNX1NldE9uY2VfU3RhcnRfSVQoKSBmb3IKICAgICAgICAgIGludGVycnVwdGlvbiBtb2RlLgotICAgICAgICAgCi0gICAgICAgICAoIyMpIEVuY29kZXIgTW9kZTogVG8gdXNlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjYWxsCi0gICAgICAgICBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydCgpIG9yIEhBTF9MUFRJTV9FbmNvZGVyX1N0YXJ0X0lUKCkgZm9yIAotICAgICAgICAgaW50ZXJydXB0aW9uIG1vZGUuCi0gICAgICAgICAKLSAgICAgICAgICgjIykgVGltZSBvdXQgTW9kZTogYW4gYWN0aXZlIGVkZ2Ugb24gb25lIHNlbGVjdGVkIHRyaWdnZXIgaW5wdXQgcmVzdHMKKworICAgICAgICAgKCsrKSBFbmNvZGVyIE1vZGU6IFRvIHVzZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgY2FsbAorICAgICAgICAgSEFMX0xQVElNX0VuY29kZXJfU3RhcnQoKSBvciBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydF9JVCgpIGZvcgorICAgICAgICAgaW50ZXJydXB0aW9uIG1vZGUuIE9ubHkgYXZhaWxhYmxlIGZvciBMUFRJTTEgaW5zdGFuY2UuCisKKyAgICAgICAgICgrKykgVGltZSBvdXQgTW9kZTogYW4gYWN0aXZlIGVkZ2Ugb24gb25lIHNlbGVjdGVkIHRyaWdnZXIgaW5wdXQgcmVzdHMKICAgICAgICAgIHRoZSBjb3VudGVyLiBUaGUgZmlyc3QgdHJpZ2dlciBldmVudCB3aWxsIHN0YXJ0IHRoZSB0aW1lciwgYW55CiAgICAgICAgICBzdWNjZXNzaXZlIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldCB0aGUgY291bnRlciBhbmQgdGhlIHRpbWVyIHdpbGwKLSAgICAgICAgIHJlc3RhcnQuIFRvIHN0YXJ0IHRoaXMgbW9kZSBjYWxsIEhBTF9MUFRJTV9UaW1lT3V0X1N0YXJ0X0lUKCkgb3IgCisgICAgICAgICByZXN0YXJ0LiBUbyBzdGFydCB0aGlzIG1vZGUgY2FsbCBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVCgpIG9yCiAgICAgICAgICBIQUxfTFBUSU1fVGltZU91dF9TdGFydF9JVCgpIGZvciBpbnRlcnJ1cHRpb24gbW9kZS4KLSAgICAgICAgIAotICAgICAgICAgKCMjKSBDb3VudGVyIE1vZGU6IGNvdW50ZXIgY2FuIGJlIHVzZWQgdG8gY291bnQgZXh0ZXJuYWwgZXZlbnRzIG9uCi0gICAgICAgICB0aGUgTFBUSU0gSW5wdXQxIG9yIGl0IGNhbiBiZSB1c2VkIHRvIGNvdW50IGludGVybmFsIGNsb2NrIGN5Y2xlcy4KLSAgICAgICAgIFRvIHN0YXJ0IHRoaXMgbW9kZSwgY2FsbCBIQUxfTFBUSU1fQ291bnRlcl9TdGFydCgpIG9yIAotICAgICAgICAgSEFMX0xQVElNX0NvdW50ZXJfU3RhcnRfSVQoKSBmb3IgaW50ZXJydXB0aW9uIG1vZGUuICAgICAgICAgICAgIAogCi0gICAgCisgICAgICAgICAoKyspIENvdW50ZXIgTW9kZTogY291bnRlciBjYW4gYmUgdXNlZCB0byBjb3VudCBleHRlcm5hbCBldmVudHMgb24KKyAgICAgICAgIHRoZSBMUFRJTSBJbnB1dDEgb3IgaXQgY2FuIGJlIHVzZWQgdG8gY291bnQgaW50ZXJuYWwgY2xvY2sgY3ljbGVzLgorICAgICAgICAgVG8gc3RhcnQgdGhpcyBtb2RlLCBjYWxsIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0KCkgb3IKKyAgICAgICAgIEhBTF9MUFRJTV9Db3VudGVyX1N0YXJ0X0lUKCkgZm9yIGludGVycnVwdGlvbiBtb2RlLgorCisKICAgICAgICgjKSBVc2VyIGNhbiBzdG9wIGFueSBwcm9jZXNzIGJ5IGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgQVBJOgogICAgICAgICAgIEhBTF9MUFRJTV9YeHhfU3RvcCgpIG9yIEhBTF9MUFRJTV9YeHhfU3RvcF9JVCgpIGlmIHRoZSBwcm9jZXNzIGlzCiAgICAgICAgICAgYWxyZWFkeSBzdGFydGVkIGluIGludGVycnVwdGlvbiBtb2RlLgotICAgICAgICAgCi0gICAgICAoIykgQ2FsbCBIQUxfTFBUSU1fRGVJbml0KCkgdG8gZGVpbml0aWFsaXplIHRoZSBMUFRJTSBwZXJpcGhlcmFsLgogCi0gICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgorICAgICAgKCMpIERlLWluaXRpYWxpemUgdGhlIExQVElNIHBlcmlwaGVyYWwgdXNpbmcgSEFMX0xQVElNX0RlSW5pdCgpLgorCisgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCisgIFsuLl0KKyAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMQogICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgotCisgIFsuLl0KICAgVXNlIEZ1bmN0aW9uIEByZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgogICBAcmVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAogICB0aGUgQ2FsbGJhY2sgSUQgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KLQotICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAotICB3ZWFrIGZ1bmN0aW9uLgorICBbLi5dCisgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9MUFRJTV9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZQorICBkZWZhdWx0IHdlYWsgZnVuY3Rpb24uCiAgIEByZWYgSEFMX0xQVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCiAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCi0KKyAgWy4uXQogICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgotICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IExQVElNIE1zcCBJbml0IENhbGxiYWNrLgotICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICAgICA6IExQVElNIE1zcCBEZUluaXQgQ2FsbGJhY2suCi0gICAgKCspIENvbXBhcmVNYXRjaENhbGxiYWNrICAgIDogTFBUSU0gQ29tcGFyZSBNYXRjaCBJbml0IENhbGxiYWNrLgotICAgICgrKSBBdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA6IExQVElNIEF1dG8gUmVsb2FkIE1hdGNoIENhbGxiYWNrLgotICAgICgrKSBUcmlnZ2VyQ2FsbGJhY2sgICAgICAgICA6IExQVElNIFRyaWdnZXIgQ2FsbGJhY2suCi0gICAgKCspIENvbXBhcmVXcml0ZUNhbGxiYWNrICAgIDogTFBUSU0gQ29tcGFyZSBXcml0ZSBDYWxsYmFjay4KLSAgICAoKykgQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgOiBMUFRJTSBBdXRvIFJlbG9hZCBXcml0ZSBDYWxsYmFjay4KLSAgICAoKykgRGlyZWN0aW9uVXBDYWxsYmFjayAgICAgOiBMUFRJTSBEaXJlY3Rpb24gVXAgQ2FsbGJhY2suCi0gICAgKCspIERpcmVjdGlvbkRvd25DYWxsYmFjayAgIDogTFBUSU0gRGlyZWN0aW9uIERvd24gQ2FsbGJhY2suCiAKLSAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX0xQVElNX0luaXQgYW5kIHdoZW4gdGhlIHN0YXRlIGlzIEhBTF9MUFRJTV9TVEFURV9SRVNFVAorICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgICAgICA6IExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2suCisgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgICAgIDogTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrLgorICAgICgrKSBDb21wYXJlTWF0Y2hDYWxsYmFjayAgICA6IENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIEF1dG9SZWxvYWRNYXRjaENhbGxiYWNrIDogQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2suCisgICAgKCspIFRyaWdnZXJDYWxsYmFjayAgICAgICAgIDogRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2suCisgICAgKCspIENvbXBhcmVXcml0ZUNhbGxiYWNrICAgIDogQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgOiBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjay4KKyAgICAoKykgRGlyZWN0aW9uVXBDYWxsYmFjayAgICAgOiBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrLgorICAgICgrKSBEaXJlY3Rpb25Eb3duQ2FsbGJhY2sgICA6IERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjay4KKworICBbLi5dCisgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBJbml0IGFuZCB3aGVuIHRoZSBzdGF0ZSBpcyBIQUxfTFBUSU1fU1RBVEVfUkVTRVQKICAgYWxsIGludGVycnVwdCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKLSAgZXhhbXBsZXMgQHJlZiBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2soKSwgQHJlZiBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2soKS4KKyAgZXhhbXBsZXMgQHJlZiBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrKCksIEByZWYgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKCkuCiAKKyAgWy4uXQogICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGZ1bmN0aW9ucyB0aGF0IGFyZSByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsKLSAgZnVuY3Rpb25hbGl0aWVzIGluIHRoZSBAcmVmIEhBTF9MUFRJTV9Jbml0L0ByZWYgSEFMX0xQVElNX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UKLSAgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsCi0gIHRoZSBAcmVmIEhBTF9MUFRJTV9Jbml0L0ByZWYgSEFMX0xQVElNX0RlSW5pdCBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQKLSAgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCisgIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgSW5pdC9EZUluaXQgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbAorICAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgSW5pdC9EZUluaXQKKyAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQogCisgIFsuLl0KICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBIQUxfTFBUSU1fU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KICAgRXhjZXB0aW9uIGRvbmUgTXNwSW5pdC9Nc3BEZUluaXQgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKLSAgaW4gSEFMX0xQVElNX1NUQVRFX1JFQURZIG9yIEhBTF9MUFRJTV9TVEFURV9SRVNFVCBzdGF0ZSwgdGh1cyByZWdpc3RlcmVkICh1c2VyKQotICBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQgZHVyaW5nIHRoZSBAcmVmIEhBTF9MUFRJTV9Jbml0L0ByZWYgSEFMX0xQVElNX0RlSW5pdC4KLSAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcyB1c2luZwotICBAcmVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKCkgYmVmb3JlIGNhbGxpbmcgRGVJbml0IG9yIEluaXQgZnVuY3Rpb24uCisgIGluIEhBTF9MUFRJTV9TVEFURV9SRUFEWSBvciBIQUxfTFBUSU1fU1RBVEVfUkVTRVQgc3RhdGUsCisgIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCisgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKKyAgdXNpbmcgQHJlZiBIQUxfTFBUSU1fUmVnaXN0ZXJDYWxsYmFjaygpIGJlZm9yZSBjYWxsaW5nIERlSW5pdCBvciBJbml0IGZ1bmN0aW9uLgogCisgIFsuLl0KICAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSBhbmQgYWxsIGNhbGxiYWNrcwogICBhcmUgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHdlYWsgZnVuY3Rpb25zLgpAQCAtMTM4LDE2ICsxNDIsMTYgQEAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICogQGF0dGVudGlvbgogICAqCi0gICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuIAorICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAgKgogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAotICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCisgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqLyAKKyAgKi8KIAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsLmgiCkBAIC0xNjIsMjI5ICsxNjYsMjA3IEBACiAgICovCiAKICNpZmRlZiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQKLS8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfVHlwZXMgTFBUSU0gUHJpdmF0ZSBUeXBlcworCisjaWYgZGVmaW5lZCAoTFBUSU0xKQorCisvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qKiBAYWRkdG9ncm91cCBMUFRJTV9Qcml2YXRlX0NvbnN0YW50cwogICAqIEB7CiAgICovCi0KLS8qKgotICAqIEB9Ci0gICovCi0gIAotLyogUHJpdmF0ZSBkZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9EZWZpbmVzIExQVElNIFByaXZhdGUgRGVmaW5lcwotICAqIEB7Ci0gICovCi0KKyNkZWZpbmUgVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwVUwgLyogVGltZW91dCBpcyAxcyAqLwogLyoqCiAgICogQH0KICAgKi8KIAorLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgTFBUSU1fUHJpdmF0ZV9WYXJpYWJsZXMgTFBUSU0gUHJpdmF0ZSBWYXJpYWJsZXMKLSAgKiBAewotICAqLwotCi0vKioKLSAgKiBAfQotICAqLwotIAotLyogUHJpdmF0ZSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAYWRkdG9ncm91cCBMUFRJTV9Qcml2YXRlX0NvbnN0YW50cyBMUFRJTSBQcml2YXRlIENvbnN0YW50cwotICAqIEB7Ci0gICovCi0KLS8qKgotICAqIEB9Ci0gICovCi0gIAotLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAYWRkdG9ncm91cCBMUFRJTV9Qcml2YXRlX01hY3JvcyBMUFRJTSBQcml2YXRlIE1hY3JvcwotICAqIEB7Ci0gICovCi0KLS8qKgotICAqIEB9Ci0gICovCi0KIC8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgTFBUSU1fUHJpdmF0ZV9GdW5jdGlvbnNfUHJvdG90eXBlcyBMUFRJTSBQcml2YXRlIEZ1bmN0aW9ucyBQcm90b3R5cGVzCi0gICogQHsKLSAgKi8KKyNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKK3N0YXRpYyB2b2lkIExQVElNX1Jlc2V0Q2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqbHB0aW0pOworI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgTFBUSU1fV2FpdEZvckZsYWcoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBmbGFnKTsKIAotLyoqCi0gICogQH0KLSAgKi8KKy8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgTFBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgTFBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKLSAgKiBAewotICAqLwotCi0vKioKLSAgKiBAfQotICAqLwotICAKLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnMgTFBUSU0gRXhwb3J0ZWQgRnVuY3Rpb25zCiAgICogQHsKICAgKi8KIAotLyoqIEBkZWZncm91cCBMUFRJTV9Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAotICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuIAorLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCiAgKgotQHZlcmJhdGltICAgIAorQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgTFBUSU0gYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUKLSAgICAgICAgICBMUFRJTV9Jbml0VHlwZURlZiBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICAgICAgICAgTFBUSU1fSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgogICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KICAgICAgICgrKSBJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCi0gICAgICAoKykgRGVJbml0aWFsaXplIExQVElNIE1TUC4gCi0gCisgICAgICAoKykgRGVJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCisKIEBlbmR2ZXJiYXRpbQogICAqIEB7CiAgICovCiAKIC8qKgotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIExQVElNIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCi0gICogICAgICAgICBMUFRJTV9Jbml0VHlwZURlZiBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBMUFRJTSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZQorICAqICAgICAgICAgTFBUSU1fSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgogICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX0luaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewotICB1aW50MzJfdCB0bXBjZmdyID0gMDsKKyAgdWludDMyX3QgdG1wY2ZncjsKIAogICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KLSAgaWYoaGxwdGltID09IE5VTEwpCisgIGlmIChobHB0aW0gPT0gTlVMTCkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KIAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAKKwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfU09VUkNFKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpKTsKLSAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BSRVNDQUxFUihobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7ICAKLSAgaWYgKChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlKSA9PSAgTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKQorICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKGhscHRpbS0+SW5pdC5DbG9jay5QcmVzY2FsZXIpKTsKKyAgaWYgKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKLSAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfU0FNUExFX1RJTUUoaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5TYW1wbGVUaW1lKSk7Ci0gIH0gIAorICB9CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUkdfU09VUkNFKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkpOwotICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIGlmIChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgeworICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9FWFRfVFJHX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5UcmlnZ2VyLkFjdGl2ZUVkZ2UpKTsKKyAgfQorICBpZiAoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQykKICAgewogICAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9UUklHX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNhbXBsZVRpbWUpKTsKLSAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fRVhUX1RSR19QT0xBUklUWShobHB0aW0tPkluaXQuVHJpZ2dlci5BY3RpdmVFZGdlKSk7Ci0gIH0gIAotICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fT1VUUFVUX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5PdXRwdXRQb2xhcml0eSkpOyAgCisgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1NBTVBMRV9USU1FKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suU2FtcGxlVGltZSkpOworICB9CisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9PVVRQVVRfUE9MQVJJVFkoaGxwdGltLT5Jbml0Lk91dHB1dFBvbGFyaXR5KSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9VUERBVEVfTU9ERShobHB0aW0tPkluaXQuVXBkYXRlTW9kZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ09VTlRFUl9TT1VSQ0UoaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UpKTsKIAotICBpZihobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgaWYgKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFU0VUKQogICB7CiAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgIGhscHRpbS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKIAogI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgIC8qIFJlc2V0IHRoZSBMUFRJTSBjYWxsYmFjayB0byB0aGUgbGVnYWN5IHdlYWsgY2FsbGJhY2tzICovCi0gICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayAgICA9IEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjazsKLSAgICBobHB0aW0tPkF1dG9SZWxvYWRNYXRjaENhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrOwotICAgIGhscHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgPSBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrOwotICAgIGhscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2s7Ci0gICAgaGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjazsKLSAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgICAgID0gSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2s7Ci0gICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2sgICA9IEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2s7CisgICAgLyogUmVzZXQgaW50ZXJydXB0IGNhbGxiYWNrcyB0byBsZWdhY3kgd2VhayBjYWxsYmFja3MgKi8KKyAgICBMUFRJTV9SZXNldENhbGxiYWNrKGhscHRpbSk7CiAKLSAgICBpZihobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICAgIGlmIChobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogICAgIHsKICAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0xQVElNX01zcEluaXQ7CiAgICAgfQorCiAgICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIE5WSUMgKi8KICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayhobHB0aW0pOwogI2Vsc2UKLSAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KKyAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyAqLwogICAgIEhBTF9MUFRJTV9Nc3BJbml0KGhscHRpbSk7CiAjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgfQorCiAgIC8qIENoYW5nZSB0aGUgTFBUSU0gc3RhdGUgKi8KICAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKwogICAvKiBHZXQgdGhlIExQVElNeCBDRkdSIHZhbHVlICovCiAgIHRtcGNmZ3IgPSBobHB0aW0tPkluc3RhbmNlLT5DRkdSOwotICAKLSAgaWYgKChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlKSA9PSAgTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKQorCisgIGlmIChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlID09IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkKICAgewotICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tQT0wgfCBMUFRJTV9DRkdSX0NLRkxUKSk7CisgICAgdG1wY2ZnciAmPSAodWludDMyX3QpKH4oTFBUSU1fQ0ZHUl9DS1BPTCkpOwogICB9Ci0gIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgaWYgKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQogICB7Ci0gICAgdG1wY2ZnciAmPSAodWludDMyX3QpKH4gKExQVElNX0NGR1JfVFJHRkxUIHwgTFBUSU1fQ0ZHUl9UUklHU0VMKSk7CisgICAgdG1wY2ZnciAmPSAodWludDMyX3QpKH4oTFBUSU1fQ0ZHUl9UUklHU0VMKSk7CiAgIH0KLSAgICAKLSAgLyogQ2xlYXIgQ0tTRUwsIFBSRVNDLCBUUklHRU4sIFRSR0ZMVCwgV0FWUE9MLCBQUkVMT0FEICYgQ09VTlRNT0RFIGJpdHMgKi8KLSAgdG1wY2ZnciAmPSAodWludDMyX3QpKH4oTFBUSU1fQ0ZHUl9DS1NFTCB8IExQVElNX0NGR1JfVFJJR0VOIHwgTFBUSU1fQ0ZHUl9QUkVMT0FEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSU1fQ0ZHUl9XQVZQT0wgfCBMUFRJTV9DRkdSX1BSRVNDIHwgTFBUSU1fQ0ZHUl9DT1VOVE1PREUgKSk7Ci0gIAorICBpZiAoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9BUEJDTE9DS19MUE9TQykKKyAgeworICAgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfVFJHRkxUIHwgTFBUSU1fQ0ZHUl9DS0ZMVCkpOworICB9CisKKyAgLyogQ2xlYXIgQ0tTRUwsIENLUE9MLCBQUkVTQywgVFJJR0VOLCBUUkdGTFQsIFdBVlBPTCwgUFJFTE9BRCAmIENPVU5UTU9ERSBiaXRzICovCisgIHRtcGNmZ3IgJj0gKHVpbnQzMl90KSh+KExQVElNX0NGR1JfQ0tTRUwgfCBMUFRJTV9DRkdSX0NLUE9MIHwgTFBUSU1fQ0ZHUl9UUklHRU4gfCBMUFRJTV9DRkdSX1BSRUxPQUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRJTV9DRkdSX1dBVlBPTCB8IExQVElNX0NGR1JfUFJFU0MgfCBMUFRJTV9DRkdSX0NPVU5UTU9ERSkpOworCiAgIC8qIFNldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCiAgIHRtcGNmZ3IgfD0gKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgICAgfAogICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyIHwKICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0Lk91dHB1dFBvbGFyaXR5ICB8CiAgICAgICAgICAgICAgIGhscHRpbS0+SW5pdC5VcGRhdGVNb2RlICAgICAgfAogICAgICAgICAgICAgICBobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSk7Ci0gIAotICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UpID09ICBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pCisKKyAgLyogR2xpdGNoIGZpbHRlcnMgZm9yIGludGVybmFsIHRyaWdnZXJzIGFuZCAgZXh0ZXJuYWwgaW5wdXRzIGFyZSBjb25maWd1cmVkCisgICAqIG9ubHkgaWYgYW4gaW50ZXJuYWwgY2xvY2sgc291cmNlIGlzIHByb3ZpZGVkIHRvIHRoZSBMUFRJTQorICAgKi8KKyAgaWYgKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgPT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfQVBCQ0xPQ0tfTFBPU0MpCiAgIHsKLSAgICB0bXBjZmdyIHw9ICAoaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5Qb2xhcml0eSB8CisgICAgdG1wY2ZnciB8PSAoaGxwdGltLT5Jbml0LlRyaWdnZXIuU2FtcGxlVGltZSB8CiAgICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlVsdHJhTG93UG93ZXJDbG9jay5TYW1wbGVUaW1lKTsKLSAgfSAKLSAgCi0gIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgfQorCisgIC8qIENvbmZpZ3VyZSB0aGUgYWN0aXZlIGVkZ2Ugb3IgZWRnZXMgdXNlZCBieSB0aGUgY291bnRlciBvbmx5IGlmIExQVElNIGlzCisgICAqIGNsb2NrZWQgYnkgYW4gZXh0ZXJuYWwgY2xvY2sgc291cmNlCisgICAqLworICBpZiAoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSA9PSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pCisgIHsKKyAgICB0bXBjZmdyIHw9IChobHB0aW0tPkluaXQuVWx0cmFMb3dQb3dlckNsb2NrLlBvbGFyaXR5KTsKKyAgfQorCisgIGlmIChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKICAgewogICAgIC8qIEVuYWJsZSBFeHRlcm5hbCB0cmlnZ2VyIGFuZCBzZXQgdGhlIHRyaWdnZXIgc291cmNlICovCi0gICAgdG1wY2ZnciB8PSAoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlICAgICB8Ci0gICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuQWN0aXZlRWRnZSB8Ci0gICAgICAgICAgICAgICAgaGxwdGltLT5Jbml0LlRyaWdnZXIuU2FtcGxlVGltZSk7CisgICAgdG1wY2ZnciB8PSAoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlIHwKKyAgICAgICAgICAgICAgICBobHB0aW0tPkluaXQuVHJpZ2dlci5BY3RpdmVFZGdlKTsKICAgfQotICAKKwogICAvKiBXcml0ZSB0byBMUFRJTXggQ0ZHUiAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wY2ZncjsKIAogICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCiAgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBMUFRJTSBwZXJpcGhlcmFsLiAKKyAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZSB0aGUgTFBUSU0gcGVyaXBoZXJhbC4KICAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9EZUluaXQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBDaGVjayB0aGUgTFBUSU0gaGFuZGxlIGFsbG9jYXRpb24gKi8KLSAgaWYoaGxwdGltID09IE5VTEwpCisgIGlmIChobHB0aW0gPT0gTlVMTCkKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogQ2hhbmdlIHRoZSBMUFRJTSBzdGF0ZSAqLwogICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7Ci0gIAorCiAgIC8qIERpc2FibGUgdGhlIExQVElNIFBlcmlwaGVyYWwgQ2xvY2sgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwogCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gIGlmKGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKKyAgaWYgKGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgewogICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OwogICB9Ci0gIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCisKKyAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCiAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2soaGxwdGltKTsKICNlbHNlCiAgIC8qIERlSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlOiBDTE9DSywgTlZJQy4qLwpAQCAtMzkzLDE2ICszNzUsMTYgQEAKIAogICAvKiBDaGFuZ2UgdGhlIExQVElNIHN0YXRlICovCiAgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQ7Ci0gIAorCiAgIC8qIFJlbGVhc2UgTG9jayAqLwogICBfX0hBTF9VTkxPQ0soaGxwdGltKTsKLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBMUFRJTSBNU1AuCisgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBMUFRJTSBNU1AuCiAgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCkBAIC00MTAsMTQgKzM5MiwxNCBAQAogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobHB0aW0pOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIERlSW5pdGlhbGl6ZXMgTFBUSU0gTVNQLgorICAqIEBicmllZiAgRGVJbml0aWFsaXplIExQVElNIE1TUC4KICAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KQEAgLTQyNSw4ICs0MDcsOCBAQAogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobHB0aW0pOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fTXNwRGVJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCiB9CkBAIC00MzUsMTMgKzQxNywxMyBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgTFBUSU1fR3JvdXAyIExQVElNIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucyAKLSAqICBAYnJpZWYgICBTdGFydC1TdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMuIAorLyoqIEBkZWZncm91cCBMUFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIExQVElNIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucworICogIEBicmllZiAgIFN0YXJ0LVN0b3Agb3BlcmF0aW9uIGZ1bmN0aW9ucy4KICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAjIyMjIyBMUFRJTSBTdGFydCBTdG9wIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICAgICgrKSBTdGFydCB0aGUgUFdNIG1vZGUuCiAgICAgICAoKykgU3RvcCB0aGUgUFdNIG1vZGUuCkBAIC00NTIsMjEgKzQzNCwyMSBAQAogICAgICAgKCspIFN0YXJ0IHRoZSBFbmNvZGVyIG1vZGUuCiAgICAgICAoKykgU3RvcCB0aGUgRW5jb2RlciBtb2RlLgogICAgICAgKCspIFN0YXJ0IHRoZSBUaW1lb3V0IG1vZGUuCi0gICAgICAoKykgU3RvcCB0aGUgVGltZW91dCBtb2RlLiAgICAgIAorICAgICAgKCspIFN0b3AgdGhlIFRpbWVvdXQgbW9kZS4KICAgICAgICgrKSBTdGFydCB0aGUgQ291bnRlciBtb2RlLgogICAgICAgKCspIFN0b3AgdGhlIENvdW50ZXIgbW9kZS4KLSAgICAgIAorCiAKIEBlbmR2ZXJiYXRpbQogICAqIEB7CiAgICovCi0gICAgCisKIC8qKgotICAqIEBicmllZiAgU3RhcnRzIHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbi4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBQZXJpb2QgIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KLSAgKiBAcGFyYW0gIFB1bHNlICBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTQ3Niw2MSArNDU4LDg0IEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBQV00gbW9kZSAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKLSAgCisKKyAgLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU1fQVJSIHJlZ2lzdGVyICovCisgIGlmIChMUFRJTV9XYWl0Rm9yRmxhZyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spID09IEhBTF9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSyk7CisKICAgLyogTG9hZCB0aGUgcHVsc2UgdmFsdWUgaW4gdGhlIGNvbXBhcmUgcmVnaXN0ZXIgKi8KICAgX19IQUxfTFBUSU1fQ09NUEFSRV9TRVQoaGxwdGltLCBQdWxzZSk7Ci0gIAorCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0NNUCByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLwogICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7Ci0gICAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24uCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fUFdNX1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKIAorICBpZiAoSEFMX0xQVElNX0dldFN0YXRlKGhscHRpbSkgPT0gSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gUFdNIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYKLSAgKiBAcGFyYW0gIFB1bHNlICBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwpAQCAtNTQwLDk5ICs1NDUsMTMzIEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIFJlc2V0IFdBVkUgYml0IHRvIHNldCBQV00gbW9kZSAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1dBVkU7Ci0gIAorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0NNUCByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7Ci0gIAorCiAgIC8qIEVuYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7Ci0gIAorCiAgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKLSAgCisKICAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOwotICAKKwogICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLwotICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQogICB7CiAgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCiAgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7Ci0gIH0gIAotICAKKyAgfQorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCi0gIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7Ci0gIAotICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKLSAgCisKICAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCiAgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKLSAgICAKKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0b3BzIHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBQV00gZ2VuZXJhdGlvbiBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9QV01fU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwotICAKLSAgICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisKKyAgaWYgKEhBTF9MUFRJTV9HZXRTdGF0ZShobHB0aW0pID09IEhBTF9MUFRJTV9TVEFURV9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOwotICAKKwogICAvKiBEaXNhYmxlIENvbXBhcmUgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7Ci0gIAorCiAgIC8qIERpc2FibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk0pOwotICAKKwogICAvKiBEaXNhYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKLSAgCisKICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBkaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCi0gIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSAgTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKKyAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9IExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCiAgIHsKICAgICAvKiBEaXNhYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCiAgICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOwotICB9ICAKKyAgfQogCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RhcnRzIHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbi4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBQZXJpb2QgIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KLSAgKiBAcGFyYW0gIFB1bHNlICBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTY0Miw2MSArNjgxLDg0IEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgb25lIHB1bHNlIG1vZGUgKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOwotICAKKwogICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7Ci0gIAorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworCiAgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLwogICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7Ci0gIAorCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworCiAgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOwotICAKLSAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisKKyAgLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU1fQ01QIHJlZ2lzdGVyICovCisgIGlmIChMUFRJTV9XYWl0Rm9yRmxhZyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spID09IEhBTF9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLwogICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKLSAgICAKKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0b3BzIHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbi4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBPbmUgcHVsc2UgZ2VuZXJhdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9PbmVQdWxzZV9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgICAgICAgICAgICAgIAorCiAgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CiAKKyAgaWYgKEhBTF9MUFRJTV9HZXRTdGF0ZShobHB0aW0pID09IEhBTF9MUFRJTV9TVEFURV9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIE9uZSBwdWxzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKLSAgKiBAcGFyYW0gIFBlcmlvZCAgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgorICAqIEBicmllZiAgU3RhcnQgdGhlIExQVElNIE9uZSBwdWxzZSBnZW5lcmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgotICAqIEBwYXJhbSAgUHVsc2UgIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KKyAgKiBAcGFyYW0gIFB1bHNlIFNwZWNpZmllcyB0aGUgY29tcGFyZSB2YWx1ZS4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwpAQCAtNzA2LDk5ICs3NjgsMTMzIEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBSZXNldCBXQVZFIGJpdCB0byBzZXQgb25lIHB1bHNlIG1vZGUgKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9XQVZFOwotICAKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKKyAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKKworICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9BUlIgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKTsKKworICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLworICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKKworICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9DTVAgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKKworICBpZiAoSEFMX0xQVElNX0dldFN0YXRlKGhscHRpbSkgPT0gSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBFbmFibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJST0spOwotICAKKwogICAvKiBFbmFibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOwotICAKKwogICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7Ci0gIAorCiAgIC8qIEVuYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKLSAgCisKICAgLyogSWYgZXh0ZXJuYWwgdHJpZ2dlciBzb3VyY2UgaXMgdXNlZCwgdGhlbiBlbmFibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KLSAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKICAgewogICAgIC8qIEVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLwogICAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0VYVFRSSUcpOwogICB9Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCi0gIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7Ci0gIAotICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKLSAgCi0gIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworCisgIC8qIFN0YXJ0IHRpbWVyIGluIHNpbmdsZSAob25lIHNob3QpIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKGhscHRpbSk7Ci0gICAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQorICAqIEBicmllZiAgU3RvcCB0aGUgTFBUSU0gT25lIHB1bHNlIGdlbmVyYXRpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fT25lUHVsc2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwotICAKKworICBpZiAoSEFMX0xQVElNX0dldFN0YXRlKGhscHRpbSkgPT0gSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7Ci0gIAorCiAgIC8qIERpc2FibGUgQ29tcGFyZSB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE9LKTsKLSAgCisKICAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7Ci0gIAorCiAgIC8qIERpc2FibGUgQ29tcGFyZSBtYXRjaCBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOwotICAKKwogICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGRpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KLSAgaWYgKChobHB0aW0tPkluaXQuVHJpZ2dlci5Tb3VyY2UpICE9ICBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQorICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gTFBUSU1fVFJJR1NPVVJDRV9TT0ZUV0FSRSkKICAgewogICAgIC8qIERpc2FibGUgZXh0ZXJuYWwgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KICAgICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7CiAgIH0KLSAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIGluIFNldCBvbmNlIG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gaW4gU2V0IG9uY2UgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KLSAgKiBAcGFyYW0gIFB1bHNlICBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTgwOCw2MSArOTA0LDg0IEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShQdWxzZSkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBTZXQgV0FWRSBiaXQgdG8gZW5hYmxlIHRoZSBzZXQgb25jZSBtb2RlICovCiAgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9XQVZFOwotICAKKwogICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7Ci0gIAorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworCiAgIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLwogICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7Ci0gIAorCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworCiAgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOwotICAKLSAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCisKKyAgLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU1fQ01QIHJlZ2lzdGVyICovCisgIGlmIChMUFRJTV9XYWl0Rm9yRmxhZyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spID09IEhBTF9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogU3RhcnQgdGltZXIgaW4gc2luZ2xlIChvbmUgc2hvdCkgbW9kZSAqLwogICBfX0hBTF9MUFRJTV9TVEFSVF9TSU5HTEUoaGxwdGltKTsKLSAgICAKKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0b3BzIHRoZSBMUFRJTSBTZXQgb25jZSBtb2RlLgotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIExQVElNIFNldCBvbmNlIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fU2V0T25jZV9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgICAgICAgICAgICAgIAorCiAgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CiAKKyAgaWYgKEhBTF9MUFRJTV9HZXRTdGF0ZShobHB0aW0pID09IEhBTF9MUFRJTV9TVEFURV9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIExQVElNIFNldCBvbmNlIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KLSAgKiBAcGFyYW0gIFB1bHNlICBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCisgICogQHBhcmFtICBQdWxzZSBTcGVjaWZpZXMgdGhlIGNvbXBhcmUgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTg3MiwxMDMgKzk5MSwxMzcgQEAKICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BFUklPRChQZXJpb2QpKTsKICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX1BVTFNFKFB1bHNlKSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIFNldCBXQVZFIGJpdCB0byBlbmFibGUgdGhlIHNldCBvbmNlIG1vZGUgKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1dBVkU7Ci0gIAorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIENsZWFyIGZsYWcgKi8KKyAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spOworCisgIC8qIExvYWQgdGhlIHB1bHNlIHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCisgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgUHVsc2UpOworCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0NNUCByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7Ci0gIAorCiAgIC8qIEVuYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBPSyk7Ci0gIAorCiAgIC8qIEVuYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKLSAgCisKICAgLyogRW5hYmxlIENvbXBhcmUgbWF0Y2ggaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0NNUE0pOwotICAKKwogICAvKiBJZiBleHRlcm5hbCB0cmlnZ2VyIHNvdXJjZSBpcyB1c2VkLCB0aGVuIGVuYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLwotICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQogICB7CiAgICAgLyogRW5hYmxlIGV4dGVybmFsIHRyaWdnZXIgaW50ZXJydXB0ICovCiAgICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRyk7Ci0gIH0gIAotICAKKyAgfQorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCi0gIC8qIExvYWQgdGhlIHBlcmlvZCB2YWx1ZSBpbiB0aGUgYXV0b3JlbG9hZCByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9BVVRPUkVMT0FEX1NFVChobHB0aW0sIFBlcmlvZCk7Ci0gIAotICAvKiBMb2FkIHRoZSBwdWxzZSB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLwotICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFB1bHNlKTsKLSAgCi0gIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLworCisgIC8qIFN0YXJ0IHRpbWVyIGluIHNpbmdsZSAob25lIHNob3QpIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfU0lOR0xFKGhscHRpbSk7Ci0gICAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgTFBUSU0gU2V0IG9uY2UgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBTdG9wIHRoZSBMUFRJTSBTZXQgb25jZSBtb2RlIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1NldE9uY2VfU3RvcF9JVChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwogCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIERpc2FibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKLSAgCisKICAgLyogRGlzYWJsZSBDb21wYXJlIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QT0spOwotICAKKwogICAvKiBEaXNhYmxlIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJNKTsKLSAgCisKICAgLyogRGlzYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7Ci0gIAorCiAgIC8qIElmIGV4dGVybmFsIHRyaWdnZXIgc291cmNlIGlzIHVzZWQsIHRoZW4gZGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLwotICBpZiAoKGhscHRpbS0+SW5pdC5UcmlnZ2VyLlNvdXJjZSkgIT0gIExQVElNX1RSSUdTT1VSQ0VfU09GVFdBUkUpCisgIGlmICgoaGxwdGltLT5Jbml0LlRyaWdnZXIuU291cmNlKSAhPSBMUFRJTV9UUklHU09VUkNFX1NPRlRXQVJFKQogICB7CiAgICAgLyogRGlzYWJsZSBleHRlcm5hbCB0cmlnZ2VyIGludGVycnVwdCAqLwogICAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKTsKLSAgfSAKLSAgCisgIH0KKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdGFydChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0sIHVpbnQzMl90IFBlcmlvZCkKIHsKLSAgdWludDMyX3QgdG1wY2ZnciA9IDA7CisgIHVpbnQzMl90ICAgICAgICAgIHRtcGNmZ3I7CiAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKQEAgLTk3OCw3ICsxMTMxLDcgQEAKICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKIAogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CiAKICAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLwogICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKQEAgLTk5OCw1NSArMTE1MSw2OSBAQAogICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CiAKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKIAorICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9BUlIgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOwogCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwogCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQorICAqIEBicmllZiAgU3RvcCB0aGUgRW5jb2RlciBpbnRlcmZhY2UuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgICAgICAgICAgICAgIAorCiAgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7Ci0gIAorCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIFJlc2V0IEVOQyBiaXQgdG8gZGlzYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9FTkM7Ci0gIAorCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RhcnRzIHRoZSBFbmNvZGVyIGludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBQZXJpb2QgIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBFbmNvZGVyIGludGVyZmFjZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9FbmNvZGVyX1N0YXJ0X0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgdWludDMyX3QgUGVyaW9kKQogewotICB1aW50MzJfdCB0bXBjZmdyID0gMDsKKyAgdWludDMyX3QgICAgICAgICAgdG1wY2ZncjsKIAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwpAQCAtMTA1Niw4ICsxMjIzLDggQEAKICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BPTEFSSVRZKGhscHRpbS0+SW5pdC5VbHRyYUxvd1Bvd2VyQ2xvY2suUG9sYXJpdHkpKTsKIAogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIENvbmZpZ3VyZSBlZGdlIHNlbnNpdGl2aXR5IGZvciBlbmNvZGVyIG1vZGUgKi8KICAgLyogR2V0IHRoZSBMUFRJTXggQ0ZHUiB2YWx1ZSAqLwogICB0bXBjZmdyID0gaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUjsKQEAgLTEwNzQsNjggKzEyNDEsOTMgQEAKICAgLyogU2V0IEVOQyBiaXQgdG8gZW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSIHw9IExQVElNX0NGR1JfRU5DOwogCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKTsKKworICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KKyAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOworCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIEVuYWJsZSAic3dpdGNoIHRvIGRvd24gZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfRE9XTik7CiAKICAgLyogRW5hYmxlICJzd2l0Y2ggdG8gdXAgZGlyZWN0aW9uIiBpbnRlcnJ1cHQgKi8KLSAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfVVApOyAgCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX1VQKTsKIAogICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CiAKLSAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCi0gIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKLQogICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOwogCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwogCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgRW5jb2RlciBpbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQorICAqIEBicmllZiAgU3RvcCB0aGUgRW5jb2RlciBpbnRlcmZhY2UgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fRW5jb2Rlcl9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgICAgICAgICAgICAgIAorCiAgIC8qIFNldCB0aGUgTFBUSU0gc3RhdGUgKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX0JVU1k7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7Ci0gIAorCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIFJlc2V0IEVOQyBiaXQgdG8gZGlzYWJsZSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiAmPSB+TFBUSU1fQ0ZHUl9FTkM7Ci0gIAorCiAgIC8qIERpc2FibGUgInN3aXRjaCB0byBkb3duIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9ET1dOKTsKLSAgCisKICAgLyogRGlzYWJsZSAic3dpdGNoIHRvIHVwIGRpcmVjdGlvbiIgaW50ZXJydXB0ICovCi0gIF9fSEFMX0xQVElNX0RJU0FCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9VUCk7IAotICAKKyAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX1VQKTsKKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0YXJ0cyB0aGUgVGltZW91dCBmdW5jdGlvbi4gVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUKLSAgKiAgICAgICAgIHRpbWVyLCBhbnkgc3VjY2Vzc2l2ZSB0cmlnZ2VyIGV2ZW50IHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIgYW5kCi0gICogICAgICAgICB0aGUgdGltZXIgcmVzdGFydHMuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgVGltZW91dCBmdW5jdGlvbi4KKyAgKiBAbm90ZSAgIFRoZSBmaXJzdCB0cmlnZ2VyIGV2ZW50IHdpbGwgc3RhcnQgdGhlIHRpbWVyLCBhbnkgc3VjY2Vzc2l2ZQorICAqICAgICAgICAgdHJpZ2dlciBldmVudCB3aWxsIHJlc2V0IHRoZSBjb3VudGVyIGFuZCB0aGUgdGltZXIgcmVzdGFydHMuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCi0gICogQHBhcmFtICBUaW1lb3V0ICBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzdCB0aGUgY291bnRlci4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmaWVzIHRoZSBUaW1lT3V0IHZhbHVlIHRvIHJlc2V0IHRoZSBjb3VudGVyLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xMTQ1LDY2ICsxMzM3LDg5IEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShUaW1lb3V0KSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogU2V0IFRJTU9VVCBiaXQgdG8gZW5hYmxlIHRoZSB0aW1lb3V0IGZ1bmN0aW9uICovCiAgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgfD0gTFBUSU1fQ0ZHUl9USU1PVVQ7Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKLSAgCisKKyAgLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU1fQVJSIHJlZ2lzdGVyICovCisgIGlmIChMUFRJTV9XYWl0Rm9yRmxhZyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spID09IEhBTF9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSyk7CisKICAgLyogTG9hZCB0aGUgVGltZW91dCB2YWx1ZSBpbiB0aGUgY29tcGFyZSByZWdpc3RlciAqLwogICBfX0hBTF9MUFRJTV9DT01QQVJFX1NFVChobHB0aW0sIFRpbWVvdXQpOwotICAKKworICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9DTVAgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOwotICAgIAorCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RvcHMgdGhlIFRpbWVvdXQgZnVuY3Rpb24uCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQorICAqIEBicmllZiAgU3RvcCB0aGUgVGltZW91dCBmdW5jdGlvbi4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9UaW1lT3V0X1N0b3AoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworCiAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwotICAKKworICBpZiAoSEFMX0xQVElNX0dldFN0YXRlKGhscHRpbSkgPT0gSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBSZXNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1RJTU9VVDsKLSAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIFRpbWVvdXQgZnVuY3Rpb24gaW4gaW50ZXJydXB0IG1vZGUuIFRoZSBmaXJzdCB0cmlnZ2VyIAotICAqICAgICAgICAgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlIHRyaWdnZXIgZXZlbnQgd2lsbCByZXNldAotICAqICAgICAgICAgdGhlIGNvdW50ZXIgYW5kIHRoZSB0aW1lciByZXN0YXJ0cy4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBQZXJpb2QgIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBUaW1lb3V0IGZ1bmN0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgVGhlIGZpcnN0IHRyaWdnZXIgZXZlbnQgd2lsbCBzdGFydCB0aGUgdGltZXIsIGFueSBzdWNjZXNzaXZlCisgICogICAgICAgICB0cmlnZ2VyIGV2ZW50IHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIgYW5kIHRoZSB0aW1lciByZXN0YXJ0cy4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gIFBlcmlvZCBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KLSAgKiBAcGFyYW0gIFRpbWVvdXQgIFNwZWNpZmllcyB0aGUgVGltZU91dCB2YWx1ZSB0byByZXN0IHRoZSBjb3VudGVyLgorICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZpZXMgdGhlIFRpbWVPdXQgdmFsdWUgdG8gcmVzZXQgdGhlIGNvdW50ZXIuCiAgICogICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwMDAgYW5kIDB4RkZGRi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTEyMTQsODAgKzE0MjksMTEyIEBACiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShobHB0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QRVJJT0QoUGVyaW9kKSk7CiAgIGFzc2VydF9wYXJhbShJU19MUFRJTV9QVUxTRShUaW1lb3V0KSk7Ci0gICAgICAgICAgICAgICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX0JVU1k7CisKICAgLyogRW5hYmxlIEVYVEkgTGluZSBpbnRlcnJ1cHQgb24gdGhlIExQVElNIFdha2UtdXAgVGltZXIgKi8KLSAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKTsgCi0gIAorICBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOwogICAvKiBFbmFibGUgcmlzaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBFeHRpIGxpbmUgKi8KICAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfUklTSU5HX0VER0UoKTsKLSAKKwogICAvKiBTZXQgVElNT1VUIGJpdCB0byBlbmFibGUgdGhlIHRpbWVvdXQgZnVuY3Rpb24gKi8KICAgaGxwdGltLT5JbnN0YW5jZS0+Q0ZHUiB8PSBMUFRJTV9DRkdSX1RJTU9VVDsKLSAgCi0gIC8qIEVuYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLwotICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKLSAgCisKICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOwotICAKKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKTsKKwogICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KICAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOwotICAKKworICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9BUlIgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKTsKKwogICAvKiBMb2FkIHRoZSBUaW1lb3V0IHZhbHVlIGluIHRoZSBjb21wYXJlIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0NPTVBBUkVfU0VUKGhscHRpbSwgVGltZW91dCk7Ci0gIAorCisgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0NNUCByZWdpc3RlciAqLworICBpZiAoTFBUSU1fV2FpdEZvckZsYWcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKSA9PSBIQUxfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOworCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCisgIC8qIEVuYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLworICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9DTVBNKTsKKworICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFKGhscHRpbSk7CisKICAgLyogU3RhcnQgdGltZXIgaW4gY29udGludW91cyBtb2RlICovCiAgIF9fSEFMX0xQVElNX1NUQVJUX0NPTlRJTlVPVVMoaGxwdGltKTsKLSAgICAKKwogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFN0b3BzIHRoZSBUaW1lb3V0IGZ1bmN0aW9uIGluIGludGVycnVwdCBtb2RlLgotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIFRpbWVvdXQgZnVuY3Rpb24gaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVGltZU91dF9TdG9wX0lUKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCi0gIC8qIERpc2FibGUgcmlzaW5nIGVkZ2UgdHJpZ2dlciBvbiB0aGUgTFBUSU0gV2FrZS11cCBUaW1lciBFeHRpIGxpbmUgKi8gCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgLyogRGlzYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyIEV4dGkgbGluZSAqLwogICBfX0hBTF9MUFRJTV9XQUtFVVBUSU1FUl9FWFRJX0RJU0FCTEVfUklTSU5HX0VER0UoKTsKLSAgCisKICAgLyogRGlzYWJsZSBFWFRJIExpbmUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyICovCi0gIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9JVCgpOyAKLSAgCisgIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9JVCgpOworCiAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRShobHB0aW0pOwotICAKKworICBpZiAoSEFMX0xQVElNX0dldFN0YXRlKGhscHRpbSkgPT0gSEFMX0xQVElNX1NUQVRFX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBSZXNldCBUSU1PVVQgYml0IHRvIGVuYWJsZSB0aGUgdGltZW91dCBmdW5jdGlvbiAqLwogICBobHB0aW0tPkluc3RhbmNlLT5DRkdSICY9IH5MUFRJTV9DRkdSX1RJTU9VVDsKLSAgCisKICAgLyogRGlzYWJsZSBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQ01QTSk7Ci0gIAorCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RhcnRzIHRoZSBDb3VudGVyIG1vZGUuCi0gICogQHBhcmFtICBobHB0aW0gIExQVElNIGhhbmRsZQotICAqIEBwYXJhbSAgUGVyaW9kICBTcGVjaWZpZXMgdGhlIEF1dG9yZWxvYWQgdmFsdWUuCisgICogQGJyaWVmICBTdGFydCB0aGUgQ291bnRlciBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQorICAqIEBwYXJhbSAgUGVyaW9kIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAwMCBhbmQgMHhGRkZGLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwpAQCAtMTI5NiwxMiArMTU0MywxMiBAQAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBJZiBjbG9jayBzb3VyY2UgaXMgbm90IFVMUFRJTSBjbG9jayBhbmQgY291bnRlciBzb3VyY2UgaXMgZXh0ZXJuYWwsIHRoZW4gaXQgbXVzdCBub3QgYmUgcHJlc2NhbGVkICovCi0gIGlmKChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlICE9IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkgJiYgKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlID09IExQVElNX0NPVU5URVJTT1VSQ0VfRVhURVJOQUwpKQorICBpZiAoKGhscHRpbS0+SW5pdC5DbG9jay5Tb3VyY2UgIT0gTFBUSU1fQ0xPQ0tTT1VSQ0VfVUxQVElNKSAmJiAoaGxwdGltLT5Jbml0LkNvdW50ZXJTb3VyY2UgPT0gTFBUSU1fQ09VTlRFUlNPVVJDRV9FWFRFUk5BTCkpCiAgIHsKICAgICAvKiBDaGVjayBpZiBjbG9jayBpcyBwcmVzY2FsZWQgKi8KICAgICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSRElWMShobHB0aW0tPkluaXQuQ2xvY2suUHJlc2NhbGVyKSk7CkBAIC0xMzExLDQ3ICsxNTU4LDYxIEBACiAKICAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOwotICAKKworICAvKiBDbGVhciBmbGFnICovCisgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKTsKKwogICAvKiBMb2FkIHRoZSBwZXJpb2QgdmFsdWUgaW4gdGhlIGF1dG9yZWxvYWQgcmVnaXN0ZXIgKi8KICAgX19IQUxfTFBUSU1fQVVUT1JFTE9BRF9TRVQoaGxwdGltLCBQZXJpb2QpOwotICAKKworICAvKiBXYWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZSBMUFRJTV9BUlIgcmVnaXN0ZXIgKi8KKyAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgPT0gSEFMX1RJTUVPVVQpCisgIHsKKyAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CisgIH0KKwogICAvKiBTdGFydCB0aW1lciBpbiBjb250aW51b3VzIG1vZGUgKi8KICAgX19IQUxfTFBUSU1fU1RBUlRfQ09OVElOVU9VUyhobHB0aW0pOwotICAgIAorCiAgIC8qIENoYW5nZSB0aGUgVElNIHN0YXRlKi8KLSAgaGxwdGltLT5TdGF0ZT0gSEFMX0xQVElNX1NUQVRFX1JFQURZOwotICAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RvcHMgdGhlIENvdW50ZXIgbW9kZS4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBTdG9wIHRoZSBDb3VudGVyIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fQ291bnRlcl9TdG9wKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKwogICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX0xQVElNX0RJU0FCTEUoaGxwdGltKTsKLSAgCisKKyAgaWYgKEhBTF9MUFRJTV9HZXRTdGF0ZShobHB0aW0pID09IEhBTF9MUFRJTV9TVEFURV9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdGFydHMgdGhlIENvdW50ZXIgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCi0gICogQHBhcmFtICBQZXJpb2QgIFNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCB2YWx1ZS4KKyAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBDb3VudGVyIG1vZGUgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCisgICogQHBhcmFtICBQZXJpb2QgU3BlY2lmaWVzIHRoZSBBdXRvcmVsb2FkIHZhbHVlLgogICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMDAwIGFuZCAweEZGRkYuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xMzYwLDc4ICsxNjIxLDEwMCBAQAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fUEVSSU9EKFBlcmlvZCkpOwotICAgICAgICAgICAgICAgCisKICAgLyogU2V0IHRoZSBMUFRJTSBzdGF0ZSAqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfQlVTWTsKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwogCiAgIC8qIEVuYWJsZSBFWFRJIExpbmUgaW50ZXJydXB0IG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyICovCi0gIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7IAotICAKKyAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9FTkFCTEVfSVQoKTsKICAgLyogRW5hYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIExQVElNIFdha2UtdXAgVGltZXIgRXh0aSBsaW5lICovCi0gIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7ICAKLSAgCisgIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CisKICAgLyogSWYgY2xvY2sgc291cmNlIGlzIG5vdCBVTFBUSU0gY2xvY2sgYW5kIGNvdW50ZXIgc291cmNlIGlzIGV4dGVybmFsLCB0aGVuIGl0IG11c3Qgbm90IGJlIHByZXNjYWxlZCAqLwotICBpZigoaGxwdGltLT5Jbml0LkNsb2NrLlNvdXJjZSAhPSBMUFRJTV9DTE9DS1NPVVJDRV9VTFBUSU0pICYmIChobHB0aW0tPkluaXQuQ291bnRlclNvdXJjZSA9PSBMUFRJTV9DT1VOVEVSU09VUkNFX0VYVEVSTkFMKSkKKyAgaWYgKChobHB0aW0tPkluaXQuQ2xvY2suU291cmNlICE9IExQVElNX0NMT0NLU09VUkNFX1VMUFRJTSkgJiYgKGhscHRpbS0+SW5pdC5Db3VudGVyU291cmNlID09IExQVElNX0NPVU5URVJTT1VSQ0VfRVhURVJOQUwpKQogICB7CiAgICAgLyogQ2hlY2sgaWYgY2xvY2sgaXMgcHJlc2NhbGVkICovCiAgICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0NMT0NLX1BSRVNDQUxFUkRJVjEoaGxwdGltLT5Jbml0LkNsb2NrLlByZXNjYWxlcikpOwogICAgIC8qIFNldCBjbG9jayBwcmVzY2FsZXIgdG8gMCAqLwogICAgIGhscHRpbS0+SW5zdGFuY2UtPkNGR1IgJj0gfkxQVElNX0NGR1JfUFJFU0M7CiAgIH0KLSAgCi0gIC8qIEVuYWJsZSBBdXRvcmVsb2FkIHdyaXRlIGNvbXBsZXRlIGludGVycnVwdCAqLwotICBfX0hBTF9MUFRJTV9FTkFCTEVfSVQoaGxwdGltLCBMUFRJTV9JVF9BUlJPSyk7Ci0gIAotICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KLSAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7Ci0gIAorCiAgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9FTkFCTEUoaGxwdGltKTsKLSAgCisKKyAgLyogQ2xlYXIgZmxhZyAqLworICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSyk7CisKICAgLyogTG9hZCB0aGUgcGVyaW9kIHZhbHVlIGluIHRoZSBhdXRvcmVsb2FkIHJlZ2lzdGVyICovCiAgIF9fSEFMX0xQVElNX0FVVE9SRUxPQURfU0VUKGhscHRpbSwgUGVyaW9kKTsKLSAgCisKKyAgLyogV2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUgTFBUSU1fQVJSIHJlZ2lzdGVyICovCisgIGlmIChMUFRJTV9XYWl0Rm9yRmxhZyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spID09IEhBTF9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7CisKKyAgaWYgKEhBTF9MUFRJTV9HZXRTdGF0ZShobHB0aW0pID09IEhBTF9MUFRJTV9TVEFURV9USU1FT1VUKQorICB7CisgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICB9CisKKyAgLyogRW5hYmxlIEF1dG9yZWxvYWQgd3JpdGUgY29tcGxldGUgaW50ZXJydXB0ICovCisgIF9fSEFMX0xQVElNX0VOQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKKworICAvKiBFbmFibGUgQXV0b3JlbG9hZCBtYXRjaCBpbnRlcnJ1cHQgKi8KKyAgX19IQUxfTFBUSU1fRU5BQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7CisKKyAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCisgIF9fSEFMX0xQVElNX0VOQUJMRShobHB0aW0pOworCiAgIC8qIFN0YXJ0IHRpbWVyIGluIGNvbnRpbnVvdXMgbW9kZSAqLwogICBfX0hBTF9MUFRJTV9TVEFSVF9DT05USU5VT1VTKGhscHRpbSk7Ci0gICAgCisKICAgLyogQ2hhbmdlIHRoZSBUSU0gc3RhdGUqLwotICBobHB0aW0tPlN0YXRlPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7Ci0gIAorICBobHB0aW0tPlN0YXRlID0gSEFMX0xQVElNX1NUQVRFX1JFQURZOworCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCi0gICogQGJyaWVmICBTdG9wcyB0aGUgQ291bnRlciBtb2RlIGluIGludGVycnVwdCBtb2RlLgotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKKyAgKiBAYnJpZWYgIFN0b3AgdGhlIENvdW50ZXIgbW9kZSBpbiBpbnRlcnJ1cHQgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9Db3VudGVyX1N0b3BfSVQoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAKKwogICAvKiBTZXQgdGhlIExQVElNIHN0YXRlICovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9CVVNZOwotICAKLSAgLyogRGlzYWJsZSByaXNpbmcgZWRnZSB0cmlnZ2VyIG9uIHRoZSBMUFRJTSBXYWtlLXVwIFRpbWVyIEV4dGkgbGluZSAqLyAKKyAgaGxwdGltLT5TdGF0ZSA9IEhBTF9MUFRJTV9TVEFURV9CVVNZOworICAvKiBEaXNhYmxlIHJpc2luZyBlZGdlIHRyaWdnZXIgb24gdGhlIExQVElNIFdha2UtdXAgVGltZXIgRXh0aSBsaW5lICovCiAgIF9fSEFMX0xQVElNX1dBS0VVUFRJTUVSX0VYVElfRElTQUJMRV9SSVNJTkdfRURHRSgpOwotICAKKwogICAvKiBEaXNhYmxlIEVYVEkgTGluZSBpbnRlcnJ1cHQgb24gdGhlIExQVElNIFdha2UtdXAgVGltZXIgKi8KLSAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCk7IAotICAKKyAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9ESVNBQkxFX0lUKCk7CisKICAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFKGhscHRpbSk7Ci0gIAorCisgIGlmIChIQUxfTFBUSU1fR2V0U3RhdGUoaGxwdGltKSA9PSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVCkKKyAgeworICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgfQorCiAgIC8qIERpc2FibGUgQXV0b3JlbG9hZCB3cml0ZSBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KICAgX19IQUxfTFBUSU1fRElTQUJMRV9JVChobHB0aW0sIExQVElNX0lUX0FSUk9LKTsKLSAgCisKICAgLyogRGlzYWJsZSBBdXRvcmVsb2FkIG1hdGNoIGludGVycnVwdCAqLwogICBfX0hBTF9MUFRJTV9ESVNBQkxFX0lUKGhscHRpbSwgTFBUSU1fSVRfQVJSTSk7Ci0gIAogICAvKiBDaGFuZ2UgdGhlIFRJTSBzdGF0ZSovCi0gIGhscHRpbS0+U3RhdGU9IEhBTF9MUFRJTV9TVEFURV9SRUFEWTsKLSAgCisgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfUkVBRFk7CisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gSEFMX09LOwogfQpAQCAtMTQ0MCwxMyArMTcyMywxMyBAQAogICAqIEB9CiAgICovCiAKLS8qKiBAZGVmZ3JvdXAgTFBUSU1fR3JvdXAzIExQVElNIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucyAKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBMUFRJTSBSZWFkIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucy4KICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICMjIyMjIExQVElNIFJlYWQgb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBMUFRJTSBSZWFkaW5nIGZ1bmN0aW9ucy4KICAgICAgICgrKSBSZWFkIHRoZSBjb3VudGVyIHZhbHVlLgogICAgICAgKCspIFJlYWQgdGhlIHBlcmlvZCAoQXV0by1yZWxvYWQpIHZhbHVlLgpAQCAtMTQ1Niw0MSArMTczOSw0MSBAQAogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VycmVudCBjb3VudGVyIHZhbHVlLgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUuCiAgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBDb3VudGVyIHZhbHVlLgogICAqLwogdWludDMyX3QgSEFMX0xQVElNX1JlYWRDb3VudGVyKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAKKwogICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkNOVCk7CiB9CiAKIC8qKgotICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm4gdGhlIGN1cnJlbnQgQXV0b3JlbG9hZCAoUGVyaW9kKSB2YWx1ZS4KKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBBdXRvcmVsb2FkIChQZXJpb2QpIHZhbHVlLgogICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgQXV0b3JlbG9hZCB2YWx1ZS4KICAgKi8KIHVpbnQzMl90IEhBTF9MUFRJTV9SZWFkQXV0b1JlbG9hZChMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCiB7Ci0gICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKGhscHRpbS0+SW5zdGFuY2UpKTsKLSAgCisKICAgcmV0dXJuIChobHB0aW0tPkluc3RhbmNlLT5BUlIpOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJuIHRoZSBjdXJyZW50IENvbXBhcmUgKFB1bHNlKSB2YWx1ZS4KKyAgKiBAYnJpZWYgIFJldHVybiB0aGUgY3VycmVudCBDb21wYXJlIChQdWxzZSkgdmFsdWUuCiAgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBDb21wYXJlIHZhbHVlLgogICAqLwogdWludDMyX3QgSEFMX0xQVElNX1JlYWRDb21wYXJlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKLSAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoaGxwdGltLT5JbnN0YW5jZSkpOwotICAKKwogICByZXR1cm4gKGhscHRpbS0+SW5zdGFuY2UtPkNNUCk7CiB9CiAKQEAgLTE0OTgsMzM5ICsxNzgxLDM1NSBAQAogICAqIEB9CiAgICovCiAKLQotCi0vKiogQGRlZmdyb3VwIExQVElNX0dyb3VwNCBMUFRJTSBJUlEgaGFuZGxlciAKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBMUFRJTSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzCiAgKiAgQGJyaWVmICBMUFRJTSAgSVJRIGhhbmRsZXIuCiAgKgotQHZlcmJhdGltICAgCitAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgTFBUSU0gSVJRIGhhbmRsZXIgICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCi1bLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgTFBUSU0gSVJRIGhhbmRsZXIgZnVuY3Rpb24uCisgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgTFBUSU0gSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcyAgIyMjIyMKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgTFBUSU0gSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucyBjYWxsZWQgd2l0aGluCisgICAgICB0aGUgSVJRIGhhbmRsZXI6CisgICAoKykgTFBUSU0gaW50ZXJydXB0IHJlcXVlc3QgaGFuZGxlcgorICAgKCspIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sKKyAgICgrKSBBdXRvLXJlbG9hZCBtYXRjaCBDYWxsYmFjaworICAgKCspIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrCisgICAoKykgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjaworICAgKCspIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrCisgICAoKykgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjaworICAgKCspIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjawogCiBAZW5kdmVyYmF0aW0KICAgKiBAewogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBMUFRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KKyAgKiBAYnJpZWYgIEhhbmRsZSBMUFRJTSBpbnRlcnJ1cHQgcmVxdWVzdC4KICAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX0xQVElNX0lSUUhhbmRsZXIoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBDb21wYXJlIG1hdGNoIGludGVycnVwdCAqLwotICBpZihfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QTSkgIT0gUkVTRVQpCi0JewotICAgIGlmKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9DTVBNKSAhPVJFU0VUKQotCQl7CisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QTSkgIT0gUkVTRVQpCisgIHsKKyAgICBpZiAoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX0NNUE0pICE9IFJFU0VUKQorICAgIHsKICAgICAgIC8qIENsZWFyIENvbXBhcmUgbWF0Y2ggZmxhZyAqLwogICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QTSk7CisKICAgICAgIC8qIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgIGhscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2soaGxwdGltKTsKICNlbHNlCi0gICAgICBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2soaGxwdGltKTsgICAgICAKKyAgICAgIEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjayhobHB0aW0pOwogI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgfQogICB9Ci0gIAorCiAgIC8qIEF1dG9yZWxvYWQgbWF0Y2ggaW50ZXJydXB0ICovCi0gIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKSAhPSBSRVNFVCkKLQl7Ci0gICAgaWYoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX0FSUk0pICE9UkVTRVQpCi0JCXsKKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJSTSkgIT0gUkVTRVQpCisgICAgewogICAgICAgLyogQ2xlYXIgQXV0b3JlbG9hZCBtYXRjaCBmbGFnICovCiAgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJNKTsKKwogICAgICAgLyogQXV0b3JlbG9hZCBtYXRjaCBDYWxsYmFjayAqLwogI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOwogI2Vsc2UKLSAgICAgIEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayhobHB0aW0pOyAgICAgIAorICAgICAgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrKGhscHRpbSk7CiAjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9CiAgIH0KLSAgCisKICAgLyogVHJpZ2dlciBkZXRlY3RlZCBpbnRlcnJ1cHQgKi8KLSAgaWYoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0VYVFRSSUcpICE9IFJFU0VUKQotCXsKLSAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfRVhUVFJJRykgIT1SRVNFVCkKLQkJeworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0VYVFRSSUcpICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9FWFRUUklHKSAhPSBSRVNFVCkKKyAgICB7CiAgICAgICAvKiBDbGVhciBUcmlnZ2VyIGRldGVjdGVkIGZsYWcgKi8KICAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0VYVFRSSUcpOworCiAgICAgICAvKiBUcmlnZ2VyIGRldGVjdGVkIGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayhobHB0aW0pOwogI2Vsc2UKLSAgICAgIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soaGxwdGltKTsgICAgICAKKyAgICAgIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2soaGxwdGltKTsKICNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgIH0KICAgfQotICAKKwogICAvKiBDb21wYXJlIHdyaXRlIGludGVycnVwdCAqLwotICBpZihfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spICE9IFJFU0VUKQotCXsKLSAgICBpZihfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fRkxBR19DTVBNKSAhPVJFU0VUKQotCQl7CisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQ01QT0spICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9DTVBPSykgIT0gUkVTRVQpCisgICAgewogICAgICAgLyogQ2xlYXIgQ29tcGFyZSB3cml0ZSBmbGFnICovCiAgICAgICBfX0hBTF9MUFRJTV9DTEVBUl9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSyk7CisKICAgICAgIC8qIENvbXBhcmUgd3JpdGUgQ2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgIGhscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2soaGxwdGltKTsKICNlbHNlCi0gICAgICBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soaGxwdGltKTsgICAgICAKKyAgICAgIEhBTF9MUFRJTV9Db21wYXJlV3JpdGVDYWxsYmFjayhobHB0aW0pOwogI2VuZGlmIC8qIFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgfQogICB9Ci0gIAorCiAgIC8qIEF1dG9yZWxvYWQgd3JpdGUgaW50ZXJydXB0ICovCi0gIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgIT0gUkVTRVQpCi0JewotICAgIGlmKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9BUlJPSykgIT1SRVNFVCkKLQkJeworICBpZiAoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0FSUk9LKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfQVJST0spICE9IFJFU0VUKQorICAgIHsKICAgICAgIC8qIENsZWFyIEF1dG9yZWxvYWQgd3JpdGUgZmxhZyAqLwogICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworCiAgICAgICAvKiBBdXRvcmVsb2FkIHdyaXRlIENhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7CiAjZWxzZQotICAgICAgSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrKGhscHRpbSk7ICAgICAgCisgICAgICBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2soaGxwdGltKTsKICNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgIH0KICAgfQotICAKKwogICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBpbnRlcnJ1cHQgKi8KLSAgaWYoX19IQUxfTFBUSU1fR0VUX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX1VQKSAhPSBSRVNFVCkKLQl7Ci0gICAgaWYoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX1VQKSAhPVJFU0VUKQotCQl7CisgIGlmIChfX0hBTF9MUFRJTV9HRVRfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfVVApICE9IFJFU0VUKQorICB7CisgICAgaWYgKF9fSEFMX0xQVElNX0dFVF9JVF9TT1VSQ0UoaGxwdGltLCBMUFRJTV9JVF9VUCkgIT0gUkVTRVQpCisgICAgewogICAgICAgLyogQ2xlYXIgRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIERvd24gdG8gVXAgZmxhZyAqLwogICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfVVApOworCiAgICAgICAvKiBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBDYWxsYmFjayAqLwogI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrKGhscHRpbSk7CiAjZWxzZQotICAgICAgSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2soaGxwdGltKTsgICAgICAKKyAgICAgIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKGhscHRpbSk7CiAjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9CiAgIH0KLSAgCisKICAgLyogRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIFVwIHRvIERvd24gaW50ZXJydXB0ICovCi0gIGlmKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19ET1dOKSAhPSBSRVNFVCkKLQl7Ci0gICAgaWYoX19IQUxfTFBUSU1fR0VUX0lUX1NPVVJDRShobHB0aW0sIExQVElNX0lUX0RPV04pICE9UkVTRVQpCi0JCXsKKyAgaWYgKF9fSEFMX0xQVElNX0dFVF9GTEFHKGhscHRpbSwgTFBUSU1fRkxBR19ET1dOKSAhPSBSRVNFVCkKKyAgeworICAgIGlmIChfX0hBTF9MUFRJTV9HRVRfSVRfU09VUkNFKGhscHRpbSwgTFBUSU1fSVRfRE9XTikgIT0gUkVTRVQpCisgICAgewogICAgICAgLyogQ2xlYXIgRGlyZWN0aW9uIGNvdW50ZXIgY2hhbmdlZCBmcm9tIFVwIHRvIERvd24gZmxhZyAqLwogICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfRE9XTik7CisKICAgICAgIC8qIERpcmVjdGlvbiBjb3VudGVyIGNoYW5nZWQgZnJvbSBVcCB0byBEb3duIENhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfTFBUSU1fUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICBobHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayhobHB0aW0pOwogI2Vsc2UKLSAgICAgIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soaGxwdGltKTsgICAgICAKKyAgICAgIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soaGxwdGltKTsKICNlbmRpZiAvKiBVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgIH0KICAgfQotICAKICAgX19IQUxfTFBUSU1fV0FLRVVQVElNRVJfRVhUSV9DTEVBUl9GTEFHKCk7CiB9CiAKIC8qKgotICAqIEBicmllZiAgQ29tcGFyZSBtYXRjaCBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBDb21wYXJlIG1hdGNoIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGxwdGltKTsKLSAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0NvbXBhcmVNYXRjaENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovICAKKyAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgQXV0b3JlbG9hZCBtYXRjaCBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBBdXRvcmVsb2FkIG1hdGNoIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGxwdGltKTsKLSAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0F1dG9SZWxvYWRNYXRjaENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovICAKKyAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgVHJpZ2dlciBkZXRlY3RlZCBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBUcmlnZ2VyIGRldGVjdGVkIGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaGxwdGltIExQVElNIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjayhMUFRJTV9IYW5kbGVUeXBlRGVmICpobHB0aW0pCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhscHRpbSk7Ci0gIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9MUFRJTV9UcmlnZ2VyQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gIAorICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBDb21wYXJlIHdyaXRlIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIAotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKKyAgKiBAYnJpZWYgIENvbXBhcmUgd3JpdGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobHB0aW0pOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gIAorICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBBdXRvcmVsb2FkIHdyaXRlIGNhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlIAotICAqIEBwYXJhbSAgaGxwdGltICBMUFRJTSBoYW5kbGUKKyAgKiBAYnJpZWYgIEF1dG9yZWxvYWQgd3JpdGUgY2FsbGJhY2sgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobHB0aW0pOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gIAorICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gRG93biB0byBVcCBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25VcENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaGxwdGltKTsKLSAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gIAorICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBjYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZSAKLSAgKiBAcGFyYW0gIGhscHRpbSAgTFBUSU0gaGFuZGxlCisgICogQGJyaWVmICBEaXJlY3Rpb24gY291bnRlciBjaGFuZ2VkIGZyb20gVXAgdG8gRG93biBjYWxsYmFjayBpbiBub24tYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBMUFRJTSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9MUFRJTV9EaXJlY3Rpb25Eb3duQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobHB0aW0pOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovICAKKyAgICovCiB9CiAKICNpZiAoVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKIC8qKgotICAqIEBicmllZiAgUmVnaXN0ZXIgdXNlciBMUFRJTSBjYWxsYmFjayB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjawotICAqIEBwYXJhbSAgaGxwdGltIGxwdGltIGhhbmRsZQotICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAotICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBDYWxsYmFjayBJRAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQREVJTklUX0NCX0lEIE1zcERlSW5pdCBDYWxsYmFjayBJRAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCBDb21wYXJlIE1hdGNoIENhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPX1JFTE9BRF9NQVRDSF9DQl9JRCBBdXRvIFJlbG9hZCBNYXRjaCBDYWxsYmFjayBJRAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCBUcmlnZ2VyIENhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIENvbXBhcmUgV3JpdGUgQ2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9fUkVMT0FEX1dSSVRFX0NCX0lEIEF1dG8gUmVsb2FkIFdyaXRlIENhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgRGlyZWN0aW9uIFVQIENhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCBEaXJlY3Rpb24gRG93biBDYWxsYmFjayBJRAorICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIExQVElNIGNhbGxiYWNrIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCAgICAgICAgICBMUFRJTSBCYXNlIE1zcCBJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgICAgICAgIExQVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCAgICBDb21wYXJlIG1hdGNoIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPUkVMT0FEX01BVENIX0NCX0lEIEF1dG8tcmVsb2FkIG1hdGNoIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEICAgICAgICAgIEV4dGVybmFsIHRyaWdnZXIgZXZlbnQgZGV0ZWN0aW9uIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEICAgIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCAgICAgVXAtY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fRElSRUNUSU9OX0RPV05fQ0JfSUQgICBEb3duLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgSUQKICAgKiBAcGFyYW0gcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICogQHJldHZhbCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9MUFRJTV9SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsIHBMUFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0xQVElNX1JlZ2lzdGVyQ2FsbGJhY2soTFBUSU1fSGFuZGxlVHlwZURlZiAgICAgICAgKmhscHRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExQVElNX0NhbGxiYWNrVHlwZURlZiAgICAgIHBDYWxsYmFjaykKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogCi0gIGlmKHBDYWxsYmFjayA9PSBOVUxMKQorICBpZiAocENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhobHB0aW0pOwogCi0gIGlmKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFQURZKQorICBpZiAoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVBRFkpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewotICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrICAgICAgID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayAgICA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBIQUxfTFBUSU1fQVVUT19SRUxPQURfTUFUQ0hfQ0JfSUQgOgotICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCA6Ci0gICAgICBobHB0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5UcmlnZ2VyQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCA6Ci0gICAgICBobHB0aW0tPkNvbXBhcmVXcml0ZUNhbGxiYWNrICAgID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Db21wYXJlV3JpdGVDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9BVVRPX1JFTE9BRF9XUklURV9DQl9JRCA6Ci0gICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9BVVRPUkVMT0FEX1dSSVRFX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IHBDYWxsYmFjazsKKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgOgotICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrICAgICA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5EaXJlY3Rpb25VcENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEIDoKLSAgICAgIGhscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrICAgPSBwQ2FsbGJhY2s7Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0xQVElNX0RJUkVDVElPTl9ET1dOX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5EaXJlY3Rpb25Eb3duQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CisgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCi0gICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwotICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0IDoKKyAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLworICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOworICAgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgZWxzZSBpZihobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKKyAgZWxzZSBpZiAoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVTRVQpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewotICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IHBDYWxsYmFjazsKLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6Ci0gICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrICAgICAgID0gcENhbGxiYWNrOwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOworICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQgOgotICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGVsc2UKQEAgLTE4NDYsOTEgKzIxNDUsOTIgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBVblJlZ2lzdGVyIHVzZXIgTFBUSU0gY2FsbGJhY2sKLSAgKiAgICAgICAgIExQVElNIGNhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgcHJlZGVmaW5lZCBjYWxsYmFjawotICAqIEBwYXJhbSAgaGxwdGltIGxwdGltIGhhbmRsZQotICAqIEBwYXJhbSAgQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCi0rICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIE1zcEluaXQgQ2FsbGJhY2sgSUQKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECi0rICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQ09NUEFSRV9NQVRDSF9DQl9JRCBDb21wYXJlIE1hdGNoIENhbGxiYWNrIElECi0rICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT19SRUxPQURfTUFUQ0hfQ0JfSUQgQXV0byBSZWxvYWQgTWF0Y2ggQ2FsbGJhY2sgSUQKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEIFRyaWdnZXIgQ2FsbGJhY2sgSUQKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIENvbXBhcmUgV3JpdGUgQ2FsbGJhY2sgSUQKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9BVVRPX1JFTE9BRF9XUklURV9DQl9JRCBBdXRvIFJlbG9hZCBXcml0ZSBDYWxsYmFjayBJRAotKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0RJUkVDVElPTl9VUF9DQl9JRCBEaXJlY3Rpb24gVVAgQ2FsbGJhY2sgSUQKLSsgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCBEaXJlY3Rpb24gRG93biBDYWxsYmFjayBJRAorICAqIEBicmllZiAgVW5yZWdpc3RlciBhIExQVElNIGNhbGxiYWNrCisgICogICAgICAgICBMTFBUSU0gY2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrCisgICogQHBhcmFtIGhscHRpbSBMUFRJTSBoYW5kbGUKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCisgICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEICAgICAgICAgIExQVElNIEJhc2UgTXNwIEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCAgICAgICAgTFBUSU0gQmFzZSBNc3AgRGVJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEICAgIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0FVVE9SRUxPQURfTUFUQ0hfQ0JfSUQgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX1RSSUdHRVJfQ0JfSUQgICAgICAgICAgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0xQVElNX0NPTVBBUkVfV1JJVEVfQ0JfSUQgICAgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fQVVUT1JFTE9BRF9XUklURV9DQl9JRCBBdXRvLXJlbG9hZCByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEICAgICBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCAgIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayBJRAogICAqIEByZXR2YWwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSwgSEFMX0xQVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfTFBUSU1fVW5SZWdpc3RlckNhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgICAgICAgICpobHB0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9MUFRJTV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhobHB0aW0pOwogCi0gIGlmKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFQURZKQorICBpZiAoaGxwdGltLT5TdGF0ZSA9PSBIQUxfTFBUSU1fU1RBVEVfUkVBRFkpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewotICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgICAgICAgICA9IEhBTF9MUFRJTV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdCBDYWxsYmFjayAqLwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9NU1BJTklUX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwSW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayAgICAgICA9IEhBTF9MUFRJTV9Nc3BEZUluaXQ7ICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0IENhbGxiYWNrICovCi0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwIERlSW5pdCBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX0NPTVBBUkVfTUFUQ0hfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayAgICA9IEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjazsgICAgLyogTGVnYWN5IHdlYWsgQ29tcGFyZSBNYXRjaCBDYWxsYmFjayAqLwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX01BVENIX0NCX0lEIDoKKyAgICAgICAgaGxwdGltLT5Db21wYXJlTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9Db21wYXJlTWF0Y2hDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBDb21wYXJlIG1hdGNoIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBIQUxfTFBUSU1fQVVUT19SRUxPQURfTUFUQ0hfQ0JfSUQgOgotICAgICAgaGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQXV0byBSZWxvYWQgTWF0Y2ggQ2FsbGJhY2sgKi8KLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fQVVUT1JFTE9BRF9NQVRDSF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+QXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQXV0b1JlbG9hZE1hdGNoQ2FsbGJhY2s7ICAgLyogTGVnYWN5IHdlYWsgQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9UUklHR0VSX0NCX0lEIDoKLSAgICAgIGhscHRpbS0+VHJpZ2dlckNhbGxiYWNrICAgICAgICAgPSBIQUxfTFBUSU1fVHJpZ2dlckNhbGxiYWNrOyAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFRyaWdnZXIgQ2FsbGJhY2sgKi8KLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fVFJJR0dFUl9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+VHJpZ2dlckNhbGxiYWNrID0gSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgRXh0ZXJuYWwgdHJpZ2dlciBldmVudCBkZXRlY3Rpb24gQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9DT01QQVJFX1dSSVRFX0NCX0lEIDoKLSAgICAgIGhscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2s7ICAgIC8qIExlZ2FjeSB3ZWFrIENvbXBhcmUgV3JpdGUgQ2FsbGJhY2sgKi8KLSAgICAgIGJyZWFrOworICAgICAgY2FzZSBIQUxfTFBUSU1fQ09NUEFSRV9XUklURV9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2s7ICAgICAgICAgLyogTGVnYWN5IHdlYWsgQ29tcGFyZSByZWdpc3RlciB3cml0ZSBjb21wbGV0ZSBDYWxsYmFjayAqLworICAgICAgICBicmVhazsKIAotICAgIGNhc2UgSEFMX0xQVElNX0FVVE9fUkVMT0FEX1dSSVRFX0NCX0lEIDoKLSAgICAgIGhscHRpbS0+QXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2sgPSBIQUxfTFBUSU1fQXV0b1JlbG9hZFdyaXRlQ2FsbGJhY2s7IC8qIExlZ2FjeSB3ZWFrIEF1dG8gUmVsb2FkIFdyaXRlIENhbGxiYWNrICovCi0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0xQVElNX0FVVE9SRUxPQURfV1JJVEVfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkF1dG9SZWxvYWRXcml0ZUNhbGxiYWNrID0gSEFMX0xQVElNX0F1dG9SZWxvYWRXcml0ZUNhbGxiYWNrOyAgIC8qIExlZ2FjeSB3ZWFrIEF1dG8tcmVsb2FkIHJlZ2lzdGVyIHdyaXRlIGNvbXBsZXRlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBIQUxfTFBUSU1fRElSRUNUSU9OX1VQX0NCX0lEIDoKLSAgICAgIGhscHRpbS0+RGlyZWN0aW9uVXBDYWxsYmFjayAgICAgPSBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjazsgICAgIC8qIExlZ2FjeSB3ZWFrIERpcmVjdGlvbiBVcCBDYWxsYmFjayAqLwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fVVBfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgPSBIQUxfTFBUSU1fRGlyZWN0aW9uVXBDYWxsYmFjazsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFVwLWNvdW50aW5nIGRpcmVjdGlvbiBjaGFuZ2UgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCA6Ci0gICAgICBobHB0aW0tPkRpcmVjdGlvbkRvd25DYWxsYmFjayAgID0gSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBEaXJlY3Rpb24gRG93biBDYWxsYmFjayAqLwotICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTF9MUFRJTV9ESVJFQ1RJT05fRE9XTl9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrID0gSEFMX0xQVElNX0RpcmVjdGlvbkRvd25DYWxsYmFjazsgICAgICAgLyogTGVnYWN5IHdlYWsgRG93bi1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICovCisgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdCA6Ci0gICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KLSAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7Ci0gICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQgOgorICAgICAgICAvKiBSZXR1cm4gZXJyb3Igc3RhdHVzICovCisgICAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQotICBlbHNlIGlmKGhscHRpbS0+U3RhdGUgPT0gSEFMX0xQVElNX1NUQVRFX1JFU0VUKQorICBlbHNlIGlmIChobHB0aW0tPlN0YXRlID09IEhBTF9MUFRJTV9TVEFURV9SRVNFVCkKICAgewogICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7Ci0gICAgY2FzZSBIQUxfTFBUSU1fTVNQSU5JVF9DQl9JRCA6Ci0gICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayAgICAgICA9IEhBTF9MUFRJTV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBNc3BJbml0IENhbGxiYWNrICovCi0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUElOSVRfQ0JfSUQgOgorICAgICAgICBobHB0aW0tPk1zcEluaXRDYWxsYmFjayA9IEhBTF9MUFRJTV9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcEluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIEhBTF9MUFRJTV9NU1BERUlOSVRfQ0JfSUQgOgotICAgICAgaGxwdGltLT5Nc3BEZUluaXRDYWxsYmFjayAgICAgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwRGVJbml0IENhbGxiYWNrICovCi0gICAgICBicmVhazsKKyAgICAgIGNhc2UgSEFMX0xQVElNX01TUERFSU5JVF9DQl9JRCA6CisgICAgICAgIGhscHRpbS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfTFBUSU1fTXNwRGVJbml0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIE1zcCBEZUluaXQgQ2FsbGJhY2sgKi8KKyAgICAgICAgYnJlYWs7CiAKLSAgICBkZWZhdWx0IDoKLSAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwotICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKLSAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdCA6CisgICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KKyAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGVsc2UKQEAgLTE5NTAsMTMgKzIyNTAsMTMgQEAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIExQVElNX0dyb3VwNSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAKLSAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4gCisvKiogQGRlZmdyb3VwIExQVElNX0dyb3VwNSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICogIEBicmllZiAgIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zLgogICoKLUB2ZXJiYXRpbSAgIAorQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KICAgICBUaGlzIHN1YnNlY3Rpb24gcGVybWl0cyB0byBnZXQgaW4gcnVuLXRpbWUgdGhlIHN0YXR1cyBvZiB0aGUgcGVyaXBoZXJhbC4KIApAQCAtMTk2NSwxMiArMjI2NSwxMyBAQAogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgIFJldHVybnMgdGhlIExQVElNIHN0YXRlLgorICAqIEBicmllZiAgUmV0dXJuIHRoZSBMUFRJTSBoYW5kbGUgc3RhdGUuCiAgICogQHBhcmFtICBobHB0aW0gTFBUSU0gaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdGUKICAgKi8KIEhBTF9MUFRJTV9TdGF0ZVR5cGVEZWYgSEFMX0xQVElNX0dldFN0YXRlKExQVElNX0hhbmRsZVR5cGVEZWYgKmhscHRpbSkKIHsKKyAgLyogUmV0dXJuIExQVElNIGhhbmRsZSBzdGF0ZSAqLwogICByZXR1cm4gaGxwdGltLT5TdGF0ZTsKIH0KIApAQCAtMTk4Myw2ICsyMjg0LDE2NyBAQAogICAqIEB9CiAgICovCiAKKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKiBAZGVmZ3JvdXAgTFBUSU1fUHJpdmF0ZV9GdW5jdGlvbnMgTFBUSU0gUHJpdmF0ZSBGdW5jdGlvbnMKKyAgKiBAeworICAqLworI2lmIChVU0VfSEFMX0xQVElNX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorLyoqCisgICogQGJyaWVmICBSZXNldCBpbnRlcnJ1cHQgY2FsbGJhY2tzIHRvIHRoZSBsZWdhY3kgd2VhayBjYWxsYmFja3MuCisgICogQHBhcmFtICBscHRpbSBwb2ludGVyIHRvIGEgTFBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBMUFRJTSBtb2R1bGUuCisgICogQHJldHZhbCBOb25lCisgICovCitzdGF0aWMgdm9pZCBMUFRJTV9SZXNldENhbGxiYWNrKExQVElNX0hhbmRsZVR5cGVEZWYgKmxwdGltKQoreworICAvKiBSZXNldCB0aGUgTFBUSU0gY2FsbGJhY2sgdG8gdGhlIGxlZ2FjeSB3ZWFrIGNhbGxiYWNrcyAqLworICBscHRpbS0+Q29tcGFyZU1hdGNoQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZU1hdGNoQ2FsbGJhY2s7ICAgIC8qIENvbXBhcmUgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICovCisgIGxwdGltLT5BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkTWF0Y2hDYWxsYmFjazsgLyogQXV0by1yZWxvYWQgbWF0Y2ggQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgKi8KKyAgbHB0aW0tPlRyaWdnZXJDYWxsYmFjayAgICAgICAgID0gSEFMX0xQVElNX1RyaWdnZXJDYWxsYmFjazsgICAgICAgICAvKiBFeHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGRldGVjdGlvbiBDYWxsYmFjayAgICAqLworICBscHRpbS0+Q29tcGFyZVdyaXRlQ2FsbGJhY2sgICAgPSBIQUxfTFBUSU1fQ29tcGFyZVdyaXRlQ2FsbGJhY2s7ICAgIC8qIENvbXBhcmUgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgICAgICovCisgIGxwdGltLT5BdXRvUmVsb2FkV3JpdGVDYWxsYmFjayA9IEhBTF9MUFRJTV9BdXRvUmVsb2FkV3JpdGVDYWxsYmFjazsgLyogQXV0by1yZWxvYWQgcmVnaXN0ZXIgd3JpdGUgY29tcGxldGUgQ2FsbGJhY2sgKi8KKyAgbHB0aW0tPkRpcmVjdGlvblVwQ2FsbGJhY2sgICAgID0gSEFMX0xQVElNX0RpcmVjdGlvblVwQ2FsbGJhY2s7ICAgICAvKiBVcC1jb3VudGluZyBkaXJlY3Rpb24gY2hhbmdlIENhbGxiYWNrICAgICAgICAqLworICBscHRpbS0+RGlyZWN0aW9uRG93bkNhbGxiYWNrICAgPSBIQUxfTFBUSU1fRGlyZWN0aW9uRG93bkNhbGxiYWNrOyAgIC8qIERvd24tY291bnRpbmcgZGlyZWN0aW9uIGNoYW5nZSBDYWxsYmFjayAgICAgICovCit9CisjZW5kaWYgLyogVVNFX0hBTF9MUFRJTV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKworLyoqCisgICogQGJyaWVmICBMUFRpbWVyIFdhaXQgZm9yIGZsYWcgc2V0CisgICogQHBhcmFtICBobHB0aW0gcG9pbnRlciB0byBhIExQVElNX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTFBUSU0gbW9kdWxlLgorICAqIEBwYXJhbSAgZmxhZyAgIFRoZSBscHRpbSBmbGFnCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgTFBUSU1fV2FpdEZvckZsYWcoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltLCB1aW50MzJfdCBmbGFnKQoreworICBIQUxfU3RhdHVzVHlwZURlZiByZXN1bHQgPSBIQUxfT0s7CisgIHVpbnQzMl90IGNvdW50ID0gVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyAyMFVMIC8gMTAwMFVMKTsKKyAgZG8KKyAgeworICAgIGNvdW50LS07CisgICAgaWYgKGNvdW50ID09IDBVTCkKKyAgICB7CisgICAgICByZXN1bHQgPSBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyAgd2hpbGUgKCghKF9fSEFMX0xQVElNX0dFVF9GTEFHKChobHB0aW0pLCAoZmxhZykpKSkgJiYgKGNvdW50ICE9IDBVTCkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSBMUFRJTSBIVyBpbnN0YW5jZS4KKyAgKiBAcGFyYW0gIGhscHRpbSBwb2ludGVyIHRvIGEgTFBUSU1fSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBMUFRJTSBtb2R1bGUuCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExQVElNX0Rpc2FibGUoTFBUSU1fSGFuZGxlVHlwZURlZiAqaGxwdGltKQoreworICB1aW50MzJfdCB0bXBjbGtzb3VyY2UgPSAwOworICB1aW50MzJfdCB0bXBJRVI7CisgIHVpbnQzMl90IHRtcENGR1I7CisgIHVpbnQzMl90IHRtcENNUDsKKyAgdWludDMyX3QgdG1wQVJSOworCisgIF9fZGlzYWJsZV9pcnEoKTsKKworICAvKioqKioqKioqKiogU2F2ZSBMUFRJTSBDb25maWcgKioqKioqKioqKiovCisgIC8qIFNhdmUgTFBUSU0gc291cmNlIGNsb2NrICovCisgIHN3aXRjaCAoKHVpbnQzMl90KWhscHRpbS0+SW5zdGFuY2UpCisgIHsKKyAgICBjYXNlIExQVElNMV9CQVNFOgorICAgICAgdG1wY2xrc291cmNlID0gX19IQUxfUkNDX0dFVF9MUFRJTTFfU09VUkNFKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBTYXZlIExQVElNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIHRtcElFUiA9IGhscHRpbS0+SW5zdGFuY2UtPklFUjsKKyAgdG1wQ0ZHUiA9IGhscHRpbS0+SW5zdGFuY2UtPkNGR1I7CisgIHRtcENNUCA9IGhscHRpbS0+SW5zdGFuY2UtPkNNUDsKKyAgdG1wQVJSID0gaGxwdGltLT5JbnN0YW5jZS0+QVJSOworCisgIC8qKioqKioqKioqKiBSZXNldCBMUFRJTSAqKioqKioqKioqKi8KKyAgc3dpdGNoICgodWludDMyX3QpaGxwdGltLT5JbnN0YW5jZSkKKyAgeworICAgIGNhc2UgTFBUSU0xX0JBU0U6CisgICAgICBfX0hBTF9SQ0NfTFBUSU0xX0ZPUkNFX1JFU0VUKCk7CisgICAgICBfX0hBTF9SQ0NfTFBUSU0xX1JFTEVBU0VfUkVTRVQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIC8qKioqKioqKioqKiBSZXN0b3JlIExQVElNIENvbmZpZyAqKioqKioqKioqKi8KKyAgaWYgKCh0bXBDTVAgIT0gMFVMKSB8fCAodG1wQVJSICE9IDBVTCkpCisgIHsKKyAgICAvKiBGb3JjZSBMUFRJTSBzb3VyY2Uga2VybmVsIGNsb2NrIGZyb20gQVBCICovCisgICAgc3dpdGNoICgodWludDMyX3QpaGxwdGltLT5JbnN0YW5jZSkKKyAgICB7CisgICAgICBjYXNlIExQVElNMV9CQVNFOgorICAgICAgICBfX0hBTF9SQ0NfTFBUSU0xX0NPTkZJRyhSQ0NfTFBUSU0xQ0xLU09VUkNFX1BDTEsxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodG1wQ01QICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIENNUCByZWdpc3RlciAoTFBUSU0gc2hvdWxkIGJlIGVuYWJsZWQgZmlyc3QpICovCisgICAgICBobHB0aW0tPkluc3RhbmNlLT5DUiB8PSBMUFRJTV9DUl9FTkFCTEU7CisgICAgICBobHB0aW0tPkluc3RhbmNlLT5DTVAgPSB0bXBDTVA7CisKKyAgICAgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0NNUCByZWdpc3RlciAqLworICAgICAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19DTVBPSykgPT0gSEFMX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVDsKKyAgICAgIH0KKyAgICAgIF9fSEFMX0xQVElNX0NMRUFSX0ZMQUcoaGxwdGltLCBMUFRJTV9GTEFHX0NNUE9LKTsKKyAgICB9CisKKyAgICBpZiAodG1wQVJSICE9IDBVTCkKKyAgICB7CisgICAgICAvKiBSZXN0b3JlIEFSUiByZWdpc3RlciAoTFBUSU0gc2hvdWxkIGJlIGVuYWJsZWQgZmlyc3QpICovCisgICAgICBobHB0aW0tPkluc3RhbmNlLT5DUiB8PSBMUFRJTV9DUl9FTkFCTEU7CisgICAgICBobHB0aW0tPkluc3RhbmNlLT5BUlIgPSB0bXBBUlI7CisKKyAgICAgIC8qIFdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIExQVElNX0FSUiByZWdpc3RlciAqLworICAgICAgaWYgKExQVElNX1dhaXRGb3JGbGFnKGhscHRpbSwgTFBUSU1fRkxBR19BUlJPSykgPT0gSEFMX1RJTUVPVVQpCisgICAgICB7CisgICAgICAgIGhscHRpbS0+U3RhdGUgPSBIQUxfTFBUSU1fU1RBVEVfVElNRU9VVDsKKyAgICAgIH0KKworICAgICAgX19IQUxfTFBUSU1fQ0xFQVJfRkxBRyhobHB0aW0sIExQVElNX0ZMQUdfQVJST0spOworICAgIH0KKworICAgIC8qIFJlc3RvcmUgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KWhscHRpbS0+SW5zdGFuY2UpCisgICAgeworICAgICAgY2FzZSBMUFRJTTFfQkFTRToKKyAgICAgICAgX19IQUxfUkNDX0xQVElNMV9DT05GSUcodG1wY2xrc291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBSZXN0b3JlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChMUFRJTSBzaG91bGQgYmUgZGlzYWJsZWQgZmlyc3QpICovCisgIGhscHRpbS0+SW5zdGFuY2UtPkNSICY9IH4oTFBUSU1fQ1JfRU5BQkxFKTsKKyAgaGxwdGltLT5JbnN0YW5jZS0+SUVSID0gdG1wSUVSOworICBobHB0aW0tPkluc3RhbmNlLT5DRkdSID0gdG1wQ0ZHUjsKKworICBfX2VuYWJsZV9pcnEoKTsKK30KKy8qKgorICAqIEB9CisgICovCisjZW5kaWYgLyogTFBUSU0xICovCisKICNlbmRpZiAvKiBIQUxfTFBUSU1fTU9EVUxFX0VOQUJMRUQgKi8KIC8qKgogICAqIEB9CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9tbWMuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX21tYy5jCmluZGV4IGUwZTQ0ZmMuLjE1NTAwMTkgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX21tYy5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX21tYy5jCkBAIC0zLDM0ICszLDM0IEBACiAgICogQGZpbGUgICAgc3RtMzJmN3h4X2hhbF9tbWMuYwogICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCiAgICogQGJyaWVmICAgTU1DIGNhcmQgSEFMIG1vZHVsZSBkcml2ZXIuCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZWN1cmUgRGlnaXRhbCAoTU1DKSBwZXJpcGhlcmFsOgogICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCi0gICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCiAgICogICAgICAgICAgICsgTU1DIGNhcmQgQ29udHJvbCBmdW5jdGlvbnMKLSAgKiAgICAgICAgIAorICAqCiAgIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KLSAgICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIGEgaGlnaCBsZXZlbCBjb21tdW5pY2F0aW9uIGxheWVyIGZvciByZWFkIGFuZCB3cml0ZSBmcm9tL3RvIAotICAgIHRoaXMgbWVtb3J5LiBUaGUgbmVlZGVkIFNUTTMyIGhhcmR3YXJlIHJlc291cmNlcyAoU0RNTUMgYW5kIEdQSU8pIGFyZSBwZXJmb3JtZWQgYnkgCi0gICAgdGhlIHVzZXIgaW4gSEFMX01NQ19Nc3BJbml0KCkgZnVuY3Rpb24gKE1TUCBsYXllcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBCYXNpY2FsbHksIHRoZSBNU1AgbGF5ZXIgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUgYXMgd2UgcHJvdmlkZSBpbiB0aGUgCisgICAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBhIGhpZ2ggbGV2ZWwgY29tbXVuaWNhdGlvbiBsYXllciBmb3IgcmVhZCBhbmQgd3JpdGUgZnJvbS90bworICAgIHRoaXMgbWVtb3J5LiBUaGUgbmVlZGVkIFNUTTMyIGhhcmR3YXJlIHJlc291cmNlcyAoU0RNTUMgYW5kIEdQSU8pIGFyZSBwZXJmb3JtZWQgYnkKKyAgICB0aGUgdXNlciBpbiBIQUxfTU1DX01zcEluaXQoKSBmdW5jdGlvbiAoTVNQIGxheWVyKS4KKyAgICBCYXNpY2FsbHksIHRoZSBNU1AgbGF5ZXIgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUgYXMgd2UgcHJvdmlkZSBpbiB0aGUKICAgICBleGFtcGxlcy4KICAgICBZb3UgY2FuIGVhc2lseSB0YWlsb3IgdGhpcyBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byBoYXJkd2FyZSByZXNvdXJjZXMuCiAKICAgWy4uXQotICAgIFRoaXMgZHJpdmVyIGlzIGEgZ2VuZXJpYyBsYXllcmVkIGRyaXZlciBmb3IgU0RNTUMgbWVtb3JpZXMgd2hpY2ggdXNlcyB0aGUgSEFMIAotICAgIFNETU1DIGRyaXZlciBmdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHdpdGggTU1DIGFuZCBlTU1DIGNhcmRzIGRldmljZXMuIAorICAgIFRoaXMgZHJpdmVyIGlzIGEgZ2VuZXJpYyBsYXllcmVkIGRyaXZlciBmb3IgU0RNTUMgbWVtb3JpZXMgd2hpY2ggdXNlcyB0aGUgSEFMCisgICAgU0RNTUMgZHJpdmVyIGZ1bmN0aW9ucyB0byBpbnRlcmZhY2Ugd2l0aCBNTUMgYW5kIGVNTUMgY2FyZHMgZGV2aWNlcy4KICAgICBJdCBpcyB1c2VkIGFzIGZvbGxvd3M6Ci0gCisKICAgICAoIylJbml0aWFsaXplIHRoZSBTRE1NQyBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudCB0aGUgSEFMX01NQ19Nc3BJbml0KCkgQVBJOgotICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU0RNTUMgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19TRE1NQ19DTEtfRU5BQkxFKCk7IAorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU0RNTUMgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19TRE1NQ19DTEtfRU5BQkxFKCk7CiAgICAgICAgICgjIykgU0RNTUMgcGlucyBjb25maWd1cmF0aW9uIGZvciBNTUMgY2FyZAotICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFNETU1DIEdQSU9zIHVzaW5nIHRoZSBmdW5jdGlvbnMgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKTsgICAKKyAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTRE1NQyBHUElPcyB1c2luZyB0aGUgZnVuY3Rpb25zIF9fSEFMX1JDQ19HUElPeF9DTEtfRU5BQkxFKCk7CiAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlc2UgU0RNTUMgcGlucyBhcyBhbHRlcm5hdGUgZnVuY3Rpb24gcHVsbC11cCB1c2luZyBIQUxfR1BJT19Jbml0KCkKICAgICAgICAgICAgICAgICAgIGFuZCBhY2NvcmRpbmcgdG8geW91ciBwaW4gYXNzaWdubWVudDsKICAgICAgICAgKCMjKSBETUEgQ29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9NTUNfUmVhZEJsb2Nrc19ETUEoKQpAQCAtMzgsOCArMzgsOCBAQAogICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfRE1BeF9DTEtfRU5BQkxFKCk7IAogICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgdXNpbmcgdGhlIGZ1bmN0aW9uIEhBTF9ETUFfSW5pdCgpIHdpdGggcHJlZGVjbGFyZWQgYW5kIGZpbGxlZC4gCiAgICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyB3aGVuIHVzaW5nIERNQSB0cmFuc2Zlci4KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU0RNTUMgYW5kIERNQSBpbnRlcnJ1cHQgcHJpb3JpdGllcyB1c2luZyBmdW5jdGlvbnMKLSAgICAgICAgICAgICAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KCk7IERNQSBwcmlvcml0eSBpcyBzdXBlcmlvciB0byBTRE1NQydzIHByaW9yaXR5CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNETU1DIGFuZCBETUEgaW50ZXJydXB0IHByaW9yaXRpZXMgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfU2V0UHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICAgIERNQSBwcmlvcml0eSBpcyBzdXBlcmlvciB0byBTRE1NQydzIHByaW9yaXR5CiAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgRE1BIGFuZCBTRE1NQyBJUlFzIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUSgpCiAgICAgICAgICAgICAoKysrKSBTRE1NQyBpbnRlcnJ1cHRzIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MgX19IQUxfTU1DX0VOQUJMRV9JVCgpIAogICAgICAgICAgICAgICAgICAgYW5kIF9fSEFMX01NQ19ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSBjb21tdW5pY2F0aW9uIHByb2Nlc3MuCkBAIC00Nyw3MCArNDcsNzEgQEAKICAgICAgICAgICAgICAgICAgIGFuZCBfX0hBTF9NTUNfQ0xFQVJfSVQoKQogICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9NTUNfUmVhZEJsb2Nrc19JVCgpCiAgICAgICAgICAgICAgYW5kIEhBTF9NTUNfV3JpdGVCbG9ja3NfSVQoKSBBUElzKS4KLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU0RNTUMgaW50ZXJydXB0IHByaW9yaXRpZXMgdXNpbmcgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KCk7CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNETU1DIGludGVycnVwdCBwcmlvcml0aWVzIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX1NldFByaW9yaXR5KCk7CiAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU0RNTUMgSVJRcyB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoKQotICAgICAgICAgICAgKCsrKykgU0RNTUMgaW50ZXJydXB0cyBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX01NQ19FTkFCTEVfSVQoKSAKKyAgICAgICAgICAgICgrKyspIFNETU1DIGludGVycnVwdHMgYXJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcyBfX0hBTF9NTUNfRU5BQkxFX0lUKCkKICAgICAgICAgICAgICAgICAgIGFuZCBfX0hBTF9NTUNfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgY29tbXVuaWNhdGlvbiBwcm9jZXNzLgogICAgICAgICAgICAgKCsrKykgU0RNTUMgaW50ZXJydXB0cyBwZW5kaW5nIGJpdHMgYXJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcyBfX0hBTF9NTUNfR0VUX0lUKCkKICAgICAgICAgICAgICAgICAgIGFuZCBfX0hBTF9NTUNfQ0xFQVJfSVQoKQotICAgICgjKSBBdCB0aGlzIHN0YWdlLCB5b3UgY2FuIHBlcmZvcm0gTU1DIHJlYWQvd3JpdGUvZXJhc2Ugb3BlcmF0aW9ucyBhZnRlciBNTUMgY2FyZCBpbml0aWFsaXphdGlvbiAgCisgICAgKCMpIEF0IHRoaXMgc3RhZ2UsIHlvdSBjYW4gcGVyZm9ybSBNTUMgcmVhZC93cml0ZS9lcmFzZSBvcGVyYXRpb25zIGFmdGVyIE1NQyBjYXJkIGluaXRpYWxpemF0aW9uCiAKLSAgICAgICAgIAorCiAgICoqKiBNTUMgQ2FyZCBJbml0aWFsaXphdGlvbiBhbmQgY29uZmlndXJhdGlvbiAqKioKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgWy4uXQotICAgIFRvIGluaXRpYWxpemUgdGhlIE1NQyBDYXJkLCB1c2UgdGhlIEhBTF9NTUNfSW5pdCgpIGZ1bmN0aW9uLiBJdCBJbml0aWFsaXplcyAKLSAgICBTRE1NQyBJUCAoU1RNMzIgc2lkZSkgYW5kIHRoZSBNTUMgQ2FyZCwgYW5kIHB1dCBpdCBpbnRvIFN0YW5kQnkgU3RhdGUgKFJlYWR5IGZvciBkYXRhIHRyYW5zZmVyKS4gCisgICAgVG8gaW5pdGlhbGl6ZSB0aGUgTU1DIENhcmQsIHVzZSB0aGUgSEFMX01NQ19Jbml0KCkgZnVuY3Rpb24uIEl0IEluaXRpYWxpemVzCisgICAgU0RNTUMgUGVyaXBoZXJhbCAoU1RNMzIgc2lkZSkgYW5kIHRoZSBNTUMgQ2FyZCwgYW5kIHB1dCBpdCBpbnRvIFN0YW5kQnkgU3RhdGUgKFJlYWR5IGZvciBkYXRhIHRyYW5zZmVyKS4KICAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOgogCiAgICAgKCMpIEluaXRpYWxpemUgdGhlIFNETU1DIHBlcmlwaGVyYWwgaW50ZXJmYWNlIHdpdGggZGVmYXVsbHQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaXMgZG9uZSBhdCA0MDBLSHouIFlvdSBjYW4gY2hhbmdlIG9yIGFkYXB0IAotICAgICAgICB0aGlzIGZyZXF1ZW5jeSBieSBhZGp1c3RpbmcgdGhlICJDbG9ja0RpdiIgZmllbGQuIAorICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBpcyBkb25lIGF0IDQwMEtIei4gWW91IGNhbiBjaGFuZ2Ugb3IgYWRhcHQKKyAgICAgICAgdGhpcyBmcmVxdWVuY3kgYnkgYWRqdXN0aW5nIHRoZSAiQ2xvY2tEaXYiIGZpZWxkLgogICAgICAgICBUaGUgTU1DIENhcmQgZnJlcXVlbmN5IChTRE1NQ19DSykgaXMgY29tcHV0ZWQgYXMgZm9sbG93czoKLSAgCisKICAgICAgICAgICAgU0RNTUNfQ0sgPSBTRE1NQ0NMSyAvIChDbG9ja0RpdiArIDIpCi0gIAotICAgICAgICBJbiBpbml0aWFsaXphdGlvbiBtb2RlIGFuZCBhY2NvcmRpbmcgdG8gdGhlIE1NQyBDYXJkIHN0YW5kYXJkLCAKKworICAgICAgICBJbiBpbml0aWFsaXphdGlvbiBtb2RlIGFuZCBhY2NvcmRpbmcgdG8gdGhlIE1NQyBDYXJkIHN0YW5kYXJkLAogICAgICAgICBtYWtlIHN1cmUgdGhhdCB0aGUgU0RNTUNfQ0sgZnJlcXVlbmN5IGRvZXNuJ3QgZXhjZWVkIDQwMEtIei4KIAotICAgICAgICBUaGlzIHBoYXNlIG9mIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgdGhyb3VnaCBTRE1NQ19Jbml0KCkgYW5kIAorICAgICAgICBUaGlzIHBoYXNlIG9mIGluaXRpYWxpemF0aW9uIGlzIGRvbmUgdGhyb3VnaCBTRE1NQ19Jbml0KCkgYW5kCiAgICAgICAgIFNETU1DX1Bvd2VyU3RhdGVfT04oKSBTRE1NQyBsb3cgbGV2ZWwgQVBJcy4KIAogICAgICgjKSBJbml0aWFsaXplIHRoZSBNTUMgY2FyZC4gVGhlIEFQSSB1c2VkIGlzIEhBTF9NTUNfSW5pdENhcmQoKS4KLSAgICAgICAgVGhpcyBwaGFzZSBhbGxvd3MgdGhlIGNhcmQgaW5pdGlhbGl6YXRpb24gYW5kIGlkZW50aWZpY2F0aW9uIAorICAgICAgICBUaGlzIHBoYXNlIGFsbG93cyB0aGUgY2FyZCBpbml0aWFsaXphdGlvbiBhbmQgaWRlbnRpZmljYXRpb24KICAgICAgICAgYW5kIGNoZWNrIHRoZSBNTUMgQ2FyZCB0eXBlIChTdGFuZGFyZCBDYXBhY2l0eSBvciBIaWdoIENhcGFjaXR5KQogICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gZmxvdyBpcyBjb21wYXRpYmxlIHdpdGggTU1DIHN0YW5kYXJkLgogCi0gICAgICAgIFRoaXMgQVBJIChIQUxfTU1DX0luaXRDYXJkKCkpIGNvdWxkIGJlIHVzZWQgYWxzbyB0byByZWluaXRpYWxpemUgdGhlIGNhcmQgaW4gY2FzZSAKKyAgICAgICAgVGhpcyBBUEkgKEhBTF9NTUNfSW5pdENhcmQoKSkgY291bGQgYmUgdXNlZCBhbHNvIHRvIHJlaW5pdGlhbGl6ZSB0aGUgY2FyZCBpbiBjYXNlCiAgICAgICAgIG9mIHBsdWctb2ZmIHBsdWctaW4uCiAgIAotICAgICgjKSBDb25maWd1cmUgdGhlIE1NQyBDYXJkIERhdGEgdHJhbnNmZXIgZnJlcXVlbmN5LiBCeSBEZWZhdWx0LCB0aGUgY2FyZCB0cmFuc2ZlciAKKyAgICAoIykgQ29uZmlndXJlIHRoZSBNTUMgQ2FyZCBEYXRhIHRyYW5zZmVyIGZyZXF1ZW5jeS4gQnkgRGVmYXVsdCwgdGhlIGNhcmQgdHJhbnNmZXIKICAgICAgICAgZnJlcXVlbmN5IGlzIHNldCB0byAyNE1Iei4gWW91IGNhbiBjaGFuZ2Ugb3IgYWRhcHQgdGhpcyBmcmVxdWVuY3kgYnkgYWRqdXN0aW5nIAogICAgICAgICB0aGUgIkNsb2NrRGl2IiBmaWVsZC4KLSAgICAgICAgSW4gdHJhbnNmZXIgbW9kZSBhbmQgYWNjb3JkaW5nIHRvIHRoZSBNTUMgQ2FyZCBzdGFuZGFyZCwgbWFrZSBzdXJlIHRoYXQgdGhlIAorICAgICAgICBJbiB0cmFuc2ZlciBtb2RlIGFuZCBhY2NvcmRpbmcgdG8gdGhlIE1NQyBDYXJkIHN0YW5kYXJkLCBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAgU0RNTUNfQ0sgZnJlcXVlbmN5IGRvZXNuJ3QgZXhjZWVkIDI1TUh6IGFuZCA1ME1IeiBpbiBIaWdoLXNwZWVkIG1vZGUgc3dpdGNoLgotICAgICAgICBUbyBiZSBhYmxlIHRvIHVzZSBhIGZyZXF1ZW5jeSBoaWdoZXIgdGhhbiAyNE1IeiwgeW91IHNob3VsZCB1c2UgdGhlIFNETU1DIAotICAgICAgICBwZXJpcGhlcmFsIGluIGJ5cGFzcyBtb2RlLiBSZWZlciB0byB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2UgbWFudWFsIAorICAgICAgICBUbyBiZSBhYmxlIHRvIHVzZSBhIGZyZXF1ZW5jeSBoaWdoZXIgdGhhbiAyNE1IeiwgeW91IHNob3VsZCB1c2UgdGhlIFNETU1DCisgICAgICAgIHBlcmlwaGVyYWwgaW4gYnlwYXNzIG1vZGUuIFJlZmVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZSBtYW51YWwKICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4KLSAgCisKICAgICAoIykgU2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIE1NQyBDYXJkIGFjY29yZGluZyB0byB0aGUgYWRkcmVzcyByZWFkIHdpdGggdGhlIHN0ZXAgMi4KLSAgICAKKwogICAgICgjKSBDb25maWd1cmUgdGhlIE1NQyBDYXJkIGluIHdpZGUgYnVzIG1vZGU6IDQtYml0cyBkYXRhLgotICAKKwogICAqKiogTU1DIENhcmQgUmVhZCBvcGVyYXRpb24gKioqCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBbLi5dIAotICAgICgrKSBZb3UgY2FuIHJlYWQgZnJvbSBNTUMgY2FyZCBpbiBwb2xsaW5nIG1vZGUgYnkgdXNpbmcgZnVuY3Rpb24gSEFMX01NQ19SZWFkQmxvY2tzKCkuIAotICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgcmVhZCBvZiA1MTIgYnl0ZXMgYmxvY2tzLgotICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uIAorICBbLi5dCisgICAgKCspIFlvdSBjYW4gcmVhZCBmcm9tIE1NQyBjYXJkIGluIHBvbGxpbmcgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfTU1DX1JlYWRCbG9ja3MoKS4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0IG9ubHkgNTEyLWJ5dGVzIGJsb2NrIGxlbmd0aCAodGhlIGJsb2NrIHNpemUgc2hvdWxkIGJlCisgICAgICAgIGNob3NlbiBhcyA1MTIgYnl0ZXMpLgorICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uCiAgICAgICAgIGJ5IGFkanVzdGluZyB0aGUgIk51bWJlck9mQmxvY2tzIiBwYXJhbWV0ZXIuCiAgICAgICAgIEFmdGVyIHRoaXMsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lIGNvcnJlY3RseS4gVGhlIGNoZWNrIGlzIGRvbmUKICAgICAgICAgdGhyb3VnaCBIQUxfTU1DX0dldENhcmRTdGF0ZSgpIGZ1bmN0aW9uIGZvciBNTUMgY2FyZCBzdGF0ZS4KIAogICAgICgrKSBZb3UgY2FuIHJlYWQgZnJvbSBNTUMgY2FyZCBpbiBETUEgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfTU1DX1JlYWRCbG9ja3NfRE1BKCkuCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZWFkIG9mIDUxMiBieXRlcyBibG9ja3MuCi0gICAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBvbmUgYmxvY2sgcmVhZCBvcGVyYXRpb24gb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCBvcGVyYXRpb24gCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydCBvbmx5IDUxMi1ieXRlcyBibG9jayBsZW5ndGggKHRoZSBibG9jayBzaXplIHNob3VsZCBiZQorICAgICAgICBjaG9zZW4gYXMgNTEyIGJ5dGVzKS4KKyAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbgogICAgICAgICBieSBhZGp1c3RpbmcgdGhlICJOdW1iZXJPZkJsb2NrcyIgcGFyYW1ldGVyLgogICAgICAgICBBZnRlciB0aGlzLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgaXMgZG9uZSBjb3JyZWN0bHkuIFRoZSBjaGVjayBpcyBkb25lCiAgICAgICAgIHRocm91Z2ggSEFMX01NQ19HZXRDYXJkU3RhdGUoKSBmdW5jdGlvbiBmb3IgTU1DIGNhcmQgc3RhdGUuCkBAIC0xMjMsMjAgKzEyNCwyMiBAQAogICAgICAgICBBZnRlciB0aGlzLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgaXMgZG9uZSBjb3JyZWN0bHkuIFRoZSBjaGVjayBpcyBkb25lCiAgICAgICAgIHRocm91Z2ggSEFMX01NQ19HZXRDYXJkU3RhdGUoKSBmdW5jdGlvbiBmb3IgTU1DIGNhcmQgc3RhdGUuCiAgICAgICAgIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSBJVCB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIE1NQyBSeCBpbnRlcnJ1cHQgZXZlbnQuCi0gIAorCiAgICoqKiBNTUMgQ2FyZCBXcml0ZSBvcGVyYXRpb24gKioqCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gIFsuLl0gCi0gICAgKCspIFlvdSBjYW4gd3JpdGUgdG8gTU1DIGNhcmQgaW4gcG9sbGluZyBtb2RlIGJ5IHVzaW5nIGZ1bmN0aW9uIEhBTF9NTUNfV3JpdGVCbG9ja3MoKS4gCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZWFkIG9mIDUxMiBieXRlcyBibG9ja3MuCi0gICAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBvbmUgYmxvY2sgcmVhZCBvcGVyYXRpb24gb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCBvcGVyYXRpb24gCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgWy4uXQorICAgICgrKSBZb3UgY2FuIHdyaXRlIHRvIE1NQyBjYXJkIGluIHBvbGxpbmcgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfTU1DX1dyaXRlQmxvY2tzKCkuCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydCBvbmx5IDUxMi1ieXRlcyBibG9jayBsZW5ndGggKHRoZSBibG9jayBzaXplIHNob3VsZCBiZQorICAgICAgICBjaG9zZW4gYXMgNTEyIGJ5dGVzKS4KKyAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbgogICAgICAgICBieSBhZGp1c3RpbmcgdGhlICJOdW1iZXJPZkJsb2NrcyIgcGFyYW1ldGVyLgogICAgICAgICBBZnRlciB0aGlzLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgaXMgZG9uZSBjb3JyZWN0bHkuIFRoZSBjaGVjayBpcyBkb25lCiAgICAgICAgIHRocm91Z2ggSEFMX01NQ19HZXRDYXJkU3RhdGUoKSBmdW5jdGlvbiBmb3IgTU1DIGNhcmQgc3RhdGUuCiAKICAgICAoKykgWW91IGNhbiB3cml0ZSB0byBNTUMgY2FyZCBpbiBETUEgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfTU1DX1dyaXRlQmxvY2tzX0RNQSgpLgotICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgcmVhZCBvZiA1MTIgYnl0ZXMgYmxvY2tzLgotICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uIAorICAgICAgICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnQgb25seSA1MTItYnl0ZXMgYmxvY2sgbGVuZ3RoICh0aGUgYmxvY2sgc2l6ZSBzaG91bGQgYmUKKyAgICAgICAgY2hvc2VuIGFzIDUxMiBieXRlKS4KKyAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbgogICAgICAgICBieSBhZGp1c3RpbmcgdGhlICJOdW1iZXJPZkJsb2NrcyIgcGFyYW1ldGVyLgogICAgICAgICBBZnRlciB0aGlzLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgaXMgZG9uZSBjb3JyZWN0bHkuIFRoZSBjaGVjayBpcyBkb25lCiAgICAgICAgIHRocm91Z2ggSEFMX01NQ19HZXRDYXJkU3RhdGUoKSBmdW5jdGlvbiBmb3IgTU1DIGNhcmQgc3RhdGUuCkBAIC0xNzMsNyArMTc2LDcgQEAKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCiAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBNTUMgSEFMIGRyaXZlci4KLSAgICAgICAKKwogICAgICgrKSBfX0hBTF9NTUNfRU5BQkxFIDogRW5hYmxlIHRoZSBNTUMgZGV2aWNlCiAgICAgKCspIF9fSEFMX01NQ19ESVNBQkxFIDogRGlzYWJsZSB0aGUgTU1DIGRldmljZQogICAgICgrKSBfX0hBTF9NTUNfRE1BX0VOQUJMRTogRW5hYmxlIHRoZSBTRE1NQyBETUEgdHJhbnNmZXIKQEAgLTE4NCw4ICsxODcsOCBAQAogICAgICgrKSBfX0hBTF9NTUNfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIE1NQydzIHBlbmRpbmcgZmxhZ3MKIAogICBbLi5dCi0gICAgKEApIFlvdSBjYW4gcmVmZXIgdG8gdGhlIE1NQyBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MgCi0gICAgICAKKyAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgTU1DIEhBTCBkcml2ZXIgaGVhZGVyIGZpbGUgZm9yIG1vcmUgdXNlZnVsIG1hY3JvcworCiAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCkBAIC0yMTYsNyArMjE5LDcgQEAKICAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfTU1DX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfTU1DX1NUQVRFX1JFU0VUCiAgICAgYWxsIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucy4KICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKLSAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfTU1DX0luaXQgCisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX01NQ19Jbml0CiAgICAgYW5kIEByZWYgIEhBTF9NTUNfRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfTU1DX0luaXQgYW5kIEByZWYgSEFMX01NQ19EZUluaXQKICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpCkBAIC0yMjYsMTIgKzIyOSwxMyBAQAogICAgIGluIFJFQURZIG9yIFJFU0VUIHN0YXRlLCB0aHVzIHJlZ2lzdGVyZWQgKHVzZXIpIE1zcEluaXQvRGVJbml0IGNhbGxiYWNrcyBjYW4gYmUgdXNlZAogICAgIGR1cmluZyB0aGUgSW5pdC9EZUluaXQuCiAgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcwotICAgIHVzaW5nIEByZWYgSEFMX19SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX01NQ19EZUluaXQgCisgICAgdXNpbmcgQHJlZiBIQUxfTU1DX1JlZ2lzdGVyQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfTU1DX0RlSW5pdAogICAgIG9yIEByZWYgSEFMX01NQ19Jbml0IGZ1bmN0aW9uLgogCiAgICAgV2hlbiBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgotICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIAorICAgIG5vdCBkZWZpbmVkLCB0aGUgY2FsbGJhY2sgcmVnaXN0ZXJpbmcgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlCiAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KKwogICBAZW5kdmVyYmF0aW0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICogQGF0dGVudGlvbgpAQCAtMjQyLDEwICsyNDYsMTAgQEAKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCisgICogICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICAqCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqLyAKKyAgKi8KIAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsLmgiCkBAIC0yNjEsMTYgKzI2NSwxOCBAQAogCiAjaWZkZWYgSEFMX01NQ19NT0RVTEVfRU5BQkxFRAogCisjaWYgZGVmaW5lZChTRE1NQzEpCisKIC8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIE1NQ19Qcml2YXRlX0RlZmluZXMKICAgKiBAewogICAqLwotICAgIAorCiAvKioKICAgKiBAfQogICAqLwotICAKKwogLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjgxLDMxICsyODcsMzAgQEAKIHN0YXRpYyB1aW50MzJfdCBNTUNfSW5pdENhcmQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOwogc3RhdGljIHVpbnQzMl90IE1NQ19Qb3dlck9OKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKTsKIHN0YXRpYyB1aW50MzJfdCBNTUNfU2VuZFN0YXR1cyhNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgdWludDMyX3QgKnBDYXJkU3RhdHVzKTsKLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBNTUNfUG93ZXJPRkYoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIE1NQ19Xcml0ZV9JVChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYyk7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgTU1DX1JlYWRfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOwotc3RhdGljIHZvaWQgTU1DX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7Ci1zdGF0aWMgdm9pZCBNTUNfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwotc3RhdGljIHZvaWQgTU1DX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKLXN0YXRpYyB2b2lkIE1NQ19ETUFUeEFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKLXN0YXRpYyB2b2lkIE1NQ19ETUFSeEFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICBNTUNfUG93ZXJPRkYoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOworc3RhdGljIHZvaWQgICAgIE1NQ19Xcml0ZV9JVChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYyk7CitzdGF0aWMgdm9pZCAgICAgTU1DX1JlYWRfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpOworc3RhdGljIHZvaWQgICAgIE1NQ19ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOworc3RhdGljIHZvaWQgICAgIE1NQ19ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgTU1DX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKK3N0YXRpYyB2b2lkICAgICBNTUNfRE1BVHhBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CitzdGF0aWMgdm9pZCAgICAgTU1DX0RNQVJ4QWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwogLyoqCiAgICogQH0KICAgKi8KLQogLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAYWRkdG9ncm91cCBNTUNfRXhwb3J0ZWRfRnVuY3Rpb25zCiAgICogQHsKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIE1NQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCi0gKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCiAgKgotQHZlcmJhdGltICAgIAorQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIFsuLl0gIAorICBbLi5dCiAgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplL2RlLWluaXRpYWxpemUgdGhlIE1NQwogICAgIGNhcmQgZGV2aWNlIHRvIGJlIHJlYWR5IGZvciB1c2UuCiAKQEAgLTMxNCw5ICszMTksOSBAQAogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBNTUMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgCisgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgTU1DIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCiAgICAgICAgICAgICBNTUNfSGFuZGxlVHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byB0aGUgTU1DIGhhbmRsZSAgCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIHRoZSBNTUMgaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX0luaXQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCkBAIC0zNDAsNyArMzQ1LDcgQEAKICAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBobW1jLT5Mb2NrID0gSEFMX1VOTE9DS0VEOwotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgaW4gSEFMX01NQ19TVEFURV9SRVNFVCBvbmx5ICovCiAgICAgaG1tYy0+VHhDcGx0Q2FsbGJhY2sgICAgPSBIQUxfTU1DX1R4Q3BsdENhbGxiYWNrOwogICAgIGhtbWMtPlJ4Q3BsdENhbGxiYWNrICAgID0gSEFMX01NQ19SeENwbHRDYWxsYmFjazsKQEAgLTM1NywyMCArMzYyLDIzIEBACiAjZWxzZQogICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVguLi5ldGMgKi8KICAgICBIQUxfTU1DX01zcEluaXQoaG1tYyk7Ci0jZW5kaWYJCisjZW5kaWYKICAgfQogCiAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9CVVNZOwogCiAgIC8qIEluaXRpYWxpemUgdGhlIENhcmQgcGFyYW1ldGVycyAqLwotICBIQUxfTU1DX0luaXRDYXJkKGhtbWMpOworICBpZihIQUxfTU1DX0luaXRDYXJkKGhtbWMpID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KIAogICAvKiBJbml0aWFsaXplIHRoZSBlcnJvciBjb2RlICovCiAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgCisKICAgLyogSW5pdGlhbGl6ZSB0aGUgTU1DIG9wZXJhdGlvbiAqLwogICBobW1jLT5Db250ZXh0ID0gTU1DX0NPTlRFWFRfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwogICAvKiBJbml0aWFsaXplIHRoZSBNTUMgc3RhdGUgKi8KICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogCkBAIC0zNzksMTUgKzM4NywxNiBAQAogCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBNTUMgQ2FyZC4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCi0gICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBNTUMgY2FyZC4gSXQgY291bGQgYmUgdXNlZCB3aGVuIGEgY2FyZCAKKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgTU1DIGNhcmQuIEl0IGNvdWxkIGJlIHVzZWQgd2hlbiBhIGNhcmQKICAgICAgICAgICAgIHJlLWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfSW5pdENhcmQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIE1NQ19Jbml0VHlwZURlZiBJbml0OworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CiAgIAogICAvKiBEZWZhdWx0IFNETU1DIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbiBmb3IgTU1DIGNhcmQgaW5pdGlhbGl6YXRpb24gKi8KICAgSW5pdC5DbG9ja0VkZ2UgICAgICAgICAgID0gU0RNTUNfQ0xPQ0tfRURHRV9SSVNJTkc7CkBAIC0zOTgsMjAgKzQwNywyNSBAQAogICBJbml0LkNsb2NrRGl2ICAgICAgICAgICAgPSBTRE1NQ19JTklUX0NMS19ESVY7CiAKICAgLyogSW5pdGlhbGl6ZSBTRE1NQyBwZXJpcGhlcmFsIGludGVyZmFjZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLwotICBTRE1NQ19Jbml0KGhtbWMtPkluc3RhbmNlLCBJbml0KTsKKyAgc3RhdHVzID0gU0RNTUNfSW5pdChobW1jLT5JbnN0YW5jZSwgSW5pdCk7CisgIGlmKHN0YXR1cyA9PSBIQUxfRVJST1IpCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CiAKICAgLyogRGlzYWJsZSBTRE1NQyBDbG9jayAqLwogICBfX0hBTF9NTUNfRElTQUJMRShobW1jKTsgCiAgIAogICAvKiBTZXQgUG93ZXIgU3RhdGUgdG8gT04gKi8KLSAgU0RNTUNfUG93ZXJTdGF0ZV9PTihobW1jLT5JbnN0YW5jZSk7Ci0gIAorICBzdGF0dXMgPSBTRE1NQ19Qb3dlclN0YXRlX09OKGhtbWMtPkluc3RhbmNlKTsKKyAgaWYoc3RhdHVzID09IEhBTF9FUlJPUikKKyAgeworICAgIHJldHVybiBIQUxfRVJST1I7CisgIH0KKwogICAvKiBFbmFibGUgTU1DIENsb2NrICovCiAgIF9fSEFMX01NQ19FTkFCTEUoaG1tYyk7Ci0gIAotICAvKiBSZXF1aXJlZCBwb3dlciB1cCB3YWl0aW5nIHRpbWUgYmVmb3JlIHN0YXJ0aW5nIHRoZSBTRCBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSAqLwotICBIQUxfRGVsYXkoMik7Ci0gIAorCiAgIC8qIElkZW50aWZ5IGNhcmQgb3BlcmF0aW5nIHZvbHRhZ2UgKi8KICAgZXJyb3JzdGF0ZSA9IE1NQ19Qb3dlck9OKGhtbWMpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKQEAgLTQzNSw3ICs0NDksNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBNTUMgY2FyZC4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfRGVJbml0KE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQpAQCAtNDQ1LDE2ICs0NTksMTYgQEAKICAgewogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1NETU1DX0FMTF9JTlNUQU5DRShobW1jLT5JbnN0YW5jZSkpOwogCiAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9CVVNZOwotICAKLSAgLyogU2V0IE1NQyBwb3dlciBzdGF0ZSB0byBvZmYgKi8gCisKKyAgLyogU2V0IE1NQyBwb3dlciBzdGF0ZSB0byBvZmYgKi8KICAgTU1DX1Bvd2VyT0ZGKGhtbWMpOwotICAKLSNpZiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgIGlmKGhtbWMtPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICBobW1jLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9NTUNfTXNwRGVJbml0OwpAQCAtNDY2LDI0ICs0ODAsMjQgQEAKICAgLyogRGUtSW5pdGlhbGl6ZSB0aGUgTVNQIGxheWVyICovCiAgIEhBTF9NTUNfTXNwRGVJbml0KGhtbWMpOwogI2VuZGlmCi0gIAorCiAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFU0VUOwotICAKKwogICByZXR1cm4gSEFMX09LOwogfQogCiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIE1NQyBNU1AuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgaG1tYzogUG9pbnRlciB0byBNTUMgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfTU1DX01zcEluaXQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhtbWMpOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTU1DX01zcEluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KQEAgLTQ5MSwxNCArNTA1LDE0IEBACiAKIC8qKgogICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSBNTUMgTVNQLgotICAqIEBwYXJhbSAgaG1tYyBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgdG8gTU1DIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX01NQ19Nc3BEZUluaXQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhtbWMpOwotIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfTU1DX01zcERlSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtNTA5LDE0ICs1MjMsMTQgQEAKICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIE1NQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCi0gKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlciBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlciBmdW5jdGlvbnMKICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgZGF0YSAKKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgZGF0YQogICAgIHRyYW5zZmVyIGZyb20vdG8gTU1DIGNhcmQuCiAKIEBlbmR2ZXJiYXRpbQpAQCAtNTI0LDg1ICs1MzgsODYgQEAKICAgKi8KIAogLyoqCi0gICogQGJyaWVmICBSZWFkcyBibG9jayhzKSBmcm9tIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlciAKKyAgKiBAYnJpZWYgIFJlYWRzIGJsb2NrKHMpIGZyb20gYSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBhIGNhcmQuIFRoZSBEYXRhIHRyYW5zZmVyCiAgICogICAgICAgICBpcyBtYW5hZ2VkIGJ5IHBvbGxpbmcgbW9kZS4KICAgKiBAbm90ZSAgIFRoaXMgQVBJIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNoZWNrIG9uIHRoZSBjYXJkIHN0YXRlIHRocm91Z2gKICAgKiAgICAgICAgIEhBTF9NTUNfR2V0Q2FyZFN0YXRlKCkuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSByZWNlaXZlZCBkYXRhCi0gICogQHBhcmFtICBCbG9ja0FkZCBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkIAotICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3MgTnVtYmVyIG9mIE1NQyBibG9ja3MgdG8gcmVhZAotICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUKKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGE6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVjZWl2ZWQgZGF0YQorICAqIEBwYXJhbSAgQmxvY2tBZGQ6IEJsb2NrIEFkZHJlc3MgZnJvbSB3aGVyZSBkYXRhIGlzIHRvIGJlIHJlYWQKKyAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzOiBOdW1iZXIgb2YgTU1DIGJsb2NrcyB0byByZWFkCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfUmVhZEJsb2NrcyhNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IEJsb2NrQWRkLCB1aW50MzJfdCBOdW1iZXJPZkJsb2NrcywgdWludDMyX3QgVGltZW91dCkKIHsKICAgU0RNTUNfRGF0YUluaXRUeXBlRGVmIGNvbmZpZzsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgdWludDMyX3QgY291bnQgPSAwLCAqdGVtcGJ1ZmYgPSAodWludDMyX3QgKilwRGF0YTsKLSAgCisgIHVpbnQzMl90IGNvdW50LCBkYXRhLCBkYXRhcmVtYWluaW5nOworICB1aW50MzJfdCBhZGQgPSBCbG9ja0FkZDsKKyAgdWludDhfdCAqdGVtcGJ1ZmYgPSBwRGF0YTsKKwogICBpZihOVUxMID09IHBEYXRhKQogICB7CiAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfUEFSQU07CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotIAorCiAgIGlmKGhtbWMtPlN0YXRlID09IEhBTF9NTUNfU1RBVEVfUkVBRFkpCiAgIHsKLSAgICBobW1jLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gICAgCisgICAgaG1tYy0+RXJyb3JDb2RlID0gSEFMX01NQ19FUlJPUl9OT05FOworCiAgICAgaWYoKEJsb2NrQWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpKQogICAgIHsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCi0gICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX0JVU1k7Ci0gICAgCi0gICAgLyogSW5pdGlhbGl6ZSBkYXRhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgICBobW1jLT5JbnN0YW5jZS0+RENUUkwgPSAwOwogCi0gICAgLyogQ2hlY2sgdGhlIENhcmQgY2FwYWNpdHkgaW4gdGVybSBvZiBMb2dpY2FsIG51bWJlciBvZiBibG9ja3MgKi8KLSAgICBpZiAoKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpIDwgQ0FQQUNJVFkpCisgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX0JVU1k7CisKKyAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLworICAgIGhtbWMtPkluc3RhbmNlLT5EQ1RSTCA9IDBVOworCisgICAgaWYgKChobW1jLT5NbWNDYXJkLkNhcmRUeXBlKSAhPSBNTUNfSElHSF9DQVBBQ0lUWV9DQVJEKQogICAgIHsKLSAgICAgIEJsb2NrQWRkICo9IDUxMjsKKyAgICAgIGFkZCAqPSA1MTJVOwogICAgIH0KLSAgICAgIAorCiAgICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8KLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaG1tYy0+SW5zdGFuY2UsIEJMT0NLU0laRSk7CisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBNTUNfQkxPQ0tTSVpFKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgICAgICAKKyAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogQ29uZmlndXJlIHRoZSBNTUMgRFBTTSAoRGF0YSBQYXRoIFN0YXRlIE1hY2hpbmUpICovCiAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgICBjb25maWcuRGF0YUxlbmd0aCAgICA9IE51bWJlck9mQmxvY2tzICogQkxPQ0tTSVpFOworICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gTnVtYmVyT2ZCbG9ja3MgKiBNTUNfQkxPQ0tTSVpFOwogICAgIGNvbmZpZy5EYXRhQmxvY2tTaXplID0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNTEyQjsKICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19TRE1NQzsKICAgICBjb25maWcuVHJhbnNmZXJNb2RlICA9IFNETU1DX1RSQU5TRkVSX01PREVfQkxPQ0s7CiAgICAgY29uZmlnLkRQU00gICAgICAgICAgPSBTRE1NQ19EUFNNX0VOQUJMRTsKLSAgICBTRE1NQ19Db25maWdEYXRhKGhtbWMtPkluc3RhbmNlLCAmY29uZmlnKTsKLSAgICAKKyAgICAodm9pZClTRE1NQ19Db25maWdEYXRhKGhtbWMtPkluc3RhbmNlLCAmY29uZmlnKTsKKwogICAgIC8qIFJlYWQgYmxvY2socykgaW4gcG9sbGluZyBtb2RlICovCi0gICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxKQorICAgIGlmKE51bWJlck9mQmxvY2tzID4gMVUpCiAgICAgewogICAgICAgaG1tYy0+Q29udGV4dCA9IE1NQ19DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0s7Ci0gICAgICAKLSAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkTXVsdGlCbG9jayhobW1jLT5JbnN0YW5jZSwgQmxvY2tBZGQpOworCisgICAgICAvKiBSZWFkIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkTXVsdGlCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGhtbWMtPkNvbnRleHQgPSBNTUNfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSzsKLSAgICAgIAorCiAgICAgICAvKiBSZWFkIFNpbmdsZSBCbG9jayBjb21tYW5kICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhtbWMtPkluc3RhbmNlLCBhZGQpOwogICAgIH0KICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CkBAIC02MTIsMjEgKzYyNywzMyBAQAogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgICAKKwogICAgIC8qIFBvbGwgb24gU0RNTUMgZmxhZ3MgKi8KKyAgICBkYXRhcmVtYWluaW5nID0gY29uZmlnLkRhdGFMZW5ndGg7CiAgICAgd2hpbGUoIV9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX1JYT1ZFUlIgfCBTRE1NQ19GTEFHX0RDUkNGQUlMIHwgU0RNTUNfRkxBR19EVElNRU9VVCB8IFNETU1DX0ZMQUdfREFUQUVORCkpCiAgICAgewotICAgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfUlhGSUZPSEYpKQorICAgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfUlhGSUZPSEYpICYmIChkYXRhcmVtYWluaW5nID4gMFUpKQogICAgICAgewogICAgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBTRE1NQyBSeCBGSUZPICovCiAgICAgICAgIGZvcihjb3VudCA9IDBVOyBjb3VudCA8IDhVOyBjb3VudCsrKQogICAgICAgICB7Ci0gICAgICAgICAgKih0ZW1wYnVmZiArIGNvdW50KSA9IFNETU1DX1JlYWRGSUZPKGhtbWMtPkluc3RhbmNlKTsKKyAgICAgICAgICBkYXRhID0gU0RNTUNfUmVhZEZJRk8oaG1tYy0+SW5zdGFuY2UpOworICAgICAgICAgICp0ZW1wYnVmZiA9ICh1aW50OF90KShkYXRhICYgMHhGRlUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgICp0ZW1wYnVmZiA9ICh1aW50OF90KSgoZGF0YSA+PiA4VSkgJiAweEZGVSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAgICAgKnRlbXBidWZmID0gKHVpbnQ4X3QpKChkYXRhID4+IDE2VSkgJiAweEZGVSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAgICAgKnRlbXBidWZmID0gKHVpbnQ4X3QpKChkYXRhID4+IDI0VSkgJiAweEZGVSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CiAgICAgICAgIH0KLSAgICAgICAgdGVtcGJ1ZmYgKz0gOFU7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGlmKChUaW1lb3V0ID09IDBVKXx8KChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPj0gIFRpbWVvdXQpKQorCisgICAgICBpZigoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+PSAgVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgewogICAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwogICAgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwpAQCAtNjM1LDcgKzY2Miw3IEBACiAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKiBTZW5kIHN0b3AgdHJhbnNtaXNzaW9uIGNvbW1hbmQgaW4gY2FzZSBvZiBtdWx0aWJsb2NrIHJlYWQgKi8KICAgICBpZihfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfRkxBR19EQVRBRU5EKSAmJiAoTnVtYmVyT2ZCbG9ja3MgPiAxVSkpCiAgICAgewpAQCAtNjUwLDcgKzY3Nyw3IEBACiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogR2V0IGVycm9yIHN0YXRlICovCiAgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfRFRJTUVPVVQpKQogICAgIHsKQEAgLTY3NiwxNCArNzAzLDI5IEBACiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKLSAgICAvKiBFbXB0eSBGSUZPIGlmIHRoZXJlIGlzIHN0aWxsIGFueSBkYXRhICovCi0gICAgd2hpbGUgKChfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfRkxBR19SWERBVkwpKSkKKyAgICBlbHNlCiAgICAgewotICAgICAgKnRlbXBidWZmID0gU0RNTUNfUmVhZEZJRk8oaG1tYy0+SW5zdGFuY2UpOworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIC8qIEVtcHR5IEZJRk8gaWYgdGhlcmUgaXMgc3RpbGwgYW55IGRhdGEgKi8KKyAgICB3aGlsZSAoKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX1JYREFWTCkpICYmIChkYXRhcmVtYWluaW5nID4gMFUpKQorICAgIHsKKyAgICAgIGRhdGEgPSBTRE1NQ19SZWFkRklGTyhobW1jLT5JbnN0YW5jZSk7CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoZGF0YSAmIDB4RkZVKTsKICAgICAgIHRlbXBidWZmKys7Ci0gICAgICAKLSAgICAgIGlmKChUaW1lb3V0ID09IDBVKXx8KChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPj0gIFRpbWVvdXQpKQorICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKnRlbXBidWZmID0gKHVpbnQ4X3QpKChkYXRhID4+IDhVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoKGRhdGEgPj4gMTZVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoKGRhdGEgPj4gMjRVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID49ICBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCiAgICAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7ICAgICAgICAKQEAgLTY5MiwxMiArNzM0LDEyIEBACiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAgIAorICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKKwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtNzEyLDIxICs3NTQsMjIgQEAKICAgKiAgICAgICAgIHRyYW5zZmVyIGlzIG1hbmFnZWQgYnkgcG9sbGluZyBtb2RlLgogICAqIEBub3RlICAgVGhpcyBBUEkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2hlY2sgb24gdGhlIGNhcmQgc3RhdGUgdGhyb3VnaAogICAqICAgICAgICAgSEFMX01NQ19HZXRDYXJkU3RhdGUoKS4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCi0gICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKLSAgKiBAcGFyYW0gIEJsb2NrQWRkIEJsb2NrIEFkZHJlc3Mgd2hlcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gIAotICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3MgTnVtYmVyIG9mIE1NQyBibG9ja3MgdG8gd3JpdGUKLSAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSB0aW1lb3V0IHZhbHVlCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIE1NQyBibG9ja3MgdG8gd3JpdGUKKyAgKiBAcGFyYW0gIFRpbWVvdXQ6IFNwZWNpZnkgdGltZW91dCB2YWx1ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19Xcml0ZUJsb2NrcyhNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IEJsb2NrQWRkLCB1aW50MzJfdCBOdW1iZXJPZkJsb2NrcywgdWludDMyX3QgVGltZW91dCkKIHsKICAgU0RNTUNfRGF0YUluaXRUeXBlRGVmIGNvbmZpZzsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgdWludDMyX3QgY291bnQgPSAwOwotICB1aW50MzJfdCAqdGVtcGJ1ZmYgPSAodWludDMyX3QgKilwRGF0YTsKLSAgCisgIHVpbnQzMl90IGNvdW50LCBkYXRhLCBkYXRhcmVtYWluaW5nOworICB1aW50MzJfdCBhZGQgPSBCbG9ja0FkZDsKKyAgdWludDhfdCAqdGVtcGJ1ZmYgPSBwRGF0YTsKKwogICBpZihOVUxMID09IHBEYXRhKQogICB7CiAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfUEFSQU07CkBAIC03MzUsMTA3ICs3NzgsMTE4IEBACiAKICAgaWYoaG1tYy0+U3RhdGUgPT0gSEFMX01NQ19TVEFURV9SRUFEWSkKICAgewotICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKKyAgICBobW1jLT5FcnJvckNvZGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7CisKICAgICBpZigoQmxvY2tBZGQgKyBOdW1iZXJPZkJsb2NrcykgPiAoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfQUREUl9PVVRfT0ZfUkFOR0U7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgICBobW1jLT5JbnN0YW5jZS0+RENUUkwgPSAwOwotICAgICAKLSAgICAvKiBDaGVjayB0aGUgQ2FyZCBjYXBhY2l0eSBpbiB0ZXJtIG9mIExvZ2ljYWwgbnVtYmVyIG9mIGJsb2NrcyAqLwotICAgIGlmICgoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikgPCBDQVBBQ0lUWSkKKyAgICBobW1jLT5JbnN0YW5jZS0+RENUUkwgPSAwVTsKKworICAgIGlmICgoaG1tYy0+TW1jQ2FyZC5DYXJkVHlwZSkgIT0gTU1DX0hJR0hfQ0FQQUNJVFlfQ0FSRCkKICAgICB7Ci0gICAgICBCbG9ja0FkZCAqPSA1MTI7CisgICAgICBhZGQgKj0gNTEyVTsKICAgICB9Ci0gICAgCi0gICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBCTE9DS1NJWkUpOworCisgICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8KKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaG1tYy0+SW5zdGFuY2UsIE1NQ19CTE9DS1NJWkUpOwogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICAgIHsKICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIC8qIFdyaXRlIEJsb2NrcyBpbiBQb2xsaW5nIG1vZGUgKi8KICAgICBpZihOdW1iZXJPZkJsb2NrcyA+IDFVKQogICAgIHsKICAgICAgIGhtbWMtPkNvbnRleHQgPSBNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSzsKLSAgICAgIAotICAgICAgLyogV3JpdGUgTXVsdGkgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZU11bHRpQmxvY2soaG1tYy0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKworICAgICAgLyogV3JpdGUgTXVsdGkgQmxvY2sgY29tbWFuZCAqLworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGhtbWMtPkNvbnRleHQgPSBNTUNfQ09OVEVYVF9XUklURV9TSU5HTEVfQkxPQ0s7Ci0gICAgICAKKwogICAgICAgLyogV3JpdGUgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kV3JpdGVTaW5nbGVCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7ICAKKyAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLwogICAgIGNvbmZpZy5EYXRhVGltZU91dCAgID0gU0RNTUNfREFUQVRJTUVPVVQ7Ci0gICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBOdW1iZXJPZkJsb2NrcyAqIEJMT0NLU0laRTsKKyAgICBjb25maWcuRGF0YUxlbmd0aCAgICA9IE51bWJlck9mQmxvY2tzICogTU1DX0JMT0NLU0laRTsKICAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CiAgICAgY29uZmlnLlRyYW5zZmVyRGlyICAgPSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fQ0FSRDsKICAgICBjb25maWcuVHJhbnNmZXJNb2RlICA9IFNETU1DX1RSQU5TRkVSX01PREVfQkxPQ0s7CiAgICAgY29uZmlnLkRQU00gICAgICAgICAgPSBTRE1NQ19EUFNNX0VOQUJMRTsKLSAgICBTRE1NQ19Db25maWdEYXRhKGhtbWMtPkluc3RhbmNlLCAmY29uZmlnKTsKLSAgICAKKyAgICAodm9pZClTRE1NQ19Db25maWdEYXRhKGhtbWMtPkluc3RhbmNlLCAmY29uZmlnKTsKKwogICAgIC8qIFdyaXRlIGJsb2NrKHMpIGluIHBvbGxpbmcgbW9kZSAqLworICAgIGRhdGFyZW1haW5pbmcgPSBjb25maWcuRGF0YUxlbmd0aDsKICAgICB3aGlsZSghX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfVFhVTkRFUlIgfCBTRE1NQ19GTEFHX0RDUkNGQUlMIHwgU0RNTUNfRkxBR19EVElNRU9VVCB8IFNETU1DX0ZMQUdfREFUQUVORCkpCiAgICAgewotICAgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfVFhGSUZPSEUpKQorICAgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfVFhGSUZPSEUpICYmIChkYXRhcmVtYWluaW5nID4gMFUpKQogICAgICAgewogICAgICAgICAvKiBXcml0ZSBkYXRhIHRvIFNETU1DIFR4IEZJRk8gKi8KICAgICAgICAgZm9yKGNvdW50ID0gMFU7IGNvdW50IDwgOFU7IGNvdW50KyspCiAgICAgICAgIHsKLSAgICAgICAgICBTRE1NQ19Xcml0ZUZJRk8oaG1tYy0+SW5zdGFuY2UsICh0ZW1wYnVmZiArIGNvdW50KSk7CisgICAgICAgICAgZGF0YSA9ICh1aW50MzJfdCkoKnRlbXBidWZmKTsKKyAgICAgICAgICB0ZW1wYnVmZisrOworICAgICAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgICAgICBkYXRhIHw9ICgodWludDMyX3QpKCp0ZW1wYnVmZikgPDwgOFUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRlbXBidWZmKSA8PCAxNlUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRlbXBidWZmKSA8PCAyNFUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgICh2b2lkKVNETU1DX1dyaXRlRklGTyhobW1jLT5JbnN0YW5jZSwgJmRhdGEpOwogICAgICAgICB9Ci0gICAgICAgIHRlbXBidWZmICs9IDhVOwogICAgICAgfQotICAgICAgCi0gICAgICBpZigoVGltZW91dCA9PSAwVSl8fCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID49ICBUaW1lb3V0KSkKKworICAgICAgaWYoKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPj0gIFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgIHsKICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgIAorICAgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogU2VuZCBzdG9wIHRyYW5zbWlzc2lvbiBjb21tYW5kIGluIGNhc2Ugb2YgbXVsdGlibG9jayB3cml0ZSAqLwogICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RBVEFFTkQpICYmIChOdW1iZXJPZkJsb2NrcyA+IDFVKSkKLSAgICB7IAorICAgIHsKICAgICAgIC8qIFNlbmQgc3RvcCB0cmFuc21pc3Npb24gY29tbWFuZCAqLwogICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFN0b3BUcmFuc2ZlcihobW1jLT5JbnN0YW5jZSk7CiAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICAgIHsKICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgIAorICAgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qIEdldCBlcnJvciBzdGF0ZSAqLwogICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RUSU1FT1VUKSkKICAgICB7CkBAIC04NDksNyArOTAzLDcgQEAKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwogICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0RBVEFfQ1JDX0ZBSUw7ICAgICAgCisgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9EQVRBX0NSQ19GQUlMOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CkBAIC04NjEsMTIgKzkxNSwxNiBAQAogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7Ci0gICAgCisgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCiAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwotICAgIAorCiAgICAgcmV0dXJuIEhBTF9PSzsKICAgfQogICBlbHNlCkBAIC04NzcsOTkgKzkzNSwxMDAgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBSZWFkcyBibG9jayhzKSBmcm9tIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlciAKLSAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuIAorICAqIEBicmllZiAgUmVhZHMgYmxvY2socykgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIKKyAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuCiAgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjaGVjayBvbiB0aGUgY2FyZCBzdGF0ZSB0aHJvdWdoCiAgICogICAgICAgICBIQUxfTU1DX0dldENhcmRTdGF0ZSgpLgotICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIElUIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgTU1DIFJ4IAorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIElUIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgTU1DIFJ4CiAgICogICAgICAgICBpbnRlcnJ1cHQgZXZlbnQuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZSAgICAgICAgICAgICAgICAgCi0gICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlY2VpdmVkIGRhdGEKLSAgKiBAcGFyYW0gIEJsb2NrQWRkIEJsb2NrIEFkZHJlc3MgZnJvbSB3aGVyZSBkYXRhIGlzIHRvIGJlIHJlYWQgCi0gICogQHBhcmFtICBOdW1iZXJPZkJsb2NrcyBOdW1iZXIgb2YgYmxvY2tzIHRvIHJlYWQuCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIGJsb2NrcyB0byByZWFkLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19SZWFkQmxvY2tzX0lUKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgQmxvY2tBZGQsIHVpbnQzMl90IE51bWJlck9mQmxvY2tzKQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgaWYoaG1tYy0+U3RhdGUgPT0gSEFMX01NQ19TVEFURV9SRUFEWSkKICAgewotICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKKyAgICBobW1jLT5FcnJvckNvZGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7CisKICAgICBpZigoQmxvY2tBZGQgKyBOdW1iZXJPZkJsb2NrcykgPiAoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfQUREUl9PVVRfT0ZfUkFOR0U7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KICAgICBobW1jLT5JbnN0YW5jZS0+RENUUkwgPSAwVTsKLSAgICAKLSAgICBobW1jLT5wUnhCdWZmUHRyID0gKHVpbnQzMl90ICopcERhdGE7Ci0gICAgaG1tYy0+UnhYZmVyU2l6ZSA9IEJMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOwotICAgIAorCisgICAgaG1tYy0+cFJ4QnVmZlB0ciA9IHBEYXRhOworICAgIGhtbWMtPlJ4WGZlclNpemUgPSBNTUNfQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisKICAgICBfX0hBTF9NTUNfRU5BQkxFX0lUKGhtbWMsIChTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHwgU0RNTUNfSVRfUlhPVkVSUiB8IFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19GTEFHX1JYRklGT0hGKSk7Ci0gICAgCi0gICAgLyogQ2hlY2sgdGhlIENhcmQgY2FwYWNpdHkgaW4gdGVybSBvZiBMb2dpY2FsIG51bWJlciBvZiBibG9ja3MgKi8KLSAgICBpZiAoKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpIDwgQ0FQQUNJVFkpCisKKyAgICBpZiAoKGhtbWMtPk1tY0NhcmQuQ2FyZFR5cGUpICE9IE1NQ19ISUdIX0NBUEFDSVRZX0NBUkQpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyOworICAgICAgYWRkICo9IDUxMlU7CiAgICAgfQotICAgIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKLSAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOwotICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7Ci0gICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOwotICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX1NETU1DOwotICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKLSAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOwotICAgIAotICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovIAotICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCbG9ja0xlbmd0aChobW1jLT5JbnN0YW5jZSwgQkxPQ0tTSVpFKTsKKworICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBNTUNfQkxPQ0tTSVpFKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KIAorICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLworICAgIGNvbmZpZy5EYXRhVGltZU91dCAgID0gU0RNTUNfREFUQVRJTUVPVVQ7CisgICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBNTUNfQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisgICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOworICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX1NETU1DOworICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKKyAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOworICAgICh2b2lkKVNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOworCiAgICAgLyogUmVhZCBCbG9ja3MgaW4gSVQgbW9kZSAqLwogICAgIGlmKE51bWJlck9mQmxvY2tzID4gMVUpCiAgICAgewogICAgICAgaG1tYy0+Q29udGV4dCA9IChNTUNfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLIHwgTU1DX0NPTlRFWFRfSVQpOwotICAgICAgCisKICAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLwotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRNdWx0aUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZE11bHRpQmxvY2soaG1tYy0+SW5zdGFuY2UsIGFkZCk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBobW1jLT5Db250ZXh0ID0gKE1NQ19DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLIHwgTU1DX0NPTlRFWFRfSVQpOwotICAgICAgCisKICAgICAgIC8qIFJlYWQgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkU2luZ2xlQmxvY2soaG1tYy0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkU2luZ2xlQmxvY2soaG1tYy0+SW5zdGFuY2UsIGFkZCk7CiAgICAgfQorCiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gSEFMX09LOwogICB9CiAgIGVsc2UKQEAgLTk3OSw5OSArMTAzOCw5OSBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgIFdyaXRlcyBibG9jayhzKSB0byBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIgCi0gICogICAgICAgICBpcyBtYW5hZ2VkIGluIGludGVycnVwdCBtb2RlLiAKKyAgKiBAYnJpZWYgIFdyaXRlcyBibG9jayhzKSB0byBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIKKyAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuCiAgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjaGVjayBvbiB0aGUgY2FyZCBzdGF0ZSB0aHJvdWdoCiAgICogICAgICAgICBIQUxfTU1DX0dldENhcmRTdGF0ZSgpLgotICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIElUIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgTU1DIFR4IAotICAqICAgICAgICAgaW50ZXJydXB0IGV2ZW50LiAKLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCi0gICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKLSAgKiBAcGFyYW0gIEJsb2NrQWRkIEJsb2NrIEFkZHJlc3Mgd2hlcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gICAgCi0gICogQHBhcmFtICBOdW1iZXJPZkJsb2NrcyBOdW1iZXIgb2YgYmxvY2tzIHRvIHdyaXRlCisgICogQG5vdGUgICBZb3UgY291bGQgYWxzbyBjaGVjayB0aGUgSVQgdHJhbnNmZXIgcHJvY2VzcyB0aHJvdWdoIHRoZSBNTUMgVHgKKyAgKiAgICAgICAgIGludGVycnVwdCBldmVudC4KKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGF0YSB0byB0cmFuc21pdAorICAqIEBwYXJhbSAgQmxvY2tBZGQ6IEJsb2NrIEFkZHJlc3Mgd2hlcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4KKyAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzOiBOdW1iZXIgb2YgYmxvY2tzIHRvIHdyaXRlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX1dyaXRlQmxvY2tzX0lUKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgQmxvY2tBZGQsIHVpbnQzMl90IE51bWJlck9mQmxvY2tzKQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgaWYoaG1tYy0+U3RhdGUgPT0gSEFMX01NQ19TVEFURV9SRUFEWSkKICAgewotICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKKyAgICBobW1jLT5FcnJvckNvZGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7CisKICAgICBpZigoQmxvY2tBZGQgKyBOdW1iZXJPZkJsb2NrcykgPiAoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfQUREUl9PVVRfT0ZfUkFOR0U7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KICAgICBobW1jLT5JbnN0YW5jZS0+RENUUkwgPSAwVTsKLSAgICAKLSAgICBobW1jLT5wVHhCdWZmUHRyID0gKHVpbnQzMl90ICopcERhdGE7Ci0gICAgaG1tYy0+VHhYZmVyU2l6ZSA9IEJMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOwotICAgIAorCisgICAgaG1tYy0+cFR4QnVmZlB0ciA9IHBEYXRhOworICAgIGhtbWMtPlR4WGZlclNpemUgPSBNTUNfQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisKICAgICAvKiBFbmFibGUgdHJhbnNmZXIgaW50ZXJydXB0cyAqLwotICAgIF9fSEFMX01NQ19FTkFCTEVfSVQoaG1tYywgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUiB8IFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19GTEFHX1RYRklGT0hFKSk7IAotICAgIAotICAgIC8qIENoZWNrIHRoZSBDYXJkIGNhcGFjaXR5IGluIHRlcm0gb2YgTG9naWNhbCBudW1iZXIgb2YgYmxvY2tzICovCi0gICAgaWYgKChobW1jLT5NbWNDYXJkLkxvZ0Jsb2NrTmJyKSA8IENBUEFDSVRZKQorICAgIF9fSEFMX01NQ19FTkFCTEVfSVQoaG1tYywgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUiB8IFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19GTEFHX1RYRklGT0hFKSk7CisKKyAgICBpZiAoKGhtbWMtPk1tY0NhcmQuQ2FyZFR5cGUpICE9IE1NQ19ISUdIX0NBUEFDSVRZX0NBUkQpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyOworICAgICAgYWRkICo9IDUxMlU7CiAgICAgfQotICAgIAotICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovIAotICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCbG9ja0xlbmd0aChobW1jLT5JbnN0YW5jZSwgQkxPQ0tTSVpFKTsKKworICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBNTUNfQkxPQ0tTSVpFKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIC8qIFdyaXRlIEJsb2NrcyBpbiBQb2xsaW5nIG1vZGUgKi8KICAgICBpZihOdW1iZXJPZkJsb2NrcyA+IDFVKQogICAgIHsKICAgICAgIGhtbWMtPkNvbnRleHQgPSAoTU1DX0NPTlRFWFRfV1JJVEVfTVVMVElQTEVfQkxPQ0t8IE1NQ19DT05URVhUX0lUKTsKLSAgICAgIAotICAgICAgLyogV3JpdGUgTXVsdGkgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZU11bHRpQmxvY2soaG1tYy0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKworICAgICAgLyogV3JpdGUgTXVsdGkgQmxvY2sgY29tbWFuZCAqLworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGhtbWMtPkNvbnRleHQgPSAoTU1DX0NPTlRFWFRfV1JJVEVfU0lOR0xFX0JMT0NLIHwgTU1DX0NPTlRFWFRfSVQpOwotICAgICAgCi0gICAgICAvKiBXcml0ZSBTaW5nbGUgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisKKyAgICAgIC8qIFdyaXRlIFNpbmdsZSBCbG9jayBjb21tYW5kICovCisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kV3JpdGVTaW5nbGVCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICAvKiBDb25maWd1cmUgdGhlIE1NQyBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8gCiAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgICBjb25maWcuRGF0YUxlbmd0aCAgICA9IEJMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOworICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gTU1DX0JMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOwogICAgIGNvbmZpZy5EYXRhQmxvY2tTaXplID0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNTEyQjsKICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19DQVJEOwogICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKICAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOworICAgICh2b2lkKVNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOwogICAgIAogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KQEAgLTEwODIsMTEyICsxMTQxLDEyMiBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgIFJlYWRzIGJsb2NrKHMpIGZyb20gYSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBhIGNhcmQuIFRoZSBEYXRhIHRyYW5zZmVyIAotICAqICAgICAgICAgaXMgbWFuYWdlZCBieSBETUEgbW9kZS4gCisgICogQGJyaWVmICBSZWFkcyBibG9jayhzKSBmcm9tIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlcgorICAqICAgICAgICAgaXMgbWFuYWdlZCBieSBETUEgbW9kZS4KICAgKiBAbm90ZSAgIFRoaXMgQVBJIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNoZWNrIG9uIHRoZSBjYXJkIHN0YXRlIHRocm91Z2gKICAgKiAgICAgICAgIEhBTF9NTUNfR2V0Q2FyZFN0YXRlKCkuCi0gICogQG5vdGUgICBZb3UgY291bGQgYWxzbyBjaGVjayB0aGUgRE1BIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgTU1DIFJ4IAorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIE1NQyBSeAogICAqICAgICAgICAgaW50ZXJydXB0IGV2ZW50LgotICAqIEBwYXJhbSAgaG1tYyBQb2ludGVyIE1NQyBoYW5kbGUgICAgICAgICAgICAgICAgIAotICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSByZWNlaXZlZCBkYXRhCi0gICogQHBhcmFtICBCbG9ja0FkZCBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkICAKLSAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzIE51bWJlciBvZiBibG9ja3MgdG8gcmVhZC4KKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVjZWl2ZWQgZGF0YQorICAqIEBwYXJhbSAgQmxvY2tBZGQ6IEJsb2NrIEFkZHJlc3MgZnJvbSB3aGVyZSBkYXRhIGlzIHRvIGJlIHJlYWQKKyAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzOiBOdW1iZXIgb2YgYmxvY2tzIHRvIHJlYWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX1JlYWRCbG9ja3NfRE1BKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgQmxvY2tBZGQsIHVpbnQzMl90IE51bWJlck9mQmxvY2tzKQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgaWYoaG1tYy0+U3RhdGUgPT0gSEFMX01NQ19TVEFURV9SRUFEWSkKICAgewogICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKKwogICAgIGlmKChCbG9ja0FkZCArIE51bWJlck9mQmxvY2tzKSA+IChobW1jLT5NbWNDYXJkLkxvZ0Jsb2NrTmJyKSkKICAgICB7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9BRERSX09VVF9PRl9SQU5HRTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwogICAgIGhtbWMtPkluc3RhbmNlLT5EQ1RSTCA9IDBVOwotICAgIAorCiAgICAgX19IQUxfTU1DX0VOQUJMRV9JVChobW1jLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1JYT1ZFUlIgfCBTRE1NQ19JVF9EQVRBRU5EKSk7Ci0gICAgCisKICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwogICAgIGhtbWMtPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IE1NQ19ETUFSZWNlaXZlQ3BsdDsKLSAgICAKKwogICAgIC8qIFNldCB0aGUgRE1BIGVycm9yIGNhbGxiYWNrICovCiAgICAgaG1tYy0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IE1NQ19ETUFFcnJvcjsKLSAgICAKKwogICAgIC8qIFNldCB0aGUgRE1BIEFib3J0IGNhbGxiYWNrICovCiAgICAgaG1tYy0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IE5VTEw7Ci0gICAgCi0gICAgLyogRW5hYmxlIHRoZSBETUEgQ2hhbm5lbCAqLwotICAgIEhBTF9ETUFfU3RhcnRfSVQoaG1tYy0+aGRtYXJ4LCAodWludDMyX3QpJmhtbWMtPkluc3RhbmNlLT5GSUZPLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkoQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3MpLzQpOwotICAgIAotICAgIC8qIEVuYWJsZSBNTUMgRE1BIHRyYW5zZmVyICovCi0gICAgX19IQUxfTU1DX0RNQV9FTkFCTEUoaG1tYyk7Ci0gICAgCi0gICAgLyogQ2hlY2sgdGhlIENhcmQgY2FwYWNpdHkgaW4gdGVybSBvZiBMb2dpY2FsIG51bWJlciBvZiBibG9ja3MgKi8KLSAgICBpZiAoKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpIDwgQ0FQQUNJVFkpCisKKyAgICBpZiAoKGhtbWMtPk1tY0NhcmQuQ2FyZFR5cGUpICE9IE1NQ19ISUdIX0NBUEFDSVRZX0NBUkQpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyOworICAgICAgYWRkICo9IDUxMlU7CiAgICAgfQotICAgIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKLSAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOwotICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7Ci0gICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOwotICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX1NETU1DOwotICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKLSAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOwogCiAgICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBCTE9DS1NJWkUpOworICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCbG9ja0xlbmd0aChobW1jLT5JbnN0YW5jZSwgTU1DX0JMT0NLU0laRSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KICAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAotICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CisgICAgICBobW1jLT5FcnJvckNvZGUgPSBlcnJvcnN0YXRlOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgICAgIAotICAgIC8qIFJlYWQgQmxvY2tzIGluIERNQSBtb2RlICovCi0gICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKKworICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KKyAgICBpZihIQUxfRE1BX1N0YXJ0X0lUKGhtbWMtPmhkbWFyeCwgKHVpbnQzMl90KSZobW1jLT5JbnN0YW5jZS0+RklGTywgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpKE1NQ19CTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNCkgIT0gSEFMX09LKQogICAgIHsKLSAgICAgIGhtbWMtPkNvbnRleHQgPSAoTU1DX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSyB8IE1NQ19DT05URVhUX0RNQSk7Ci0gICAgICAKLSAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkTXVsdGlCbG9jayhobW1jLT5JbnN0YW5jZSwgQmxvY2tBZGQpOworICAgICAgX19IQUxfTU1DX0RJU0FCTEVfSVQoaG1tYywgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9SWE9WRVJSIHwgU0RNTUNfSVRfREFUQUVORCkpOworICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKKyAgICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9NTUNfRVJST1JfRE1BOworICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGhtbWMtPkNvbnRleHQgPSAoTU1DX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0sgfCBNTUNfQ09OVEVYVF9ETUEpOwotICAgICAgCi0gICAgICAvKiBSZWFkIFNpbmdsZSBCbG9jayBjb21tYW5kICovIAotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRTaW5nbGVCbG9jayhobW1jLT5JbnN0YW5jZSwgQmxvY2tBZGQpOwotICAgIH0KLSAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCi0gICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKLSAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKLSAgICAgIHJldHVybiBIQUxfRVJST1I7Ci0gICAgfQorICAgICAgLyogRW5hYmxlIE1NQyBETUEgdHJhbnNmZXIgKi8KKyAgICAgIF9fSEFMX01NQ19ETUFfRU5BQkxFKGhtbWMpOwogCi0gICAgcmV0dXJuIEhBTF9PSzsKKyAgICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLworICAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKKyAgICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gTU1DX0JMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOworICAgICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOworICAgICAgY29uZmlnLlRyYW5zZmVyRGlyICAgPSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUM7CisgICAgICBjb25maWcuVHJhbnNmZXJNb2RlICA9IFNETU1DX1RSQU5TRkVSX01PREVfQkxPQ0s7CisgICAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOworICAgICAgKHZvaWQpU0RNTUNfQ29uZmlnRGF0YShobW1jLT5JbnN0YW5jZSwgJmNvbmZpZyk7CisKKyAgICAgIC8qIFJlYWQgQmxvY2tzIGluIERNQSBtb2RlICovCisgICAgICBpZihOdW1iZXJPZkJsb2NrcyA+IDFVKQorICAgICAgeworICAgICAgICBobW1jLT5Db250ZXh0ID0gKE1NQ19DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0sgfCBNTUNfQ09OVEVYVF9ETUEpOworCisgICAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLworICAgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZE11bHRpQmxvY2soaG1tYy0+SW5zdGFuY2UsIGFkZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhtbWMtPkNvbnRleHQgPSAoTU1DX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0sgfCBNTUNfQ09OVEVYVF9ETUEpOworCisgICAgICAgIC8qIFJlYWQgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRTaW5nbGVCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKKyAgICAgIH0KKyAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQorICAgICAgeworICAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLworICAgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAKKyAgICAgICAgX19IQUxfTU1DX0RJU0FCTEVfSVQoaG1tYywgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9SWE9WRVJSIHwgU0RNTUNfSVRfREFUQUVORCkpOworICAgICAgICBobW1jLT5FcnJvckNvZGUgPSBlcnJvcnN0YXRlOworICAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQogICB9CiAgIGVsc2UKICAgewpAQCAtMTE5NiwxMTMgKzEyNjUsMTIzIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgV3JpdGVzIGJsb2NrKHMpIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlciAKLSAgKiAgICAgICAgIGlzIG1hbmFnZWQgYnkgRE1BIG1vZGUuIAorICAqIEBicmllZiAgV3JpdGVzIGJsb2NrKHMpIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlcgorICAqICAgICAgICAgaXMgbWFuYWdlZCBieSBETUEgbW9kZS4KICAgKiBAbm90ZSAgIFRoaXMgQVBJIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNoZWNrIG9uIHRoZSBjYXJkIHN0YXRlIHRocm91Z2gKICAgKiAgICAgICAgIEhBTF9NTUNfR2V0Q2FyZFN0YXRlKCkuCi0gICogQG5vdGUgICBZb3UgY291bGQgYWxzbyBjaGVjayB0aGUgRE1BIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgTU1DIFR4IAorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIE1NQyBUeAogICAqICAgICAgICAgaW50ZXJydXB0IGV2ZW50LgotICAqIEBwYXJhbSAgaG1tYyBQb2ludGVyIHRvIE1NQyBoYW5kbGUKLSAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGF0YSB0byB0cmFuc21pdAotICAqIEBwYXJhbSAgQmxvY2tBZGQgQmxvY2sgQWRkcmVzcyB3aGVyZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiAgCi0gICogQHBhcmFtICBOdW1iZXJPZkJsb2NrcyBOdW1iZXIgb2YgYmxvY2tzIHRvIHdyaXRlCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIGJsb2NrcyB0byB3cml0ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19Xcml0ZUJsb2Nrc19ETUEoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBCbG9ja0FkZCwgdWludDMyX3QgTnVtYmVyT2ZCbG9ja3MpCiB7CiAgIFNETU1DX0RhdGFJbml0VHlwZURlZiBjb25maWc7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7Ci0gIAorICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MzJfdCBhZGQgPSBCbG9ja0FkZDsKKwogICBpZihOVUxMID09IHBEYXRhKQogICB7CiAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfUEFSQU07CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKKwogICBpZihobW1jLT5TdGF0ZSA9PSBIQUxfTU1DX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaG1tYy0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOwotICAgIAorICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKKwogICAgIGlmKChCbG9ja0FkZCArIE51bWJlck9mQmxvY2tzKSA+IChobW1jLT5NbWNDYXJkLkxvZ0Jsb2NrTmJyKSkKICAgICB7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9BRERSX09VVF9PRl9SQU5HRTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwogICAgIGhtbWMtPkluc3RhbmNlLT5EQ1RSTCA9IDBVOwotICAgIAorCiAgICAgLyogRW5hYmxlIE1NQyBFcnJvciBpbnRlcnJ1cHRzICovCi0gICAgX19IQUxfTU1DX0VOQUJMRV9JVChobW1jLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1RYVU5ERVJSKSk7ICAgIAotICAgIAorCV9fSEFMX01NQ19FTkFCTEVfSVQoaG1tYywgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUikpOworCiAgICAgLyogU2V0IHRoZSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICAgICBobW1jLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBNTUNfRE1BVHJhbnNtaXRDcGx0OwotICAgIAorCiAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KICAgICBobW1jLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gTU1DX0RNQUVycm9yOwotICAgIAorCiAgICAgLyogU2V0IHRoZSBETUEgQWJvcnQgY2FsbGJhY2sgKi8KICAgICBobW1jLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKLSAgICAKLSAgICAvKiBDaGVjayB0aGUgQ2FyZCBjYXBhY2l0eSBpbiB0ZXJtIG9mIExvZ2ljYWwgbnVtYmVyIG9mIGJsb2NrcyAqLwotICAgIGlmICgoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikgPCBDQVBBQ0lUWSkKKworICAgIGlmICgoaG1tYy0+TW1jQ2FyZC5DYXJkVHlwZSkgIT0gTU1DX0hJR0hfQ0FQQUNJVFlfQ0FSRCkKICAgICB7Ci0gICAgICBCbG9ja0FkZCAqPSA1MTI7CisgICAgICBhZGQgKj0gNTEyVTsKICAgICB9Ci0gICAgCi0gICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhtbWMtPkluc3RhbmNlLCBCTE9DS1NJWkUpOworCisgICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8KKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaG1tYy0+SW5zdGFuY2UsIE1NQ19CTE9DS1NJWkUpOwogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICAgIHsKICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAKKyAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogV3JpdGUgQmxvY2tzIGluIFBvbGxpbmcgbW9kZSAqLwogICAgIGlmKE51bWJlck9mQmxvY2tzID4gMVUpCiAgICAgewogICAgICAgaG1tYy0+Q29udGV4dCA9IChNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSyB8IE1NQ19DT05URVhUX0RNQSk7Ci0gICAgICAKLSAgICAgIC8qIFdyaXRlIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8gCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kV3JpdGVNdWx0aUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisKKyAgICAgIC8qIFdyaXRlIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZU11bHRpQmxvY2soaG1tYy0+SW5zdGFuY2UsIGFkZCk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBobW1jLT5Db250ZXh0ID0gKE1NQ19DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSyB8IE1NQ19DT05URVhUX0RNQSk7Ci0gICAgICAKKwogICAgICAgLyogV3JpdGUgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhtbWMtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kV3JpdGVTaW5nbGVCbG9jayhobW1jLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKKyAgICAgIF9fSEFMX01NQ19ESVNBQkxFX0lUKGhtbWMsIChTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHwgU0RNTUNfSVRfVFhVTkRFUlIgfCBTRE1NQ19JVF9EQVRBRU5EKSk7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogRW5hYmxlIFNETU1DIERNQSB0cmFuc2ZlciAqLwogICAgIF9fSEFMX01NQ19ETUFfRU5BQkxFKGhtbWMpOwotICAgIAorCiAgICAgLyogRW5hYmxlIHRoZSBETUEgQ2hhbm5lbCAqLwotICAgIEhBTF9ETUFfU3RhcnRfSVQoaG1tYy0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaG1tYy0+SW5zdGFuY2UtPkZJRk8sICh1aW50MzJfdCkoQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3MpLzQpOwotICAgIAotICAgIC8qIENvbmZpZ3VyZSB0aGUgTU1DIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKLSAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOwotICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7Ci0gICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOwotICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX0NBUkQ7Ci0gICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOwotICAgIGNvbmZpZy5EUFNNICAgICAgICAgID0gU0RNTUNfRFBTTV9FTkFCTEU7Ci0gICAgU0RNTUNfQ29uZmlnRGF0YShobW1jLT5JbnN0YW5jZSwgJmNvbmZpZyk7Ci0gICAgCi0gICAgcmV0dXJuIEhBTF9PSzsKKyAgICBpZihIQUxfRE1BX1N0YXJ0X0lUKGhtbWMtPmhkbWF0eCwgKHVpbnQzMl90KXBEYXRhLCAodWludDMyX3QpJmhtbWMtPkluc3RhbmNlLT5GSUZPLCAodWludDMyX3QpKE1NQ19CTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIF9fSEFMX01NQ19ESVNBQkxFX0lUKGhtbWMsIChTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHwgU0RNTUNfSVRfVFhVTkRFUlIgfCBTRE1NQ19JVF9EQVRBRU5EKSk7CisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOworICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfRE1BOworICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOworICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAgCisgICAgICAvKiBDb25maWd1cmUgdGhlIE1NQyBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8gCisgICAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOworICAgICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBNTUNfQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisgICAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CisgICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19DQVJEOworICAgICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOworICAgICAgY29uZmlnLkRQU00gICAgICAgICAgPSBTRE1NQ19EUFNNX0VOQUJMRTsKKyAgICAgICh2b2lkKVNETU1DX0NvbmZpZ0RhdGEoaG1tYy0+SW5zdGFuY2UsICZjb25maWcpOworCisgICAgICByZXR1cm4gSEFMX09LOworICAgIH0KICAgfQogICBlbHNlCiAgIHsKQEAgLTEzMTQsMzMgKzEzOTMsMzUgQEAKICAgKiBAYnJpZWYgIEVyYXNlcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBhcmVhIG9mIHRoZSBnaXZlbiBNTUMgY2FyZC4KICAgKiBAbm90ZSAgIFRoaXMgQVBJIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNoZWNrIG9uIHRoZSBjYXJkIHN0YXRlIHRocm91Z2gKICAgKiAgICAgICAgIEhBTF9NTUNfR2V0Q2FyZFN0YXRlKCkuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZSAKLSAgKiBAcGFyYW0gIEJsb2NrU3RhcnRBZGQgU3RhcnQgQmxvY2sgYWRkcmVzcwotICAqIEBwYXJhbSAgQmxvY2tFbmRBZGQgRW5kIEJsb2NrIGFkZHJlc3MKKyAgKiBAcGFyYW0gIGhtbWM6IFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgQmxvY2tTdGFydEFkZDogU3RhcnQgQmxvY2sgYWRkcmVzcworICAqIEBwYXJhbSAgQmxvY2tFbmRBZGQ6IEVuZCBCbG9jayBhZGRyZXNzCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX0VyYXNlKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCB1aW50MzJfdCBCbG9ja1N0YXJ0QWRkLCB1aW50MzJfdCBCbG9ja0VuZEFkZCkKIHsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IGVycm9yc3RhdGU7CisgIHVpbnQzMl90IHN0YXJ0X2FkZCA9IEJsb2NrU3RhcnRBZGQ7CisgIHVpbnQzMl90IGVuZF9hZGQgPSBCbG9ja0VuZEFkZDsKKwogICBpZihobW1jLT5TdGF0ZSA9PSBIQUxfTU1DX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaG1tYy0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOwotICAgIAotICAgIGlmKEJsb2NrRW5kQWRkIDwgQmxvY2tTdGFydEFkZCkKKyAgICBobW1jLT5FcnJvckNvZGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7CisKKyAgICBpZihlbmRfYWRkIDwgc3RhcnRfYWRkKQogICAgIHsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCi0gICAgaWYoQmxvY2tFbmRBZGQgPiAoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icikpCisKKyAgICBpZihlbmRfYWRkID4gKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpKQogICAgIHsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIENoZWNrIGlmIHRoZSBjYXJkIGNvbW1hbmQgY2xhc3Mgc3VwcG9ydHMgZXJhc2UgY29tbWFuZCAqLwogICAgIGlmKCgoaG1tYy0+TW1jQ2FyZC5DbGFzcykgJiBTRE1NQ19DQ0NDX0VSQVNFKSA9PSAwVSkKICAgICB7CkBAIC0xMzUwLDU4ICsxNDMxLDU3IEBACiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGlmKChTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpICYgU0RNTUNfQ0FSRF9MT0NLRUQpID09IFNETU1DX0NBUkRfTE9DS0VEKQogICAgIHsKICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfTE9DS19VTkxPQ0tfRkFJTEVEOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgdGhlIENhcmQgY2FwYWNpdHkgaW4gdGVybSBvZiBMb2dpY2FsIG51bWJlciBvZiBibG9ja3MgKi8KLSAgICBpZiAoKGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIpIDwgQ0FQQUNJVFkpCisKKyAgICBpZiAoKGhtbWMtPk1tY0NhcmQuQ2FyZFR5cGUpICE9IE1NQ19ISUdIX0NBUEFDSVRZX0NBUkQpCiAgICAgewotICAgICAgQmxvY2tTdGFydEFkZCAqPSA1MTJVOwotICAgICAgQmxvY2tFbmRBZGQgICAqPSA1MTJVOworICAgICAgc3RhcnRfYWRkICo9IDUxMlU7CisgICAgICBlbmRfYWRkICAgKj0gNTEyVTsKICAgICB9CiAKICAgICAvKiBTZW5kIENNRDM1IE1NQ19FUkFTRV9HUlBfU1RBUlQgd2l0aCBhcmd1bWVudCBhcyBhZGRyICAqLwotICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRFcmFzZVN0YXJ0QWRkKGhtbWMtPkluc3RhbmNlLCBCbG9ja1N0YXJ0QWRkKTsKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kRXJhc2VTdGFydEFkZChobW1jLT5JbnN0YW5jZSwgc3RhcnRfYWRkKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIC8qIFNlbmQgQ01EMzYgTU1DX0VSQVNFX0dSUF9FTkQgd2l0aCBhcmd1bWVudCBhcyBhZGRyICAqLwotICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRFcmFzZUVuZEFkZChobW1jLT5JbnN0YW5jZSwgQmxvY2tFbmRBZGQpOworICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRFcmFzZUVuZEFkZChobW1jLT5JbnN0YW5jZSwgZW5kX2FkZCk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICAvKiBTZW5kIENNRDM4IEVSQVNFICovCiAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEVyYXNlKGhtbWMtPkluc3RhbmNlKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtMTQxMiw3NCArMTQ5Miw0NiBAQAogCiAvKioKICAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBNTUMgY2FyZCBpbnRlcnJ1cHQgcmVxdWVzdC4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX01NQ19JUlFIYW5kbGVyKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgY29udGV4dCA9IGhtbWMtPkNvbnRleHQ7CisKICAgLyogQ2hlY2sgZm9yIFNETU1DIGludGVycnVwdCBmbGFncyAqLwotICBpZihfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfSVRfREFUQUVORCkgIT0gUkVTRVQpCisgIGlmKChfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfRkxBR19SWEZJRk9IRikgIT0gUkVTRVQpICYmICgoY29udGV4dCAmIE1NQ19DT05URVhUX0lUKSAhPSAwVSkpCiAgIHsKLSAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RBVEFFTkQpOyAKKyAgICBNTUNfUmVhZF9JVChobW1jKTsKKyAgfQorCisgIGVsc2UgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfREFUQUVORCkgIT0gUkVTRVQpCisgIHsKKyAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RBVEFFTkQpOworCisgICAgX19IQUxfTU1DX0RJU0FCTEVfSVQoaG1tYywgU0RNTUNfSVRfREFUQUVORCAgfCBTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfSVRfVFhVTkRFUlIgfCBTRE1NQ19JVF9SWE9WRVJSICB8IFNETU1DX0lUX1RYRklGT0hFIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfSVRfUlhGSUZPSEYpOwogICAgIAotICAgIF9fSEFMX01NQ19ESVNBQkxFX0lUKGhtbWMsIFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfSVRfVFhVTkRFUlJ8IFNETU1DX0lUX1JYT1ZFUlIpOwotICAgIAotICAgIGlmKChobW1jLT5Db250ZXh0ICYgTU1DX0NPTlRFWFRfSVQpICE9IFJFU0VUKQorICAgIGhtbWMtPkluc3RhbmNlLT5EQ1RSTCAmPSB+KFNETU1DX0RDVFJMX0RURU4pOworCisgICAgaWYoKGNvbnRleHQgJiBNTUNfQ09OVEVYVF9ETUEpICE9IDBVKQogICAgIHsKLSAgICAgIGlmKCgoaG1tYy0+Q29udGV4dCAmIE1NQ19DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0spICE9IFJFU0VUKSB8fCAoKGhtbWMtPkNvbnRleHQgJiBNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gUkVTRVQpKQorICAgICAgaWYoKGNvbnRleHQgJiBNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gMFUpCiAgICAgICB7CiAgICAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaG1tYy0+SW5zdGFuY2UpOwogICAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgICAgICAgewogICAgICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgICAgaG1tYy0+RXJyb3JDYWxsYmFjayhobW1jKTsKICNlbHNlCiAgICAgICAgICAgSEFMX01NQ19FcnJvckNhbGxiYWNrKGhtbWMpOwogI2VuZGlmCiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAotICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7Ci0gICAgICAKLSAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKLSAgICAgIGlmKCgoaG1tYy0+Q29udGV4dCAmIE1NQ19DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLKSAhPSBSRVNFVCkgfHwgKChobW1jLT5Db250ZXh0ICYgTU1DX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgIT0gUkVTRVQpKQotICAgICAgewotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgICAgaG1tYy0+UnhDcGx0Q2FsbGJhY2soaG1tYyk7Ci0jZWxzZQotICAgICAgICBIQUxfTU1DX1J4Q3BsdENhbGxiYWNrKGhtbWMpOwotI2VuZGlmCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0jaWYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgICAgICBobW1jLT5UeENwbHRDYWxsYmFjayhobW1jKTsKLSNlbHNlICAgICAgCi0gICAgICAgIEhBTF9NTUNfVHhDcGx0Q2FsbGJhY2soaG1tYyk7Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZigoaG1tYy0+Q29udGV4dCAmIE1NQ19DT05URVhUX0RNQSkgIT0gUkVTRVQpCi0gICAgewotICAgICAgaWYoKGhtbWMtPkNvbnRleHQgJiBNTUNfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gUkVTRVQpCi0gICAgICB7Ci0gICAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaG1tYy0+SW5zdGFuY2UpOwotICAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKLSAgICAgICAgewotICAgICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgICAgICBobW1jLT5FcnJvckNhbGxiYWNrKGhtbWMpOwotI2Vsc2UKLSAgICAgICAgICBIQUxfTU1DX0Vycm9yQ2FsbGJhY2soaG1tYyk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYoKChobW1jLT5Db250ZXh0ICYgTU1DX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0spID09IFJFU0VUKSAmJiAoKGhtbWMtPkNvbnRleHQgJiBNTUNfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSA9PSBSRVNFVCkpCisgICAgICBpZigoKGNvbnRleHQgJiBNTUNfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSykgPT0gMFUpICYmICgoY29udGV4dCAmIE1NQ19DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0spID09IDBVKSkKICAgICAgIHsKICAgICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIERNQUVOIGJpdAogICAgICAgICBpbiB0aGUgTU1DIERDVFJMIHJlZ2lzdGVyICovCkBAIC0xNDg3LDU3ICsxNTM5LDEwMiBAQAogICAgICAgICAKICAgICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwogICAgICAgICAKLSNpZiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgICBobW1jLT5UeENwbHRDYWxsYmFjayhobW1jKTsKLSNlbHNlICAgICAgCisjZWxzZQogICAgICAgICBIQUxfTU1DX1R4Q3BsdENhbGxiYWNrKGhtbWMpOwogI2VuZGlmCiAgICAgICB9CiAgICAgfQorICAgIGVsc2UgaWYoKGNvbnRleHQgJiBNTUNfQ09OVEVYVF9JVCkgIT0gMFUpCisgICAgeworICAgICAgLyogU3RvcCBUcmFuc2ZlciBmb3IgV3JpdGUgTXVsdGkgYmxvY2tzIG9yIFJlYWQgTXVsdGkgYmxvY2tzICovCisgICAgICBpZigoKGNvbnRleHQgJiBNTUNfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgTU1DX0NPTlRFWFRfV1JJVEVfTVVMVElQTEVfQkxPQ0spICE9IDBVKSkKKyAgICAgIHsKKyAgICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFN0b3BUcmFuc2ZlcihobW1jLT5JbnN0YW5jZSk7CisgICAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQorICAgICAgICB7CisgICAgICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICAgIGhtbWMtPkVycm9yQ2FsbGJhY2soaG1tYyk7CisjZWxzZQorICAgICAgICAgIEhBTF9NTUNfRXJyb3JDYWxsYmFjayhobW1jKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCisgICAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfREFUQV9GTEFHUyk7CisKKyAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKKyAgICAgIGlmKCgoY29udGV4dCAmIE1NQ19DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgTU1DX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgIT0gMFUpKQorICAgICAgeworI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaG1tYy0+UnhDcGx0Q2FsbGJhY2soaG1tYyk7CisjZWxzZQorICAgICAgICBIQUxfTU1DX1J4Q3BsdENhbGxiYWNrKGhtbWMpOworI2VuZGlmCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICBobW1jLT5UeENwbHRDYWxsYmFjayhobW1jKTsKKyNlbHNlCisgICAgICAgIEhBTF9NTUNfVHhDcGx0Q2FsbGJhY2soaG1tYyk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CiAgIH0KLSAgCi0gIGVsc2UgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0lUX1RYRklGT0hFKSAhPSBSRVNFVCkKKworICBlbHNlIGlmKChfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfRkxBR19UWEZJRk9IRSkgIT0gUkVTRVQpICYmICgoY29udGV4dCAmIE1NQ19DT05URVhUX0lUKSAhPSAwVSkpCiAgIHsKLSAgICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19GTEFHX1RYRklGT0hFKTsKLSAgICAKICAgICBNTUNfV3JpdGVfSVQoaG1tYyk7CiAgIH0KLSAgCi0gIGVsc2UgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0lUX1JYRklGT0hGKSAhPSBSRVNFVCkKLSAgewotICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfUlhGSUZPSEYpOwotICAgIAotICAgIE1NQ19SZWFkX0lUKGhtbWMpOwotICB9Ci0gIAotICBlbHNlIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHwgU0RNTUNfSVRfUlhPVkVSUiB8IFNETU1DX0lUX1RYVU5ERVJSKSAhPSBSRVNFVCkKKworICBlbHNlIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RDUkNGQUlMIHwgU0RNTUNfRkxBR19EVElNRU9VVCB8IFNETU1DX0ZMQUdfUlhPVkVSUiB8IFNETU1DX0ZMQUdfVFhVTkRFUlIpICE9IFJFU0VUKQogICB7CiAgICAgLyogU2V0IEVycm9yIGNvZGUgKi8KLSAgICBpZihfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfSVRfRENSQ0ZBSUwpICE9IFJFU0VUKQorICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19GTEFHX0RDUkNGQUlMKSAhPSBSRVNFVCkKICAgICB7Ci0gICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9EQVRBX0NSQ19GQUlMOyAKKyAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0RBVEFfQ1JDX0ZBSUw7CiAgICAgfQotICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19JVF9EVElNRU9VVCkgIT0gUkVTRVQpCisgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfRFRJTUVPVVQpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0RBVEFfVElNRU9VVDsgCisgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9EQVRBX1RJTUVPVVQ7CiAgICAgfQotICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19JVF9SWE9WRVJSKSAhPSBSRVNFVCkKKyAgICBpZihfX0hBTF9NTUNfR0VUX0ZMQUcoaG1tYywgU0RNTUNfRkxBR19SWE9WRVJSKSAhPSBSRVNFVCkKICAgICB7Ci0gICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9SWF9PVkVSUlVOOyAKKyAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1JYX09WRVJSVU47CiAgICAgfQotICAgIGlmKF9fSEFMX01NQ19HRVRfRkxBRyhobW1jLCBTRE1NQ19JVF9UWFVOREVSUikgIT0gUkVTRVQpCisgICAgaWYoX19IQUxfTU1DX0dFVF9GTEFHKGhtbWMsIFNETU1DX0ZMQUdfVFhVTkRFUlIpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1RYX1VOREVSUlVOOyAKKyAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1RYX1VOREVSUlVOOwogICAgIH0KLQkKKwogICAgIC8qIENsZWFyIEFsbCBmbGFncyAqLwotICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgICAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOwogICAgIAogICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KICAgICBfX0hBTF9NTUNfRElTQUJMRV9JVChobW1jLCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKLSAgICAKLSAgICBpZigoaG1tYy0+Q29udGV4dCAmIE1NQ19DT05URVhUX0RNQSkgIT0gUkVTRVQpCisKKyAgICBobW1jLT5FcnJvckNvZGUgfD0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhtbWMtPkluc3RhbmNlKTsKKworICAgIGlmKChjb250ZXh0ICYgTU1DX0NPTlRFWFRfSVQpICE9IDBVKQorICAgIHsKKyAgICAgIC8qIFNldCB0aGUgTU1DIHN0YXRlIHRvIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBobW1jLT5FcnJvckNhbGxiYWNrKGhtbWMpOworI2Vsc2UKKyAgICAgIEhBTF9NTUNfRXJyb3JDYWxsYmFjayhobW1jKTsKKyNlbmRpZiAvKiBVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZSBpZigoY29udGV4dCAmIE1NQ19DT05URVhUX0RNQSkgIT0gMFUpCiAgICAgewogICAgICAgLyogQWJvcnQgdGhlIE1NQyBETUEgU3RyZWFtcyAqLwogICAgICAgaWYoaG1tYy0+aGRtYXR4ICE9IE5VTEwpCkBAIC0xNTY0LDI5ICsxNjYxLDI4IEBACiAgICAgICB7CiAgICAgICAgIGhtbWMtPkVycm9yQ29kZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKICAgICAgICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgIGhtbWMtPkFib3J0Q3BsdENhbGxiYWNrKGhtbWMpOwogI2Vsc2UKICAgICAgICAgSEFMX01NQ19BYm9ydENhbGxiYWNrKGhtbWMpOwogI2VuZGlmCiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYoKGhtbWMtPkNvbnRleHQgJiBNTUNfQ09OVEVYVF9JVCkgIT0gUkVTRVQpCisgICAgZWxzZQogICAgIHsKLSAgICAgIC8qIFNldCB0aGUgTU1DIHN0YXRlIHRvIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KLSAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKLSNpZiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gICAgICBobW1jLT5FcnJvckNhbGxiYWNrKGhtbWMpOwotI2Vsc2UKLSAgICAgIEhBTF9NTUNfRXJyb3JDYWxsYmFjayhobW1jKTsKLSNlbmRpZgorICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgIH0KLSAgfSAgIAorICB9CisKKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CiB9CiAKIC8qKgogICAqIEBicmllZiByZXR1cm4gdGhlIE1NQyBzdGF0ZQotICAqIEBwYXJhbSBobW1jIFBvaW50ZXIgdG8gbW1jIGhhbmRsZQorICAqIEBwYXJhbSBobW1jOiBQb2ludGVyIHRvIG1tYyBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0ZQogICAqLwogSEFMX01NQ19TdGF0ZVR5cGVEZWYgSEFMX01NQ19HZXRTdGF0ZShNTUNfSGFuZGxlVHlwZURlZiAqaG1tYykKQEAgLTE1OTYsNyArMTY5Miw3IEBACiAKIC8qKgogKiBAYnJpZWYgIFJldHVybiB0aGUgTU1DIGVycm9yIGNvZGUKLSogQHBhcmFtICBobW1jICBQb2ludGVyIHRvIGEgTU1DX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyogQHBhcmFtICBobW1jIDogUG9pbnRlciB0byBhIE1NQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgogKiBAcmV0dmFsIE1NQyBFcnJvciBDb2RlCiAqLwpAQCAtMTYwNywxMCArMTcwMywxMCBAQAogCiAvKioKICAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcwotICAqIEBwYXJhbSBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSBfX3dlYWsgdm9pZCBIQUxfTU1DX1R4Q3BsdENhbGxiYWNrKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQorX193ZWFrIHZvaWQgSEFMX01NQ19UeENwbHRDYWxsYmFjayhNTUNfSGFuZGxlVHlwZURlZiAqaG1tYykKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaG1tYyk7CkBAIC0xNjIyLDE0ICsxNzE4LDE0IEBACiAKIC8qKgogICAqIEBicmllZiBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2tzCi0gICogQHBhcmFtIGhtbWMgUG9pbnRlciBNTUMgaGFuZGxlCisgICogQHBhcmFtIGhtbWM6IFBvaW50ZXIgTU1DIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX01NQ19SeENwbHRDYWxsYmFjayhNTUNfSGFuZGxlVHlwZURlZiAqaG1tYykKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaG1tYyk7Ci0gCisKICAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9NTUNfUnhDcGx0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCkBAIC0xNjM3LDQ3ICsxNzMzLDQ3IEBACiAKIC8qKgogICAqIEBicmllZiBNTUMgZXJyb3IgY2FsbGJhY2tzCi0gICogQHBhcmFtIGhtbWMgUG9pbnRlciBNTUMgaGFuZGxlCisgICogQHBhcmFtIGhtbWM6IFBvaW50ZXIgTU1DIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX01NQ19FcnJvckNhbGxiYWNrKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobW1jKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX01NQ19FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgogICAqIEBicmllZiBNTUMgQWJvcnQgY2FsbGJhY2tzCi0gICogQHBhcmFtIGhtbWMgUG9pbnRlciBNTUMgaGFuZGxlCisgICogQHBhcmFtIGhtbWM6IFBvaW50ZXIgTU1DIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX01NQ19BYm9ydENhbGxiYWNrKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChobW1jKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCi0gICAgICAgICAgICB0aGUgSEFMX01NQ19FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICAgICAgICAgIHRoZSBIQUxfTU1DX0Fib3J0Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKKyAgICovCiB9CiAKLSNpZiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogLyoqCiAgICogQGJyaWVmICBSZWdpc3RlciBhIFVzZXIgTU1DIENhbGxiYWNrCi0gICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKICAgKiBAcGFyYW0gaG1tYyA6IE1NQyBoYW5kbGUKLSAgKiBAcGFyYW0gQ2FsbGJhY2tJRCA6IElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCisgICogQHBhcmFtIENhbGxiYWNrSWQgOiBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTU1DX1RYX0NQTFRfQ0JfSUQgICAgTU1DIFR4IENvbXBsZXRlIENhbGxiYWNrIElECiAgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9NTUNfUlhfQ1BMVF9DQl9JRCAgICBNTUMgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19FUlJPUl9DQl9JRCAgICAgIE1NQyBFcnJvciBDYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTU1DX0FCT1JUX0NCX0lEICAgICAgTU1DIEFib3J0IENhbGxiYWNrIElECi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9NTUNfTVNQX0lOSVRfQ0JfSUQgICBNTUMgTXNwSW5pdCBDYWxsYmFjayBJRCAKLSAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19NU1BfREVJTklUX0NCX0lEIE1NQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTU1DX01TUF9JTklUX0NCX0lEICAgTU1DIE1zcEluaXQgQ2FsbGJhY2sgSUQKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19NU1BfREVJTklUX0NCX0lEIE1NQyBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKICAgKiBAcGFyYW0gcENhbGxiYWNrIDogcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAgKiBAcmV0dmFsIHN0YXR1cwogICAqLwpAQCAtMTY5NCw3ICsxNzkwLDcgQEAKIAogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhtbWMpOwotICAKKwogICBpZihobW1jLT5TdGF0ZSA9PSBIQUxfTU1DX1NUQVRFX1JFQURZKQogICB7CiAgICAgc3dpdGNoIChDYWxsYmFja0lkKQpAQCAtMTcxOSw3ICsxODE1LDcgQEAKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQgOgogICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAKKyAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgIGJyZWFrOwpAQCAtMTczNyw3ICsxODMzLDcgQEAKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQgOgogICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAKKyAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgIGJyZWFrOwpAQCAtMTc0Niw3ICsxODQyLDcgQEAKICAgZWxzZQogICB7CiAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KQEAgLTE3NTgsMTYgKzE4NTQsMTYgQEAKIAogLyoqCiAgICogQGJyaWVmICBVbnJlZ2lzdGVyIGEgVXNlciBNTUMgQ2FsbGJhY2sKLSAgKiAgICAgICAgIE1NQyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrIAorICAqICAgICAgICAgTU1DIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKICAgKiBAcGFyYW0gaG1tYyA6IE1NQyBoYW5kbGUKLSAgKiBAcGFyYW0gQ2FsbGJhY2tJRCA6IElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgKiBAcGFyYW0gQ2FsbGJhY2tJZCA6IElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSB1bnJlZ2lzdGVyZWQKICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19UWF9DUExUX0NCX0lEICAgIE1NQyBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTU1DX1JYX0NQTFRfQ0JfSUQgICAgTU1DIFJ4IENvbXBsZXRlIENhbGxiYWNrIElECiAgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9NTUNfRVJST1JfQ0JfSUQgICAgICBNTUMgRXJyb3IgQ2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19BQk9SVF9DQl9JRCAgICAgIE1NQyBBYm9ydCBDYWxsYmFjayBJRAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfTU1DX01TUF9JTklUX0NCX0lEICAgTU1DIE1zcEluaXQgQ2FsbGJhY2sgSUQgCi0gICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9NTUNfTVNQX0RFSU5JVF9DQl9JRCBNTUMgTXNwRGVJbml0IENhbGxiYWNrIElEICAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX01NQ19NU1BfSU5JVF9DQl9JRCAgIE1NQyBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9NTUNfTVNQX0RFSU5JVF9DQl9JRCBNTUMgTXNwRGVJbml0IENhbGxiYWNrIElECiAgICogQHJldHZhbCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfVW5SZWdpc3RlckNhbGxiYWNrKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSWQpCkBAIC0xNzc2LDcgKzE4NzIsNyBAQAogCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaG1tYyk7Ci0gIAorCiAgIGlmKGhtbWMtPlN0YXRlID09IEhBTF9NTUNfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBzd2l0Y2ggKENhbGxiYWNrSWQpCkBAIC0xODAxLDcgKzE4OTcsNyBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdCA6CiAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgYnJlYWs7CkBAIC0xODE5LDcgKzE5MTUsNyBAQAogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdCA6CiAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IEhBTF9NTUNfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgYnJlYWs7CkBAIC0xODI4LDcgKzE5MjQsNyBAQAogICBlbHNlCiAgIHsKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOyAKKyAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgfQpAQCAtMTgzOSwyMCArMTkzNSwxOSBAQAogfQogI2VuZGlmCiAKLQogLyoqCiAgICogQH0KICAgKi8KIAogLyoqIEBhZGR0b2dyb3VwIE1NQ19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCi0gKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBNTUMgY2FyZCAKKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIE1NQyBjYXJkCiAgICAgb3BlcmF0aW9ucyBhbmQgZ2V0IHRoZSByZWxhdGVkIGluZm9ybWF0aW9uCiAKIEBlbmR2ZXJiYXRpbQpAQCAtMTg2Miw4MCArMTk1NywzMiBAQAogLyoqCiAgICogQGJyaWVmICBSZXR1cm5zIGluZm9ybWF0aW9uIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY2FyZCB3aGljaCBhcmUgc3RvcmVkIG9uCiAgICogICAgICAgICB0aGUgQ0lEIHJlZ2lzdGVyLgotICAqIEBwYXJhbSAgaG1tYyBQb2ludGVyIHRvIE1NQyBoYW5kbGUKLSAgKiBAcGFyYW0gIHBDSUQgUG9pbnRlciB0byBhIEhBTF9NTUNfQ0lEVHlwZWRlZiBzdHJ1Y3R1cmUgdGhhdCAgCi0gICogICAgICAgICBjb250YWlucyBhbGwgQ0lEIHJlZ2lzdGVyIHBhcmFtZXRlcnMgCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDSUQ6IFBvaW50ZXIgdG8gYSBIQUxfTU1DX0NJRFR5cGVkZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIGNvbnRhaW5zIGFsbCBDSUQgcmVnaXN0ZXIgcGFyYW1ldGVycwogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX01NQ19HZXRDYXJkQ0lEKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhcmRDSURUeXBlRGVmICpwQ0lEKQogewotICB1aW50MzJfdCB0bXAgPSAwOwotICAKLSAgLyogQnl0ZSAwICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q0lEWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENJRC0+TWFudWZhY3R1cmVySUQgPSB0bXA7Ci0gIAotICAvKiBCeXRlIDEgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMF0gJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gIHBDSUQtPk9FTV9BcHBsaUlEID0gdG1wIDw8IDg7Ci0gIAotICAvKiBCeXRlIDIgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMF0gJiAweDAwMDAwMEZGMDApID4+IDgpOwotICBwQ0lELT5PRU1fQXBwbGlJRCB8PSB0bXA7Ci0gIAotICAvKiBCeXRlIDMgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKGhtbWMtPkNJRFswXSAmIDB4MDAwMDAwRkYpOwotICBwQ0lELT5Qcm9kTmFtZTEgPSB0bXAgPDwgMjQ7Ci0gIAotICAvKiBCeXRlIDQgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMV0gJiAweEZGMDAwMDAwVSkgPj4gMjQpOwotICBwQ0lELT5Qcm9kTmFtZTEgfD0gdG1wIDw8IDE2OwotICAKLSAgLyogQnl0ZSA1ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q0lEWzFdICYgMHgwMEZGMDAwMCkgPj4gMTYpOwotICBwQ0lELT5Qcm9kTmFtZTEgfD0gdG1wIDw8IDg7Ci0gIAotICAvKiBCeXRlIDYgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMV0gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENJRC0+UHJvZE5hbWUxIHw9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgNyAqLwotICB0bXAgPSAodWludDhfdCkoaG1tYy0+Q0lEWzFdICYgMHgwMDAwMDBGRik7Ci0gIHBDSUQtPlByb2ROYW1lMiA9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgOCAqLwotICB0bXAgPSAodWludDhfdCkoKGhtbWMtPkNJRFsyXSAmIDB4RkYwMDAwMDBVKSA+PiAyNCk7Ci0gIHBDSUQtPlByb2RSZXYgPSB0bXA7Ci0gIAotICAvKiBCeXRlIDkgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMl0gJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gIHBDSUQtPlByb2RTTiA9IHRtcCA8PCAyNDsKLSAgCi0gIC8qIEJ5dGUgMTAgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMl0gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENJRC0+UHJvZFNOIHw9IHRtcCA8PCAxNjsKLSAgCi0gIC8qIEJ5dGUgMTEgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKGhtbWMtPkNJRFsyXSAmIDB4MDAwMDAwRkYpOwotICBwQ0lELT5Qcm9kU04gfD0gdG1wIDw8IDg7Ci0gIAotICAvKiBCeXRlIDEyICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q0lEWzNdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENJRC0+UHJvZFNOIHw9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgMTMgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbM10gJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gIHBDSUQtPlJlc2VydmVkMSAgIHw9ICh0bXAgJiAweEYwKSA+PiA0OwotICBwQ0lELT5NYW51ZmFjdERhdGUgPSAodG1wICYgMHgwRikgPDwgODsKLSAgCi0gIC8qIEJ5dGUgMTQgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DSURbM10gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENJRC0+TWFudWZhY3REYXRlIHw9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgMTUgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKGhtbWMtPkNJRFszXSAmIDB4MDAwMDAwRkYpOwotICBwQ0lELT5DSURfQ1JDICAgPSAodG1wICYgMHhGRSkgPj4gMTsKLSAgcENJRC0+UmVzZXJ2ZWQyID0gMTsKKyAgcENJRC0+TWFudWZhY3R1cmVySUQgPSAodWludDhfdCkoKGhtbWMtPkNJRFswXSAmIDB4RkYwMDAwMDBVKSA+PiAyNFUpOworCisgIHBDSUQtPk9FTV9BcHBsaUlEID0gKHVpbnQxNl90KSgoaG1tYy0+Q0lEWzBdICYgMHgwMEZGRkYwMFUpID4+IDhVKTsKKworICBwQ0lELT5Qcm9kTmFtZTEgPSAoKChobW1jLT5DSURbMF0gJiAweDAwMDAwMEZGVSkgPDwgMjRVKSB8ICgoaG1tYy0+Q0lEWzFdICYgMHhGRkZGRkYwMFUpID4+IDhVKSk7CisKKyAgcENJRC0+UHJvZE5hbWUyID0gKHVpbnQ4X3QpKGhtbWMtPkNJRFsxXSAmIDB4MDAwMDAwRkZVKTsKKworICBwQ0lELT5Qcm9kUmV2ID0gKHVpbnQ4X3QpKChobW1jLT5DSURbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjRVKTsKKworICBwQ0lELT5Qcm9kU04gPSAoKChobW1jLT5DSURbMl0gJiAweDAwRkZGRkZGVSkgPDwgOFUpIHwgKChobW1jLT5DSURbM10gJiAweEZGMDAwMDAwVSkgPj4gMjRVKSk7CisKKyAgcENJRC0+UmVzZXJ2ZWQxID0gKHVpbnQ4X3QpKChobW1jLT5DSURbM10gJiAweDAwRjAwMDAwVSkgPj4gMjBVKTsKKworICBwQ0lELT5NYW51ZmFjdERhdGUgPSAodWludDE2X3QpKChobW1jLT5DSURbM10gJiAweDAwMEZGRjAwVSkgPj4gOFUpOworCisgIHBDSUQtPkNJRF9DUkMgPSAodWludDhfdCkoKGhtbWMtPkNJRFszXSAmIDB4MDAwMDAwRkVVKSA+PiAxVSk7CisKKyAgcENJRC0+UmVzZXJ2ZWQyID0gMVU7CiAKICAgcmV0dXJuIEhBTF9PSzsKIH0KQEAgLTE5NDMsMTIzICsxOTkwLDEwMiBAQAogLyoqCiAgICogQGJyaWVmICBSZXR1cm5zIGluZm9ybWF0aW9uIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY2FyZCB3aGljaCBhcmUgc3RvcmVkIG9uCiAgICogICAgICAgICB0aGUgQ1NEIHJlZ2lzdGVyLgotICAqIEBwYXJhbSAgaG1tYyBQb2ludGVyIHRvIE1NQyBoYW5kbGUKLSAgKiBAcGFyYW0gIHBDU0QgUG9pbnRlciB0byBhIEhBTF9NTUNfQ2FyZEluZm9UeXBlRGVmIHN0cnVjdHVyZSB0aGF0ICAKLSAgKiAgICAgICAgIGNvbnRhaW5zIGFsbCBDU0QgcmVnaXN0ZXIgcGFyYW1ldGVycyAgCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDU0Q6IFBvaW50ZXIgdG8gYSBIQUxfTU1DX0NhcmRDU0RUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CisgICogICAgICAgICBjb250YWlucyBhbGwgQ1NEIHJlZ2lzdGVyIHBhcmFtZXRlcnMKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfR2V0Q2FyZENTRChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgSEFMX01NQ19DYXJkQ1NEVHlwZURlZiAqcENTRCkKIHsKLSAgdWludDMyX3QgdG1wID0gMDsKKyAgcENTRC0+Q1NEU3RydWN0ID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMF0gJiAweEMwMDAwMDAwVSkgPj4gMzBVKTsKKworICBwQ1NELT5TeXNTcGVjVmVyc2lvbiA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzBdICYgMHgzQzAwMDAwMFUpID4+IDI2VSk7CisKKyAgcENTRC0+UmVzZXJ2ZWQxID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMF0gJiAweDAzMDAwMDAwVSkgPj4gMjRVKTsKKworICBwQ1NELT5UQUFDID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMF0gJiAweDAwRkYwMDAwVSkgPj4gMTZVKTsKKworICBwQ1NELT5OU0FDID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMF0gJiAweDAwMDBGRjAwVSkgPj4gOFUpOworCisgIHBDU0QtPk1heEJ1c0Nsa0ZyZWMgPSAodWludDhfdCkoaG1tYy0+Q1NEWzBdICYgMHgwMDAwMDBGRlUpOworCisgIHBDU0QtPkNhcmRDb21kQ2xhc3NlcyA9ICh1aW50MTZfdCkoKGhtbWMtPkNTRFsxXSAmIDB4RkZGMDAwMDBVKSA+PiAyMFUpOworCisgIHBDU0QtPlJkQmxvY2tMZW4gPSAodWludDhfdCkoKGhtbWMtPkNTRFsxXSAmIDB4MDAwRjAwMDBVKSA+PiAxNlUpOworCisgIHBDU0QtPlBhcnRCbG9ja1JlYWQgICA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzFdICYgMHgwMDAwODAwMFUpID4+IDE1VSk7CisKKyAgcENTRC0+V3JCbG9ja01pc2FsaWduID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMV0gJiAweDAwMDA0MDAwVSkgPj4gMTRVKTsKKworICBwQ1NELT5SZEJsb2NrTWlzYWxpZ24gPSAodWludDhfdCkoKGhtbWMtPkNTRFsxXSAmIDB4MDAwMDIwMDBVKSA+PiAxM1UpOworCisgIHBDU0QtPkRTUkltcGwgPSAodWludDhfdCkoKGhtbWMtPkNTRFsxXSAmIDB4MDAwMDEwMDBVKSA+PiAxMlUpOworCisgIHBDU0QtPlJlc2VydmVkMiA9IDBVOyAvKiE8IFJlc2VydmVkICovCisKKyAgcENTRC0+RGV2aWNlU2l6ZSA9ICgoKGhtbWMtPkNTRFsxXSAmIDB4MDAwMDAzRkZVKSA8PCAyVSkgfCAoKGhtbWMtPkNTRFsyXSAmIDB4QzAwMDAwMDBVKSA+PiAzMFUpKTsKKworICBwQ1NELT5NYXhSZEN1cnJlbnRWRERNaW4gPSAodWludDhfdCkoKGhtbWMtPkNTRFsyXSAmIDB4MzgwMDAwMDBVKSA+PiAyN1UpOworCisgIHBDU0QtPk1heFJkQ3VycmVudFZERE1heCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzJdICYgMHgwNzAwMDAwMFUpID4+IDI0VSk7CisKKyAgcENTRC0+TWF4V3JDdXJyZW50VkRETWluID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMl0gJiAweDAwRTAwMDAwVSkgPj4gMjFVKTsKKworICBwQ1NELT5NYXhXckN1cnJlbnRWRERNYXggPSAodWludDhfdCkoKGhtbWMtPkNTRFsyXSAmIDB4MDAxQzAwMDBVKSA+PiAxOFUpOworCisgIHBDU0QtPkRldmljZVNpemVNdWwgPSAodWludDhfdCkoKGhtbWMtPkNTRFsyXSAmIDB4MDAwMzgwMDBVKSA+PiAxNVUpOworCisgIGhtbWMtPk1tY0NhcmQuQmxvY2tOYnIgID0gKHBDU0QtPkRldmljZVNpemUgKyAxVSkgOworICBobW1jLT5NbWNDYXJkLkJsb2NrTmJyICo9ICgxVUwgPDwgKChwQ1NELT5EZXZpY2VTaXplTXVsICYgMHgwN1UpICsgMlUpKTsKKyAgaG1tYy0+TW1jQ2FyZC5CbG9ja1NpemUgPSAoMVVMIDw8IChwQ1NELT5SZEJsb2NrTGVuICYgMHgwRlUpKTsKKworICBobW1jLT5NbWNDYXJkLkxvZ0Jsb2NrTmJyID0gIChobW1jLT5NbWNDYXJkLkJsb2NrTmJyKSAqICgoaG1tYy0+TW1jQ2FyZC5CbG9ja1NpemUpIC8gNTEyVSk7CisgIGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tTaXplID0gNTEyVTsKICAgCi0gIC8qIEJ5dGUgMCAqLwotICB0bXAgPSAoaG1tYy0+Q1NEWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0OwotICBwQ1NELT5DU0RTdHJ1Y3QgICAgICA9ICh1aW50OF90KSgodG1wICYgMHhDMCkgPj4gNik7Ci0gIHBDU0QtPlN5c1NwZWNWZXJzaW9uID0gKHVpbnQ4X3QpKCh0bXAgJiAweDNDKSA+PiAyKTsKLSAgcENTRC0+UmVzZXJ2ZWQxICAgICAgPSB0bXAgJiAweDAzOwotICAKLSAgLyogQnl0ZSAxICovCi0gIHRtcCA9IChobW1jLT5DU0RbMF0gJiAweDAwRkYwMDAwKSA+PiAxNjsKLSAgcENTRC0+VEFBQyA9ICh1aW50OF90KXRtcDsKLSAgCi0gIC8qIEJ5dGUgMiAqLwotICB0bXAgPSAoaG1tYy0+Q1NEWzBdICYgMHgwMDAwRkYwMCkgPj4gODsKLSAgcENTRC0+TlNBQyA9ICh1aW50OF90KXRtcDsKLSAgCi0gIC8qIEJ5dGUgMyAqLwotICB0bXAgPSBobW1jLT5DU0RbMF0gJiAweDAwMDAwMEZGOwotICBwQ1NELT5NYXhCdXNDbGtGcmVjID0gKHVpbnQ4X3QpdG1wOwotICAKLSAgLyogQnl0ZSA0ICovCi0gIHRtcCA9IChobW1jLT5DU0RbMV0gJiAweEZGMDAwMDAwVSkgPj4gMjQ7Ci0gIHBDU0QtPkNhcmRDb21kQ2xhc3NlcyA9ICh1aW50MTZfdCkodG1wIDw8IDQpOwotICAKLSAgLyogQnl0ZSA1ICovCi0gIHRtcCA9IChobW1jLT5DU0RbMV0gJiAweDAwRkYwMDAwVSkgPj4gMTY7Ci0gIHBDU0QtPkNhcmRDb21kQ2xhc3NlcyB8PSAodWludDE2X3QpKCh0bXAgJiAweEYwKSA+PiA0KTsKLSAgcENTRC0+UmRCbG9ja0xlbiAgICAgICA9ICh1aW50OF90KSh0bXAgJiAweDBGKTsKLSAgCi0gIC8qIEJ5dGUgNiAqLwotICB0bXAgPSAoaG1tYy0+Q1NEWzFdICYgMHgwMDAwRkYwMFUpID4+IDg7Ci0gIHBDU0QtPlBhcnRCbG9ja1JlYWQgICA9ICh1aW50OF90KSgodG1wICYgMHg4MCkgPj4gNyk7Ci0gIHBDU0QtPldyQmxvY2tNaXNhbGlnbiA9ICh1aW50OF90KSgodG1wICYgMHg0MCkgPj4gNik7Ci0gIHBDU0QtPlJkQmxvY2tNaXNhbGlnbiA9ICh1aW50OF90KSgodG1wICYgMHgyMCkgPj4gNSk7Ci0gIHBDU0QtPkRTUkltcGwgICAgICAgICA9ICh1aW50OF90KSgodG1wICYgMHgxMCkgPj4gNCk7Ci0gIHBDU0QtPlJlc2VydmVkMiAgICAgICA9IDA7IC8qITwgUmVzZXJ2ZWQgKi8KLSAgCi0gIHBDU0QtPkRldmljZVNpemUgPSAodG1wICYgMHgwMykgPDwgMTA7Ci0gIAotICAvKiBCeXRlIDcgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKGhtbWMtPkNTRFsxXSAmIDB4MDAwMDAwRkZVKTsKLSAgcENTRC0+RGV2aWNlU2l6ZSB8PSAodG1wKSA8PCAyOwotICAKLSAgLyogQnl0ZSA4ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzJdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENTRC0+RGV2aWNlU2l6ZSB8PSAodG1wICYgMHhDMCkgPj4gNjsKLSAgCi0gIHBDU0QtPk1heFJkQ3VycmVudFZERE1pbiA9ICh0bXAgJiAweDM4KSA+PiAzOwotICBwQ1NELT5NYXhSZEN1cnJlbnRWRERNYXggPSAodG1wICYgMHgwNyk7Ci0gIAotICAvKiBCeXRlIDkgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMl0gJiAweDAwRkYwMDAwVSkgPj4gMTYpOwotICBwQ1NELT5NYXhXckN1cnJlbnRWRERNaW4gPSAodG1wICYgMHhFMCkgPj4gNTsKLSAgcENTRC0+TWF4V3JDdXJyZW50VkRETWF4ID0gKHRtcCAmIDB4MUMpID4+IDI7Ci0gIHBDU0QtPkRldmljZVNpemVNdWwgICAgICA9ICh0bXAgJiAweDAzKSA8PCAxOwotICAvKiBCeXRlIDEwICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzJdICYgMHgwMDAwRkYwMFUpID4+IDgpOwotICBwQ1NELT5EZXZpY2VTaXplTXVsIHw9ICh0bXAgJiAweDgwKSA+PiA3OwotICAKLSAgaG1tYy0+TW1jQ2FyZC5CbG9ja05iciAgPSAocENTRC0+RGV2aWNlU2l6ZSArIDEpIDsKLSAgaG1tYy0+TW1jQ2FyZC5CbG9ja05iciAqPSAoMSA8PCAocENTRC0+RGV2aWNlU2l6ZU11bCArIDIpKTsKLSAgaG1tYy0+TW1jQ2FyZC5CbG9ja1NpemUgPSAxIDw8IChwQ1NELT5SZEJsb2NrTGVuKTsKLSAgCi0gIGhtbWMtPk1tY0NhcmQuTG9nQmxvY2tOYnIgPSAgKGhtbWMtPk1tY0NhcmQuQmxvY2tOYnIpICogKChobW1jLT5NbWNDYXJkLkJsb2NrU2l6ZSkgLyA1MTIpOyAKLSAgaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja1NpemUgPSA1MTI7Ci0gIAotICBwQ1NELT5FcmFzZUdyU2l6ZSA9ICh0bXAgJiAweDQwKSA+PiA2OwotICBwQ1NELT5FcmFzZUdyTXVsICA9ICh0bXAgJiAweDNGKSA8PCAxOwotICAKLSAgLyogQnl0ZSAxMSAqLwotICB0bXAgPSAodWludDhfdCkoaG1tYy0+Q1NEWzJdICYgMHgwMDAwMDBGRik7Ci0gIHBDU0QtPkVyYXNlR3JNdWwgICAgIHw9ICh0bXAgJiAweDgwKSA+PiA3OwotICBwQ1NELT5XclByb3RlY3RHclNpemUgPSAodG1wICYgMHg3Rik7Ci0gIAotICAvKiBCeXRlIDEyICovCi0gIHRtcCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENTRC0+V3JQcm90ZWN0R3JFbmFibGUgPSAodG1wICYgMHg4MCkgPj4gNzsKLSAgcENTRC0+TWFuRGVmbEVDQyAgICAgICAgPSAodG1wICYgMHg2MCkgPj4gNTsKLSAgcENTRC0+V3JTcGVlZEZhY3QgICAgICAgPSAodG1wICYgMHgxQykgPj4gMjsKLSAgcENTRC0+TWF4V3JCbG9ja0xlbiAgICAgPSAodG1wICYgMHgwMykgPDwgMjsKLSAgCi0gIC8qIEJ5dGUgMTMgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbM10gJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gIHBDU0QtPk1heFdyQmxvY2tMZW4gICAgICB8PSAodG1wICYgMHhDMCkgPj4gNjsKLSAgcENTRC0+V3JpdGVCbG9ja1BhUGFydGlhbCA9ICh0bXAgJiAweDIwKSA+PiA1OwotICBwQ1NELT5SZXNlcnZlZDMgICAgICAgICAgID0gMDsKLSAgcENTRC0+Q29udGVudFByb3RlY3RBcHBsaSA9ICh0bXAgJiAweDAxKTsKLSAgCi0gIC8qIEJ5dGUgMTQgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbM10gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENTRC0+RmlsZUZvcm1hdEdyb3VvcCA9ICh0bXAgJiAweDgwKSA+PiA3OwotICBwQ1NELT5Db3B5RmxhZyAgICAgICAgID0gKHRtcCAmIDB4NDApID4+IDY7Ci0gIHBDU0QtPlBlcm1XclByb3RlY3QgICAgPSAodG1wICYgMHgyMCkgPj4gNTsKLSAgcENTRC0+VGVtcFdyUHJvdGVjdCAgICA9ICh0bXAgJiAweDEwKSA+PiA0OwotICBwQ1NELT5GaWxlRm9ybWF0ICAgICAgID0gKHRtcCAmIDB4MEMpID4+IDI7Ci0gIHBDU0QtPkVDQyAgICAgICAgICAgICAgPSAodG1wICYgMHgwMyk7Ci0gIAotICAvKiBCeXRlIDE1ICovCi0gIHRtcCA9ICh1aW50OF90KShobW1jLT5DU0RbM10gJiAweDAwMDAwMEZGKTsKLSAgcENTRC0+Q1NEX0NSQyAgID0gKHRtcCAmIDB4RkUpID4+IDE7CisgIHBDU0QtPkVyYXNlR3JTaXplID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMl0gJiAweDAwMDA0MDAwVSkgPj4gMTRVKTsKKworICBwQ1NELT5FcmFzZUdyTXVsID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbMl0gJiAweDAwMDAzRjgwVSkgPj4gN1UpOworCisgIHBDU0QtPldyUHJvdGVjdEdyU2l6ZSA9ICh1aW50OF90KShobW1jLT5DU0RbMl0gJiAweDAwMDAwMDdGVSk7CisKKyAgcENTRC0+V3JQcm90ZWN0R3JFbmFibGUgPSAodWludDhfdCkoKGhtbWMtPkNTRFszXSAmIDB4ODAwMDAwMDBVKSA+PiAzMVUpOworCisgIHBDU0QtPk1hbkRlZmxFQ0MgPSAodWludDhfdCkoKGhtbWMtPkNTRFszXSAmIDB4NjAwMDAwMDBVKSA+PiAyOVUpOworCisgIHBDU0QtPldyU3BlZWRGYWN0ID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbM10gJiAweDFDMDAwMDAwVSkgPj4gMjZVKTsKKworICBwQ1NELT5NYXhXckJsb2NrTGVuPSAodWludDhfdCkoKGhtbWMtPkNTRFszXSAmIDB4MDNDMDAwMDBVKSA+PiAyMlUpOworCisgIHBDU0QtPldyaXRlQmxvY2tQYVBhcnRpYWwgPSAodWludDhfdCkoKGhtbWMtPkNTRFszXSAmIDB4MDAyMDAwMDBVKSA+PiAyMVUpOworCisgIHBDU0QtPlJlc2VydmVkMyA9IDA7CisKKyAgcENTRC0+Q29udGVudFByb3RlY3RBcHBsaSA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAxMDAwMFUpID4+IDE2VSk7CisKKyAgcENTRC0+RmlsZUZvcm1hdEdyb3VwID0gKHVpbnQ4X3QpKChobW1jLT5DU0RbM10gJiAweDAwMDA4MDAwVSkgPj4gMTVVKTsKKworICBwQ1NELT5Db3B5RmxhZyA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAwNDAwMFUpID4+IDE0VSk7CisKKyAgcENTRC0+UGVybVdyUHJvdGVjdCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAwMjAwMFUpID4+IDEzVSk7CisKKyAgcENTRC0+VGVtcFdyUHJvdGVjdCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAwMTAwMFUpID4+IDEyVSk7CisKKyAgcENTRC0+RmlsZUZvcm1hdCA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAwMEMwMFUpID4+IDEwVSk7CisKKyAgcENTRC0+RUNDPSAodWludDhfdCkoKGhtbWMtPkNTRFszXSAmIDB4MDAwMDAzMDBVKSA+PiA4VSk7CisKKyAgcENTRC0+Q1NEX0NSQyA9ICh1aW50OF90KSgoaG1tYy0+Q1NEWzNdICYgMHgwMDAwMDBGRVUpID4+IDFVKTsKKwogICBwQ1NELT5SZXNlcnZlZDQgPSAxOwotICAKKwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEdldHMgdGhlIE1NQyBjYXJkIGluZm8uCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZSAgICAgIAotICAqIEBwYXJhbSAgcENhcmRJbmZvIFBvaW50ZXIgdG8gdGhlIEhBTF9NTUNfQ2FyZEluZm9UeXBlRGVmIHN0cnVjdHVyZSB0aGF0IAotICAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSBNTUMgY2FyZCBzdGF0dXMgaW5mb3JtYXRpb24gCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYXJkSW5mbzogUG9pbnRlciB0byB0aGUgSEFMX01NQ19DYXJkSW5mb1R5cGVEZWYgc3RydWN0dXJlIHRoYXQKKyAgKiAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgTU1DIGNhcmQgc3RhdHVzIGluZm9ybWF0aW9uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX0dldENhcmRJbmZvKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jLCBIQUxfTU1DX0NhcmRJbmZvVHlwZURlZiAqcENhcmRJbmZvKQpAQCAtMjA3MSwxNSArMjA5NywxNSBAQAogICBwQ2FyZEluZm8tPkJsb2NrU2l6ZSAgICA9ICh1aW50MzJfdCkoaG1tYy0+TW1jQ2FyZC5CbG9ja1NpemUpOwogICBwQ2FyZEluZm8tPkxvZ0Jsb2NrTmJyICA9ICh1aW50MzJfdCkoaG1tYy0+TW1jQ2FyZC5Mb2dCbG9ja05icik7CiAgIHBDYXJkSW5mby0+TG9nQmxvY2tTaXplID0gKHVpbnQzMl90KShobW1jLT5NbWNDYXJkLkxvZ0Jsb2NrU2l6ZSk7Ci0gIAorCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgRW5hYmxlcyB3aWRlIGJ1cyBvcGVyYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgY2FyZCBpZiBzdXBwb3J0ZWQgYnkgCisgICogQGJyaWVmICBFbmFibGVzIHdpZGUgYnVzIG9wZXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXJkIGlmIHN1cHBvcnRlZCBieQogICAqICAgICAgICAgY2FyZC4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlICAgICAgIAotICAqIEBwYXJhbSAgV2lkZU1vZGUgU3BlY2lmaWVzIHRoZSBNTUMgY2FyZCB3aWRlIGJ1cyBtb2RlIAorICAqIEBwYXJhbSAgaG1tYzogUG9pbnRlciB0byBNTUMgaGFuZGxlCisgICogQHBhcmFtICBXaWRlTW9kZTogU3BlY2lmaWVzIHRoZSBNTUMgY2FyZCB3aWRlIGJ1cyBtb2RlCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfQlVTX1dJREVfOEI6IDgtYml0IGRhdGEgdHJhbnNmZXIKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfQlVTX1dJREVfNEI6IDQtYml0IGRhdGEgdHJhbnNmZXIKQEAgLTIwODgsMTcgKzIxMTQsMTcgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfQ29uZmlnV2lkZUJ1c09wZXJhdGlvbihNTUNfSGFuZGxlVHlwZURlZiAqaG1tYywgdWludDMyX3QgV2lkZU1vZGUpCiB7Ci0gIF9fSU8gdWludDMyX3QgY291bnQgPSAwOworICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CiAgIFNETU1DX0luaXRUeXBlRGVmIEluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7Ci0gIHVpbnQzMl90IHJlc3BvbnNlID0gMCwgYnVzeSA9IDA7Ci0JCi0JLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgcmVzcG9uc2UgPSAwVSwgYnVzeSA9IDBVOworCisgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19TRE1NQ19CVVNfV0lERShXaWRlTW9kZSkpOwotCQorCiAgIC8qIENobmFnZSBTYXR0ZSAqLwogICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfQlVTWTsKLSAgCisKICAgLyogVXBkYXRlIENsb2NrIGZvciBCdXMgbW9kZSB1cGRhdGUgKi8KICAgSW5pdC5DbG9ja0VkZ2UgICAgICAgICAgID0gU0RNTUNfQ0xPQ0tfRURHRV9SSVNJTkc7CiAgIEluaXQuQ2xvY2tCeXBhc3MgICAgICAgICA9IFNETU1DX0NMT0NLX0JZUEFTU19ESVNBQkxFOwpAQCAtMjEwNywxMSArMjEzMywxMSBAQAogICBJbml0LkhhcmR3YXJlRmxvd0NvbnRyb2wgPSBTRE1NQ19IQVJEV0FSRV9GTE9XX0NPTlRST0xfRElTQUJMRTsKICAgSW5pdC5DbG9ja0RpdiAgICAgICAgICAgID0gU0RNTUNfSU5JVF9DTEtfRElWOwogICAvKiBJbml0aWFsaXplIFNETU1DKi8KLSAgU0RNTUNfSW5pdChobW1jLT5JbnN0YW5jZSwgSW5pdCk7IAotICAgIAorICAodm9pZClTRE1NQ19Jbml0KGhtbWMtPkluc3RhbmNlLCBJbml0KTsgCisKICAgaWYoV2lkZU1vZGUgPT0gU0RNTUNfQlVTX1dJREVfOEIpCiAgIHsKLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMjAwKTsKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMjAwVSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CkBAIC0yMTE5LDcgKzIxNDUsNyBAQAogICB9CiAgIGVsc2UgaWYoV2lkZU1vZGUgPT0gU0RNTUNfQlVTX1dJREVfNEIpCiAgIHsKLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMTAwKTsKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMTAwVSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CkBAIC0yMTI3LDcgKzIxNTMsNyBAQAogICB9CiAgIGVsc2UgaWYoV2lkZU1vZGUgPT0gU0RNTUNfQlVTX1dJREVfMUIpCiAgIHsKLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMDAwKTsKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3dpdGNoKGhtbWMtPkluc3RhbmNlLCAweDAzQjcwMDAwVSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CkBAIC0yMTM4LDUzICsyMTY0LDU1IEBACiAgICAgLyogV2lkZU1vZGUgaXMgbm90IGEgdmFsaWQgYXJndW1lbnQqLwogICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICB9Ci0gIAorCiAgIC8qIENoZWNrIGZvciBzd2l0Y2ggZXJyb3IgYW5kIHZpb2xhdGlvbiBvZiB0aGUgdHJpYWwgbnVtYmVyIG9mIHNlbmRpbmcgQ01EIDEzICovCi0gIHdoaWxlKGJ1c3kgPT0gMCkKKyAgd2hpbGUoYnVzeSA9PSAwVSkKICAgewotICAgIGlmKGNvdW50KysgPT0gU0RNTUNfTUFYX1RSSUFMKQorICAgIGlmKGNvdW50ID09IFNETU1DX01BWF9UUklBTCkKICAgICB7CiAgICAgICBobW1jLT5TdGF0ZSA9IEhBTF9NTUNfU1RBVEVfUkVBRFk7CiAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9SRVFVRVNUX05PVF9BUFBMSUNBQkxFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisgICAgY291bnQrKzsKKwogICAgIC8qIFdoaWxlIGNhcmQgaXMgbm90IHJlYWR5IGZvciBkYXRhIGFuZCB0cmlhbCBudW1iZXIgZm9yIHNlbmRpbmcgQ01EMTMgaXMgbm90IGV4Y2VlZGVkICovCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRTdGF0dXMoaG1tYy0+SW5zdGFuY2UsICh1aW50MzJfdCkoKCh1aW50MzJfdClobW1jLT5NbWNDYXJkLlJlbENhcmRBZGQpIDw8IDE2KSk7CisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRTdGF0dXMoaG1tYy0+SW5zdGFuY2UsICh1aW50MzJfdCkoKCh1aW50MzJfdClobW1jLT5NbWNDYXJkLlJlbENhcmRBZGQpIDw8IDE2VSkpOwogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICAgIHsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgIH0KLSAgICAKKwogICAgIC8qIEdldCBjb21tYW5kIHJlc3BvbnNlICovCiAgICAgcmVzcG9uc2UgPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOwotICAgIAorCiAgICAgLyogR2V0IG9wZXJhdGluZyB2b2x0YWdlKi8KLSAgICBidXN5ID0gKCgocmVzcG9uc2UgPj4gNykgPT0gMSkgPyAwIDogMSk7CisgICAgYnVzeSA9ICgoKHJlc3BvbnNlID4+IDdVKSA9PSAxVSkgPyAwVSA6IDFVKTsKICAgfQotICAgICAgCisKICAgLyogV2hpbGUgY2FyZCBpcyBub3QgcmVhZHkgZm9yIGRhdGEgYW5kIHRyaWFsIG51bWJlciBmb3Igc2VuZGluZyBDTUQxMyBpcyBub3QgZXhjZWVkZWQgKi8KICAgY291bnQgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgd2hpbGUoKHJlc3BvbnNlICYgMHgwMDAwMDEwMCkgPT0gMCkKKyAgd2hpbGUoKHJlc3BvbnNlICYgMHgwMDAwMDEwMFUpID09IDBVKQogICB7Ci0gICAgaWYoY291bnQtLSA9PSAwKQorICAgIGlmKGNvdW50ID09IDBVKQogICAgIHsKICAgICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX1JFUVVFU1RfTk9UX0FQUExJQ0FCTEU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKyAgICBjb3VudC0tOworCiAgICAgLyogV2hpbGUgY2FyZCBpcyBub3QgcmVhZHkgZm9yIGRhdGEgYW5kIHRyaWFsIG51bWJlciBmb3Igc2VuZGluZyBDTUQxMyBpcyBub3QgZXhjZWVkZWQgKi8KLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2VuZFN0YXR1cyhobW1jLT5JbnN0YW5jZSwgKHVpbnQzMl90KSgoKHVpbnQzMl90KWhtbWMtPk1tY0NhcmQuUmVsQ2FyZEFkZCkgPDwgMTYpKTsKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2VuZFN0YXR1cyhobW1jLT5JbnN0YW5jZSwgKHVpbnQzMl90KSgoKHVpbnQzMl90KWhtbWMtPk1tY0NhcmQuUmVsQ2FyZEFkZCkgPDwgMTZVKSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgfQotICAgIAorCiAgICAgLyogR2V0IGNvbW1hbmQgcmVzcG9uc2UgKi8KICAgICByZXNwb25zZSA9IFNETU1DX0dldFJlc3BvbnNlKGhtbWMtPkluc3RhbmNlLCBTRE1NQ19SRVNQMSk7CiAgIH0KLSAgCisKICAgaWYoaG1tYy0+RXJyb3JDb2RlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgewogICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCkBAIC0yMjAxLDU1ICsyMjI5LDU0IEBACiAgICAgSW5pdC5CdXNXaWRlICAgICAgICAgICAgID0gV2lkZU1vZGU7CiAgICAgSW5pdC5IYXJkd2FyZUZsb3dDb250cm9sID0gaG1tYy0+SW5pdC5IYXJkd2FyZUZsb3dDb250cm9sOwogICAgIEluaXQuQ2xvY2tEaXYgICAgICAgICAgICA9IGhtbWMtPkluaXQuQ2xvY2tEaXY7Ci0gICAgU0RNTUNfSW5pdChobW1jLT5JbnN0YW5jZSwgSW5pdCk7CisgICAgKHZvaWQpU0RNTUNfSW5pdChobW1jLT5JbnN0YW5jZSwgSW5pdCk7CiAgIH0KIAogICAvKiBDaGFuZ2UgU3RhdGUgKi8KICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOwotICAKKwogICByZXR1cm4gSEFMX09LOwogfQogCi0KIC8qKgogICAqIEBicmllZiAgR2V0cyB0aGUgY3VycmVudCBtbWMgY2FyZCBkYXRhIHN0YXRlLgotICAqIEBwYXJhbSAgaG1tYyBwb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcGFyYW0gIGhtbWM6IHBvaW50ZXIgdG8gTU1DIGhhbmRsZQogICAqIEByZXR2YWwgQ2FyZCBzdGF0ZQogICAqLwogSEFMX01NQ19DYXJkU3RhdGVUeXBlRGVmIEhBTF9NTUNfR2V0Q2FyZFN0YXRlKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewotICBIQUxfTU1DX0NhcmRTdGF0ZVR5cGVEZWYgY2FyZHN0YXRlID0gIEhBTF9NTUNfQ0FSRF9UUkFOU0ZFUjsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKLSAgdWludDMyX3QgcmVzcDEgPSAwOwotICAKKyAgdWludDMyX3QgY2FyZHN0YXRlOworICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MzJfdCByZXNwMSA9IDBVOworCiAgIGVycm9yc3RhdGUgPSBNTUNfU2VuZFN0YXR1cyhobW1jLCAmcmVzcDEpOwotICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgIHsKICAgICBobW1jLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgfQogCi0gIGNhcmRzdGF0ZSA9IChIQUxfTU1DX0NhcmRTdGF0ZVR5cGVEZWYpKChyZXNwMSA+PiA5KSAmIDB4MEYpOwotICAKLSAgcmV0dXJuIGNhcmRzdGF0ZTsKKyAgY2FyZHN0YXRlID0gKChyZXNwMSA+PiA5VSkgJiAweDBGVSk7CisKKyAgcmV0dXJuIChIQUxfTU1DX0NhcmRTdGF0ZVR5cGVEZWYpY2FyZHN0YXRlOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zZmVyIGFuZCBkaXNhYmxlIHRoZSBNTUMuCi0gICogQHBhcmFtICBobW1jIHBvaW50ZXIgdG8gYSBNTUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworICAqIEBwYXJhbSAgaG1tYzogcG9pbnRlciB0byBhIE1NQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIE1NQyBtb2R1bGUuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfTU1DX0Fib3J0KE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewogICBIQUxfTU1DX0NhcmRTdGF0ZVR5cGVEZWYgQ2FyZFN0YXRlOwotICAKKwogICAvKiBESXNhYmxlIEFsbCBpbnRlcnJ1cHRzICovCiAgIF9fSEFMX01NQ19ESVNBQkxFX0lUKGhtbWMsIFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKLSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKKwogICAvKiBDbGVhciBBbGwgZmxhZ3MgKi8KLSAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgCisgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKKwogICBpZigoaG1tYy0+aGRtYXR4ICE9IE5VTEwpIHx8IChobW1jLT5oZG1hcnggIT0gTlVMTCkpCiAgIHsKICAgICAvKiBEaXNhYmxlIHRoZSBNTUMgRE1BIHJlcXVlc3QgKi8KQEAgLTIyNTgsMTYgKzIyODUsMjYgQEAKICAgICAvKiBBYm9ydCB0aGUgTU1DIERNQSBUeCBTdHJlYW0gKi8KICAgICBpZihobW1jLT5oZG1hdHggIT0gTlVMTCkKICAgICB7Ci0gICAgICBIQUxfRE1BX0Fib3J0KGhtbWMtPmhkbWF0eCk7CisgICAgICBpZihIQUxfRE1BX0Fib3J0KGhtbWMtPmhkbWF0eCkgIT0gSEFMX09LKQorICAgICAgeworICAgICAgICBobW1jLT5FcnJvckNvZGUgfD0gSEFMX01NQ19FUlJPUl9ETUE7CisgICAgICB9CiAgICAgfQogICAgIC8qIEFib3J0IHRoZSBNTUMgRE1BIFJ4IFN0cmVhbSAqLwogICAgIGlmKGhtbWMtPmhkbWFyeCAhPSBOVUxMKQogICAgIHsKLSAgICAgIEhBTF9ETUFfQWJvcnQoaG1tYy0+aGRtYXJ4KTsKKyAgICAgIGlmKEhBTF9ETUFfQWJvcnQoaG1tYy0+aGRtYXJ4KSAhPSBIQUxfT0spCisgICAgICB7CisgICAgICAgIGhtbWMtPkVycm9yQ29kZSB8PSBIQUxfTU1DX0VSUk9SX0RNQTsKKyAgICAgIH0KICAgICB9CiAgIH0KLSAgCisKICAgaG1tYy0+U3RhdGUgPSBIQUxfTU1DX1NUQVRFX1JFQURZOworCisgIC8qIEluaXRpYWxpemUgdGhlIE1NQyBvcGVyYXRpb24gKi8KKyAgaG1tYy0+Q29udGV4dCA9IE1NQ19DT05URVhUX05PTkU7CisKICAgQ2FyZFN0YXRlID0gSEFMX01NQ19HZXRDYXJkU3RhdGUoaG1tYyk7CiAgIGlmKChDYXJkU3RhdGUgPT0gSEFMX01NQ19DQVJEX1JFQ0VJVklORykgfHwgKENhcmRTdGF0ZSA9PSBIQUxfTU1DX0NBUkRfU0VORElORykpCiAgIHsKQEAgLTIyODIsMjEgKzIzMTksMjEgQEAKIAogLyoqCiAgICogQGJyaWVmICBBYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciBhbmQgZGlzYWJsZSB0aGUgTU1DIChJVCBtb2RlKS4KLSAgKiBAcGFyYW0gIGhtbWMgcG9pbnRlciB0byBhIE1NQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogQHBhcmFtICBobW1jOiBwb2ludGVyIHRvIGEgTU1DX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgTU1DIG1vZHVsZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NTUNfQWJvcnRfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7CiAgIEhBTF9NTUNfQ2FyZFN0YXRlVHlwZURlZiBDYXJkU3RhdGU7Ci0gICAgCisKICAgLyogRElzYWJsZSBBbGwgaW50ZXJydXB0cyAqLwogICBfX0hBTF9NTUNfRElTQUJMRV9JVChobW1jLCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19JVF9UWFVOREVSUnwgU0RNTUNfSVRfUlhPVkVSUik7Ci0gIAorCiAgIC8qIENsZWFyIEFsbCBmbGFncyAqLwotICBfX0hBTF9NTUNfQ0xFQVJfRkxBRyhobW1jLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAKKyAgX19IQUxfTU1DX0NMRUFSX0ZMQUcoaG1tYywgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCiAgIGlmKChobW1jLT5oZG1hdHggIT0gTlVMTCkgfHwgKGhtbWMtPmhkbWFyeCAhPSBOVUxMKSkKICAgewogICAgIC8qIERpc2FibGUgdGhlIE1NQyBETUEgcmVxdWVzdCAqLwpAQCAtMjMyNyw2ICsyMzY0LDcgQEAKICAgewogICAgIENhcmRTdGF0ZSA9IEhBTF9NTUNfR2V0Q2FyZFN0YXRlKGhtbWMpOwogICAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKKwogICAgIGlmKChDYXJkU3RhdGUgPT0gSEFMX01NQ19DQVJEX1JFQ0VJVklORykgfHwgKENhcmRTdGF0ZSA9PSBIQUxfTU1DX0NBUkRfU0VORElORykpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlID0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhtbWMtPkluc3RhbmNlKTsKQEAgLTIzMzcsMjkgKzIzNzUsMzMgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICBobW1jLT5BYm9ydENwbHRDYWxsYmFjayhobW1jKTsKKyNlbHNlCiAgICAgICBIQUxfTU1DX0Fib3J0Q2FsbGJhY2soaG1tYyk7CisjZW5kaWYKICAgICB9CiAgIH0KLSAgCisKICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQH0KICAgKi8KLSAgCisKIC8qKgogICAqIEB9CiAgICovCi0gIAotLyogUHJpdmF0ZSBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorCisvKiBQcml2YXRlIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIE1NQ19Qcml2YXRlX0Z1bmN0aW9ucwogICAqIEB7CiAgICovCiAKIC8qKgogICAqIEBicmllZiAgRE1BIE1NQyB0cmFuc21pdCBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrIAotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBzdGF0aWMgdm9pZCBNTUNfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgICAgCkBAIC0yMzcyLDEzICsyNDE0LDEzIEBACiAKIC8qKgogICAqIEBicmllZiAgRE1BIE1NQyByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2sgCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIE1NQ19ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgIAogewogICBNTUNfSGFuZGxlVHlwZURlZiogaG1tYyA9IChNTUNfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2VuZCBzdG9wIGNvbW1hbmQgaW4gbXVsdGlibG9jayB3cml0ZSAqLwogICBpZihobW1jLT5Db250ZXh0ID09IChNTUNfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLIHwgTU1DX0NPTlRFWFRfRE1BKSkKQEAgLTIzODcsNyArMjQyOSw3IEBACiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgaG1tYy0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7Ci0jaWYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIGhtbWMtPkVycm9yQ2FsbGJhY2soaG1tYyk7CiAjZWxzZQogICAgICAgSEFMX01NQ19FcnJvckNhbGxiYWNrKGhtbWMpOwpAQCAtMjQwMCwxMSArMjQ0MiwxMSBAQAogICBobW1jLT5JbnN0YW5jZS0+RENUUkwgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KVNETU1DX0RDVFJMX0RNQUVOKTsKICAgCiAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKICAgCiAgIGhtbWMtPlN0YXRlID0gSEFMX01NQ19TVEFURV9SRUFEWTsKIAotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgIGhtbWMtPlJ4Q3BsdENhbGxiYWNrKGhtbWMpOwogI2Vsc2UKICAgSEFMX01NQ19SeENwbHRDYWxsYmFjayhobW1jKTsKQEAgLTI0MTMsMTggKzI0NTUsMjEgQEAKIAogLyoqCiAgICogQGJyaWVmICBETUEgTU1DIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2sgCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIE1NQ19ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAKIHsKICAgTU1DX0hhbmRsZVR5cGVEZWYqIGhtbWMgPSAoTU1DX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKICAgSEFMX01NQ19DYXJkU3RhdGVUeXBlRGVmIENhcmRTdGF0ZTsKKyAgdWludDMyX3QgUnhFcnJvckNvZGUsIFR4RXJyb3JDb2RlOwogICAKICAgLyogaWYgRE1BIGVycm9yIGlzIEZJRk8gZXJyb3IgaWdub3JlIGl0ICovCiAgIGlmKEhBTF9ETUFfR2V0RXJyb3IoaGRtYSkgIT0gSEFMX0RNQV9FUlJPUl9GRSkKICAgewotICAgIGlmKChobW1jLT5oZG1hcngtPkVycm9yQ29kZSA9PSBIQUxfRE1BX0VSUk9SX1RFKSB8fCAoaG1tYy0+aGRtYXR4LT5FcnJvckNvZGUgPT0gSEFMX0RNQV9FUlJPUl9URSkpCisgICAgUnhFcnJvckNvZGUgPSBobW1jLT5oZG1hcngtPkVycm9yQ29kZTsKKyAgICBUeEVycm9yQ29kZSA9IGhtbWMtPmhkbWF0eC0+RXJyb3JDb2RlOyAgCisgICAgaWYoKFJ4RXJyb3JDb2RlID09IEhBTF9ETUFfRVJST1JfVEUpIHx8IChUeEVycm9yQ29kZSA9PSBIQUxfRE1BX0VSUk9SX1RFKSkKICAgICB7CiAgICAgICAvKiBDbGVhciBBbGwgZmxhZ3MgKi8KICAgICAgIF9fSEFMX01NQ19DTEVBUl9GTEFHKGhtbWMsIFNETU1DX1NUQVRJQ19GTEFHUyk7CkBAIC0yNDQzLDE4ICsyNDg4LDE3IEBACiAgICAgICBobW1jLT5TdGF0ZT0gSEFMX01NQ19TVEFURV9SRUFEWTsKICAgICB9CiAgICAgCi0jaWYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICBobW1jLT5FcnJvckNhbGxiYWNrKGhtbWMpOwogI2Vsc2UKICAgICBIQUxfTU1DX0Vycm9yQ2FsbGJhY2soaG1tYyk7CiAjZW5kaWYKICAgfQotCiB9CiAKIC8qKgogICAqIEBicmllZiAgRE1BIE1NQyBUeCBBYm9ydCBjYWxsYmFjayAKLSAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIHZvaWQgTU1DX0RNQVR4QWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCkBAIC0yNDc5LDExICsyNTIzLDE1IEBACiAgICAgICAKICAgICAgIGlmKGhtbWMtPkVycm9yQ29kZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgICB7CisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQorICAgICAgICBobW1jLT5BYm9ydENwbHRDYWxsYmFjayhobW1jKTsKKyNlbHNlCiAgICAgICAgIEhBTF9NTUNfQWJvcnRDYWxsYmFjayhobW1jKTsKKyNlbmRpZgogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotI2lmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX01NQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgIGhtbWMtPkVycm9yQ2FsbGJhY2soaG1tYyk7CiAjZWxzZQogICAgICAgICBIQUxfTU1DX0Vycm9yQ2FsbGJhY2soaG1tYyk7CkBAIC0yNDk1LDcgKzI1NDMsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERNQSBNTUMgUnggQWJvcnQgY2FsbGJhY2sgCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHN0YXRpYyB2b2lkIE1NQ19ETUFSeEFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIApAQCAtMjUyMCwxMSArMjU2OCwxNSBAQAogICAgICAgCiAgICAgICBpZihobW1jLT5FcnJvckNvZGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICAgICAgeworI2lmIGRlZmluZWQgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfTU1DX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaG1tYy0+QWJvcnRDcGx0Q2FsbGJhY2soaG1tYyk7CisjZWxzZQogICAgICAgICBIQUxfTU1DX0Fib3J0Q2FsbGJhY2soaG1tYyk7CisjZW5kaWYKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKLSNpZiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9NTUNfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgICBobW1jLT5FcnJvckNhbGxiYWNrKGhtbWMpOwogI2Vsc2UKICAgICAgICAgSEFMX01NQ19FcnJvckNhbGxiYWNrKGhtbWMpOwpAQCAtMjUzNCwyNSArMjU4NiwyNCBAQAogICB9CiB9CiAKLQogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgbW1jIGNhcmQuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgaG1tYzogUG9pbnRlciB0byBNTUMgaGFuZGxlCiAgICogQHJldHZhbCBNTUMgQ2FyZCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IE1NQ19Jbml0Q2FyZChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYykKIHsKICAgSEFMX01NQ19DYXJkQ1NEVHlwZURlZiBDU0Q7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfTU1DX0VSUk9SX05PTkU7Ci0gIHVpbnQxNl90IG1tY19yY2EgPSAxOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDE2X3QgbW1jX3JjYSA9IDFVOworCiAgIC8qIENoZWNrIHRoZSBwb3dlciBTdGF0ZSAqLwotICBpZihTRE1NQ19HZXRQb3dlclN0YXRlKGhtbWMtPkluc3RhbmNlKSA9PSAwKSAKKyAgaWYoU0RNTUNfR2V0UG93ZXJTdGF0ZShobW1jLT5JbnN0YW5jZSkgPT0gMFUpCiAgIHsKICAgICAvKiBQb3dlciBvZmYgKi8KICAgICByZXR1cm4gSEFMX01NQ19FUlJPUl9SRVFVRVNUX05PVF9BUFBMSUNBQkxFOwogICB9Ci0gIAorCiAgIC8qIFNlbmQgQ01EMiBBTExfU0VORF9DSUQgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRDSUQoaG1tYy0+SW5zdGFuY2UpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKQEAgLTI1NjIsMTIgKzI2MTMsMTIgQEAKICAgZWxzZQogICB7CiAgICAgLyogR2V0IENhcmQgaWRlbnRpZmljYXRpb24gbnVtYmVyIGRhdGEgKi8KLSAgICBobW1jLT5DSURbMF0gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOwotICAgIGhtbWMtPkNJRFsxXSA9IFNETU1DX0dldFJlc3BvbnNlKGhtbWMtPkluc3RhbmNlLCBTRE1NQ19SRVNQMik7Ci0gICAgaG1tYy0+Q0lEWzJdID0gU0RNTUNfR2V0UmVzcG9uc2UoaG1tYy0+SW5zdGFuY2UsIFNETU1DX1JFU1AzKTsKLSAgICBobW1jLT5DSURbM10gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDQpOworICAgIGhtbWMtPkNJRFswVV0gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOworICAgIGhtbWMtPkNJRFsxVV0gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDIpOworICAgIGhtbWMtPkNJRFsyVV0gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDMpOworICAgIGhtbWMtPkNJRFszVV0gPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDQpOwogICB9Ci0gIAorCiAgIC8qIFNlbmQgQ01EMyBTRVRfUkVMX0FERFIgd2l0aCBhcmd1bWVudCAwICovCiAgIC8qIE1NQyBDYXJkIHB1Ymxpc2hlcyBpdHMgUkNBLiAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2V0UmVsQWRkKGhtbWMtPkluc3RhbmNlLCAmbW1jX3JjYSk7CkBAIC0yNTc1LDEwICsyNjI2LDEwIEBACiAgIHsKICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgfQotICAKKwogICAvKiBHZXQgdGhlIE1NQyBjYXJkIFJDQSAqLwogICBobW1jLT5NbWNDYXJkLlJlbENhcmRBZGQgPSBtbWNfcmNhOwotICAKKwogICAvKiBTZW5kIENNRDkgU0VORF9DU0Qgd2l0aCBhcmd1bWVudCBhcyBjYXJkJ3MgUkNBICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTZW5kQ1NEKGhtbWMtPkluc3RhbmNlLCAodWludDMyX3QpKGhtbWMtPk1tY0NhcmQuUmVsQ2FyZEFkZCA8PCAxNlUpKTsKICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCkBAIC0yNTkzLDIyICsyNjQ0LDI1IEBACiAgICAgaG1tYy0+Q1NEWzJVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhtbWMtPkluc3RhbmNlLCBTRE1NQ19SRVNQMyk7CiAgICAgaG1tYy0+Q1NEWzNVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhtbWMtPkluc3RhbmNlLCBTRE1NQ19SRVNQNCk7CiAgIH0KLSAgCisKICAgLyogR2V0IHRoZSBDYXJkIENsYXNzICovCi0gIGhtbWMtPk1tY0NhcmQuQ2xhc3MgPSAoU0RNTUNfR2V0UmVzcG9uc2UoaG1tYy0+SW5zdGFuY2UsIFNETU1DX1JFU1AyKSA+PiAyMCk7Ci0gIAorICBobW1jLT5NbWNDYXJkLkNsYXNzID0gKFNETU1DX0dldFJlc3BvbnNlKGhtbWMtPkluc3RhbmNlLCBTRE1NQ19SRVNQMikgPj4gMjBVKTsKKwogICAvKiBHZXQgQ1NEIHBhcmFtZXRlcnMgKi8KLSAgSEFMX01NQ19HZXRDYXJkQ1NEKGhtbWMsICZDU0QpOworICBpZiAoSEFMX01NQ19HZXRDYXJkQ1NEKGhtbWMsICZDU0QpICE9IEhBTF9PSykKKyAgeworICAgIHJldHVybiBobW1jLT5FcnJvckNvZGU7CisgIH0KIAogICAvKiBTZWxlY3QgdGhlIENhcmQgKi8KLSAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbERlc2VsKGhtbWMtPkluc3RhbmNlLCAodWludDMyX3QpKCgodWludDMyX3QpaG1tYy0+TW1jQ2FyZC5SZWxDYXJkQWRkKSA8PCAxNikpOworICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2VsRGVzZWwoaG1tYy0+SW5zdGFuY2UsICh1aW50MzJfdCkoKCh1aW50MzJfdClobW1jLT5NbWNDYXJkLlJlbENhcmRBZGQpIDw8IDE2VSkpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9NTUNfRVJST1JfTk9ORSkKICAgewogICAgIHJldHVybiBlcnJvcnN0YXRlOwogICB9CiAKLSAgLyogQ29uZmlndXJlIFNETU1DIHBlcmlwaGVyYWwgaW50ZXJmYWNlICovICAgICAKLSAgU0RNTUNfSW5pdChobW1jLT5JbnN0YW5jZSwgaG1tYy0+SW5pdCk7CisgIC8qIENvbmZpZ3VyZSBTRE1NQyBwZXJpcGhlcmFsIGludGVyZmFjZSAqLworICAodm9pZClTRE1NQ19Jbml0KGhtbWMtPkluc3RhbmNlLCBobW1jLT5Jbml0KTsKIAogICAvKiBBbGwgY2FyZHMgYXJlIGluaXRpYWxpemVkICovCiAgIHJldHVybiBIQUxfTU1DX0VSUk9SX05PTkU7CkBAIC0yNjE4LDE1MiArMjY3MiwxODAgQEAKICAgKiBAYnJpZWYgIEVucXVpcmVzIGNhcmRzIGFib3V0IHRoZWlyIG9wZXJhdGluZyB2b2x0YWdlIGFuZCBjb25maWd1cmVzIGNsb2NrCiAgICogICAgICAgICBjb250cm9scyBhbmQgc3RvcmVzIE1NQyBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgbmVlZGVkIGluIGZ1dHVyZQogICAqICAgICAgICAgaW4gdGhlIE1NQyBoYW5kbGUuCi0gICogQHBhcmFtICBobW1jIFBvaW50ZXIgdG8gTU1DIGhhbmRsZQorICAqIEBwYXJhbSAgaG1tYzogUG9pbnRlciB0byBNTUMgaGFuZGxlCiAgICogQHJldHZhbCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IE1NQ19Qb3dlck9OKE1NQ19IYW5kbGVUeXBlRGVmICpobW1jKQogewotICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgdWludDMyX3QgcmVzcG9uc2UgPSAwLCB2YWxpZHZvbHRhZ2UgPSAwOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX01NQ19FUlJPUl9OT05FOwotICAKKyAgX19JTyB1aW50MzJfdCBjb3VudCA9IDBVOworICB1aW50MzJfdCByZXNwb25zZSA9IDBVLCB2YWxpZHZvbHRhZ2UgPSAwVTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKwogICAvKiBDTUQwOiBHT19JRExFX1NUQVRFICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRHb0lkbGVTdGF0ZShobW1jLT5JbnN0YW5jZSk7CiAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KLSAgCi0gIHdoaWxlKHZhbGlkdm9sdGFnZSA9PSAwKQorCisgIHdoaWxlKHZhbGlkdm9sdGFnZSA9PSAwVSkKICAgewogICAgIGlmKGNvdW50KysgPT0gU0RNTUNfTUFYX1ZPTFRfVFJJQUwpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9NTUNfRVJST1JfSU5WQUxJRF9WT0xUUkFOR0U7CiAgICAgfQotICAgIAorCiAgICAgLyogU0VORCBDTUQxIEFQUF9DTUQgd2l0aCBNTUNfSElHSF9WT0xUQUdFX1JBTkdFKDB4QzBGRjgwMDApIGFzIGFyZ3VtZW50ICovCiAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZE9wQ29uZGl0aW9uKGhtbWMtPkluc3RhbmNlLCBlTU1DX0hJR0hfVk9MVEFHRV9SQU5HRSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfTU1DX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9NTUNfRVJST1JfVU5TVVBQT1JURURfRkVBVFVSRTsKICAgICB9Ci0gICAgCisKICAgICAvKiBHZXQgY29tbWFuZCByZXNwb25zZSAqLwogICAgIHJlc3BvbnNlID0gU0RNTUNfR2V0UmVzcG9uc2UoaG1tYy0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKTsKLSAgICAKKwogICAgIC8qIEdldCBvcGVyYXRpbmcgdm9sdGFnZSovCi0gICAgdmFsaWR2b2x0YWdlID0gKCgocmVzcG9uc2UgPj4gMzEpID09IDEpID8gMSA6IDApOworICAgIHZhbGlkdm9sdGFnZSA9ICgoKHJlc3BvbnNlID4+IDMxVSkgPT0gMVUpID8gMVUgOiAwVSk7CiAgIH0KLSAgCisKICAgLyogV2hlbiBwb3dlciByb3V0aW5lIGlzIGZpbmlzaGVkIGFuZCBjb21tYW5kIHJldHVybnMgdmFsaWQgdm9sdGFnZSAqLwotICBpZiAoKHJlc3BvbnNlICYgTU1DX0hJR0hfVk9MVEFHRV9SQU5HRSkgPT0gTU1DX0hJR0hfVk9MVEFHRV9SQU5HRSkKKyAgaWYgKCgocmVzcG9uc2UgJiAoMHhGRjAwMDAwMFUpKSA+PiAyNFUpID09IDB4QzBVKQogICB7Ci0gICAgLyogV2hlbiB2b2x0YWdlIHJhbmdlIG9mIHRoZSBjYXJkIGlzIHdpdGhpbiAyLjdWIGFuZCAzLjZWICovCi0gICAgaG1tYy0+TW1jQ2FyZC5DYXJkVHlwZSA9IE1NQ19ISUdIX1ZPTFRBR0VfQ0FSRDsKKyAgICBobW1jLT5NbWNDYXJkLkNhcmRUeXBlID0gTU1DX0hJR0hfQ0FQQUNJVFlfQ0FSRDsKICAgfQogICBlbHNlCiAgIHsKLSAgICAvKiBXaGVuIHZvbHRhZ2UgcmFuZ2Ugb2YgdGhlIGNhcmQgaXMgd2l0aGluIDEuNjVWIGFuZCAxLjk1ViBvciAyLjdWIGFuZCAzLjZWICovCi0gICAgaG1tYy0+TW1jQ2FyZC5DYXJkVHlwZSA9IE1NQ19EVUFMX1ZPTFRBR0VfQ0FSRDsKKyAgICBobW1jLT5NbWNDYXJkLkNhcmRUeXBlID0gTU1DX0xPV19DQVBBQ0lUWV9DQVJEOwogICB9Ci0gIAorCiAgIHJldHVybiBIQUxfTU1DX0VSUk9SX05PTkU7CiB9CiAKIC8qKgogICAqIEBicmllZiAgVHVybnMgdGhlIFNETU1DIG91dHB1dCBzaWduYWxzIG9mZi4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCi0gICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQHBhcmFtICBobW1jOiBQb2ludGVyIHRvIE1NQyBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBNTUNfUG93ZXJPRkYoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCitzdGF0aWMgdm9pZCBNTUNfUG93ZXJPRkYoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7CiAgIC8qIFNldCBQb3dlciBTdGF0ZSB0byBPRkYgKi8KLSAgU0RNTUNfUG93ZXJTdGF0ZV9PRkYoaG1tYy0+SW5zdGFuY2UpOwotICAKLSAgcmV0dXJuIEhBTF9PSzsKKyAgKHZvaWQpU0RNTUNfUG93ZXJTdGF0ZV9PRkYoaG1tYy0+SW5zdGFuY2UpOwogfQogCiAvKioKICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgY2FyZCdzIHN0YXR1cy4KLSAgKiBAcGFyYW0gIGhtbWMgUG9pbnRlciB0byBNTUMgaGFuZGxlCi0gICogQHBhcmFtICBwQ2FyZFN0YXR1cyBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIE1NQyBjYXJkIAotICAqICAgICAgICAgc3RhdHVzIChDYXJkIFN0YXR1cyByZWdpc3RlcikgIAorICAqIEBwYXJhbSAgaG1tYzogUG9pbnRlciB0byBNTUMgaGFuZGxlCisgICogQHBhcmFtICBwQ2FyZFN0YXR1czogcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBNTUMgY2FyZAorICAqICAgICAgICAgc3RhdHVzIChDYXJkIFN0YXR1cyByZWdpc3RlcikKICAgKiBAcmV0dmFsIGVycm9yIHN0YXRlCiAgICovCiBzdGF0aWMgdWludDMyX3QgTU1DX1NlbmRTdGF0dXMoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMsIHVpbnQzMl90ICpwQ2FyZFN0YXR1cykKIHsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9NTUNfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IGVycm9yc3RhdGU7CisKICAgaWYocENhcmRTdGF0dXMgPT0gTlVMTCkKICAgewogICAgIHJldHVybiBIQUxfTU1DX0VSUk9SX1BBUkFNOwogICB9Ci0gIAorCiAgIC8qIFNlbmQgU3RhdHVzIGNvbW1hbmQgKi8KLSAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRTdGF0dXMoaG1tYy0+SW5zdGFuY2UsICh1aW50MzJfdCkoaG1tYy0+TW1jQ2FyZC5SZWxDYXJkQWRkIDw8IDE2KSk7Ci0gIGlmKGVycm9yc3RhdGUgIT0gSEFMX09LKQorICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2VuZFN0YXR1cyhobW1jLT5JbnN0YW5jZSwgKHVpbnQzMl90KShobW1jLT5NbWNDYXJkLlJlbENhcmRBZGQgPDwgMTZVKSk7CisgIGlmKGVycm9yc3RhdGUgIT0gSEFMX01NQ19FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KLSAgCisKICAgLyogR2V0IE1NQyBjYXJkIHN0YXR1cyAqLwogICAqcENhcmRTdGF0dXMgPSBTRE1NQ19HZXRSZXNwb25zZShobW1jLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOwotICAKKwogICByZXR1cm4gSEFMX01NQ19FUlJPUl9OT05FOwogfQogCiAvKioKICAgKiBAYnJpZWYgIFdyYXAgdXAgcmVhZGluZyBpbiBub24tYmxvY2tpbmcgbW9kZS4KLSAgKiBAcGFyYW0gIGhtbWMgcG9pbnRlciB0byBhIE1NQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogQHBhcmFtICBobW1jOiBwb2ludGVyIHRvIGEgTU1DX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgTU1DX1JlYWRfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCitzdGF0aWMgdm9pZCBNTUNfUmVhZF9JVChNTUNfSGFuZGxlVHlwZURlZiAqaG1tYykKIHsKLSAgdWludDMyX3QgY291bnQgPSAwOwotICB1aW50MzJfdCogdG1wOworICB1aW50MzJfdCBjb3VudCwgZGF0YSwgZGF0YXJlbWFpbmluZzsKKyAgdWludDhfdCogdG1wOwogCi0gIHRtcCA9ICh1aW50MzJfdCopaG1tYy0+cFJ4QnVmZlB0cjsKLSAgCi0gIC8qIFJlYWQgZGF0YSBmcm9tIFNETU1DIFJ4IEZJRk8gKi8KLSAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA4OyBjb3VudCsrKQorICB0bXAgPSBobW1jLT5wUnhCdWZmUHRyOworICBkYXRhcmVtYWluaW5nID0gaG1tYy0+UnhYZmVyU2l6ZTsKKworICBpZiAoZGF0YXJlbWFpbmluZyA+IDBVKQogICB7Ci0gICAgKih0bXAgKyBjb3VudCkgPSBTRE1NQ19SZWFkRklGTyhobW1jLT5JbnN0YW5jZSk7CisgICAgLyogUmVhZCBkYXRhIGZyb20gU0RNTUMgUnggRklGTyAqLworICAgIGZvcihjb3VudCA9IDBVOyBjb3VudCA8IDhVOyBjb3VudCsrKQorICAgIHsKKyAgICAgIGRhdGEgPSBTRE1NQ19SZWFkRklGTyhobW1jLT5JbnN0YW5jZSk7CisgICAgICAqdG1wID0gKHVpbnQ4X3QpKGRhdGEgJiAweEZGVSk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgICp0bXAgPSAodWludDhfdCkoKGRhdGEgPj4gOFUpICYgMHhGRlUpOworICAgICAgdG1wKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAqdG1wID0gKHVpbnQ4X3QpKChkYXRhID4+IDE2VSkgJiAweEZGVSk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgICp0bXAgPSAodWludDhfdCkoKGRhdGEgPj4gMjRVKSAmIDB4RkZVKTsKKyAgICAgIHRtcCsrOworICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgIH0KKworICAgIGhtbWMtPnBSeEJ1ZmZQdHIgPSB0bXA7CisgICAgaG1tYy0+UnhYZmVyU2l6ZSA9IGRhdGFyZW1haW5pbmc7CiAgIH0KLSAgCi0gIGhtbWMtPnBSeEJ1ZmZQdHIgKz0gODsKLSAgCi0gIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgogICAqIEBicmllZiAgV3JhcCB1cCB3cml0aW5nIGluIG5vbi1ibG9ja2luZyBtb2RlLgotICAqIEBwYXJhbSAgaG1tYyBwb2ludGVyIHRvIGEgTU1DX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiBAcGFyYW0gIGhtbWM6IHBvaW50ZXIgdG8gYSBNTUNfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKKyAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBNTUNfV3JpdGVfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCitzdGF0aWMgdm9pZCBNTUNfV3JpdGVfSVQoTU1DX0hhbmRsZVR5cGVEZWYgKmhtbWMpCiB7Ci0gIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgdWludDMyX3QqIHRtcDsKLSAgCi0gIHRtcCA9ICh1aW50MzJfdCopaG1tYy0+cFR4QnVmZlB0cjsKLSAgCi0gIC8qIFdyaXRlIGRhdGEgdG8gU0RNTUMgVHggRklGTyAqLwotICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDg7IGNvdW50KyspCisgIHVpbnQzMl90IGNvdW50LCBkYXRhLCBkYXRhcmVtYWluaW5nOworICB1aW50OF90KiB0bXA7CisKKyAgdG1wID0gaG1tYy0+cFR4QnVmZlB0cjsKKyAgZGF0YXJlbWFpbmluZyA9IGhtbWMtPlR4WGZlclNpemU7CisKKyAgaWYgKGRhdGFyZW1haW5pbmcgPiAwVSkKICAgewotICAgIFNETU1DX1dyaXRlRklGTyhobW1jLT5JbnN0YW5jZSwgKHRtcCArIGNvdW50KSk7CisgICAgLyogV3JpdGUgZGF0YSB0byBTRE1NQyBUeCBGSUZPICovCisgICAgZm9yKGNvdW50ID0gMFU7IGNvdW50IDwgOFU7IGNvdW50KyspCisgICAgeworICAgICAgZGF0YSA9ICh1aW50MzJfdCkoKnRtcCk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRtcCkgPDwgOFUpOworICAgICAgdG1wKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICBkYXRhIHw9ICgodWludDMyX3QpKCp0bXApIDw8IDE2VSk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRtcCkgPDwgMjRVKTsKKyAgICAgIHRtcCsrOworICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKHZvaWQpU0RNTUNfV3JpdGVGSUZPKGhtbWMtPkluc3RhbmNlLCAmZGF0YSk7CisgICAgfQorCisgICAgaG1tYy0+cFR4QnVmZlB0ciA9IHRtcDsKKyAgICBobW1jLT5UeFhmZXJTaXplID0gZGF0YXJlbWFpbmluZzsKICAgfQotICAKLSAgaG1tYy0+cFR4QnVmZlB0ciArPSA4OwotICAKLSAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQH0KICAgKi8KIAorI2VuZGlmIC8qIFNETU1DMSAqLworCiAjZW5kaWYgLyogSEFMX01NQ19NT0RVTEVfRU5BQkxFRCAqLwogCiAvKioKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3BjZC5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfcGNkLmMKaW5kZXggNTI4NGI3OS4uNmNlNGVkZCAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfcGNkLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfcGNkLmMKQEAgLTEyMiw2ICsxMjIsNyBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1BDRF9Jbml0KFBDRF9IYW5kbGVUeXBlRGVmICpocGNkKQogeworICBVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQng7CiAgIHVpbnQ4X3QgaTsKIAogICAvKiBDaGVjayB0aGUgUENEIGhhbmRsZSBhbGxvY2F0aW9uICovCkBAIC0xMzMsNiArMTM0LDggQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1BDRF9BTExfSU5TVEFOQ0UoaHBjZC0+SW5zdGFuY2UpKTsKIAorICBVU0J4ID0gaHBjZC0+SW5zdGFuY2U7CisKICAgaWYgKGhwY2QtPlN0YXRlID09IEhBTF9QQ0RfU1RBVEVfUkVTRVQpCiAgIHsKICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCkBAIC0xNjYsNiArMTY5LDEyIEBACiAKICAgaHBjZC0+U3RhdGUgPSBIQUxfUENEX1NUQVRFX0JVU1k7CiAKKyAgLyogRGlzYWJsZSBETUEgbW9kZSBmb3IgRlMgaW5zdGFuY2UgKi8KKyAgaWYgKChVU0J4LT5DSUQgJiAoMHgxVSA8PCA4KSkgPT0gMFUpCisgIHsKKyAgICBocGNkLT5Jbml0LmRtYV9lbmFibGUgPSAwVTsKKyAgfQorCiAgIC8qIERpc2FibGUgdGhlIEludGVycnVwdHMgKi8KICAgX19IQUxfUENEX0RJU0FCTEUoaHBjZCk7CiAKQEAgLTk0Myw3ICs5NTIsNyBAQAogewogICBVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQnggPSBocGNkLT5JbnN0YW5jZTsKICAgdWludDMyX3QgVVNCeF9CQVNFID0gKHVpbnQzMl90KVVTQng7Ci0gIHVpbnQzMl90IGksIGVwX2ludHIsIGVwaW50LCBlcG51bSA9IDBVOworICB1aW50MzJfdCBpLCBlcF9pbnRyLCBlcGludCwgZXBudW07CiAgIHVpbnQzMl90IGZpZm9lbXB0eW1zaywgdGVtcDsKICAgVVNCX09UR19FUFR5cGVEZWYgKmVwOwogCkBAIC05NjIsNiArOTcxLDM4IEBACiAgICAgICBfX0hBTF9QQ0RfQ0xFQVJfRkxBRyhocGNkLCBVU0JfT1RHX0dJTlRTVFNfTU1JUyk7CiAgICAgfQogCisgICAgIC8qIEhhbmRsZSBSeFFMZXZlbCBJbnRlcnJ1cHQgKi8KKyAgICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9PVEdfR0lOVFNUU19SWEZMVkwpKQorICAgIHsKKyAgICAgIFVTQl9NQVNLX0lOVEVSUlVQVChocGNkLT5JbnN0YW5jZSwgVVNCX09UR19HSU5UU1RTX1JYRkxWTCk7CisKKyAgICAgIHRlbXAgPSBVU0J4LT5HUlhTVFNQOworCisgICAgICBlcCA9ICZocGNkLT5PVVRfZXBbdGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9FUE5VTV07CisKKyAgICAgIGlmICgoKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfUEtUU1RTKSA+PiAxNykgPT0gIFNUU19EQVRBX1VQRFQpCisgICAgICB7CisgICAgICAgIGlmICgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSAhPSAwVSkKKyAgICAgICAgeworICAgICAgICAgICh2b2lkKVVTQl9SZWFkUGFja2V0KFVTQngsIGVwLT54ZmVyX2J1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KSgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0KSk7CisKKyAgICAgICAgICBlcC0+eGZlcl9idWZmICs9ICh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpID4+IDQ7CisgICAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfQkNOVCkgPj4gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSBpZiAoKCh0ZW1wICYgVVNCX09UR19HUlhTVFNQX1BLVFNUUykgPj4gMTcpID09ICBTVFNfU0VUVVBfVVBEVCkKKyAgICAgIHsKKyAgICAgICAgKHZvaWQpVVNCX1JlYWRQYWNrZXQoVVNCeCwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCwgOFUpOworICAgICAgICBlcC0+eGZlcl9jb3VudCArPSAodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiAuLi4gKi8KKyAgICAgIH0KKyAgICAgIFVTQl9VTk1BU0tfSU5URVJSVVBUKGhwY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfUlhGTFZMKTsKKyAgICB9CisKICAgICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9PVEdfR0lOVFNUU19PRVBJTlQpKQogICAgIHsKICAgICAgIGVwbnVtID0gMFU7CkBAIC05ODMsOSArMTAyNCw5IEBACiAKICAgICAgICAgICBpZiAoKGVwaW50ICYgVVNCX09UR19ET0VQSU5UX1NUVVApID09IFVTQl9PVEdfRE9FUElOVF9TVFVQKQogICAgICAgICAgIHsKKyAgICAgICAgICAgIENMRUFSX09VVF9FUF9JTlRSKGVwbnVtLCBVU0JfT1RHX0RPRVBJTlRfU1RVUCk7CiAgICAgICAgICAgICAvKiBDbGFzcyBCIHNldHVwIHBoYXNlIGRvbmUgZm9yIHByZXZpb3VzIGRlY29kZWQgc2V0dXAgKi8KICAgICAgICAgICAgICh2b2lkKVBDRF9FUF9PdXRTZXR1cFBhY2tldF9pbnQoaHBjZCwgZXBudW0pOwotICAgICAgICAgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9TVFVQKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBpZiAoKGVwaW50ICYgVVNCX09UR19ET0VQSU5UX09URVBESVMpID09IFVTQl9PVEdfRE9FUElOVF9PVEVQRElTKQpAQCAtOTk2LDEwICsxMDM3LDYgQEAKICAgICAgICAgICAvKiBDbGVhciBTdGF0dXMgUGhhc2UgUmVjZWl2ZWQgaW50ZXJydXB0ICovCiAgICAgICAgICAgaWYgKChlcGludCAmIFVTQl9PVEdfRE9FUElOVF9PVEVQU1BSKSA9PSBVU0JfT1RHX0RPRVBJTlRfT1RFUFNQUikKICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaHBjZC0+SW5pdC5kbWFfZW5hYmxlID09IDFVKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAodm9pZClVU0JfRVAwX091dFN0YXJ0KGhwY2QtPkluc3RhbmNlLCAxVSwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBDTEVBUl9PVVRfRVBfSU5UUihlcG51bSwgVVNCX09UR19ET0VQSU5UX09URVBTUFIpOwogICAgICAgICAgIH0KIApAQCAtMTAzNywxNiArMTA3NCw3IEBACiAgICAgICAgICAgICBpZiAoaHBjZC0+SW5pdC5kbWFfZW5hYmxlID09IDFVKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBocGNkLT5JTl9lcFtlcG51bV0ueGZlcl9idWZmICs9IGhwY2QtPklOX2VwW2VwbnVtXS5tYXhwYWNrZXQ7Ci0gICAgICAgICAgICB9CiAKLSNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQotICAgICAgICAgICAgaHBjZC0+RGF0YUluU3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7Ci0jZWxzZQotICAgICAgICAgICAgSEFMX1BDRF9EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKLSNlbmRpZiAvKiBVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KLQotICAgICAgICAgICAgaWYgKGhwY2QtPkluaXQuZG1hX2VuYWJsZSA9PSAxVSkKLSAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgLyogdGhpcyBpcyBaTFAsIHNvIHByZXBhcmUgRVAwIGZvciBuZXh0IHNldHVwICovCiAgICAgICAgICAgICAgIGlmICgoZXBudW0gPT0gMFUpICYmIChocGNkLT5JTl9lcFtlcG51bV0ueGZlcl9sZW4gPT0gMFUpKQogICAgICAgICAgICAgICB7CkBAIC0xMDU0LDYgKzEwODIsMTIgQEAKICAgICAgICAgICAgICAgICAodm9pZClVU0JfRVAwX091dFN0YXJ0KGhwY2QtPkluc3RhbmNlLCAxVSwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCisgICAgICAgICAgICBocGNkLT5EYXRhSW5TdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKKyNlbHNlCisgICAgICAgICAgICBIQUxfUENEX0RhdGFJblN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOworI2VuZGlmIC8qIFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoKGVwaW50ICYgVVNCX09UR19ESUVQSU5UX1RPQykgPT0gVVNCX09UR19ESUVQSU5UX1RPQykKICAgICAgICAgICB7CkBAIC0xMTU5LDggKzExOTMsMTAgQEAKICAgICAgIHsKICAgICAgICAgVVNCeF9JTkVQKGkpLT5ESUVQSU5UID0gMHhGQjdGVTsKICAgICAgICAgVVNCeF9JTkVQKGkpLT5ESUVQQ1RMICY9IH5VU0JfT1RHX0RJRVBDVExfU1RBTEw7CisgICAgICAgIFVTQnhfSU5FUChpKS0+RElFUENUTCB8PSBVU0JfT1RHX0RJRVBDVExfU05BSzsKICAgICAgICAgVVNCeF9PVVRFUChpKS0+RE9FUElOVCA9IDB4RkI3RlU7CiAgICAgICAgIFVTQnhfT1VURVAoaSktPkRPRVBDVEwgJj0gflVTQl9PVEdfRE9FUENUTF9TVEFMTDsKKyAgICAgICAgVVNCeF9PVVRFUChpKS0+RE9FUENUTCB8PSBVU0JfT1RHX0RPRVBDVExfU05BSzsKICAgICAgIH0KICAgICAgIFVTQnhfREVWSUNFLT5EQUlOVE1TSyB8PSAweDEwMDAxVTsKIApAQCAtMTIwMSwxNSArMTIzNyw3IEBACiAgICAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfT1RHX0dJTlRTVFNfRU5VTURORSkpCiAgICAgewogICAgICAgKHZvaWQpVVNCX0FjdGl2YXRlU2V0dXAoaHBjZC0+SW5zdGFuY2UpOwotCi0gICAgICBpZiAoVVNCX0dldERldlNwZWVkKGhwY2QtPkluc3RhbmNlKSA9PSBVU0JfT1RHX1NQRUVEX0hJR0gpCi0gICAgICB7Ci0gICAgICAgIGhwY2QtPkluaXQuc3BlZWQgPSBVU0JfT1RHX1NQRUVEX0hJR0g7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhwY2QtPkluaXQuc3BlZWQgPSBVU0JfT1RHX1NQRUVEX0ZVTEw7Ci0gICAgICB9CisgICAgICBocGNkLT5Jbml0LnNwZWVkID0gVVNCX0dldERldlNwZWVkKGhwY2QtPkluc3RhbmNlKTsKIAogICAgICAgLyogU2V0IFVTQiBUdXJuYXJvdW5kIHRpbWUgKi8KICAgICAgICh2b2lkKVVTQl9TZXRUdXJuYXJvdW5kVGltZShocGNkLT5JbnN0YW5jZSwKQEAgLTEyMjUsMzggKzEyNTMsNiBAQAogICAgICAgX19IQUxfUENEX0NMRUFSX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX0VOVU1ETkUpOwogICAgIH0KIAotICAgIC8qIEhhbmRsZSBSeFFMZXZlbCBJbnRlcnJ1cHQgKi8KLSAgICBpZiAoX19IQUxfUENEX0dFVF9GTEFHKGhwY2QsIFVTQl9PVEdfR0lOVFNUU19SWEZMVkwpKQotICAgIHsKLSAgICAgIFVTQl9NQVNLX0lOVEVSUlVQVChocGNkLT5JbnN0YW5jZSwgVVNCX09UR19HSU5UU1RTX1JYRkxWTCk7Ci0KLSAgICAgIHRlbXAgPSBVU0J4LT5HUlhTVFNQOwotCi0gICAgICBlcCA9ICZocGNkLT5PVVRfZXBbdGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9FUE5VTV07Ci0KLSAgICAgIGlmICgoKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfUEtUU1RTKSA+PiAxNykgPT0gIFNUU19EQVRBX1VQRFQpCi0gICAgICB7Ci0gICAgICAgIGlmICgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSAhPSAwVSkKLSAgICAgICAgewotICAgICAgICAgICh2b2lkKVVTQl9SZWFkUGFja2V0KFVTQngsIGVwLT54ZmVyX2J1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KSgodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0KSk7Ci0KLSAgICAgICAgICBlcC0+eGZlcl9idWZmICs9ICh0ZW1wICYgVVNCX09UR19HUlhTVFNQX0JDTlQpID4+IDQ7Ci0gICAgICAgICAgZXAtPnhmZXJfY291bnQgKz0gKHRlbXAgJiBVU0JfT1RHX0dSWFNUU1BfQkNOVCkgPj4gNDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoKCh0ZW1wICYgVVNCX09UR19HUlhTVFNQX1BLVFNUUykgPj4gMTcpID09ICBTVFNfU0VUVVBfVVBEVCkKLSAgICAgIHsKLSAgICAgICAgKHZvaWQpVVNCX1JlYWRQYWNrZXQoVVNCeCwgKHVpbnQ4X3QgKilocGNkLT5TZXR1cCwgOFUpOwotICAgICAgICBlcC0+eGZlcl9jb3VudCArPSAodGVtcCAmIFVTQl9PVEdfR1JYU1RTUF9CQ05UKSA+PiA0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiAuLi4gKi8KLSAgICAgIH0KLSAgICAgIFVTQl9VTk1BU0tfSU5URVJSVVBUKGhwY2QtPkluc3RhbmNlLCBVU0JfT1RHX0dJTlRTVFNfUlhGTFZMKTsKLSAgICB9Ci0KICAgICAvKiBIYW5kbGUgU09GIEludGVycnVwdCAqLwogICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX1NPRikpCiAgICAgewpAQCAtMTI3Miw2ICsxMjY4LDEwIEBACiAgICAgLyogSGFuZGxlIEluY29tcGxldGUgSVNPIElOIEludGVycnVwdCAqLwogICAgIGlmIChfX0hBTF9QQ0RfR0VUX0ZMQUcoaHBjZCwgVVNCX09UR19HSU5UU1RTX0lJU09JWEZSKSkKICAgICB7CisgICAgICAvKiBLZWVwIGFwcGxpY2F0aW9uIGNoZWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIElzbyBJTiBlbmRwb2ludAorICAgICAgY2F1c2luZyB0aGUgaW5jb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIGVwbnVtID0gMFU7CisKICNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgaHBjZC0+SVNPSU5JbmNvbXBsZXRlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOwogI2Vsc2UKQEAgLTEyODQsNiArMTI4NCwxMCBAQAogICAgIC8qIEhhbmRsZSBJbmNvbXBsZXRlIElTTyBPVVQgSW50ZXJydXB0ICovCiAgICAgaWYgKF9fSEFMX1BDRF9HRVRfRkxBRyhocGNkLCBVU0JfT1RHX0dJTlRTVFNfUFhGUl9JTkNPTVBJU09PVVQpKQogICAgIHsKKyAgICAgIC8qIEtlZXAgYXBwbGljYXRpb24gY2hlY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgSXNvIE9VVCBlbmRwb2ludAorICAgICAgY2F1c2luZyB0aGUgaW5jb21wbGV0ZSBJbnRlcnJ1cHQgKi8KKyAgICAgIGVwbnVtID0gMFU7CisKICNpZiAoVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgaHBjZC0+SVNPT1VUSW5jb21wbGV0ZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKICNlbHNlCkBAIC0xOTYzLDE2ICsxOTY3LDYgQEAKICAgICAgIHsKICAgICAgICAgQ0xFQVJfT1VUX0VQX0lOVFIoZXBudW0sIFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKTsKICAgICAgIH0KLQotICAgICAgLyogSW5mb3JtIHRoZSB1cHBlciBsYXllciB0aGF0IGEgc2V0dXAgcGFja2V0IGlzIGF2YWlsYWJsZSAqLwotI2lmIChVU0VfSEFMX1BDRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCi0gICAgICBocGNkLT5TZXR1cFN0YWdlQ2FsbGJhY2soaHBjZCk7Ci0jZWxzZQotICAgICAgSEFMX1BDRF9TZXR1cFN0YWdlQ2FsbGJhY2soaHBjZCk7Ci0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0KLSAgICAgICh2b2lkKVVTQl9FUDBfT3V0U3RhcnQoaHBjZC0+SW5zdGFuY2UsIDFVLCAodWludDhfdCAqKWhwY2QtPlNldHVwKTsKLSAgICAgIENMRUFSX09VVF9FUF9JTlRSKGVwbnVtLCBVU0JfT1RHX0RPRVBJTlRfU1RVUCk7CiAgICAgfQogICAgIGVsc2UgaWYgKChEb2VwaW50UmVnICYgVVNCX09UR19ET0VQSU5UX09URVBTUFIpID09IFVTQl9PVEdfRE9FUElOVF9PVEVQU1BSKSAvKiBDbGFzcyBFICovCiAgICAgewpAQCAtMTk5NSwxNyArMTk4OSwxNiBAQAogCiAgICAgICAgIGhwY2QtPk9VVF9lcFtlcG51bV0ueGZlcl9idWZmICs9IGhwY2QtPk9VVF9lcFtlcG51bV0ubWF4cGFja2V0OwogCi0jaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKLSAgICAgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOwotI2Vsc2UKLSAgICAgICAgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7Ci0jZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCi0KICAgICAgICAgaWYgKChlcG51bSA9PSAwVSkgJiYgKGhwY2QtPk9VVF9lcFtlcG51bV0ueGZlcl9sZW4gPT0gMFUpKQogICAgICAgICB7CiAgICAgICAgICAgLyogdGhpcyBpcyBaTFAsIHNvIHByZXBhcmUgRVAwIGZvciBuZXh0IHNldHVwICovCiAgICAgICAgICAgKHZvaWQpVVNCX0VQMF9PdXRTdGFydChocGNkLT5JbnN0YW5jZSwgMVUsICh1aW50OF90ICopaHBjZC0+U2V0dXApOwogICAgICAgICB9CisjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgICAgaHBjZC0+RGF0YU91dFN0YWdlQ2FsbGJhY2soaHBjZCwgKHVpbnQ4X3QpZXBudW0pOworI2Vsc2UKKyAgICAgICAgSEFMX1BDRF9EYXRhT3V0U3RhZ2VDYWxsYmFjayhocGNkLCAodWludDhfdCllcG51bSk7CisjZW5kaWYgLyogVVNFX0hBTF9QQ0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQogICAgIGVsc2UKQEAgLTIwMzgsNiArMjAzMSwxMiBAQAogICAgIH0KICAgICBlbHNlCiAgICAgeworICAgICAgaWYgKChlcG51bSA9PSAwVSkgJiYgKGhwY2QtPk9VVF9lcFtlcG51bV0ueGZlcl9sZW4gPT0gMFUpKQorICAgICAgeworICAgICAgICAvKiB0aGlzIGlzIFpMUCwgc28gcHJlcGFyZSBFUDAgZm9yIG5leHQgc2V0dXAgKi8KKyAgICAgICAgKHZvaWQpVVNCX0VQMF9PdXRTdGFydChocGNkLT5JbnN0YW5jZSwgMFUsICh1aW50OF90ICopaHBjZC0+U2V0dXApOworICAgICAgfQorCiAjaWYgKFVTRV9IQUxfUENEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIGhwY2QtPkRhdGFPdXRTdGFnZUNhbGxiYWNrKGhwY2QsICh1aW50OF90KWVwbnVtKTsKICNlbHNlCkBAIC0yMDYzLDIyICsyMDYyLDEwIEBACiAgIHVpbnQzMl90IGdTTlBTaUQgPSAqKF9fSU8gdWludDMyX3QgKikoJlVTQngtPkNJRCArIDB4MVUpOwogICB1aW50MzJfdCBEb2VwaW50UmVnID0gVVNCeF9PVVRFUChlcG51bSktPkRPRVBJTlQ7CiAKLSAgaWYgKGhwY2QtPkluaXQuZG1hX2VuYWJsZSA9PSAxVSkKKyAgaWYgKChnU05QU2lEID4gVVNCX09UR19DT1JFX0lEXzMwMEEpICYmCisgICAgICAoKERvZXBpbnRSZWcgJiBVU0JfT1RHX0RPRVBJTlRfU1RQS1RSWCkgPT0gVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpKQogICB7Ci0gICAgLyogU3R1cFBrdFJjdmQgPSAxIHBlbmRpbmcgc2V0dXAgcGFja2V0IGludCAqLwotICAgIGlmICgoZ1NOUFNpRCA+IFVTQl9PVEdfQ09SRV9JRF8zMDBBKSAmJgotICAgICAgICAoKERvZXBpbnRSZWcgJiBVU0JfT1RHX0RPRVBJTlRfU1RQS1RSWCkgPT0gVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpKQotICAgIHsKLSAgICAgIENMRUFSX09VVF9FUF9JTlRSKGVwbnVtLCBVU0JfT1RHX0RPRVBJTlRfU1RQS1RSWCk7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIGlmICgoZ1NOUFNpRCA9PSBVU0JfT1RHX0NPUkVfSURfMzEwQSkgJiYKLSAgICAgICAgKChEb2VwaW50UmVnICYgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpID09IFVTQl9PVEdfRE9FUElOVF9TVFBLVFJYKSkKLSAgICB7Ci0gICAgICBDTEVBUl9PVVRfRVBfSU5UUihlcG51bSwgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpOwotICAgIH0KKyAgICBDTEVBUl9PVVRfRVBfSU5UUihlcG51bSwgVVNCX09UR19ET0VQSU5UX1NUUEtUUlgpOwogICB9CiAKICAgLyogSW5mb3JtIHRoZSB1cHBlciBsYXllciB0aGF0IGEgc2V0dXAgcGFja2V0IGlzIGF2YWlsYWJsZSAqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfcXNwaS5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfcXNwaS5jCmluZGV4IGQ5NTUyOGYuLmJlMTQzMzQgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3FzcGkuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9xc3BpLmMKQEAgLTMsNyArMyw3IEBACiAgICogQGZpbGUgICAgc3RtMzJmN3h4X2hhbF9xc3BpLmMKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIFFTUEkgSEFMIG1vZHVsZSBkcml2ZXIuCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBRdWFkU1BJIGludGVyZmFjZSAoUVNQSSkuCiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogICAqICAgICAgICAgICArIEluZGlyZWN0IGZ1bmN0aW9uYWwgbW9kZSBtYW5hZ2VtZW50CkBAIC0yNCwxNCArMjQsMTQgQEAKICAgICBbLi5dCiAgICAgICAoIykgQXMgcHJlcmVxdWlzaXRlLCBmaWxsIGluIHRoZSBIQUxfUVNQSV9Nc3BJbml0KCkgOgogICAgICAgICAoKyspIEVuYWJsZSBRdWFkU1BJIGNsb2NrIGludGVyZmFjZSB3aXRoIF9fSEFMX1JDQ19RU1BJX0NMS19FTkFCTEUoKS4KLSAgICAgICAgKCsrKSBSZXNldCBRdWFkU1BJIElQIHdpdGggX19IQUxfUkNDX1FTUElfRk9SQ0VfUkVTRVQoKSBhbmQgX19IQUxfUkNDX1FTUElfUkVMRUFTRV9SRVNFVCgpLgorICAgICAgICAoKyspIFJlc2V0IFF1YWRTUEkgUGVyaXBoZXJhbCB3aXRoIF9fSEFMX1JDQ19RU1BJX0ZPUkNFX1JFU0VUKCkgYW5kIF9fSEFMX1JDQ19RU1BJX1JFTEVBU0VfUkVTRVQoKS4KICAgICAgICAgKCsrKSBFbmFibGUgdGhlIGNsb2NrcyBmb3IgdGhlIFF1YWRTUEkgR1BJT1Mgd2l0aCBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpLgogICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGVzZSBRdWFkU1BJIHBpbnMgaW4gYWx0ZXJuYXRlIG1vZGUgdXNpbmcgSEFMX0dQSU9fSW5pdCgpLgogICAgICAgICAoKyspIElmIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIGVuYWJsZSBhbmQgY29uZmlndXJlIFF1YWRTUEkgZ2xvYmFsCiAgICAgICAgICAgICBpbnRlcnJ1cHQgd2l0aCBIQUxfTlZJQ19TZXRQcmlvcml0eSgpIGFuZCBIQUxfTlZJQ19FbmFibGVJUlEoKS4KLSAgICAgICAgKCsrKSBJZiBETUEgbW9kZSBpcyB1c2VkLCBlbmFibGUgdGhlIGNsb2NrcyBmb3IgdGhlIFF1YWRTUEkgRE1BIGNoYW5uZWwgCi0gICAgICAgICAgICB3aXRoIF9fSEFMX1JDQ19ETUF4X0NMS19FTkFCTEUoKSwgY29uZmlndXJlIERNQSB3aXRoIEhBTF9ETUFfSW5pdCgpLCAKLSAgICAgICAgICAgIGxpbmsgaXQgd2l0aCBRdWFkU1BJIGhhbmRsZSB1c2luZyBfX0hBTF9MSU5LRE1BKCksIGVuYWJsZSBhbmQgY29uZmlndXJlIAorICAgICAgICAoKyspIElmIERNQSBtb2RlIGlzIHVzZWQsIGVuYWJsZSB0aGUgY2xvY2tzIGZvciB0aGUgUXVhZFNQSSBETUEgY2hhbm5lbAorICAgICAgICAgICAgd2l0aCBfX0hBTF9SQ0NfRE1BeF9DTEtfRU5BQkxFKCksIGNvbmZpZ3VyZSBETUEgd2l0aCBIQUxfRE1BX0luaXQoKSwKKyAgICAgICAgICAgIGxpbmsgaXQgd2l0aCBRdWFkU1BJIGhhbmRsZSB1c2luZyBfX0hBTF9MSU5LRE1BKCksIGVuYWJsZSBhbmQgY29uZmlndXJlCiAgICAgICAgICAgICBETUEgY2hhbm5lbCBnbG9iYWwgaW50ZXJydXB0IHdpdGggSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkuCiAgICAgICAoIykgQ29uZmlndXJlIHRoZSBmbGFzaCBzaXplLCB0aGUgY2xvY2sgcHJlc2NhbGVyLCB0aGUgZmlmbyB0aHJlc2hvbGQsIHRoZQogICAgICAgICAgIGNsb2NrIG1vZGUsIHRoZSBzYW1wbGUgc2hpZnRpbmcgYW5kIHRoZSBDUyBoaWdoIHRpbWUgdXNpbmcgdGhlIEhBTF9RU1BJX0luaXQoKSBmdW5jdGlvbi4KQEAgLTM5LDQ3ICszOSw0NyBAQAogICAgICoqKiBJbmRpcmVjdCBmdW5jdGlvbmFsIG1vZGUgKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCi0gICAgICAoIykgQ29uZmlndXJlIHRoZSBjb21tYW5kIHNlcXVlbmNlIHVzaW5nIHRoZSBIQUxfUVNQSV9Db21tYW5kKCkgb3IgSEFMX1FTUElfQ29tbWFuZF9JVCgpIAorICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tbWFuZCBzZXF1ZW5jZSB1c2luZyB0aGUgSEFMX1FTUElfQ29tbWFuZCgpIG9yIEhBTF9RU1BJX0NvbW1hbmRfSVQoKQogICAgICAgICAgIGZ1bmN0aW9ucyA6CiAgICAgICAgICAoKyspIEluc3RydWN0aW9uIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgogICAgICAgICAgKCsrKSBBZGRyZXNzIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgc2l6ZSBhbmQgdGhlIGFkZHJlc3MgdmFsdWUuCi0gICAgICAgICAoKyspIEFsdGVybmF0ZS1ieXRlcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhbHRlcm5hdGUgCisgICAgICAgICAoKyspIEFsdGVybmF0ZS1ieXRlcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgICBieXRlcyB2YWx1ZXMuCiAgICAgICAgICAoKyspIER1bW15LWN5Y2xlcyBwaGFzZSA6IHRoZSBudW1iZXIgb2YgZHVtbXkgY3ljbGVzIChtb2RlIHVzZWQgaXMgc2FtZSBhcyBkYXRhIHBoYXNlKS4KICAgICAgICAgICgrKykgRGF0YSBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIG51bWJlciBvZiBieXRlcy4KLSAgICAgICAgICgrKykgRG91YmxlIERhdGEgUmF0ZSAoRERSKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlIGFuZCB0aGUgZGVsYXkgCisgICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5CiAgICAgICAgICAgICAgaWYgYWN0aXZhdGVkLgogICAgICAgICAgKCsrKSBTZW5kaW5nIEluc3RydWN0aW9uIE9ubHkgT25jZSAoU0lPTykgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZS4KICAgICAgICgjKSBJZiBubyBkYXRhIGlzIHJlcXVpcmVkIGZvciB0aGUgY29tbWFuZCwgaXQgaXMgc2VudCBkaXJlY3RseSB0byB0aGUgbWVtb3J5IDoKICAgICAgICAgICgrKykgSW4gcG9sbGluZyBtb2RlLCB0aGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBpcyBkb25lIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgogICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfQ21kQ3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi0gICAgICAoIykgRm9yIHRoZSBpbmRpcmVjdCB3cml0ZSBtb2RlLCB1c2UgSEFMX1FTUElfVHJhbnNtaXQoKSwgSEFMX1FTUElfVHJhbnNtaXRfRE1BKCkgb3IgCisgICAgICAoIykgRm9yIHRoZSBpbmRpcmVjdCB3cml0ZSBtb2RlLCB1c2UgSEFMX1FTUElfVHJhbnNtaXQoKSwgSEFMX1FTUElfVHJhbnNtaXRfRE1BKCkgb3IKICAgICAgICAgICBIQUxfUVNQSV9UcmFuc21pdF9JVCgpIGFmdGVyIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gOgogICAgICAgICAgKCsrKSBJbiBwb2xsaW5nIG1vZGUsIHRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIGlzIGRvbmUgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi0gICAgICAgICAoKyspIEluIGludGVycnVwdCBtb2RlLCBIQUxfUVNQSV9GaWZvVGhyZXNob2xkQ2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmaWZvIHRocmVzaG9sZCAKKyAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0ZpZm9UaHJlc2hvbGRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZpZm8gdGhyZXNob2xkCiAgICAgICAgICAgICAgaXMgcmVhY2hlZCBhbmQgSEFMX1FTUElfVHhDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLSAgICAgICAgICgrKykgSW4gRE1BIG1vZGUsIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIGF0IHRoZSBoYWxmIHRyYW5zZmVyIGFuZCAKKyAgICAgICAgICgrKykgSW4gRE1BIG1vZGUsIEhBTF9RU1BJX1R4SGFsZkNwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIGF0IHRoZSBoYWxmIHRyYW5zZmVyIGFuZAogICAgICAgICAgICAgIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCi0gICAgICAoIykgRm9yIHRoZSBpbmRpcmVjdCByZWFkIG1vZGUsIHVzZSBIQUxfUVNQSV9SZWNlaXZlKCksIEhBTF9RU1BJX1JlY2VpdmVfRE1BKCkgb3IgCisgICAgICAoIykgRm9yIHRoZSBpbmRpcmVjdCByZWFkIG1vZGUsIHVzZSBIQUxfUVNQSV9SZWNlaXZlKCksIEhBTF9RU1BJX1JlY2VpdmVfRE1BKCkgb3IKICAgICAgICAgICBIQUxfUVNQSV9SZWNlaXZlX0lUKCkgYWZ0ZXIgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiA6CiAgICAgICAgICAoKyspIEluIHBvbGxpbmcgbW9kZSwgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gaXMgZG9uZSB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KLSAgICAgICAgICgrKykgSW4gaW50ZXJydXB0IG1vZGUsIEhBTF9RU1BJX0ZpZm9UaHJlc2hvbGRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZpZm8gdGhyZXNob2xkIAorICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfRmlmb1RocmVzaG9sZENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmlmbyB0aHJlc2hvbGQKICAgICAgICAgICAgICBpcyByZWFjaGVkIGFuZCBIQUxfUVNQSV9SeENwbHRDYWxsYmFjaygpIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgotICAgICAgICAgKCsrKSBJbiBETUEgbW9kZSwgSEFMX1FTUElfUnhIYWxmQ3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIGhhbGYgdHJhbnNmZXIgYW5kIAorICAgICAgICAgKCsrKSBJbiBETUEgbW9kZSwgSEFMX1FTUElfUnhIYWxmQ3BsdENhbGxiYWNrKCkgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIGhhbGYgdHJhbnNmZXIgYW5kCiAgICAgICAgICAgICAgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZS4KIAogICAgICoqKiBBdXRvLXBvbGxpbmcgZnVuY3Rpb25hbCBtb2RlICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KLSAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgYW5kIHRoZSBhdXRvLXBvbGxpbmcgZnVuY3Rpb25hbCBtb2RlIHVzaW5nIHRoZSAKKyAgICAgICgjKSBDb25maWd1cmUgdGhlIGNvbW1hbmQgc2VxdWVuY2UgYW5kIHRoZSBhdXRvLXBvbGxpbmcgZnVuY3Rpb25hbCBtb2RlIHVzaW5nIHRoZQogICAgICAgICAgIEhBTF9RU1BJX0F1dG9Qb2xsaW5nKCkgb3IgSEFMX1FTUElfQXV0b1BvbGxpbmdfSVQoKSBmdW5jdGlvbnMgOgogICAgICAgICAgKCsrKSBJbnN0cnVjdGlvbiBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KICAgICAgICAgICgrKykgQWRkcmVzcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhZGRyZXNzIHZhbHVlLgotICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlIAorICAgICAgICAgKCsrKSBBbHRlcm5hdGUtYnl0ZXMgcGhhc2UgOiB0aGUgbW9kZSB1c2VkIGFuZCBpZiBwcmVzZW50IHRoZSBzaXplIGFuZCB0aGUgYWx0ZXJuYXRlCiAgICAgICAgICAgICAgYnl0ZXMgdmFsdWVzLgogICAgICAgICAgKCsrKSBEdW1teS1jeWNsZXMgcGhhc2UgOiB0aGUgbnVtYmVyIG9mIGR1bW15IGN5Y2xlcyAobW9kZSB1c2VkIGlzIHNhbWUgYXMgZGF0YSBwaGFzZSkuCiAgICAgICAgICAoKyspIERhdGEgcGhhc2UgOiB0aGUgbW9kZSB1c2VkLgotICAgICAgICAgKCsrKSBEb3VibGUgRGF0YSBSYXRlIChERFIpIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUgYW5kIHRoZSBkZWxheSAKKyAgICAgICAgICgrKykgRG91YmxlIERhdGEgUmF0ZSAoRERSKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlIGFuZCB0aGUgZGVsYXkKICAgICAgICAgICAgICBpZiBhY3RpdmF0ZWQuCiAgICAgICAgICAoKyspIFNlbmRpbmcgSW5zdHJ1Y3Rpb24gT25seSBPbmNlIChTSU9PKSBtb2RlIDogdGhlIGFjdGl2YXRpb24gKG9yIG5vdCkgb2YgdGhpcyBtb2RlLgogICAgICAgICAgKCsrKSBUaGUgc2l6ZSBvZiB0aGUgc3RhdHVzIGJ5dGVzLCB0aGUgbWF0Y2ggdmFsdWUsIHRoZSBtYXNrIHVzZWQsIHRoZSBtYXRjaCBtb2RlIChPUi9BTkQpLApAQCAtOTIsMzEgKzkyLDMxIEBACiAgICAgKioqIE1lbW9yeS1tYXBwZWQgZnVuY3Rpb25hbCBtb2RlICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCi0gICAgICAoIykgQ29uZmlndXJlIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFuZCB0aGUgbWVtb3J5LW1hcHBlZCBmdW5jdGlvbmFsIG1vZGUgdXNpbmcgdGhlIAorICAgICAgKCMpIENvbmZpZ3VyZSB0aGUgY29tbWFuZCBzZXF1ZW5jZSBhbmQgdGhlIG1lbW9yeS1tYXBwZWQgZnVuY3Rpb25hbCBtb2RlIHVzaW5nIHRoZQogICAgICAgICAgIEhBTF9RU1BJX01lbW9yeU1hcHBlZCgpIGZ1bmN0aW9ucyA6CiAgICAgICAgICAoKyspIEluc3RydWN0aW9uIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgaWYgcHJlc2VudCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgogICAgICAgICAgKCsrKSBBZGRyZXNzIHBoYXNlIDogdGhlIG1vZGUgdXNlZCBhbmQgdGhlIHNpemUuCi0gICAgICAgICAoKyspIEFsdGVybmF0ZS1ieXRlcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhbHRlcm5hdGUgCisgICAgICAgICAoKyspIEFsdGVybmF0ZS1ieXRlcyBwaGFzZSA6IHRoZSBtb2RlIHVzZWQgYW5kIGlmIHByZXNlbnQgdGhlIHNpemUgYW5kIHRoZSBhbHRlcm5hdGUKICAgICAgICAgICAgICBieXRlcyB2YWx1ZXMuCiAgICAgICAgICAoKyspIER1bW15LWN5Y2xlcyBwaGFzZSA6IHRoZSBudW1iZXIgb2YgZHVtbXkgY3ljbGVzIChtb2RlIHVzZWQgaXMgc2FtZSBhcyBkYXRhIHBoYXNlKS4KICAgICAgICAgICgrKykgRGF0YSBwaGFzZSA6IHRoZSBtb2RlIHVzZWQuCi0gICAgICAgICAoKyspIERvdWJsZSBEYXRhIFJhdGUgKEREUikgbW9kZSA6IHRoZSBhY3RpdmF0aW9uIChvciBub3QpIG9mIHRoaXMgbW9kZSBhbmQgdGhlIGRlbGF5IAorICAgICAgICAgKCsrKSBEb3VibGUgRGF0YSBSYXRlIChERFIpIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUgYW5kIHRoZSBkZWxheQogICAgICAgICAgICAgIGlmIGFjdGl2YXRlZC4KICAgICAgICAgICgrKykgU2VuZGluZyBJbnN0cnVjdGlvbiBPbmx5IE9uY2UgKFNJT08pIG1vZGUgOiB0aGUgYWN0aXZhdGlvbiAob3Igbm90KSBvZiB0aGlzIG1vZGUuCiAgICAgICAgICAoKyspIFRoZSB0aW1lb3V0IGFjdGl2YXRpb24gYW5kIHRoZSB0aW1lb3V0IHBlcmlvZC4KLSAgICAgICgjKSBBZnRlciB0aGUgY29uZmlndXJhdGlvbiwgdGhlIFF1YWRTUEkgd2lsbCBiZSB1c2VkIGFzIHNvb24gYXMgYW4gYWNjZXNzIG9uIHRoZSBBSEIgaXMgZG9uZSBvbiAKKyAgICAgICgjKSBBZnRlciB0aGUgY29uZmlndXJhdGlvbiwgdGhlIFF1YWRTUEkgd2lsbCBiZSB1c2VkIGFzIHNvb24gYXMgYW4gYWNjZXNzIG9uIHRoZSBBSEIgaXMgZG9uZSBvbgogICAgICAgICAgIHRoZSBhZGRyZXNzIHJhbmdlLiBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lb3V0IGV4cGlyZXMuCiAKICAgICAqKiogRXJyb3JzIG1hbmFnZW1lbnQgYW5kIGFib3J0IGZ1bmN0aW9uYWxpdHkgKioqCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXQogICAgICAgKCMpIEhBTF9RU1BJX0dldEVycm9yKCkgZnVuY3Rpb24gZ2l2ZXMgdGhlIGVycm9yIHJhaXNlZCBkdXJpbmcgdGhlIGxhc3Qgb3BlcmF0aW9uLgotICAgICAgKCMpIEhBTF9RU1BJX0Fib3J0KCkgYW5kIEhBTF9RU1BJX0Fib3J0SVQoKSBmdW5jdGlvbnMgYWJvcnRzIGFueSBvbi1nb2luZyBvcGVyYXRpb24gYW5kIAorICAgICAgKCMpIEhBTF9RU1BJX0Fib3J0KCkgYW5kIEhBTF9RU1BJX0Fib3J0SVQoKSBmdW5jdGlvbnMgYWJvcnRzIGFueSBvbi1nb2luZyBvcGVyYXRpb24gYW5kCiAgICAgICAgICAgZmx1c2hlcyB0aGUgZmlmbyA6Ci0gICAgICAgICAoKyspIEluIHBvbGxpbmcgbW9kZSwgdGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24gaXMgZG9uZSB3aGVuIHRoZSB0cmFuc2ZlciAKKyAgICAgICAgICgrKykgSW4gcG9sbGluZyBtb2RlLCB0aGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBpcyBkb25lIHdoZW4gdGhlIHRyYW5zZmVyCiAgICAgICAgICAgICAgIGNvbXBsZXRlIGJpdCBpcyBzZXQgYW5kIHRoZSBidXN5IGJpdCBjbGVhcmVkLgotICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfQWJvcnRDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICB0aGUgdHJhbnNmZXIgY29tcGxldGUgYmkgaXMgc2V0LgorICAgICAgICAgKCsrKSBJbiBpbnRlcnJ1cHQgbW9kZSwgSEFMX1FTUElfQWJvcnRDcGx0Q2FsbGJhY2soKSB3aWxsIGJlIGNhbGxlZCB3aGVuCisgICAgICAgICAgICAgIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBiaXQgaXMgc2V0LgogCiAgICAgKioqIENvbnRyb2wgZnVuY3Rpb25zICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEyNSw2ICsxMjUsNyBAQAogICAgICAgKCMpIEhBTF9RU1BJX1NldFRpbWVvdXQoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSB0aW1lb3V0IHZhbHVlIHVzZWQgaW4gdGhlIGRyaXZlci4KICAgICAgICgjKSBIQUxfUVNQSV9TZXRGaWZvVGhyZXNob2xkKCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgdGhyZXNob2xkIG9uIHRoZSBGaWZvIG9mIHRoZSBRU1BJIElQLgogICAgICAgKCMpIEhBTF9RU1BJX0dldEZpZm9UaHJlc2hvbGQoKSBmdW5jdGlvbiBnaXZlcyB0aGUgY3VycmVudCBvZiB0aGUgRmlmbydzIHRocmVzaG9sZAorICAgICAgKCMpIEhBTF9RU1BJX1NldEZsYXNoSUQoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBpbmRleCBvZiB0aGUgZmxhc2ggbWVtb3J5IHRvIGJlIGFjY2Vzc2VkLgogCiAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE5NSwxMyArMTk2LDEzIEBACiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqIEBhdHRlbnRpb24KICAgKgotICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLiAKKyAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcy4KICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvY2VudGVyPjwvaDI+CiAgICoKICAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKLSAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIAorICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICovCkBAIC0yMDksMzEgKzIxMCwzNCBAQAogLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNpbmNsdWRlICJzdG0zMmY3eHhfaGFsLmgiCiAKKyNpZiBkZWZpbmVkKFFVQURTUEkpCisKIC8qKiBAYWRkdG9ncm91cCBTVE0zMkY3eHhfSEFMX0RyaXZlcgogICAqIEB7CiAgICovCiAKIC8qKiBAZGVmZ3JvdXAgUVNQSSBRU1BJCi0gICogQGJyaWVmIEhBTCBRU1BJIG1vZHVsZSBkcml2ZXIKKyAgKiBAYnJpZWYgUVNQSSBIQUwgbW9kdWxlIGRyaXZlcgogICAqIEB7CiAgICovCiAjaWZkZWYgSEFMX1FTUElfTU9EVUxFX0VOQUJMRUQKLSAgICAKKwogLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qKiBAYWRkdG9ncm91cCBRU1BJX1ByaXZhdGVfQ29uc3RhbnRzIAorLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfQ29uc3RhbnRzIFFTUEkgUHJpdmF0ZSBDb25zdGFudHMKICAgKiBAewogICAqLwotI2RlZmluZSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSAoKHVpbnQzMl90KTB4MDAwMDAwMDBVKSAgICAgICAgICAvKiE8SW5kaXJlY3Qgd3JpdGUgbW9kZSovCisjZGVmaW5lIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFIDB4MDAwMDAwMDBVICAgICAgICAgICAgICAgICAgICAgLyohPEluZGlyZWN0IHdyaXRlIG1vZGUqLwogI2RlZmluZSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9SRUFEICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0ZNT0RFXzApIC8qITxJbmRpcmVjdCByZWFkIG1vZGUqLwogI2RlZmluZSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9BVVRPX1BPTExJTkcgICAoKHVpbnQzMl90KVFVQURTUElfQ0NSX0ZNT0RFXzEpIC8qITxBdXRvbWF0aWMgcG9sbGluZyBtb2RlKi8KICNkZWZpbmUgUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCAgKCh1aW50MzJfdClRVUFEU1BJX0NDUl9GTU9ERSkgICAvKiE8TWVtb3J5LW1hcHBlZCBtb2RlKi8KIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqIEBhZGR0b2dyb3VwIFFTUElfUHJpdmF0ZV9NYWNyb3MgUVNQSSBQcml2YXRlIE1hY3JvcworLyoqIEBkZWZncm91cCBRU1BJX1ByaXZhdGVfTWFjcm9zIFFTUEkgUHJpdmF0ZSBNYWNyb3MKICAgKiBAewogICAqLwogI2RlZmluZSBJU19RU1BJX0ZVTkNUSU9OQUxfTU9ERShNT0RFKSAoKChNT0RFKSA9PSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSkgfHwgXApAQCAtMjQzLDM0ICsyNDcsMjkgQEAKIC8qKgogICAqIEB9CiAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAvKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAvKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoqIEBhZGR0b2dyb3VwIFFTUElfUHJpdmF0ZV9GdW5jdGlvbnMgUVNQSSBQcml2YXRlIEZ1bmN0aW9ucwotICAqIEB7Ci0gICovCiBzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBRU1BJX0RNQVR4Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwogc3RhdGljIHZvaWQgUVNQSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKLXN0YXRpYyB2b2lkIFFTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOyAKK3N0YXRpYyB2b2lkIFFTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwogc3RhdGljIHZvaWQgUVNQSV9ETUFBYm9ydENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXRlLCB1aW50MzJfdCB0aWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOworc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXRlLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOwogc3RhdGljIHZvaWQgUVNQSV9Db25maWcoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kLCB1aW50MzJfdCBGdW5jdGlvbmFsTW9kZSk7Ci0vKioKLSAgKiBAfQotICAqLwotICAKLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zIFFTUEkgRXhwb3J0ZWQgRnVuY3Rpb25zCiAgICogQHsKICAgKi8KIAotLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIAotICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIAorLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEgSW5pdGlhbGl6YXRpb24vZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCisgICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKICAgKgotQHZlcmJhdGltICAgIAorQHZlcmJhdGltCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yNzgsMjIgKzI3NywyMiBAQAogICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgogICAgICAgKCspIEluaXRpYWxpemUgdGhlIFF1YWRTUEkuCiAgICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgUXVhZFNQSS4KLSAgICAgIAorCiBAZW5kdmVyYmF0aW0KICAgKiBAewogICAqLwogCiAvKioKLSAgKiBAYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIFFTUEkgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCi0gICogICAgICAgIGluIHRoZSBRU1BJX0luaXRUeXBlRGVmIGFuZCBjcmVhdGVzIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KLSAgKiBAcGFyYW0gaHFzcGkgcXNwaSBoYW5kbGUKKyAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgUVNQSSBtb2RlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgKiAgICAgICAgaW4gdGhlIFFTUElfSW5pdFR5cGVEZWYgYW5kIGluaXRpYWxpemUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9Jbml0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayB0aGUgUVNQSSBoYW5kbGUgYWxsb2NhdGlvbiAqLwogICBpZihocXNwaSA9PSBOVUxMKQogICB7CkBAIC0zMTQsMTIgKzMxMyw5IEBACiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9GTEFTSF9JRChocXNwaS0+SW5pdC5GbGFzaElEKSk7CiAgIH0KLSAgCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovCi0gIF9fSEFMX0xPQ0soaHFzcGkpOwotICAgIAorCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRVNFVCkKLSAgeyAKKyAgewogICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8KICAgICBocXNwaS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsKIApAQCAtMzQ5LDM1ICszNDUsMzggQEAKICNlbmRpZgogCiAgICAgLyogQ29uZmlndXJlIHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHRoZSBRU1BJIG1lbW9yeSBhY2Nlc3MgKi8KLSAgICBIQUxfUVNQSV9TZXRUaW1lb3V0KGhxc3BpLCBIQUxfUVBTSV9USU1FT1VUX0RFRkFVTFRfVkFMVUUpOworICAgIEhBTF9RU1BJX1NldFRpbWVvdXQoaHFzcGksIEhBTF9RU1BJX1RJTUVPVVRfREVGQVVMVF9WQUxVRSk7CiAgIH0KLSAgCisKICAgLyogQ29uZmlndXJlIFFTUEkgRklGTyBUaHJlc2hvbGQgKi8KLSAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0ZUSFJFUywgKChocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkIC0gMSkgPDwgOCkpOworICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRlRIUkVTLAorICAgICAgICAgICAgICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAtIDFVKSA8PCBRVUFEU1BJX0NSX0ZUSFJFU19Qb3MpKTsKIAogICAvKiBXYWl0IHRpbGwgQlVTWSBmbGFnIHJlc2V0ICovCiAgIHN0YXR1cyA9IFFTUElfV2FpdEZsYWdTdGF0ZVVudGlsVGltZW91dChocXNwaSwgUVNQSV9GTEFHX0JVU1ksIFJFU0VULCB0aWNrc3RhcnQsIGhxc3BpLT5UaW1lb3V0KTsKIAogICBpZihzdGF0dXMgPT0gSEFMX09LKQogICB7Ci0gICAgICAgICAgICAgICAgCiAgICAgLyogQ29uZmlndXJlIFFTUEkgQ2xvY2sgUHJlc2NhbGVyIGFuZCBTYW1wbGUgU2hpZnQgKi8KLSAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsKFFVQURTUElfQ1JfUFJFU0NBTEVSIHwgUVVBRFNQSV9DUl9TU0hJRlQgfCBRVUFEU1BJX0NSX0ZTRUwgfCBRVUFEU1BJX0NSX0RGTSksICgoaHFzcGktPkluaXQuQ2xvY2tQcmVzY2FsZXIgPDwgMjQpfCBocXNwaS0+SW5pdC5TYW1wbGVTaGlmdGluZyB8IGhxc3BpLT5Jbml0LkZsYXNoSUR8IGhxc3BpLT5Jbml0LkR1YWxGbGFzaCApKTsKLSAgICAgICAgCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCAoUVVBRFNQSV9DUl9QUkVTQ0FMRVIgfCBRVUFEU1BJX0NSX1NTSElGVCB8IFFVQURTUElfQ1JfRlNFTCB8IFFVQURTUElfQ1JfREZNKSwKKyAgICAgICAgICAgICAgICgoaHFzcGktPkluaXQuQ2xvY2tQcmVzY2FsZXIgPDwgUVVBRFNQSV9DUl9QUkVTQ0FMRVJfUG9zKSB8CisgICAgICAgICAgICAgICAgaHFzcGktPkluaXQuU2FtcGxlU2hpZnRpbmcgIHwgaHFzcGktPkluaXQuRmxhc2hJRCB8IGhxc3BpLT5Jbml0LkR1YWxGbGFzaCkpOworCiAgICAgLyogQ29uZmlndXJlIFFTUEkgRmxhc2ggU2l6ZSwgQ1MgSGlnaCBUaW1lIGFuZCBDbG9jayBNb2RlICovCi0gICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRDUiwgKFFVQURTUElfRENSX0ZTSVpFIHwgUVVBRFNQSV9EQ1JfQ1NIVCB8IFFVQURTUElfRENSX0NLTU9ERSksIAotICAgICAgICAgICAgICAgKChocXNwaS0+SW5pdC5GbGFzaFNpemUgPDwgMTYpIHwgaHFzcGktPkluaXQuQ2hpcFNlbGVjdEhpZ2hUaW1lIHwgaHFzcGktPkluaXQuQ2xvY2tNb2RlKSk7Ci0gICAgCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRDUiwgKFFVQURTUElfRENSX0ZTSVpFIHwgUVVBRFNQSV9EQ1JfQ1NIVCB8IFFVQURTUElfRENSX0NLTU9ERSksCisgICAgICAgICAgICAgICAoKGhxc3BpLT5Jbml0LkZsYXNoU2l6ZSA8PCBRVUFEU1BJX0RDUl9GU0laRV9Qb3MpIHwKKyAgICAgICAgICAgICAgICBocXNwaS0+SW5pdC5DaGlwU2VsZWN0SGlnaFRpbWUgfCBocXNwaS0+SW5pdC5DbG9ja01vZGUpKTsKKwogICAgIC8qIEVuYWJsZSB0aGUgUVNQSSBwZXJpcGhlcmFsICovCiAgICAgX19IQUxfUVNQSV9FTkFCTEUoaHFzcGkpOwotICAKKwogICAgIC8qIFNldCBRU1BJIGVycm9yIGNvZGUgdG8gbm9uZSAqLwotICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOyAgCisgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CiAKICAgICAvKiBJbml0aWFsaXplIHRoZSBRU1BJIHN0YXRlICovCiAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAgIH0KLSAgCisKICAgLyogUmVsZWFzZSBMb2NrICovCiAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAKQEAgLTM4Niw4ICszODUsOCBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgRGVJbml0aWFsaXplcyB0aGUgUVNQSSBwZXJpcGhlcmFsIAotICAqIEBwYXJhbSBocXNwaSBxc3BpIGhhbmRsZQorICAqIEBicmllZiBEZS1Jbml0aWFsaXplIHRoZSBRU1BJIHBlcmlwaGVyYWwuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0RlSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQpAQCAtMzk4LDkgKzM5Nyw2IEBACiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQogCi0gIC8qIFByb2Nlc3MgbG9ja2VkICovCi0gIF9fSEFMX0xPQ0soaHFzcGkpOwotCiAgIC8qIERpc2FibGUgdGhlIFFTUEkgUGVyaXBoZXJhbCBDbG9jayAqLwogICBfX0hBTF9RU1BJX0RJU0FCTEUoaHFzcGkpOwogCkBAIC00MzAsNDcgKzQyNiw0NyBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgUVNQSSBNU1AgSW5pdAotICAqIEBwYXJhbSBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBRU1BJIE1TUC4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotIF9fd2VhayB2b2lkIEhBTF9RU1BJX01zcEluaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK19fd2VhayB2b2lkIEhBTF9RU1BJX01zcEluaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX1FTUElfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gCisgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgUVNQSSBNU1AgRGVJbml0Ci0gICogQHBhcmFtIGhxc3BpIFFTUEkgaGFuZGxlCisgICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgUVNQSSBNU1AuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLSBfX3dlYWsgdm9pZCBIQUxfUVNQSV9Nc3BEZUluaXQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKK19fd2VhayB2b2lkIEhBTF9RU1BJX01zcERlSW5pdChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAorCiAgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovIAorICAgKi8KIH0KIAogLyoqCiAgICogQH0KICAgKi8KIAotLyoqIEBkZWZncm91cCBRU1BJX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAKLSAgKiAgQGJyaWVmIFFTUEkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMgCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJbnB1dCBhbmQgT3V0cHV0IG9wZXJhdGlvbiBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmIFFTUEkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMKICAgKgotQHZlcmJhdGltICAgCitAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICBbLi5dCisgICAgWy4uXQogICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOgogICAgICAgKCspIEhhbmRsZSB0aGUgaW50ZXJydXB0cy4KICAgICAgICgrKSBIYW5kbGUgdGhlIGNvbW1hbmQgc2VxdWVuY2UuCkBAIC00ODQsOSArNDgwLDkgQEAKICAgKi8KIAogLyoqCi0gICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBRU1BJIGludGVycnVwdCByZXF1ZXN0LgotICAqIEBwYXJhbSBocXNwaSBRU1BJIGhhbmRsZQotICAqIEByZXR2YWwgTm9uZS4KKyAgKiBAYnJpZWYgSGFuZGxlIFFTUEkgaW50ZXJydXB0IHJlcXVlc3QuCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX1FTUElfSVJRSGFuZGxlcihRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewpAQCAtNDk1LDE5ICs0OTEsMjAgQEAKICAgdWludDMyX3QgaXRzb3VyY2UgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSKTsKIAogICAvKiBRU1BJIEZpZm8gVGhyZXNob2xkIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKChmbGFnICYgUVNQSV9GTEFHX0ZUKSE9IFJFU0VUKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9GVCkhPSBSRVNFVCkpCisgIGlmKCgoZmxhZyAmIFFTUElfRkxBR19GVCkgIT0gMFUpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX0ZUKSAhPSAwVSkpCiAgIHsKICAgICBkYXRhX3JlZyA9ICZocXNwaS0+SW5zdGFuY2UtPkRSOwogCiAgICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFgpCiAgICAgewogICAgICAgLyogVHJhbnNtaXNzaW9uIHByb2Nlc3MgKi8KLSAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gMCkKKyAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gUkVTRVQpCiAgICAgICB7Ci0gICAgICAgIGlmIChocXNwaS0+VHhYZmVyQ291bnQgPiAwKQorICAgICAgICBpZiAoaHFzcGktPlR4WGZlckNvdW50ID4gMFUpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBGaWxsIHRoZSBGSUZPIHVudGlsIGl0IGlzIGZ1bGwgKi8KLSAgICAgICAgICAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnID0gKmhxc3BpLT5wVHhCdWZmUHRyKys7CisgICAgICAgICAgLyogRmlsbCB0aGUgRklGTyB1bnRpbCB0aGUgdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KKyAgICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZykgPSAqaHFzcGktPnBUeEJ1ZmZQdHI7CisgICAgICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIrKzsKICAgICAgICAgICBocXNwaS0+VHhYZmVyQ291bnQtLTsKICAgICAgICAgfQogICAgICAgICBlbHNlCkBAIC01MjIsMTIgKzUxOSwxMyBAQAogICAgIGVsc2UgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlgpCiAgICAgewogICAgICAgLyogUmVjZWl2aW5nIFByb2Nlc3MgKi8KLSAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gMCkKKyAgICAgIHdoaWxlKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIFFTUElfRkxBR19GVCkgIT0gUkVTRVQpCiAgICAgICB7Ci0gICAgICAgIGlmIChocXNwaS0+UnhYZmVyQ291bnQgPiAwKQorICAgICAgICBpZiAoaHFzcGktPlJ4WGZlckNvdW50ID4gMFUpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBSZWFkIHRoZSBGSUZPIHVudGlsIGl0IGlzIGVtcHR5ICovCi0gICAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyKysgPSAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnOworICAgICAgICAgIC8qIFJlYWQgdGhlIEZJRk8gdW50aWwgdGhlIHRocmVzaG9sZCBpcyByZWFjaGVkICovCisgICAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyID0gKigoX19JTyB1aW50OF90ICopZGF0YV9yZWcpOworICAgICAgICAgIGhxc3BpLT5wUnhCdWZmUHRyKys7CiAgICAgICAgICAgaHFzcGktPlJ4WGZlckNvdW50LS07CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtNTM5LDcgKzUzNywxMSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIAorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQorCiAgICAgLyogRklGTyBUaHJlc2hvbGQgY2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgIGhxc3BpLT5GaWZvVGhyZXNob2xkQ2FsbGJhY2soaHFzcGkpOwpAQCAtNTQ5LDMxICs1NTEsMzEgQEAKICAgfQogCiAgIC8qIFFTUEkgVHJhbnNmZXIgQ29tcGxldGUgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19UQykhPSBSRVNFVCkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfVEMpIT0gUkVTRVQpKQorICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19UQykgIT0gMFUpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1RDKSAhPSAwVSkpCiAgIHsKICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5GQ1IsIFFTUElfRkxBR19UQyk7CiAKICAgICAvKiBEaXNhYmxlIHRoZSBRU1BJIEZJRk8gVGhyZXNob2xkLCBUcmFuc2ZlciBFcnJvciBhbmQgVHJhbnNmZXIgY29tcGxldGUgSW50ZXJydXB0cyAqLwogICAgIF9fSEFMX1FTUElfRElTQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UQyB8IFFTUElfSVRfVEUgfCBRU1BJX0lUX0ZUKTsKLSAgICAKKwogICAgIC8qIFRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFgpCiAgICAgewotICAgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikhPSBSRVNFVCkKKyAgICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pICE9IDBVKQogICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwogICAgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsICovCiAgICAgICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhxc3BpLT5oZG1hKTsKICAgICAgIH0KIAotI2lmIGRlZmluZWQoUVNQSTFfVjFfMCkKLS8qIENsZWFyIEJ1c3kgYml0ICovCisjaWYgIGRlZmluZWQoUVNQSTFfVjFfMCkKKyAgICAgIC8qIENsZWFyIEJ1c3kgYml0ICovCiAgICAgICBIQUxfUVNQSV9BYm9ydF9JVChocXNwaSk7CiAjZW5kaWYKLSAgICAgIAorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAKQEAgLTU4NiwyMyArNTg4LDI0IEBACiAgICAgfQogICAgIGVsc2UgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlgpCiAgICAgewotICAgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikhPSBSRVNFVCkKKyAgICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pICE9IDBVKQogICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwogICAgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9ETUFFTik7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIERpc2FibGUgdGhlIERNQSBjaGFubmVsICovCiAgICAgICAgIF9fSEFMX0RNQV9ESVNBQkxFKGhxc3BpLT5oZG1hKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgZGF0YV9yZWcgPSAmaHFzcGktPkluc3RhbmNlLT5EUjsKLSAgICAgICAgd2hpbGUoUkVBRF9CSVQoaHFzcGktPkluc3RhbmNlLT5TUiwgUVVBRFNQSV9TUl9GTEVWRUwpICE9IDApCisgICAgICAgIHdoaWxlKFJFQURfQklUKGhxc3BpLT5JbnN0YW5jZS0+U1IsIFFVQURTUElfU1JfRkxFVkVMKSAhPSAwVSkKICAgICAgICAgewotICAgICAgICAgIGlmIChocXNwaS0+UnhYZmVyQ291bnQgPiAwKQorICAgICAgICAgIGlmIChocXNwaS0+UnhYZmVyQ291bnQgPiAwVSkKICAgICAgICAgICB7CiAgICAgICAgICAgICAvKiBSZWFkIHRoZSBsYXN0IGRhdGEgcmVjZWl2ZWQgaW4gdGhlIEZJRk8gdW50aWwgaXQgaXMgZW1wdHkgKi8KLSAgICAgICAgICAgICpocXNwaS0+cFJ4QnVmZlB0cisrID0gKihfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZzsKKyAgICAgICAgICAgICpocXNwaS0+cFJ4QnVmZlB0ciA9ICooKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnKTsKKyAgICAgICAgICAgIGhxc3BpLT5wUnhCdWZmUHRyKys7CiAgICAgICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQtLTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQpAQCAtNjEyLDExICs2MTUsMTIgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSNpZiBkZWZpbmVkKFFTUEkxX1YxXzApCisKKyNpZiAgZGVmaW5lZChRU1BJMV9WMV8wKQogICAgICAgLyogV29ya2Fyb3VuZCAtIEV4dHJhIGRhdGEgd3JpdHRlbiBpbiB0aGUgRklGTyBhdCB0aGUgZW5kIG9mIGEgcmVhZCB0cmFuc2ZlciAqLwogICAgICAgSEFMX1FTUElfQWJvcnRfSVQoaHFzcGkpOwotI2VuZGlmIC8qIFFTUElfVjFfMCovICAgICAgCi0gICAgICAKKyNlbmRpZgorCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAKQEAgLTY0MSw2ICs2NDUsOSBAQAogICAgIH0KICAgICBlbHNlIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9BQk9SVCkKICAgICB7CisgICAgICAvKiBSZXNldCBmdW5jdGlvbmFsIG1vZGUgY29uZmlndXJhdGlvbiB0byBpbmRpcmVjdCB3cml0ZSBtb2RlIGJ5IGRlZmF1bHQgKi8KKyAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUpOworCiAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAKQEAgLTY1NSw3ICs2NjIsNyBAQAogICAgICAgICBIQUxfUVNQSV9BYm9ydENwbHRDYWxsYmFjayhocXNwaSk7CiAjZW5kaWYKICAgICAgIH0KLSAgICAgIGVsc2UgCisgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIC8qIEFib3J0IGR1ZSB0byBhbiBlcnJvciAoZWcgOiAgRE1BIGVycm9yKSAqLwogCkBAIC02NjcsMTYgKzY3NCwyMCBAQAogI2VuZGlmCiAgICAgICB9CiAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CiAgIH0KIAogICAvKiBRU1BJIFN0YXR1cyBNYXRjaCBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfU00pIT0gUkVTRVQpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1NNKSE9IFJFU0VUKSkKKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfU00pICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9TTSkgIT0gMFUpKQogICB7CiAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfU00pOwotICAgCisKICAgICAvKiBDaGVjayBpZiB0aGUgYXV0b21hdGljIHBvbGwgbW9kZSBzdG9wIGlzIGFjdGl2YXRlZCAqLwotICAgIGlmKFJFQURfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfQVBNUykgIT0gMCkKKyAgICBpZihSRUFEX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0FQTVMpICE9IDBVKQogICAgIHsKICAgICAgIC8qIERpc2FibGUgdGhlIFFTUEkgVHJhbnNmZXIgRXJyb3IgYW5kIFN0YXR1cyBNYXRjaCBJbnRlcnJ1cHRzICovCiAgICAgICBfX0hBTF9RU1BJX0RJU0FCTEVfSVQoaHFzcGksIChRU1BJX0lUX1NNIHwgUVNQSV9JVF9URSkpOwpAQCAtNjk0LDIyICs3MDUsMjIgQEAKICAgfQogCiAgIC8qIFFTUEkgVHJhbnNmZXIgRXJyb3IgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19URSkhPSBSRVNFVCkgJiYgKChpdHNvdXJjZSAmIFFTUElfSVRfVEUpIT0gUkVTRVQpKQorICBlbHNlIGlmKCgoZmxhZyAmIFFTUElfRkxBR19URSkgIT0gMFUpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1RFKSAhPSAwVSkpCiAgIHsKICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5GQ1IsIFFTUElfRkxBR19URSk7Ci0gICAgCisKICAgICAvKiBEaXNhYmxlIGFsbCB0aGUgUVNQSSBJbnRlcnJ1cHRzICovCiAgICAgX19IQUxfUVNQSV9ESVNBQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1NNIHwgUVNQSV9JVF9UQyB8IFFTUElfSVRfVEUgfCBRU1BJX0lUX0ZUKTsKIAogICAgIC8qIFNldCBlcnJvciBjb2RlICovCiAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9UUkFOU0ZFUjsKLSAgICAKLSAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSE9IFJFU0VUKQorCisgICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikgIT0gMFUpCiAgICAgewogICAgICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IGNsZWFyaW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KICAgICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAgIAorCiAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgY2hhbm5lbCAqLwogICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gUVNQSV9ETUFBYm9ydENwbHQ7CiAgICAgICBpZiAoSEFMX0RNQV9BYm9ydF9JVChocXNwaS0+aGRtYSkgIT0gSEFMX09LKQpAQCAtNzMyLDcgKzc0Myw3IEBACiAgICAgewogICAgICAgLyogQ2hhbmdlIHN0YXRlIG9mIFFTUEkgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwotICAgICAgCisKICAgICAgIC8qIEVycm9yIGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKQEAgLTc0MywzMyArNzU0LDM4IEBACiAgIH0KIAogICAvKiBRU1BJIFRpbWVvdXQgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfVE8pIT0gUkVTRVQpICYmICgoaXRzb3VyY2UgJiBRU1BJX0lUX1RPKSE9IFJFU0VUKSkKKyAgZWxzZSBpZigoKGZsYWcgJiBRU1BJX0ZMQUdfVE8pICE9IDBVKSAmJiAoKGl0c291cmNlICYgUVNQSV9JVF9UTykgIT0gMFUpKQogICB7CiAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RkNSLCBRU1BJX0ZMQUdfVE8pOwotICAgIAotICAgIC8qIFRpbWUgb3V0IGNhbGxiYWNrICovCisKKyAgICAvKiBUaW1lb3V0IGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICBocXNwaS0+VGltZU91dENhbGxiYWNrKGhxc3BpKTsKICNlbHNlCiAgICAgSEFMX1FTUElfVGltZU91dENhbGxiYWNrKGhxc3BpKTsKICNlbmRpZgogICB9CisKKyAgIGVsc2UKKyAgeworICAgLyogTm90aGluZyB0byBkbyAqLworICB9CiB9CiAKIC8qKgotICAqIEBicmllZiBTZXRzIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24uIAotICAqIEBwYXJhbSBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSBjbWQgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgKiBAcGFyYW0gVGltZW91dCAgVGltZSBvdXQgZHVyYXRpb24KKyAgKiBAYnJpZWYgU2V0IHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24uCisgICogQHBhcmFtIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSBUaW1lb3V0IDogVGltZW91dCBkdXJhdGlvbgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBvciBXcml0ZSBNb2RlcwogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1FTUElfQ29tbWFuZChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCkBAIC03OTUsNTIgKzgxMSw1MSBAQAogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9ERFJfTU9ERShjbWQtPkRkck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX0hIQyhjbWQtPkRkckhvbGRIYWxmQ3ljbGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgUVNQSSBzdGF0ZSAqLwotICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1k7ICAgCi0gICAgCisgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWTsKKwogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKLSAgICAKKwogICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgIHsKICAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KICAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFKTsKLSAgICAgIAorCiAgICAgICBpZiAoY21kLT5EYXRhTW9kZSA9PSBRU1BJX0RBVEFfTk9ORSkKICAgICAgIHsKLSAgICAgICAgLyogV2hlbiB0aGVyZSBpcyBubyBkYXRhIHBoYXNlLCB0aGUgdHJhbnNmZXIgc3RhcnQgYXMgc29vbiBhcyB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lIAorICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgcGhhc2UsIHRoZSB0cmFuc2ZlciBzdGFydCBhcyBzb29uIGFzIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUKICAgICAgICAgc28gd2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KICAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfVEMsIFNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKIAogICAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgICAgewogICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7ICAgCisgICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOyAgIAorICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAgIH0KLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC04NDksMTcgKzg2NCwxNyBAQAogfQogCiAvKioKLSAgKiBAYnJpZWYgU2V0cyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluIGludGVycnVwdCBtb2RlLiAKLSAgKiBAcGFyYW0gaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gY21kICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisgICogQGJyaWVmIFNldCB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluIGludGVycnVwdCBtb2RlLgorICAqIEBwYXJhbSBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtIGNtZCA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFJlYWQgb3IgV3JpdGUgTW9kZXMKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX0NvbW1hbmRfSVQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kKQogewotICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfRVJST1I7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1czsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgCisKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfSU5TVFJVQ1RJT05fTU9ERShjbWQtPkluc3RydWN0aW9uTW9kZSkpOwogICBpZiAoY21kLT5JbnN0cnVjdGlvbk1vZGUgIT0gUVNQSV9JTlNUUlVDVElPTl9OT05FKQpAQCAtODg1LDIwICs5MDAsMjAgQEAKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX01PREUoY21kLT5EZHJNb2RlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9ISEMoY21kLT5EZHJIb2xkSGFsZkN5Y2xlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX1NJT09fTU9ERShjbWQtPlNJT09Nb2RlKSk7Ci0gIAorCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHFzcGkpOwogCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKICAgewogICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOwotICAgIAorCiAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KLSAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZOyAgIAotICAgIAorICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1k7CisKICAgICAvKiBXYWl0IHRpbGwgQlVTWSBmbGFnIHJlc2V0ICovCiAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOwotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgaWYgKGNtZC0+RGF0YU1vZGUgPT0gUVNQSV9EQVRBX05PTkUpCkBAIC05MDYsMTMgKzkyMSwxMyBAQAogICAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gKi8KICAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1dSSVRFKTsKLSAgICAgIAorCiAgICAgICBpZiAoY21kLT5EYXRhTW9kZSA9PSBRU1BJX0RBVEFfTk9ORSkKICAgICAgIHsKLSAgICAgICAgLyogV2hlbiB0aGVyZSBpcyBubyBkYXRhIHBoYXNlLCB0aGUgdHJhbnNmZXIgc3RhcnQgYXMgc29vbiBhcyB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lIAorICAgICAgICAvKiBXaGVuIHRoZXJlIGlzIG5vIGRhdGEgcGhhc2UsIHRoZSB0cmFuc2ZlciBzdGFydCBhcyBzb29uIGFzIHRoZSBjb25maWd1cmF0aW9uIGlzIGRvbmUKICAgICAgICAgc28gYWN0aXZhdGUgVEMgYW5kIFRFIGludGVycnVwdHMgKi8KICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwpAQCAtOTIzLDcgKzkzOCw3IEBACiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOyAgIAorICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKIAogICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CkBAIC05MzcsMjcgKzk1MiwyNyBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAgIH0KLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogICByZXR1cm4gc3RhdHVzOwogfQogCiAvKioKLSAgKiBAYnJpZWYgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4gCi0gICogQHBhcmFtIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHBhcmFtIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKLSAgKiBAcGFyYW0gVGltZW91dCAgVGltZSBvdXQgZHVyYXRpb24KKyAgKiBAYnJpZWYgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gVGltZW91dCA6IFRpbWVvdXQgZHVyYXRpb24KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFdyaXRlIE1vZGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1RyYW5zbWl0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBUaW1lb3V0KQogewotICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgIF9fSU8gdWludDMyX3QgKmRhdGFfcmVnID0gJmhxc3BpLT5JbnN0YW5jZS0+RFI7CiAKQEAgLTk3MiwyOSArOTg3LDMwIEBACiAgICAgewogICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCi0gICAgICBocXNwaS0+VHhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOwotICAgICAgaHFzcGktPlR4WGZlclNpemUgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOworICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+VHhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwogICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKLSAgICAKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KICAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CiAKLSAgICAgIHdoaWxlKGhxc3BpLT5UeFhmZXJDb3VudCA+IDApCisgICAgICB3aGlsZShocXNwaS0+VHhYZmVyQ291bnQgPiAwVSkKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBGVCBmbGFnIGlzIHNldCB0byBzZW5kIGRhdGEgKi8KICAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfRlQsIFNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKIAogICAgICAgICBpZiAoc3RhdHVzICE9IEhBTF9PSykKLSAgICAgICAgeyAKKyAgICAgICAgewogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgKihfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZyA9ICpocXNwaS0+cFR4QnVmZlB0cisrOworICAgICAgICAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZykgPSAqaHFzcGktPnBUeEJ1ZmZQdHI7CisgICAgICAgIGhxc3BpLT5wVHhCdWZmUHRyKys7CiAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudC0tOwogICAgICAgfQotICAgIAorCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KQEAgLTEwMDQsMTYgKzEwMjAsMTYgQEAKICAgICAgICAgewogICAgICAgICAgIC8qIENsZWFyIFRyYW5zZmVyIENvbXBsZXRlIGJpdCAqLwogICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgICAgICAKLSNpZiBkZWZpbmVkKFFTUEkxX1YxXzApCisKKyNpZiAgZGVmaW5lZChRU1BJMV9WMV8wKQogICAgICAgICAgIC8qIENsZWFyIEJ1c3kgYml0ICovCiAgICAgICAgICAgc3RhdHVzID0gSEFMX1FTUElfQWJvcnQoaHFzcGkpOwotI2VuZGlmIC8qIFFTUElfVjFfMCAqLyAKKyNlbmRpZgogICAgICAgICB9CiAgICAgICB9Ci0gICAgCisKICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsgICAgCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTEwMzQsMTAgKzEwNTAsMTAgQEAKIAogCiAvKioKLSAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlIAotICAqIEBwYXJhbSBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCi0gICogQHBhcmFtIFRpbWVvdXQgIFRpbWUgb3V0IGR1cmF0aW9uCisgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KKyAgKiBAcGFyYW0gaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAcGFyYW0gVGltZW91dCA6IFRpbWVvdXQgZHVyYXRpb24KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFJlYWQgTW9kZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwpAQCAtMTA1MCwxOCArMTA2NiwxOSBAQAogCiAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHFzcGkpOwotICAKKwogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCiAgIHsKICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKKwogICAgIGlmKHBEYXRhICE9IE5VTEwgKQogICAgIHsKICAgICAgIC8qIFVwZGF0ZSBzdGF0ZSAqLwogICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9SWDsKLSAgICAKKwogICAgICAgLyogQ29uZmlndXJlIGNvdW50ZXJzIGFuZCBzaXplIG9mIHRoZSBoYW5kbGUgKi8KLSAgICAgIGhxc3BpLT5SeFhmZXJDb3VudCA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDE7Ci0gICAgICBocXNwaS0+UnhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDE7CisgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVTsKKyAgICAgIGhxc3BpLT5SeFhmZXJTaXplID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CiAgICAgICBocXNwaS0+cFJ4QnVmZlB0ciA9IHBEYXRhOwogCiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCkBAIC0xMDY5LDIxICsxMDg2LDIyIEBACiAKICAgICAgIC8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSByZS13cml0aW5nIHRoZSBhZGRyZXNzIGluIEFSIHJlZ2lzdGVyICovCiAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOwotICAgICAgCi0gICAgICB3aGlsZShocXNwaS0+UnhYZmVyQ291bnQgPiAwKQorCisgICAgICB3aGlsZShocXNwaS0+UnhYZmVyQ291bnQgPiAwVSkKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBGVCBvciBUQyBmbGFnIGlzIHNldCB0byByZWFkIHJlY2VpdmVkIGRhdGEgKi8KICAgICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCAoUVNQSV9GTEFHX0ZUIHwgUVNQSV9GTEFHX1RDKSwgU0VULCB0aWNrc3RhcnQsIFRpbWVvdXQpOwogCiAgICAgICAgIGlmICAoc3RhdHVzICE9IEhBTF9PSykKLSAgICAgICAgeyAKKyAgICAgICAgewogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgKmhxc3BpLT5wUnhCdWZmUHRyKysgPSAqKF9fSU8gdWludDhfdCAqKWRhdGFfcmVnOworICAgICAgICAqaHFzcGktPnBSeEJ1ZmZQdHIgPSAqKChfX0lPIHVpbnQ4X3QgKilkYXRhX3JlZyk7CisgICAgICAgIGhxc3BpLT5wUnhCdWZmUHRyKys7CiAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudC0tOwogICAgICAgfQotICAgIAorCiAgICAgICBpZiAoc3RhdHVzID09IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KQEAgLTEwOTMsMTYgKzExMTEsMTYgQEAKICAgICAgICAgewogICAgICAgICAgIC8qIENsZWFyIFRyYW5zZmVyIENvbXBsZXRlIGJpdCAqLwogICAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RDKTsKLSAgICAgICAgICAKLSNpZiBkZWZpbmVkKFFTUEkxX1YxXzApCi0gICAgICAgICAvKiBXb3JrYXJvdW5kIC0gRXh0cmEgZGF0YSB3cml0dGVuIGluIHRoZSBGSUZPIGF0IHRoZSBlbmQgb2YgYSByZWFkIHRyYW5zZmVyICovCi0gICAgICAgICBzdGF0dXMgPSBIQUxfUVNQSV9BYm9ydChocXNwaSk7Ci0jZW5kaWYgLyogUVNQSV9WMV8wICovICAKKworI2lmICBkZWZpbmVkKFFTUEkxX1YxXzApCisgICAgICAgICAgLyogV29ya2Fyb3VuZCAtIEV4dHJhIGRhdGEgd3JpdHRlbiBpbiB0aGUgRklGTyBhdCB0aGUgZW5kIG9mIGEgcmVhZCB0cmFuc2ZlciAqLworICAgICAgICAgIHN0YXR1cyA9IEhBTF9RU1BJX0Fib3J0KGhxc3BpKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8qIFVwZGF0ZSBRU1BJIHN0YXRlICovCi0gICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsgICAgCisgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTExMTQsNyArMTEzMiw3IEBACiAgIHsKICAgICBzdGF0dXMgPSBIQUxfQlVTWTsKICAgfQotICAKKwogICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAKQEAgLTExMjIsNDQgKzExNDAsNDQgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlIAotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBpbnRlcnJ1cHQuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFdyaXRlIE1vZGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1RyYW5zbWl0X0lUKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKQoteyAgCit7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7CisKICAgICBpZihwRGF0YSAhPSBOVUxMICkKICAgICB7CiAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfVFg7CiAKICAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCi0gICAgICBocXNwaS0+VHhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOwotICAgICAgaHFzcGktPlR4WGZlclNpemUgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOworICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+VHhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwogICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKLSAgICAKLSAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIGFzIGluZGlyZWN0IHdyaXRlICovCi0gICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOwotICAgIAorCiAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKTsKIAorICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KKyAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7CisKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gICAgICAKKwogICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yLCBGSUZPIHRocmVzaG9sZCBhbmQgdHJhbnNmZXIgY29tcGxldGUgSW50ZXJydXB0cyAqLwogICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEUgfCBRU1BJX0lUX0ZUIHwgUVNQSV9JVF9UQyk7Ci0gICAgICAKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTExODIsOSArMTIwMCw5IEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBuby1ibG9ja2luZyBtb2RlIHdpdGggSW50ZXJydXB0Ci0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gSW5kaXJlY3QgUmVhZCBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC0xMTkyLDMzICsxMjEwLDMzIEBACiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICAgdWludDMyX3QgYWRkcl9yZWcgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7CiAKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICBpZihwRGF0YSAhPSBOVUxMICkKICAgICB7CiAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlg7Ci0gICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBjb3VudGVycyBhbmQgc2l6ZSBvZiB0aGUgaGFuZGxlICovCi0gICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOwotICAgICAgaHFzcGktPlJ4WGZlclNpemUgPSBSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxOworICAgICAgaHFzcGktPlJ4WGZlckNvdW50ID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5ETFIpICsgMVU7CisgICAgICBocXNwaS0+UnhYZmVyU2l6ZSA9IFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVOwogICAgICAgaHFzcGktPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKIAorICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCisgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19URSB8IFFTUElfRkxBR19UQyk7CisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIGFzIGluZGlyZWN0IHJlYWQgKi8KICAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9SRUFEKTsKIAogICAgICAgLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IHJlLXdyaXRpbmcgdGhlIGFkZHJlc3MgaW4gQVIgcmVnaXN0ZXIgKi8KICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSLCBhZGRyX3JlZyk7CiAKLSAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwotICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpOwotCiAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC0xMjM2LDcgKzEyNTQsNyBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CkBAIC0xMjQ2LDMxICsxMjY0LDMwIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgU2VuZHMgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uIGJsb2NraW5nIG1vZGUgd2l0aCBETUEuIAotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKKyAgKiBAYnJpZWYgIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YSA6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXIKICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFdyaXRlIE1vZGUKLSAgKiBAbm90ZSAgIElmIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBpcyBjb25maWd1cmVkIGFzIGhhbGZ3b3JkLCB0aGUgbnVtYmVyIAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIKICAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBoYWxmd29yZAotICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlciAKKyAgKiBAbm90ZSAgIElmIERNQSBwZXJpcGhlcmFsIGFjY2VzcyBpcyBjb25maWd1cmVkIGFzIHdvcmQsIHRoZSBudW1iZXIKICAgKiAgICAgICAgIG9mIGRhdGEgYW5kIHRoZSBmaWZvIHRocmVzaG9sZCBzaG91bGQgYmUgYWxpZ25lZCBvbiB3b3JkCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9UcmFuc21pdF9ETUEoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDhfdCAqcERhdGEpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKLSAgdWludDMyX3QgKnRtcDsKLSAgdWludDMyX3QgZGF0YV9zaXplID0gKFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDEpOwotICAKKyAgdWludDMyX3QgZGF0YV9zaXplID0gKFJFQURfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSKSArIDFVKTsKKwogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhxc3BpKTsKLSAgCisKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7Ci0gICAgLyogQ2xlYXIgdGhlIGVycm9yIGNvZGUgKi8gICAgICAgICAgICAgICAgCisgICAgLyogQ2xlYXIgdGhlIGVycm9yIGNvZGUgKi8KICAgICBocXNwaS0+RXJyb3JDb2RlID0gSEFMX1FTUElfRVJST1JfTk9ORTsKLSAgICAKLSAgICBpZihwRGF0YSAhPSBOVUxMICkgCisKKyAgICBpZihwRGF0YSAhPSBOVUxMICkKICAgICB7CiAgICAgICAvKiBDb25maWd1cmUgY291bnRlcnMgb2YgdGhlIGhhbmRsZSAqLwogICAgICAgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fQllURSkKQEAgLTEyNzksODkgKzEyOTYsMTAwIEBACiAgICAgICB9CiAgICAgICBlbHNlIGlmIChocXNwaS0+aGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50ID09IERNQV9QREFUQUFMSUdOX0hBTEZXT1JEKQogICAgICAgewotICAgICAgICBpZiAoKChkYXRhX3NpemUgJSAyKSAhPSAwKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSAyKSAhPSAwKSkKKyAgICAgICAgaWYgKCgoZGF0YV9zaXplICUgMlUpICE9IDBVKSB8fCAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgJSAyVSkgIT0gMFUpKQogICAgICAgICB7Ci0gICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiBoYWxmd29yZCAKKyAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIGhhbGZ3b3JkCiAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyBoYWxmd29yZCAqLwogICAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKICAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICBocXNwaS0+VHhYZmVyQ291bnQgPSAoZGF0YV9zaXplID4+IDEpOworICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMVUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChocXNwaS0+aGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50ID09IERNQV9QREFUQUFMSUdOX1dPUkQpCiAgICAgICB7Ci0gICAgICAgIGlmICgoKGRhdGFfc2l6ZSAlIDQpICE9IDApIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDQpICE9IDApKQorICAgICAgICBpZiAoKChkYXRhX3NpemUgJSA0VSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDRVKSAhPSAwVSkpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIHdvcmQgCisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiB3b3JkCiAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCiAgICAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOwogICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMik7CisgICAgICAgICAgaHFzcGktPlR4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAyVSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisKICAgICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgICAgeworICAgICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KKyAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWV9JTkRJUkVDVF9UWDsKIAotICAgICAgLyogVXBkYXRlIHN0YXRlICovCi0gICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0lORElSRUNUX1RYOworICAgICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKyAgICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCAoUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKSk7CiAKLSAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwotICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCAoUVNQSV9GTEFHX1RFIHwgUVNQSV9GTEFHX1RDKSk7CisgICAgICAgIC8qIENvbmZpZ3VyZSBzaXplIGFuZCBwb2ludGVyIG9mIHRoZSBoYW5kbGUgKi8KKyAgICAgICAgaHFzcGktPlR4WGZlclNpemUgPSBocXNwaS0+VHhYZmVyQ291bnQ7CisgICAgICAgIGhxc3BpLT5wVHhCdWZmUHRyID0gcERhdGE7CiAKLSAgICAgIC8qIENvbmZpZ3VyZSBzaXplIGFuZCBwb2ludGVyIG9mIHRoZSBoYW5kbGUgKi8KLSAgICAgIGhxc3BpLT5UeFhmZXJTaXplID0gaHFzcGktPlR4WGZlckNvdW50OwotICAgICAgaHFzcGktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKLSAgICAKLSAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBmdW5jdGlvbmFsIG1vZGUgYXMgaW5kaXJlY3Qgd3JpdGUgKi8KLSAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURSk7Ci0gICAgCi0gICAgICAvKiBTZXQgdGhlIFFTUEkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0gICAgICBocXNwaS0+aGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IFFTUElfRE1BVHhDcGx0OwotICAgIAotICAgICAgLyogU2V0IHRoZSBRU1BJIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCi0gICAgICBocXNwaS0+aGRtYS0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBRU1BJX0RNQVR4SGFsZkNwbHQ7Ci0gICAgCi0gICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLwotICAgICAgaHFzcGktPmhkbWEtPlhmZXJFcnJvckNhbGxiYWNrID0gUVNQSV9ETUFFcnJvcjsKLSAgICAgIAotICAgICAgLyogQ2xlYXIgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLyAgICAgIAotICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGZ1bmN0aW9uYWwgbW9kZSBhcyBpbmRpcmVjdCB3cml0ZSAqLworICAgICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCBRVUFEU1BJX0NDUl9GTU9ERSwgUVNQSV9GVU5DVElPTkFMX01PREVfSU5ESVJFQ1RfV1JJVEUpOwogCi0gICAgICAvKiBDb25maWd1cmUgdGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BICovCi0gICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfTUVNT1JZX1RPX1BFUklQSDsKLSAgICAgIE1PRElGWV9SRUcoaHFzcGktPmhkbWEtPkluc3RhbmNlLT5DUiwgRE1BX1N4Q1JfRElSLCBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24pOworICAgICAgICAvKiBTZXQgdGhlIFFTUEkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCisgICAgICAgIGhxc3BpLT5oZG1hLT5YZmVyQ3BsdENhbGxiYWNrID0gUVNQSV9ETUFUeENwbHQ7CiAKLSAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc21pdCBETUEgQ2hhbm5lbCAqLwotICAgICAgdG1wID0gKHVpbnQzMl90KikmcERhdGE7Ci0gICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhxc3BpLT5oZG1hLCAqKHVpbnQzMl90Kil0bXAsICh1aW50MzJfdCkmaHFzcGktPkluc3RhbmNlLT5EUiwgaHFzcGktPlR4WGZlclNpemUpOworICAgICAgICAvKiBTZXQgdGhlIFFTUEkgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gUVNQSV9ETUFUeEhhbGZDcGx0OwogCi0gICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCi0gICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBocXNwaS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBRU1BJX0RNQUVycm9yOwogCi0gICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNmZXIgZXJyb3IgSW50ZXJydXB0ICovCi0gICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9URSk7CisgICAgICAgIC8qIENsZWFyIHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KKyAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKIAotICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgc2V0dGluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCi0gICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOwotICAgIH0KKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQSAqLworICAgICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfTUVNT1JZX1RPX1BFUklQSDsKKyAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNSLCBETUFfU3hDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7CisKKyAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zbWl0IERNQSBDaGFubmVsICovCisgICAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhxc3BpLT5oZG1hLCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHFzcGktPkluc3RhbmNlLT5EUiwgaHFzcGktPlR4WGZlclNpemUpID09IEhBTF9PSykKKyAgICAgICAgeworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICAgIAorICAgICAgICAgIC8qIEVuYWJsZSB0aGUgUVNQSSB0cmFuc2ZlciBlcnJvciBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9URSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgc2V0dGluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCisgICAgICAgICAgU0VUX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CisgICAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9ETUE7CisgICAgICAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfUkVBRFk7CisKKyAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCisgICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKKyAgICAgICAgfQorICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07Ci0gICAgICAKICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKIAogICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwpAQCAtMTM3MCw3ICsxMzk4LDcgQEAKICAgfQogICBlbHNlCiAgIHsKLSAgICBzdGF0dXMgPSBIQUxfQlVTWTsgICAKKyAgICBzdGF0dXMgPSBIQUxfQlVTWTsKIAogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwpAQCAtMTM3OCwzMyArMTQwNiwzMyBAQAogCiAgIHJldHVybiBzdGF0dXM7CiB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAvKioKLSAgKiBAYnJpZWYgIFJlY2VpdmVzIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbiBibG9ja2luZyBtb2RlIHdpdGggRE1BLiAKLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhIDogcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIEluZGlyZWN0IFJlYWQgTW9kZQotICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQsIHRoZSBudW1iZXIgCisgICogQG5vdGUgICBJZiBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgaXMgY29uZmlndXJlZCBhcyBoYWxmd29yZCwgdGhlIG51bWJlcgogICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIGhhbGZ3b3JkCi0gICogQG5vdGUgICBJZiBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgaXMgY29uZmlndXJlZCBhcyB3b3JkLCB0aGUgbnVtYmVyIAorICAqIEBub3RlICAgSWYgRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGlzIGNvbmZpZ3VyZWQgYXMgd29yZCwgdGhlIG51bWJlcgogICAqICAgICAgICAgb2YgZGF0YSBhbmQgdGhlIGZpZm8gdGhyZXNob2xkIHNob3VsZCBiZSBhbGlnbmVkIG9uIHdvcmQKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1JlY2VpdmVfRE1BKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQ4X3QgKnBEYXRhKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIHVpbnQzMl90ICp0bXA7CiAgIHVpbnQzMl90IGFkZHJfcmVnID0gUkVBRF9SRUcoaHFzcGktPkluc3RhbmNlLT5BUik7Ci0gIHVpbnQzMl90IGRhdGFfc2l6ZSA9IChSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxKTsKLSAgCisgIHVpbnQzMl90IGRhdGFfc2l6ZSA9IChSRUFEX1JFRyhocXNwaS0+SW5zdGFuY2UtPkRMUikgKyAxVSk7CisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7Ci0gIAorCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKICAgeworICAgIC8qIENsZWFyIHRoZSBlcnJvciBjb2RlICovCiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCi0gICAgaWYocERhdGEgIT0gTlVMTCApIAorCisgICAgaWYocERhdGEgIT0gTlVMTCApCiAgICAgewogICAgICAgLyogQ29uZmlndXJlIGNvdW50ZXJzIG9mIHRoZSBoYW5kbGUgKi8KICAgICAgIGlmIChocXNwaS0+aGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50ID09IERNQV9QREFUQUFMSUdOX0JZVEUpCkBAIC0xNDEzLDE5MyArMTQ0MSwyMDQgQEAKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKGhxc3BpLT5oZG1hLT5Jbml0LlBlcmlwaERhdGFBbGlnbm1lbnQgPT0gRE1BX1BEQVRBQUxJR05fSEFMRldPUkQpCiAgICAgICB7Ci0gICAgICAgIGlmICgoKGRhdGFfc2l6ZSAlIDIpICE9IDApIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDIpICE9IDApKQorICAgICAgICBpZiAoKChkYXRhX3NpemUgJSAyVSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDJVKSAhPSAwVSkpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIGhhbGZ3b3JkIAotICAgICAgICAgID0+IG5vIHRyYW5zZmVyIHBvc3NpYmxlIHdpdGggRE1BIHBlcmlwaGVyYWwgYWNjZXNzIGNvbmZpZ3VyZWQgYXMgaGFsZndvcmQgKi8KKyAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIGhhbGZ3b3JkCisgICAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyBoYWxmd29yZCAqLwogICAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfSU5WQUxJRF9QQVJBTTsKICAgICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7Ci0gICAgICAgICAgCisKICAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICBocXNwaS0+UnhYZmVyQ291bnQgPSAoZGF0YV9zaXplID4+IDEpOworICAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMVUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChocXNwaS0+aGRtYS0+SW5pdC5QZXJpcGhEYXRhQWxpZ25tZW50ID09IERNQV9QREFUQUFMSUdOX1dPUkQpCiAgICAgICB7Ci0gICAgICAgIGlmICgoKGRhdGFfc2l6ZSAlIDQpICE9IDApIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDQpICE9IDApKQorICAgICAgICBpZiAoKChkYXRhX3NpemUgJSA0VSkgIT0gMFUpIHx8ICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAlIDRVKSAhPSAwVSkpCiAgICAgICAgIHsKLSAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGRhdGEgb3IgdGhlIGZpZm8gdGhyZXNob2xkIGlzIG5vdCBhbGlnbmVkIG9uIHdvcmQgCi0gICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCisgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBkYXRhIG9yIHRoZSBmaWZvIHRocmVzaG9sZCBpcyBub3QgYWxpZ25lZCBvbiB3b3JkCisgICAgICAgICAgICAgPT4gbm8gdHJhbnNmZXIgcG9zc2libGUgd2l0aCBETUEgcGVyaXBoZXJhbCBhY2Nlc3MgY29uZmlndXJlZCBhcyB3b3JkICovCiAgICAgICAgICAgaHFzcGktPkVycm9yQ29kZSB8PSBIQUxfUVNQSV9FUlJPUl9JTlZBTElEX1BBUkFNOwogICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKLSAgICAgICAgICAKKwogICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGhxc3BpLT5SeFhmZXJDb3VudCA9IChkYXRhX3NpemUgPj4gMik7CisgICAgICAgICAgaHFzcGktPlJ4WGZlckNvdW50ID0gKGRhdGFfc2l6ZSA+PiAyVSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICB9CisKICAgICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgICAgewotICAgICAgICAKICAgICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX0JVU1lfSU5ESVJFQ1RfUlg7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwogICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIChRU1BJX0ZMQUdfVEUgfCBRU1BJX0ZMQUdfVEMpKTsKLSAgICAgICAgCisKICAgICAgICAgLyogQ29uZmlndXJlIHNpemUgYW5kIHBvaW50ZXIgb2YgdGhlIGhhbmRsZSAqLwogICAgICAgICBocXNwaS0+UnhYZmVyU2l6ZSA9IGhxc3BpLT5SeFhmZXJDb3VudDsKICAgICAgICAgaHFzcGktPnBSeEJ1ZmZQdHIgPSBwRGF0YTsKLSAgICAgICAgCisKICAgICAgICAgLyogU2V0IHRoZSBRU1BJIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwogICAgICAgICBocXNwaS0+aGRtYS0+WGZlckNwbHRDYWxsYmFjayA9IFFTUElfRE1BUnhDcGx0OwotICAgICAgICAKKwogICAgICAgICAvKiBTZXQgdGhlIFFTUEkgRE1BIEhhbGYgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gUVNQSV9ETUFSeEhhbGZDcGx0OwotICAgICAgICAKKwogICAgICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLwogICAgICAgICBocXNwaS0+aGRtYS0+WGZlckVycm9yQ2FsbGJhY2sgPSBRU1BJX0RNQUVycm9yOwotICAgICAgICAKLSAgICAgICAgLyogQ2xlYXIgdGhlIERNQSBhYm9ydCBjYWxsYmFjayAqLyAgICAgIAorCisgICAgICAgIC8qIENsZWFyIHRoZSBETUEgYWJvcnQgY2FsbGJhY2sgKi8KICAgICAgICAgaHFzcGktPmhkbWEtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKLSAgICAgICAgCisKICAgICAgICAgLyogQ29uZmlndXJlIHRoZSBkaXJlY3Rpb24gb2YgdGhlIERNQSAqLwogICAgICAgICBocXNwaS0+aGRtYS0+SW5pdC5EaXJlY3Rpb24gPSBETUFfUEVSSVBIX1RPX01FTU9SWTsKICAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+aGRtYS0+SW5zdGFuY2UtPkNSLCBETUFfU3hDUl9ESVIsIGhxc3BpLT5oZG1hLT5Jbml0LkRpcmVjdGlvbik7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KLSAgICAgICAgdG1wID0gKHVpbnQzMl90KikmcERhdGE7Ci0gICAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHFzcGktPmhkbWEsICh1aW50MzJfdCkmaHFzcGktPkluc3RhbmNlLT5EUiwgKih1aW50MzJfdCopdG1wLCBocXNwaS0+UnhYZmVyU2l6ZSk7Ci0gICAgICAgIAotICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCi0gICAgICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9SRUFEKTsKLSAgICAgICAgCi0gICAgICAgIC8qIFN0YXJ0IHRoZSB0cmFuc2ZlciBieSByZS13cml0aW5nIHRoZSBhZGRyZXNzIGluIEFSIHJlZ2lzdGVyICovCi0gICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkFSLCBhZGRyX3JlZyk7Ci0gICAgICAgIAotICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCi0gICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gICAgICAgIAotICAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgdHJhbnNmZXIgZXJyb3IgSW50ZXJydXB0ICovCi0gICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKLSAgICAgICAgCi0gICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGJ5IHNldHRpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwotICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChocXNwaS0+aGRtYSwgKHVpbnQzMl90KSZocXNwaS0+SW5zdGFuY2UtPkRSLCAodWludDMyX3QpcERhdGEsIGhxc3BpLT5SeFhmZXJTaXplKSA9PSBIQUxfT0spCisgICAgICAgIHsKKyAgICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggZnVuY3Rpb25hbCBhcyBpbmRpcmVjdCByZWFkICovCisgICAgICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgUVVBRFNQSV9DQ1JfRk1PREUsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0lORElSRUNUX1JFQUQpOworCisgICAgICAgICAgLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IHJlLXdyaXRpbmcgdGhlIGFkZHJlc3MgaW4gQVIgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5BUiwgYWRkcl9yZWcpOworCisgICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICAgICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CisgICAgICAgICAgCisgICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGVycm9yIEludGVycnVwdCAqLworICAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RFKTsKKyAgICAgICAgICAKKyAgICAgICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQgaW4gdGhlIFFTUEkgQ1IgcmVnaXN0ZXIgKi8KKyAgICAgICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKKyAgICAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKKworICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX0lOVkFMSURfUEFSQU07CiAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7Ci0gICAgICAKKwogICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhxc3BpKTsKICAgICB9CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7IAotICAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOworCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAgIH0KLSAgCisKICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIFFTUEkgQXV0b21hdGljIFBvbGxpbmcgTW9kZSBpbiBibG9ja2luZyBtb2RlLiAKLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHBhcmFtICBjbWQgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgKiBAcGFyYW0gIGNmZyBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgcG9sbGluZyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAqIEBwYXJhbSAgVGltZW91dCAgVGltZSBvdXQgZHVyYXRpb24KKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIGJsb2NraW5nIG1vZGUuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCisgICogQHBhcmFtICBjbWQgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAqIEBwYXJhbSAgY2ZnIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIHBvbGxpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIFRpbWVvdXQgOiBUaW1lb3V0IGR1cmF0aW9uCiAgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBBdXRvbWF0aWMgUG9sbGluZyBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BdXRvUG9sbGluZyhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcsIHVpbnQzMl90IFRpbWVvdXQpCiB7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTihjbWQtPkluc3RydWN0aW9uKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUREUkVTU19NT0RFKGNtZC0+QWRkcmVzc01vZGUpKTsKICAgaWYgKGNtZC0+QWRkcmVzc01vZGUgIT0gUVNQSV9BRERSRVNTX05PTkUpCiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX1NJWkUoY21kLT5BZGRyZXNzU2l6ZSkpOwogICB9Ci0gIAorCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUpKTsKICAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRFVNTVlfQ1lDTEVTKGNtZC0+RHVtbXlDeWNsZXMpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfREFUQV9NT0RFKGNtZC0+RGF0YU1vZGUpKTsKLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX01PREUoY21kLT5EZHJNb2RlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9ISEMoY21kLT5EZHJIb2xkSGFsZkN5Y2xlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX1NJT09fTU9ERShjbWQtPlNJT09Nb2RlKSk7Ci0gIAorCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOVEVSVkFMKGNmZy0+SW50ZXJ2YWwpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU1RBVFVTX0JZVEVTX1NJWkUoY2ZnLT5TdGF0dXNCeXRlc1NpemUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfTUFUQ0hfTU9ERShjZmctPk1hdGNoTW9kZSkpOwotICAKKwogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhxc3BpKTsKLSAgCisKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7Ci0gICAgCiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX0FVVE9fUE9MTElORzsKLSAgICAKKwogICAgIC8qIFdhaXQgdGlsbCBCVVNZIGZsYWcgcmVzZXQgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKLSAgICAKKwogICAgIGlmIChzdGF0dXMgPT0gSEFMX09LKQogICAgIHsKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQU01BUiByZWdpc3RlciB3aXRoIHRoZSBzdGF0dXMgbWF0Y2ggdmFsdWUgKi8KICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPlBTTUFSLCBjZmctPk1hdGNoKTsKLSAgICAgIAorCiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogUFNNS1IgcmVnaXN0ZXIgd2l0aCB0aGUgc3RhdHVzIG1hc2sgdmFsdWUgKi8KICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPlBTTUtSLCBjZmctPk1hc2spOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQSVIgcmVnaXN0ZXIgd2l0aCB0aGUgaW50ZXJ2YWwgdmFsdWUgKi8KICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPlBJUiwgY2ZnLT5JbnRlcnZhbCk7Ci0gICAgICAKLSAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIE1hdGNoIG1vZGUgYW5kIEF1dG9tYXRpYyBzdG9wIGVuYWJsZWQgCisKKyAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIE1hdGNoIG1vZGUgYW5kIEF1dG9tYXRpYyBzdG9wIGVuYWJsZWQKICAgICAgIChvdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIGJsb2NraW5nIG1vZGUpICovCi0gICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIChRVUFEU1BJX0NSX1BNTSB8IFFVQURTUElfQ1JfQVBNUyksIAorICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCAoUVVBRFNQSV9DUl9QTU0gfCBRVUFEU1BJX0NSX0FQTVMpLAogICAgICAgICAgICAgICAgKGNmZy0+TWF0Y2hNb2RlIHwgUVNQSV9BVVRPTUFUSUNfU1RPUF9FTkFCTEUpKTsKLSAgICAgIAorCiAgICAgICAvKiBDYWxsIHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uICovCiAgICAgICBjbWQtPk5iRGF0YSA9IGNmZy0+U3RhdHVzQnl0ZXNTaXplOwogICAgICAgUVNQSV9Db25maWcoaHFzcGksIGNtZCwgUVNQSV9GVU5DVElPTkFMX01PREVfQVVUT19QT0xMSU5HKTsKLSAgICAgIAorCiAgICAgICAvKiBXYWl0IHVudGlsIFNNIGZsYWcgaXMgc2V0IHRvIGdvIGJhY2sgaW4gaWRsZSBzdGF0ZSAqLwogICAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfU00sIFNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KTsKIAogICAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgICB7CiAgICAgICAgIF9fSEFMX1FTUElfQ0xFQVJfRkxBRyhocXNwaSwgUVNQSV9GTEFHX1NNKTsKLSAgICAgICAgCisKICAgICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwogICAgICAgfQpAQCAtMTYwNyw5NyArMTY0Niw5OCBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogICB9CisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwotICAKKwogICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCi0gIHJldHVybiBzdGF0dXM7ICAKKyAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCi0gICogQGJyaWVmICBDb25maWd1cmUgdGhlIFFTUEkgQXV0b21hdGljIFBvbGxpbmcgTW9kZSBpbiBub24tYmxvY2tpbmcgbW9kZS4gCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQotICAqIEBwYXJhbSAgY21kIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHBhcmFtICBjZmcgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIHBvbGxpbmcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgUVNQSSBBdXRvbWF0aWMgUG9sbGluZyBNb2RlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAgKiBAcGFyYW0gIGNmZyA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBwb2xsaW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCiAgICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpbiBBdXRvbWF0aWMgUG9sbGluZyBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BdXRvUG9sbGluZ19JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCBRU1BJX0NvbW1hbmRUeXBlRGVmICpjbWQsIFFTUElfQXV0b1BvbGxpbmdUeXBlRGVmICpjZmcpCiB7Ci0gIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9FUlJPUjsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICAKKwogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTl9NT0RFKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlKSk7CiAgIGlmIChjbWQtPkluc3RydWN0aW9uTW9kZSAhPSBRU1BJX0lOU1RSVUNUSU9OX05PTkUpCiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9JTlNUUlVDVElPTihjbWQtPkluc3RydWN0aW9uKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfQUREUkVTU19NT0RFKGNtZC0+QWRkcmVzc01vZGUpKTsKICAgaWYgKGNtZC0+QWRkcmVzc01vZGUgIT0gUVNQSV9BRERSRVNTX05PTkUpCiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BRERSRVNTX1NJWkUoY21kLT5BZGRyZXNzU2l6ZSkpOwogICB9Ci0gIAorCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19NT0RFKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUpKTsKICAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKICAgewogICAgIGFzc2VydF9wYXJhbShJU19RU1BJX0FMVEVSTkFURV9CWVRFU19TSVpFKGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplKSk7CiAgIH0KLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRFVNTVlfQ1lDTEVTKGNtZC0+RHVtbXlDeWNsZXMpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfREFUQV9NT0RFKGNtZC0+RGF0YU1vZGUpKTsKLSAgCisKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfRERSX01PREUoY21kLT5EZHJNb2RlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0REUl9ISEMoY21kLT5EZHJIb2xkSGFsZkN5Y2xlKSk7CiAgIGFzc2VydF9wYXJhbShJU19RU1BJX1NJT09fTU9ERShjbWQtPlNJT09Nb2RlKSk7Ci0gIAorCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOVEVSVkFMKGNmZy0+SW50ZXJ2YWwpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU1RBVFVTX0JZVEVTX1NJWkUoY2ZnLT5TdGF0dXNCeXRlc1NpemUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfTUFUQ0hfTU9ERShjZmctPk1hdGNoTW9kZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9BVVRPTUFUSUNfU1RPUChjZmctPkF1dG9tYXRpY1N0b3ApKTsKLSAgCisKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhocXNwaSk7Ci0gIAorCiAgIGlmKGhxc3BpLT5TdGF0ZSA9PSBIQUxfUVNQSV9TVEFURV9SRUFEWSkKICAgewogICAgIGhxc3BpLT5FcnJvckNvZGUgPSBIQUxfUVNQSV9FUlJPUl9OT05FOwotICAgIAorCiAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgaHFzcGktPlN0YXRlID0gSEFMX1FTUElfU1RBVEVfQlVTWV9BVVRPX1BPTExJTkc7Ci0gICAgCisKICAgICAvKiBXYWl0IHRpbGwgQlVTWSBmbGFnIHJlc2V0ICovCiAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOwotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBTTUFSIHJlZ2lzdGVyIHdpdGggdGhlIHN0YXR1cyBtYXRjaCB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNQVIsIGNmZy0+TWF0Y2gpOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBQU01LUiByZWdpc3RlciB3aXRoIHRoZSBzdGF0dXMgbWFzayB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UFNNS1IsIGNmZy0+TWFzayk7Ci0gICAgICAKKwogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IFBJUiByZWdpc3RlciB3aXRoIHRoZSBpbnRlcnZhbCB2YWx1ZSAqLwogICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+UElSLCBjZmctPkludGVydmFsKTsKLSAgICAgIAorCiAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ1IgcmVnaXN0ZXIgd2l0aCBNYXRjaCBtb2RlIGFuZCBBdXRvbWF0aWMgc3RvcCBtb2RlICovCi0gICAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIChRVUFEU1BJX0NSX1BNTSB8IFFVQURTUElfQ1JfQVBNUyksIAorICAgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCAoUVVBRFNQSV9DUl9QTU0gfCBRVUFEU1BJX0NSX0FQTVMpLAogICAgICAgICAgICAgICAgKGNmZy0+TWF0Y2hNb2RlIHwgY2ZnLT5BdXRvbWF0aWNTdG9wKSk7Ci0gICAgICAKKwogICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19URSB8IFFTUElfRkxBR19TTSk7Ci0gICAgICAKKwogICAgICAgLyogQ2FsbCB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbiAqLwogICAgICAgY21kLT5OYkRhdGEgPSBjZmctPlN0YXR1c0J5dGVzU2l6ZTsKICAgICAgIFFTUElfQ29uZmlnKGhxc3BpLCBjbWQsIFFTUElfRlVOQ1RJT05BTF9NT0RFX0FVVE9fUE9MTElORyk7CiAKICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gIAorCiAgICAgICAvKiBFbmFibGUgdGhlIFFTUEkgVHJhbnNmZXIgRXJyb3IgYW5kIHN0YXR1cyBtYXRjaCBJbnRlcnJ1cHQgKi8KICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCAoUVNQSV9JVF9TTSB8IFFTUElfSVRfVEUpKTsKIApAQCAtMTcxMCwyOSArMTc1MCwyOSBAQAogICB9CiAgIGVsc2UKICAgewotICAgIHN0YXR1cyA9IEhBTF9CVVNZOyAgIAorICAgIHN0YXR1cyA9IEhBTF9CVVNZOwogCiAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhocXNwaSk7CiAgIH0KLSAgCisKICAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwotICByZXR1cm4gc3RhdHVzOyAgCisgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKgotICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBNZW1vcnkgTWFwcGVkIG1vZGUuIAotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gIGNtZCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAqIEBwYXJhbSAgY2ZnIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBtZW1vcnkgbWFwcGVkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQGJyaWVmICBDb25maWd1cmUgdGhlIE1lbW9yeSBNYXBwZWQgbW9kZS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIGNtZCA6IHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisgICogQHBhcmFtICBjZmcgOiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgbWVtb3J5IG1hcHBlZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgogICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgaW4gTWVtb3J5IG1hcHBlZCBNb2RlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9NZW1vcnlNYXBwZWQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgUVNQSV9Db21tYW5kVHlwZURlZiAqY21kLCBRU1BJX01lbW9yeU1hcHBlZFR5cGVEZWYgKmNmZykKIHsKLSAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX0VSUk9SOworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXM7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAorCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19RU1BJX0lOU1RSVUNUSU9OX01PREUoY21kLT5JbnN0cnVjdGlvbk1vZGUpKTsKICAgaWYgKGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlICE9IFFTUElfSU5TVFJVQ1RJT05fTk9ORSkKQEAgLTE3NjAsMjAgKzE4MDAsMjAgQEAKICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfU0lPT19NT0RFKGNtZC0+U0lPT01vZGUpKTsKIAogICBhc3NlcnRfcGFyYW0oSVNfUVNQSV9USU1FT1VUX0FDVElWQVRJT04oY2ZnLT5UaW1lT3V0QWN0aXZhdGlvbikpOwotICAKKwogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhxc3BpKTsKLSAgCisKICAgaWYoaHFzcGktPlN0YXRlID09IEhBTF9RU1BJX1NUQVRFX1JFQURZKQogICB7CiAgICAgaHFzcGktPkVycm9yQ29kZSA9IEhBTF9RU1BJX0VSUk9SX05PTkU7Ci0gICAgCisKICAgICAvKiBVcGRhdGUgc3RhdGUgKi8KICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9CVVNZX01FTV9NQVBQRUQ7Ci0gICAgCisKICAgICAvKiBXYWl0IHRpbGwgQlVTWSBmbGFnIHJlc2V0ICovCiAgICAgc3RhdHVzID0gUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KGhxc3BpLCBRU1BJX0ZMQUdfQlVTWSwgUkVTRVQsIHRpY2tzdGFydCwgaHFzcGktPlRpbWVvdXQpOwotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggdGltZW91dCBjb3VudGVyIGVuYWJsZSAqLwpAQCAtMTc4Miw1MSArMTgyMiw1MSBAQAogICAgIGlmIChjZmctPlRpbWVPdXRBY3RpdmF0aW9uID09IFFTUElfVElNRU9VVF9DT1VOVEVSX0VOQUJMRSkKICAgICAgIHsKICAgICAgICAgYXNzZXJ0X3BhcmFtKElTX1FTUElfVElNRU9VVF9QRVJJT0QoY2ZnLT5UaW1lT3V0UGVyaW9kKSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBMUFRSIHJlZ2lzdGVyIHdpdGggdGhlIGxvdy1wb3dlciB0aW1lb3V0IHZhbHVlICovCiAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkxQVFIsIGNmZy0+VGltZU91dFBlcmlvZCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIENsZWFyIGludGVycnVwdCAqLwogICAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UTyk7CiAKICAgICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIFRpbWVPdXQgSW50ZXJydXB0ICovCiAgICAgICAgIF9fSEFMX1FTUElfRU5BQkxFX0lUKGhxc3BpLCBRU1BJX0lUX1RPKTsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvKiBDYWxsIHRoZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uICovCiAgICAgICBRU1BJX0NvbmZpZyhocXNwaSwgY21kLCBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEKTsKICAgICB9CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAgIH0KIAogICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhocXNwaSk7Ci0gIAorCiAgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KLSAgcmV0dXJuIHN0YXR1czsgIAorICByZXR1cm4gc3RhdHVzOwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFRyYW5zZmVyIEVycm9yIGNhbGxiYWNrcwotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAYnJpZWYgIFRyYW5zZmVyIEVycm9yIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfRXJyb3JDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9RU1BJX0Vycm9yQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KIAogLyoqCiAgICogQGJyaWVmICBBYm9ydCBjb21wbGV0ZWQgY2FsbGJhY2suCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfQWJvcnRDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKQEAgLTE4NDEsMTIwICsxODgxLDEyMCBAQAogCiAvKioKICAgKiBAYnJpZWYgIENvbW1hbmQgY29tcGxldGVkIGNhbGxiYWNrLgotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9RU1BJX0NtZENwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9RU1BJX0NtZENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfUnhDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKLSAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9SeENwbHRDYWxsYmFjayBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotIF9fd2VhayB2b2lkIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCitfX3dlYWsgdm9pZCBIQUxfUVNQSV9UeENwbHRDYWxsYmFjayhRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChocXNwaSk7Ci0gIAotICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1R4Q3BsdENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovIAorICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBSeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9SeEhhbGZDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKLSAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9SeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBUeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFja3MuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi0gX193ZWFrIHZvaWQgSEFMX1FTUElfVHhIYWxmQ3BsdENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCitfX3dlYWsgdm9pZCBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKLSAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9UeEhhbGZDcGx0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQotICAgKi8gCisgICAqLwogfQogCiAvKioKLSAgKiBAYnJpZWYgIEZJRk8gVGhyZXNob2xkIGNhbGxiYWNrcwotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAYnJpZWYgIEZJRk8gVGhyZXNob2xkIGNhbGxiYWNrLgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1FTUElfRmlmb1RocmVzaG9sZENhbGxiYWNrKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGkpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhxc3BpKTsKLSAgCi0gIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIFNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKKworICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX1FTUElfRklGT1RocmVzaG9sZENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCiB9CiAKIC8qKgotICAqIEBicmllZiAgU3RhdHVzIE1hdGNoIGNhbGxiYWNrcwotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAYnJpZWYgIFN0YXR1cyBNYXRjaCBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9RU1BJX1N0YXR1c01hdGNoQ2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAgIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9RU1BJX1N0YXR1c01hdGNoQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KIAogLyoqCi0gICogQGJyaWVmICBUaW1lb3V0IGNhbGxiYWNrcwotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyAgKiBAYnJpZWYgIFRpbWVvdXQgY2FsbGJhY2suCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2soUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHFzcGkpOwotICAKLSAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gU2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorCisgIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgIHRoZSBIQUxfUVNQSV9UaW1lT3V0Q2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KQEAgLTIxODQsMjYgKzIyMjQsMjcgQEAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucyAKLSAgKiAgQGJyaWVmICAgUVNQSSBjb250cm9sIGFuZCBTdGF0ZSBmdW5jdGlvbnMgCisvKiogQGRlZmdyb3VwIFFTUElfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucworICAqICBAYnJpZWYgICBRU1BJIGNvbnRyb2wgYW5kIFN0YXRlIGZ1bmN0aW9ucwogICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBhbmQgU3RhdGUgZnVuY3Rpb25zICMjIyMjCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0KICAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIDoKLSAgICAgICgrKSBDaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIGRyaXZlci4gCisgICAgICAoKykgQ2hlY2sgaW4gcnVuLXRpbWUgdGhlIHN0YXRlIG9mIHRoZSBkcml2ZXIuCiAgICAgICAoKykgQ2hlY2sgdGhlIGVycm9yIGNvZGUgc2V0IGR1cmluZyBsYXN0IG9wZXJhdGlvbi4KICAgICAgICgrKSBBYm9ydCBhbnkgb3BlcmF0aW9uLgotLi4uLi4gICAKKworCiBAZW5kdmVyYmF0aW0KICAgKiBAewogICAqLwogCiAvKioKICAgKiBAYnJpZWYgIFJldHVybiB0aGUgUVNQSSBoYW5kbGUgc3RhdGUuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogICAqIEByZXR2YWwgSEFMIHN0YXRlCiAgICovCiBIQUxfUVNQSV9TdGF0ZVR5cGVEZWYgSEFMX1FTUElfR2V0U3RhdGUoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKQEAgLTIyMTMsOCArMjI1NCw4IEBACiB9CiAKIC8qKgotKiBAYnJpZWYgIFJldHVybiB0aGUgUVNQSSBlcnJvciBjb2RlCi0qIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyogQGJyaWVmICBSZXR1cm4gdGhlIFFTUEkgZXJyb3IgY29kZS4KKyogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlCiAqIEByZXR2YWwgUVNQSSBFcnJvciBDb2RlCiAqLwogdWludDMyX3QgSEFMX1FTUElfR2V0RXJyb3IoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKQEAgLTIyMjMsNTAgKzIyNjQsNTMgQEAKIH0KIAogLyoqCi0qIEBicmllZiAgQWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNtaXNzaW9uCi0qIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKKyogQGJyaWVmICBBYm9ydCB0aGUgY3VycmVudCB0cmFuc21pc3Npb24uCisqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogKiBAcmV0dmFsIEhBTCBzdGF0dXMKICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BYm9ydChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIAorCiAgIC8qIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBpbiBvbmUgb2YgdGhlIGJ1c3kgc3RhdGVzICovCi0gIGlmICgoaHFzcGktPlN0YXRlICYgMHgyKSAhPSAwKQorICBpZiAoKCh1aW50MzJfdClocXNwaS0+U3RhdGUgJiAweDJVKSAhPSAwVSkKICAgewogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCi0gICAgaWYgKChocXNwaS0+SW5zdGFuY2UtPkNSICYgUVVBRFNQSV9DUl9ETUFFTikhPSBSRVNFVCkKKyAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSAhPSAwVSkKICAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwogICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOwotICAgICAgCisKICAgICAgIC8qIEFib3J0IERNQSBjaGFubmVsICovCiAgICAgICBzdGF0dXMgPSBIQUxfRE1BX0Fib3J0KGhxc3BpLT5oZG1hKTsKICAgICAgIGlmKHN0YXR1cyAhPSBIQUxfT0spCiAgICAgICB7CiAgICAgICAgIGhxc3BpLT5FcnJvckNvZGUgfD0gSEFMX1FTUElfRVJST1JfRE1BOwogICAgICAgfQotICAgIH0gIAotICAgIAorICAgIH0KKwogICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIEFib3J0IHJlcXVlc3QgKi8KICAgICBTRVRfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfQUJPUlQpOwotICAgIAorCiAgICAgLyogV2FpdCB1bnRpbCBUQyBmbGFnIGlzIHNldCB0byBnbyBiYWNrIGluIGlkbGUgc3RhdGUgKi8KICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19UQywgU0VULCB0aWNrc3RhcnQsIGhxc3BpLT5UaW1lb3V0KTsKIAotICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spCisgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgewogICAgICAgX19IQUxfUVNQSV9DTEVBUl9GTEFHKGhxc3BpLCBRU1BJX0ZMQUdfVEMpOwotICAgICAgCisKICAgICAgIC8qIFdhaXQgdW50aWwgQlVTWSBmbGFnIGlzIHJlc2V0ICovCiAgICAgICBzdGF0dXMgPSBRU1BJX1dhaXRGbGFnU3RhdGVVbnRpbFRpbWVvdXQoaHFzcGksIFFTUElfRkxBR19CVVNZLCBSRVNFVCwgdGlja3N0YXJ0LCBocXNwaS0+VGltZW91dCk7CiAgICAgfQotICAgIAorCiAgICAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgICAgeworICAgICAgLyogUmVzZXQgZnVuY3Rpb25hbCBtb2RlIGNvbmZpZ3VyYXRpb24gdG8gaW5kaXJlY3Qgd3JpdGUgbW9kZSBieSBkZWZhdWx0ICovCisgICAgICBDTEVBUl9CSVQoaHFzcGktPkluc3RhbmNlLT5DQ1IsIFFVQURTUElfQ0NSX0ZNT0RFKTsKKwogICAgICAgLyogVXBkYXRlIHN0YXRlICovCiAgICAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9SRUFEWTsKICAgICB9CkBAIC0yMjc3LDMwICsyMzIxLDMwIEBACiAKIC8qKgogKiBAYnJpZWYgIEFib3J0IHRoZSBjdXJyZW50IHRyYW5zbWlzc2lvbiAobm9uLWJsb2NraW5nIGZ1bmN0aW9uKQotKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCisqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQogKiBAcmV0dmFsIEhBTCBzdGF0dXMKICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9BYm9ydF9JVChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7Ci0gIAorCiAgIC8qIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBpbiBvbmUgb2YgdGhlIGJ1c3kgc3RhdGVzICovCi0gIGlmICgoaHFzcGktPlN0YXRlICYgMHgyKSAhPSAwKQorICBpZiAoKCh1aW50MzJfdClocXNwaS0+U3RhdGUgJiAweDJVKSAhPSAwVSkKICAgewogICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHFzcGkpOwotICAgIAorCiAgICAgLyogVXBkYXRlIFFTUEkgc3RhdGUgKi8KLSAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9BQk9SVDsgICAKLSAgICAKKyAgICBocXNwaS0+U3RhdGUgPSBIQUxfUVNQSV9TVEFURV9BQk9SVDsKKwogICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KICAgICBfX0hBTF9RU1BJX0RJU0FCTEVfSVQoaHFzcGksIChRU1BJX0lUX1RPIHwgUVNQSV9JVF9TTSB8IFFTUElfSVRfRlQgfCBRU1BJX0lUX1RDIHwgUVNQSV9JVF9URSkpOwotICAgIAotICAgIGlmICgoaHFzcGktPkluc3RhbmNlLT5DUiAmIFFVQURTUElfQ1JfRE1BRU4pIT0gUkVTRVQpCisKKyAgICBpZiAoKGhxc3BpLT5JbnN0YW5jZS0+Q1IgJiBRVUFEU1BJX0NSX0RNQUVOKSAhPSAwVSkKICAgICB7CiAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwogICAgICAgQ0xFQVJfQklUKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRE1BRU4pOwotICAgICAgCisKICAgICAgIC8qIEFib3J0IERNQSBjaGFubmVsICovCiAgICAgICBocXNwaS0+aGRtYS0+WGZlckFib3J0Q2FsbGJhY2sgPSBRU1BJX0RNQUFib3J0Q3BsdDsKICAgICAgIGlmIChIQUxfRE1BX0Fib3J0X0lUKGhxc3BpLT5oZG1hKSAhPSBIQUxfT0spCkBAIC0yMzIwLDIxICsyMzY0LDIwIEBACiAgICAgewogICAgICAgLyogQ2xlYXIgaW50ZXJydXB0ICovCiAgICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UQyk7Ci0gICAgICAKKwogICAgICAgLyogRW5hYmxlIHRoZSBRU1BJIFRyYW5zZmVyIENvbXBsZXRlIEludGVycnVwdCAqLwogICAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOwotICAgICAgCisKICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDUiByZWdpc3RlciB3aXRoIEFib3J0IHJlcXVlc3QgKi8KICAgICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9BQk9SVCk7CiAgICAgfQogICB9Ci0KICAgcmV0dXJuIHN0YXR1czsKIH0KIAotLyoqIEBicmllZiBTZXQgUVNQSSB0aW1lb3V0Ci0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZS4KLSAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBmb3IgdGhlIFFTUEkgbWVtb3J5IGFjY2Vzcy4KKy8qKiBAYnJpZWYgU2V0IFFTUEkgdGltZW91dC4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUuCisgICogQHBhcmFtICBUaW1lb3V0IDogVGltZW91dCBmb3IgdGhlIFFTUEkgbWVtb3J5IGFjY2Vzcy4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX1FTUElfU2V0VGltZW91dChRU1BJX0hhbmRsZVR5cGVEZWYgKmhxc3BpLCB1aW50MzJfdCBUaW1lb3V0KQpAQCAtMjM0Myw4ICsyMzg2LDggQEAKIH0KIAogLyoqIEBicmllZiBTZXQgUVNQSSBGaWZvIHRocmVzaG9sZC4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlLgotICAqIEBwYXJhbSAgVGhyZXNob2xkIFRocmVzaG9sZCBvZiB0aGUgRmlmbyAodmFsdWUgYmV0d2VlbiAxIGFuZCAxNikuCisgICogQHBhcmFtICBocXNwaSA6IFFTUEkgaGFuZGxlLgorICAqIEBwYXJhbSAgVGhyZXNob2xkIDogVGhyZXNob2xkIG9mIHRoZSBGaWZvICh2YWx1ZSBiZXR3ZWVuIDEgYW5kIDE2KS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9RU1BJX1NldEZpZm9UaHJlc2hvbGQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSwgdWludDMyX3QgVGhyZXNob2xkKQpAQCAtMjM1OCwxNiArMjQwMSwxNiBAQAogICB7CiAgICAgLyogU3luY2hyb25pemUgaW5pdCBzdHJ1Y3R1cmUgd2l0aCBuZXcgRklGTyB0aHJlc2hvbGQgdmFsdWUgKi8KICAgICBocXNwaS0+SW5pdC5GaWZvVGhyZXNob2xkID0gVGhyZXNob2xkOwotICAgIAorCiAgICAgLyogQ29uZmlndXJlIFFTUEkgRklGTyBUaHJlc2hvbGQgKi8KLSAgICBNT0RJRllfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q1IsIFFVQURTUElfQ1JfRlRIUkVTLCAKLSAgICAgICAgICAgICAgICgoaHFzcGktPkluaXQuRmlmb1RocmVzaG9sZCAtIDEpIDw8IFFVQURTUElfQ1JfRlRIUkVTX1BvcykpOworICAgIE1PRElGWV9SRUcoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMsCisgICAgICAgICAgICAgICAoKGhxc3BpLT5Jbml0LkZpZm9UaHJlc2hvbGQgLSAxVSkgPDwgUVVBRFNQSV9DUl9GVEhSRVNfUG9zKSk7CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3RhdHVzID0gSEFMX0JVU1k7ICAgCisgICAgc3RhdHVzID0gSEFMX0JVU1k7CiAgIH0KLSAgCisKICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHFzcGkpOwogCkBAIC0yMzc2LDU2ICsyNDE5LDk5IEBACiB9CiAKIC8qKiBAYnJpZWYgR2V0IFFTUEkgRmlmbyB0aHJlc2hvbGQuCi0gICogQHBhcmFtICBocXNwaSBRU1BJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIGhxc3BpIDogUVNQSSBoYW5kbGUuCiAgICogQHJldHZhbCBGaWZvIHRocmVzaG9sZCAodmFsdWUgYmV0d2VlbiAxIGFuZCAxNikKICAgKi8KIHVpbnQzMl90IEhBTF9RU1BJX0dldEZpZm9UaHJlc2hvbGQoUVNQSV9IYW5kbGVUeXBlRGVmICpocXNwaSkKIHsKLSAgcmV0dXJuICgoUkVBRF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMpID4+IFFVQURTUElfQ1JfRlRIUkVTX1BvcykgKyAxKTsKKyAgcmV0dXJuICgoUkVBRF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9GVEhSRVMpID4+IFFVQURTUElfQ1JfRlRIUkVTX1BvcykgKyAxVSk7Cit9CisKKy8qKiBAYnJpZWYgIFNldCBGbGFzaElELgorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZS4KKyAgKiBAcGFyYW0gIEZsYXNoSUQgOiBJbmRleCBvZiB0aGUgZmxhc2ggbWVtb3J5IHRvIGJlIGFjY2Vzc2VkLgorICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhIHZhbHVlIG9mIEByZWYgUVNQSV9GbGFzaF9TZWxlY3QuCisgICogQG5vdGUgICBUaGUgRmxhc2hJRCBpcyBpZ25vcmVkIHdoZW4gZHVhbCBmbGFzaCBtb2RlIGlzIGVuYWJsZWQuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfUVNQSV9TZXRGbGFzaElEKFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYXNoSUQpCit7CisgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKKworICAvKiBDaGVjayB0aGUgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19RU1BJX0ZMQVNIX0lEKEZsYXNoSUQpKTsKKworICAvKiBQcm9jZXNzIGxvY2tlZCAqLworICBfX0hBTF9MT0NLKGhxc3BpKTsKKworICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBTeW5jaHJvbml6ZSBpbml0IHN0cnVjdHVyZSB3aXRoIG5ldyBGbGFzaElEIHZhbHVlICovCisgICAgaHFzcGktPkluaXQuRmxhc2hJRCA9IEZsYXNoSUQ7CisKKyAgICAvKiBDb25maWd1cmUgUVNQSSBGbGFzaElEICovCisgICAgTU9ESUZZX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0ZTRUwsIEZsYXNoSUQpOworICB9CisgIGVsc2UKKyAgeworICAgIHN0YXR1cyA9IEhBTF9CVVNZOworICB9CisKKyAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLworICBfX0hBTF9VTkxPQ0soaHFzcGkpOworCisgIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KKyAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCiAgICogQH0KICAgKi8KIAotLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAKIC8qKgotICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLiAKLSAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEB9CisgICovCisKKy8qKiBAZGVmZ3JvdXAgUVNQSV9Qcml2YXRlX0Z1bmN0aW9ucyBRU1BJIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKworLyoqCisgICogQGJyaWVmICBETUEgUVNQSSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgUVNQSV9ETUFSeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAKK3N0YXRpYyB2b2lkIFFTUElfRE1BUnhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKCBRU1BJX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKLSAgaHFzcGktPlJ4WGZlckNvdW50ID0gMDsKLSAgCisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKyAgaHFzcGktPlJ4WGZlckNvdW50ID0gMFU7CisKICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCAqLwogICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UQyk7CiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIFFTUEkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4gCi0gICogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKKyAgKiBAYnJpZWYgIERNQSBRU1BJIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgUVNQSV9ETUFUeENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgICAKK3N0YXRpYyB2b2lkIFFTUElfRE1BVHhDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKCBRU1BJX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKLSAgaHFzcGktPlR4WGZlckNvdW50ID0gMDsKLSAgCisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoaGRtYS0+UGFyZW50KTsKKyAgaHFzcGktPlR4WGZlckNvdW50ID0gMFU7CisKICAgLyogRW5hYmxlIHRoZSBRU1BJIHRyYW5zZmVyIGNvbXBsZXRlIEludGVycnVwdCAqLwogICBfX0hBTF9RU1BJX0VOQUJMRV9JVChocXNwaSwgUVNQSV9JVF9UQyk7CiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIFFTUEkgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgCi0gICogQHBhcmFtICBoZG1hICBETUEgaGFuZGxlCisgICogQGJyaWVmICBETUEgUVNQSSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4KKyAgKiBAcGFyYW0gIGhkbWEgOiBETUEgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBzdGF0aWMgdm9pZCBRU1BJX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCiB7Ci0gIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoUVNQSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OworICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKGhkbWEtPlBhcmVudCk7CiAKICNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICBocXNwaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhxc3BpKTsKQEAgLTI0MzUsMTMgKzI1MjEsMTMgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBETUEgUVNQSSB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgCi0gICogQHBhcmFtICBoZG1hICBETUEgaGFuZGxlCisgICogQGJyaWVmICBETUEgUVNQSSB0cmFuc21pdCBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIHZvaWQgUVNQSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKFFTUElfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsKKyAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9IChRU1BJX0hhbmRsZVR5cGVEZWYqKShoZG1hLT5QYXJlbnQpOwogCiAjaWYgKFVTRV9IQUxfUVNQSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgaHFzcGktPlR4SGFsZkNwbHRDYWxsYmFjayhocXNwaSk7CkBAIC0yNDUyLDQ5ICsyNTM4LDUwIEBACiAKIC8qKgogICAqIEBicmllZiAgRE1BIFFTUEkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4KLSAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEBwYXJhbSAgaGRtYSA6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyB2b2lkIFFTUElfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCitzdGF0aWMgdm9pZCBRU1BJX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewotICBRU1BJX0hhbmRsZVR5cGVEZWYqIGhxc3BpID0gKCBRU1BJX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKLSAgCisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoIFFTUElfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOworCiAgIC8qIGlmIERNQSBlcnJvciBpcyBGSUZPIGVycm9yIGlnbm9yZSBpdCAqLwogICBpZihIQUxfRE1BX0dldEVycm9yKGhkbWEpICE9IEhBTF9ETUFfRVJST1JfRkUpCiAgIHsKLSAgICBocXNwaS0+UnhYZmVyQ291bnQgPSAwOwotICAgIGhxc3BpLT5UeFhmZXJDb3VudCA9IDA7Ci0gICAgaHFzcGktPkVycm9yQ29kZSAgIHw9IEhBTF9RU1BJX0VSUk9SX0RNQTsKLSAgICAKLSAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgYnkgY2xlYXJpbmcgdGhlIERNQUVOIGJpdCBpbiB0aGUgUVNQSSBDUiByZWdpc3RlciAqLwotICAgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKLSAgICAKLSAgICAvKiBBYm9ydCB0aGUgUVNQSSAqLwotICAgIEhBTF9RU1BJX0Fib3J0X0lUKGhxc3BpKTsKKyAgaHFzcGktPlJ4WGZlckNvdW50ID0gMFU7CisgIGhxc3BpLT5UeFhmZXJDb3VudCA9IDBVOworICBocXNwaS0+RXJyb3JDb2RlICAgfD0gSEFMX1FTUElfRVJST1JfRE1BOworCisgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBieSBjbGVhcmluZyB0aGUgRE1BRU4gYml0IGluIHRoZSBRU1BJIENSIHJlZ2lzdGVyICovCisgIENMRUFSX0JJVChocXNwaS0+SW5zdGFuY2UtPkNSLCBRVUFEU1BJX0NSX0RNQUVOKTsKKworICAvKiBBYm9ydCB0aGUgUVNQSSAqLworICAodm9pZClIQUxfUVNQSV9BYm9ydF9JVChocXNwaSk7CisKICAgfQogfQogCiAvKioKICAgKiBAYnJpZWYgIERNQSBRU1BJIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrLgotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQHBhcmFtICBoZG1hIDogRE1BIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIHZvaWQgUVNQSV9ETUFBYm9ydENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCitzdGF0aWMgdm9pZCBRU1BJX0RNQUFib3J0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKLSAgUVNQSV9IYW5kbGVUeXBlRGVmKiBocXNwaSA9ICggUVNQSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7CisgIFFTUElfSGFuZGxlVHlwZURlZiogaHFzcGkgPSAoIFFTUElfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOwogCi0gIGhxc3BpLT5SeFhmZXJDb3VudCA9IDA7Ci0gIGhxc3BpLT5UeFhmZXJDb3VudCA9IDA7CisgIGhxc3BpLT5SeFhmZXJDb3VudCA9IDBVOworICBocXNwaS0+VHhYZmVyQ291bnQgPSAwVTsKIAogICBpZihocXNwaS0+U3RhdGUgPT0gSEFMX1FTUElfU1RBVEVfQUJPUlQpCiAgIHsKICAgICAvKiBETUEgQWJvcnQgY2FsbGVkIGJ5IFFTUEkgYWJvcnQgKi8KICAgICAvKiBDbGVhciBpbnRlcnJ1cHQgKi8KICAgICBfX0hBTF9RU1BJX0NMRUFSX0ZMQUcoaHFzcGksIFFTUElfRkxBR19UQyk7Ci0gICAgCisKICAgICAvKiBFbmFibGUgdGhlIFFTUEkgVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0ICovCiAgICAgX19IQUxfUVNQSV9FTkFCTEVfSVQoaHFzcGksIFFTUElfSVRfVEMpOwotICAgIAorCiAgICAgLyogQ29uZmlndXJlIFFTUEk6IENSIHJlZ2lzdGVyIHdpdGggQWJvcnQgcmVxdWVzdCAqLwogICAgIFNFVF9CSVQoaHFzcGktPkluc3RhbmNlLT5DUiwgUVVBRFNQSV9DUl9BQk9SVCk7CiAgIH0KQEAgLTI1MDMsNyArMjU5MCw3IEBACiAgICAgLyogRE1BIEFib3J0IGNhbGxlZCBkdWUgdG8gYSB0cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQgKi8KICAgICAvKiBDaGFuZ2Ugc3RhdGUgb2YgUVNQSSAqLwogICAgIGhxc3BpLT5TdGF0ZSA9IEhBTF9RU1BJX1NUQVRFX1JFQURZOwotICAgIAorCiAgICAgLyogRXJyb3IgY2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9RU1BJX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgIGhxc3BpLT5FcnJvckNhbGxiYWNrKGhxc3BpKTsKQEAgLTI1MTUsMjcgKzI2MDIsMjcgQEAKIAogLyoqCiAgICogQGJyaWVmICBXYWl0IGZvciBhIGZsYWcgc3RhdGUgdW50aWwgdGltZW91dC4KLSAgKiBAcGFyYW0gIGhxc3BpIFFTUEkgaGFuZGxlCi0gICogQHBhcmFtICBGbGFnIEZsYWcgY2hlY2tlZAotICAqIEBwYXJhbSAgU3RhdGUgVmFsdWUgb2YgdGhlIGZsYWcgZXhwZWN0ZWQKLSAgKiBAcGFyYW0gIHRpY2tzdGFydCBTdGFydCB0aWNrIHZhbHVlCi0gICogQHBhcmFtICBUaW1lb3V0IER1cmF0aW9uIG9mIHRoZSB0aW1lIG91dAorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgRmxhZyA6IEZsYWcgY2hlY2tlZAorICAqIEBwYXJhbSAgU3RhdGUgOiBWYWx1ZSBvZiB0aGUgZmxhZyBleHBlY3RlZAorICAqIEBwYXJhbSAgVGlja3N0YXJ0IDogVGljayBzdGFydCB2YWx1ZQorICAqIEBwYXJhbSAgVGltZW91dCA6IER1cmF0aW9uIG9mIHRoZSB0aW1lb3V0CiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnU3RhdHVzIFN0YXRlLCB1aW50MzJfdCB0aWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgUVNQSV9XYWl0RmxhZ1N0YXRlVW50aWxUaW1lb3V0KFFTUElfSGFuZGxlVHlwZURlZiAqaHFzcGksIHVpbnQzMl90IEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdTdGF0dXMgU3RhdGUsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKIHsKLSAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIGluIGV4cGVjdGVkIHN0YXRlICovICAgIAotICB3aGlsZSgoRmxhZ1N0YXR1cykoX19IQUxfUVNQSV9HRVRfRkxBRyhocXNwaSwgRmxhZykpICE9IFN0YXRlKQorICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgaW4gZXhwZWN0ZWQgc3RhdGUgKi8KKyAgd2hpbGUoKF9fSEFMX1FTUElfR0VUX0ZMQUcoaHFzcGksIEZsYWcpKSAhPSBTdGF0ZSkKICAgewogICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgewotICAgICAgaWYoKFRpbWVvdXQgPT0gMCkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQorICAgICAgaWYoKChIQUxfR2V0VGljaygpIC0gVGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgIHsKICAgICAgICAgaHFzcGktPlN0YXRlICAgICA9IEhBTF9RU1BJX1NUQVRFX0VSUk9SOwogICAgICAgICBocXNwaS0+RXJyb3JDb2RlIHw9IEhBTF9RU1BJX0VSUk9SX1RJTUVPVVQ7Ci0gICAgICAgIAorCiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQpAQCAtMjU0NSw5ICsyNjMyLDkgQEAKIAogLyoqCiAgICogQGJyaWVmICBDb25maWd1cmUgdGhlIGNvbW11bmljYXRpb24gcmVnaXN0ZXJzLgotICAqIEBwYXJhbSAgaHFzcGkgUVNQSSBoYW5kbGUKLSAgKiBAcGFyYW0gIGNtZCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0gICogQHBhcmFtICBGdW5jdGlvbmFsTW9kZSBmdW5jdGlvbmFsIG1vZGUgdG8gY29uZmlndXJlZAorICAqIEBwYXJhbSAgaHFzcGkgOiBRU1BJIGhhbmRsZQorICAqIEBwYXJhbSAgY21kIDogc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgorICAqIEBwYXJhbSAgRnVuY3Rpb25hbE1vZGUgOiBmdW5jdGlvbmFsIG1vZGUgdG8gY29uZmlndXJlZAogICAqICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9XUklURTogSW5kaXJlY3Qgd3JpdGUgbW9kZQogICAqICAgICAgICAgICAgQGFyZyBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9JTkRJUkVDVF9SRUFEOiBJbmRpcmVjdCByZWFkIG1vZGUKQEAgLTI1NjIsOSArMjY0OSw5IEBACiAgIGlmICgoY21kLT5EYXRhTW9kZSAhPSBRU1BJX0RBVEFfTk9ORSkgJiYgKEZ1bmN0aW9uYWxNb2RlICE9IFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpKQogICB7CiAgICAgLyogQ29uZmlndXJlIFFTUEk6IERMUiByZWdpc3RlciB3aXRoIHRoZSBudW1iZXIgb2YgZGF0YSB0byByZWFkIG9yIHdyaXRlICovCi0gICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSLCAoY21kLT5OYkRhdGEgLSAxKSk7CisgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+RExSLCAoY21kLT5OYkRhdGEgLSAxVSkpOwogICB9Ci0gICAgICAKKwogICBpZiAoY21kLT5JbnN0cnVjdGlvbk1vZGUgIT0gUVNQSV9JTlNUUlVDVElPTl9OT05FKQogICB7CiAgICAgaWYgKGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgIT0gUVNQSV9BTFRFUk5BVEVfQllURVNfTk9ORSkKQEAgLTI1NzcsOSArMjY2NCwxMCBAQAogICAgICAgICAvKi0tLS0gQ29tbWFuZCB3aXRoIGluc3RydWN0aW9uLCBhZGRyZXNzIGFuZCBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPkRkckhvbGRIYWxmQ3ljbGUgfCBjbWQtPlNJT09Nb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IDE4KSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKIAogICAgICAgICBpZiAoRnVuY3Rpb25hbE1vZGUgIT0gUVNQSV9GVU5DVElPTkFMX01PREVfTUVNT1JZX01BUFBFRCkKICAgICAgICAgewpAQCAtMjU5Miw4ICsyNjgwLDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBpbnN0cnVjdGlvbiBhbmQgYWx0ZXJuYXRlIGJ5dGVzIC0tLS0qLwogICAgICAgICAvKiBDb25maWd1cmUgUVNQSTogQ0NSIHJlZ2lzdGVyIHdpdGggYWxsIGNvbW11bmljYXRpb25zIHBhcmFtZXRlcnMgKi8KICAgICAgICAgV1JJVEVfUkVHKGhxc3BpLT5JbnN0YW5jZS0+Q0NSLCAoY21kLT5EZHJNb2RlIHwgY21kLT5EZHJIb2xkSGFsZkN5Y2xlIHwgY21kLT5TSU9PTW9kZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOCkgfCBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb24gfCBGdW5jdGlvbmFsTW9kZSkpOwogICAgICAgfQogICAgIH0KQEAgLTI2MDQsOSArMjY5Myw5IEBACiAgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggaW5zdHJ1Y3Rpb24gYW5kIGFkZHJlc3MgLS0tLSovCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPkRkckhvbGRIYWxmQ3ljbGUgfCBjbWQtPlNJT09Nb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IDE4KSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BZGRyZXNzU2l6ZSB8IGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uIHwgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfCBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgY21kLT5JbnN0cnVjdGlvbiB8IEZ1bmN0aW9uYWxNb2RlKSk7CiAKICAgICAgICAgaWYgKEZ1bmN0aW9uYWxNb2RlICE9IFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpCiAgICAgICAgIHsKQEAgLTI2MTksOSArMjcwOCw5IEBACiAgICAgICAgIC8qLS0tLSBDb21tYW5kIHdpdGggb25seSBpbnN0cnVjdGlvbiAtLS0tKi8KICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCiAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgMTgpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBjbWQtPkluc3RydWN0aW9uICB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbmFsTW9kZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc01vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkluc3RydWN0aW9uTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb24gfCBGdW5jdGlvbmFsTW9kZSkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjYzNyw4ICsyNzI2LDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBhZGRyZXNzIGFuZCBhbHRlcm5hdGUgYnl0ZXMgLS0tLSovCiAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICBXUklURV9SRUcoaHFzcGktPkluc3RhbmNlLT5DQ1IsIChjbWQtPkRkck1vZGUgfCBjbWQtPkRkckhvbGRIYWxmQ3ljbGUgfCBjbWQtPlNJT09Nb2RlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IDE4KSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5EYXRhTW9kZSB8IChjbWQtPkR1bW15Q3ljbGVzIDw8IFFVQURTUElfQ0NSX0RDWUNfUG9zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWx0ZXJuYXRlQnl0ZXNTaXplIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc1NpemUgfCBjbWQtPkFkZHJlc3NNb2RlIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBGdW5jdGlvbmFsTW9kZSkpOwogCiAgICAgICAgIGlmIChGdW5jdGlvbmFsTW9kZSAhPSBRU1BJX0ZVTkNUSU9OQUxfTU9ERV9NRU1PUllfTUFQUEVEKQpAQCAtMjY1Miw5ICsyNzQyLDkgQEAKICAgICAgICAgLyotLS0tIENvbW1hbmQgd2l0aCBvbmx5IGFsdGVybmF0ZSBieXRlcyAtLS0tKi8KICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCiAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgMTgpIHwgY21kLT5BbHRlcm5hdGVCeXRlc1NpemUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCBRVUFEU1BJX0NDUl9EQ1lDX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVzU2l6ZSB8IGNtZC0+QWx0ZXJuYXRlQnl0ZU1vZGUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NNb2RlIHwgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBGdW5jdGlvbmFsTW9kZSkpOwogICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0yNjY0LDkgKzI3NTQsOSBAQAogICAgICAgICAvKi0tLS0gQ29tbWFuZCB3aXRoIG9ubHkgYWRkcmVzcyAtLS0tKi8KICAgICAgICAgLyogQ29uZmlndXJlIFFTUEk6IENDUiByZWdpc3RlciB3aXRoIGFsbCBjb21tdW5pY2F0aW9ucyBwYXJhbWV0ZXJzICovCiAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgMTgpIHwgY21kLT5BbHRlcm5hdGVCeXRlTW9kZSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFkZHJlc3NTaXplIHwgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxNb2RlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCBRVUFEU1BJX0NDUl9EQ1lDX1BvcykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzU2l6ZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+QWRkcmVzc01vZGUgfCBjbWQtPkluc3RydWN0aW9uTW9kZSB8IEZ1bmN0aW9uYWxNb2RlKSk7CiAKICAgICAgICAgaWYgKEZ1bmN0aW9uYWxNb2RlICE9IFFTUElfRlVOQ1RJT05BTF9NT0RFX01FTU9SWV9NQVBQRUQpCiAgICAgICAgIHsKQEAgLTI2ODEsMTMgKzI3NzEsMTkgQEAKICAgICAgICAgewogICAgICAgICAgIC8qIENvbmZpZ3VyZSBRU1BJOiBDQ1IgcmVnaXN0ZXIgd2l0aCBhbGwgY29tbXVuaWNhdGlvbnMgcGFyYW1ldGVycyAqLwogICAgICAgICAgIFdSSVRFX1JFRyhocXNwaS0+SW5zdGFuY2UtPkNDUiwgKGNtZC0+RGRyTW9kZSB8IGNtZC0+RGRySG9sZEhhbGZDeWNsZSB8IGNtZC0+U0lPT01vZGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+RGF0YU1vZGUgfCAoY21kLT5EdW1teUN5Y2xlcyA8PCAxOCkgfCBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5BZGRyZXNzTW9kZSB8IGNtZC0+SW5zdHJ1Y3Rpb25Nb2RlIHwgRnVuY3Rpb25hbE1vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkRhdGFNb2RlIHwgKGNtZC0+RHVtbXlDeWNsZXMgPDwgUVVBRFNQSV9DQ1JfRENZQ19Qb3MpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPkFsdGVybmF0ZUJ5dGVNb2RlIHwgY21kLT5BZGRyZXNzTW9kZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5JbnN0cnVjdGlvbk1vZGUgfCBGdW5jdGlvbmFsTW9kZSkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiB9CisKKy8qKgorICAqIEB9CisgICovCisKIC8qKgogICAqIEB9CiAgICovCkBAIC0yNzAxLDQgKzI3OTcsNiBAQAogICAqIEB9CiAgICovCiAKKyNlbmRpZiAvKiBkZWZpbmVkKFFVQURTUEkpIHx8IGRlZmluZWQoUVVBRFNQSTEpIHx8IGRlZmluZWQoUVVBRFNQSTIpICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF9yY2MuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3JjYy5jCmluZGV4IGM4MjkwYTguLmQ3MTMyYzAgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3JjYy5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX3JjYy5jCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgU3lzdGVtQ29yZUNsb2NrID0gSFNJX1ZBTFVFOwogCiAgIC8qIEFkYXB0IFN5c3RpY2sgaW50ZXJydXB0IHBlcmlvZCAqLwotICBpZihIQUxfSW5pdFRpY2soVElDS19JTlRfUFJJT1JJVFkpICE9IEhBTF9PSykKKyAgaWYgKEhBTF9Jbml0VGljayh1d1RpY2tQcmlvKSAhPSBIQUxfT0spCiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CkBAIC0zNDQsMTAgKzM0NCwxMSBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1JDQ19Pc2NDb25maWcoUkNDX09zY0luaXRUeXBlRGVmICAqUkNDX09zY0luaXRTdHJ1Y3QpCiB7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKKyAgdWludDMyX3QgcGxsX2NvbmZpZzsKICAgRmxhZ1N0YXR1cyBwd3JjbGtjaGFuZ2VkID0gUkVTRVQ7CiAKICAgLyogQ2hlY2sgTnVsbCBwb2ludGVyICovCi0gIGlmKFJDQ19Pc2NJbml0U3RydWN0ID09IE5VTEwpCisgIGlmIChSQ0NfT3NjSW5pdFN0cnVjdCA9PSBOVUxMKQogICB7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQpAQCAtMzU2LDE1ICszNTcsMTUgQEAKICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19PU0NJTExBVE9SVFlQRShSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpKTsKIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFNFIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRSkKKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpID09IFJDQ19PU0NJTExBVE9SVFlQRV9IU0UpCiAgIHsKICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICAgIGFzc2VydF9wYXJhbShJU19SQ0NfSFNFKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSkpOwogICAgIC8qIFdoZW4gdGhlIEhTRSBpcyB1c2VkIGFzIHN5c3RlbSBjbG9jayBvciBjbG9jayBzb3VyY2UgZm9yIFBMTCwgSXQgY2FuIG5vdCBiZSBkaXNhYmxlZCAqLwotICAgIGlmKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpCi0gICAgICAgfHwgKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEspICYmICgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMU1JDKSA9PSBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNFKSkpCisgICAgaWYgKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19IU0UpCisgICAgICAgIHx8ICgoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgPT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKSAmJiAoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTFNSQykgPT0gUkNDX1BMTENGR1JfUExMU1JDX0hTRSkpKQogICAgIHsKLSAgICAgIGlmKChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSAhPSBSRVNFVCkgJiYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0VTdGF0ZSA9PSBSQ0NfSFNFX09GRikpCisgICAgICBpZiAoKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0VSRFkpICE9IFJFU0VUKSAmJiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID09IFJDQ19IU0VfT0ZGKSkKICAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KQEAgLTM3NSwxNSArMzc2LDE1IEBACiAgICAgICBfX0hBTF9SQ0NfSFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUpOwogCiAgICAgICAvKiBDaGVjayB0aGUgSFNFIFN0YXRlICovCi0gICAgICBpZihSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgIT0gUkNDX0hTRV9PRkYpCisgICAgICBpZiAoUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlICE9IFJDQ19IU0VfT0ZGKQogICAgICAgewogICAgICAgICAvKiBHZXQgU3RhcnQgVGljayovCiAgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAKICAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyByZWFkeSAqLwotICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSA9PSBSRVNFVCkKKyAgICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0VSRFkpID09IFJFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IEhTRV9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBIU0VfVElNRU9VVF9WQUxVRSkKICAgICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgICAgfQpAQCAtMzk1LDkgKzM5Niw5IEBACiAgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAKICAgICAgICAgLyogV2FpdCB0aWxsIEhTRSBpcyBieXBhc3NlZCBvciBkaXNhYmxlZCAqLwotICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSAhPSBSRVNFVCkKKyAgICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0VSRFkpICE9IFJFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBIU0VfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gSFNFX1RJTUVPVVRfVkFMVUUpCiAgICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICAgICAgIH0KQEAgLTQwNiwxOCArNDA3LDE4IEBACiAgICAgfQogICB9CiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFNJIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpZigoKFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSkgJiBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKSA9PSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJKQorICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTSSkKICAgewogICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19IU0koUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlKSk7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19DQUxJQlJBVElPTl9WQUxVRShSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSkpOwogCiAgICAgLyogQ2hlY2sgaWYgSFNJIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIGFzIFBMTCBzb3VyY2Ugd2hlbiBQTEwgaXMgc2VsZWN0ZWQgYXMgc3lzdGVtIGNsb2NrICovCi0gICAgaWYoKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkKLSAgICAgICB8fCAoKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSykgJiYgKChSQ0MtPlBMTENGR1IgJiBSQ0NfUExMQ0ZHUl9QTExTUkMpID09IFJDQ19QTExDRkdSX1BMTFNSQ19IU0kpKSkKKyAgICBpZiAoKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpID09IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTSSkKKyAgICAgICAgfHwgKChfX0hBTF9SQ0NfR0VUX1NZU0NMS19TT1VSQ0UoKSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1NUQVRVU19QTExDTEspICYmICgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMU1JDKSA9PSBSQ0NfUExMQ0ZHUl9QTExTUkNfSFNJKSkpCiAgICAgewogICAgICAgLyogV2hlbiBIU0kgaXMgdXNlZCBhcyBzeXN0ZW0gY2xvY2sgaXQgd2lsbCBub3QgZGlzYWJsZWQgKi8KLSAgICAgIGlmKChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNJUkRZKSAhPSBSRVNFVCkgJiYgKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSAhPSBSQ0NfSFNJX09OKSkKKyAgICAgIGlmICgoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgIT0gUkVTRVQpICYmIChSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgIT0gUkNDX0hTSV9PTikpCiAgICAgICB7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CkBAIC00MzEsNyArNDMyLDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgLyogQ2hlY2sgdGhlIEhTSSBTdGF0ZSAqLwotICAgICAgaWYoKFJDQ19Pc2NJbml0U3RydWN0LT5IU0lTdGF0ZSkhPSBSQ0NfSFNJX09GRikKKyAgICAgIGlmICgoUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlKSAhPSBSQ0NfSFNJX09GRikKICAgICAgIHsKICAgICAgICAgLyogRW5hYmxlIHRoZSBJbnRlcm5hbCBIaWdoIFNwZWVkIG9zY2lsbGF0b3IgKEhTSSkuICovCiAgICAgICAgIF9fSEFMX1JDQ19IU0lfRU5BQkxFKCk7CkBAIC00NDAsOSArNDQxLDkgQEAKICAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAogICAgICAgICAvKiBXYWl0IHRpbGwgSFNJIGlzIHJlYWR5ICovCi0gICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0lSRFkpID09IFJFU0VUKQorICAgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgPT0gUkVTRVQpCiAgICAgICAgIHsKLSAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQogICAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgICAgICB9CkBAIC00NjAsOSArNDYxLDkgQEAKICAgICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAogICAgICAgICAvKiBXYWl0IHRpbGwgSFNJIGlzIHJlYWR5ICovCi0gICAgICAgIHdoaWxlKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19IU0lSRFkpICE9IFJFU0VUKQorICAgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgIT0gUkVTRVQpCiAgICAgICAgIHsKLSAgICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gSFNJX1RJTUVPVVRfVkFMVUUpCisgICAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IEhTSV9USU1FT1VUX1ZBTFVFKQogICAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgICAgICB9CkBAIC00NzEsMTMgKzQ3MiwxMyBAQAogICAgIH0KICAgfQogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMU0kgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSSkKKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kpCiAgIHsKICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNJKFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSkpOwogCiAgICAgLyogQ2hlY2sgdGhlIExTSSBTdGF0ZSAqLwotICAgIGlmKChSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUpIT0gUkNDX0xTSV9PRkYpCisgICAgaWYgKChSQ0NfT3NjSW5pdFN0cnVjdC0+TFNJU3RhdGUpICE9IFJDQ19MU0lfT0ZGKQogICAgIHsKICAgICAgIC8qIEVuYWJsZSB0aGUgSW50ZXJuYWwgTG93IFNwZWVkIG9zY2lsbGF0b3IgKExTSSkuICovCiAgICAgICBfX0hBTF9SQ0NfTFNJX0VOQUJMRSgpOwpAQCAtNDg2LDkgKzQ4Nyw5IEBACiAgICAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogCiAgICAgICAvKiBXYWl0IHRpbGwgTFNJIGlzIHJlYWR5ICovCi0gICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTFNJUkRZKSA9PSBSRVNFVCkKKyAgICAgIHdoaWxlIChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfTFNJUkRZKSA9PSBSRVNFVCkKICAgICAgIHsKLSAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IExTSV9USU1FT1VUX1ZBTFVFKQorICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gTFNJX1RJTUVPVVRfVkFMVUUpCiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgIH0KQEAgLTUwMyw5ICs1MDQsOSBAQAogICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAogICAgICAgLyogV2FpdCB0aWxsIExTSSBpcyByZWFkeSAqLwotICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTSVJEWSkgIT0gUkVTRVQpCisgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTSVJEWSkgIT0gUkVTRVQpCiAgICAgICB7Ci0gICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBMU0lfVElNRU9VVF9WQUxVRSkKKyAgICAgICAgaWYgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IExTSV9USU1FT1VUX1ZBTFVFKQogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICAgICB9CkBAIC01MTMsMjEgKzUxNCwyMSBAQAogICAgIH0KICAgfQogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMU0UgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKChSQ0NfT3NjSW5pdFN0cnVjdC0+T3NjaWxsYXRvclR5cGUpICYgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkgPT0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSkKKyAgaWYgKCgoUkNDX09zY0luaXRTdHJ1Y3QtPk9zY2lsbGF0b3JUeXBlKSAmIFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpID09IFJDQ19PU0NJTExBVE9SVFlQRV9MU0UpCiAgIHsKICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICAgIGFzc2VydF9wYXJhbShJU19SQ0NfTFNFKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkpOwogCiAgICAgLyogVXBkYXRlIExTRSBjb25maWd1cmF0aW9uIGluIEJhY2t1cCBEb21haW4gY29udHJvbCByZWdpc3RlciAgICAqLwogICAgIC8qIFJlcXVpcmVzIHRvIGVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gQmFja3VwIERvbWFpbiBvZiBuZWNlc3NhcnkgKi8KLSAgICBpZihfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKQorICAgIGlmIChfX0hBTF9SQ0NfUFdSX0lTX0NMS19ESVNBQkxFRCgpKQogICAgIHsKICAgICAgIC8qIEVuYWJsZSBQb3dlciBDbG9jayovCiAgICAgICBfX0hBTF9SQ0NfUFdSX0NMS19FTkFCTEUoKTsKICAgICAgIHB3cmNsa2NoYW5nZWQgPSBTRVQ7CiAgICAgfQogCi0gICAgaWYoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKKyAgICBpZiAoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKICAgICB7CiAgICAgICAvKiBFbmFibGUgd3JpdGUgYWNjZXNzIHRvIEJhY2t1cCBkb21haW4gKi8KICAgICAgIFBXUi0+Q1IxIHw9IFBXUl9DUjFfREJQOwpAQCAtNTM1LDkgKzUzNiw5IEBACiAgICAgICAvKiBXYWl0IGZvciBCYWNrdXAgZG9tYWluIFdyaXRlIHByb3RlY3Rpb24gZGlzYWJsZSAqLwogICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAotICAgICAgd2hpbGUoSEFMX0lTX0JJVF9DTFIoUFdSLT5DUjEsIFBXUl9DUjFfREJQKSkKKyAgICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihQV1ItPkNSMSwgUFdSX0NSMV9EQlApKQogICAgICAgewotICAgICAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKQorICAgICAgICBpZiAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gUkNDX0RCUF9USU1FT1VUX1ZBTFVFKQogICAgICAgICB7CiAgICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICAgICB9CkBAIC01NDcsMTUgKzU0OCwxNSBAQAogICAgIC8qIFNldCB0aGUgbmV3IExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICBfX0hBTF9SQ0NfTFNFX0NPTkZJRyhSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUpOwogICAgIC8qIENoZWNrIHRoZSBMU0UgU3RhdGUgKi8KLSAgICBpZigoUkNDX09zY0luaXRTdHJ1Y3QtPkxTRVN0YXRlKSAhPSBSQ0NfTFNFX09GRikKKyAgICBpZiAoKFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSkgIT0gUkNDX0xTRV9PRkYpCiAgICAgewogICAgICAgLyogR2V0IFN0YXJ0IFRpY2sqLwogICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAogICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLwotICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgPT0gUkVTRVQpCisgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgPT0gUkVTRVQpCiAgICAgICB7Ci0gICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgIH0KQEAgLTU2Nyw5ICs1NjgsOSBAQAogICAgICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKIAogICAgICAgLyogV2FpdCB0aWxsIExTRSBpcyByZWFkeSAqLwotICAgICAgd2hpbGUoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgIT0gUkVTRVQpCisgICAgICB3aGlsZSAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0xTRVJEWSkgIT0gUkVTRVQpCiAgICAgICB7Ci0gICAgICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCisgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBSQ0NfTFNFX1RJTUVPVVRfVkFMVUUpCiAgICAgICAgIHsKICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgIH0KQEAgLTU3Nyw3ICs1NzgsNyBAQAogICAgIH0KIAogICAgIC8qIFJlc3RvcmUgY2xvY2sgY29uZmlndXJhdGlvbiBpZiBjaGFuZ2VkICovCi0gICAgaWYocHdyY2xrY2hhbmdlZCA9PSBTRVQpCisgICAgaWYgKHB3cmNsa2NoYW5nZWQgPT0gU0VUKQogICAgIHsKICAgICAgIF9fSEFMX1JDQ19QV1JfQ0xLX0RJU0FCTEUoKTsKICAgICB9CkBAIC01ODgsOSArNTg5LDkgQEAKICAgaWYgKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSAhPSBSQ0NfUExMX05PTkUpCiAgIHsKICAgICAvKiBDaGVjayBpZiB0aGUgUExMIGlzIHVzZWQgYXMgc3lzdGVtIGNsb2NrIG9yIG5vdCAqLwotICAgIGlmKF9fSEFMX1JDQ19HRVRfU1lTQ0xLX1NPVVJDRSgpICE9IFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX1BMTENMSykKKyAgICBpZiAoX19IQUxfUkNDX0dFVF9TWVNDTEtfU09VUkNFKCkgIT0gUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfUExMQ0xLKQogICAgIHsKLSAgICAgIGlmKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09OKQorICAgICAgaWYgKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09OKQogICAgICAgewogICAgICAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICAgICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1BMTFNPVVJDRShSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSkpOwpAQCAtNjA5LDkgKzYxMCw5IEBACiAgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAKICAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLwotICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSAhPSBSRVNFVCkKKyAgICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpICE9IFJFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKICAgICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgICAgfQpAQCAtNjQwLDkgKzY0MSw5IEBACiAgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAKICAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLwotICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSA9PSBSRVNFVCkKKyAgICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpID09IFJFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKICAgICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgICAgfQpAQCAtNjU3LDkgKzY1OCw5IEBACiAgICAgICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAKICAgICAgICAgLyogV2FpdCB0aWxsIFBMTCBpcyByZWFkeSAqLwotICAgICAgICB3aGlsZShfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfUExMUkRZKSAhPSBSRVNFVCkKKyAgICAgICAgd2hpbGUgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpICE9IFJFU0VUKQogICAgICAgICB7Ci0gICAgICAgICAgaWYoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQgKSA+IFBMTF9USU1FT1VUX1ZBTFVFKQorICAgICAgICAgIGlmICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBQTExfVElNRU9VVF9WQUxVRSkKICAgICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CiAgICAgICAgICAgfQpAQCAtNjY4LDcgKzY2OSwyNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIC8qIERvIG5vdCByZXR1cm4gSEFMX0VSUk9SIGlmIHJlcXVlc3QgcmVwZWF0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uICovCisgICAgICBwbGxfY29uZmlnID0gUkNDLT5QTExDRkdSOworI2lmIGRlZmluZWQgKFJDQ19QTExDRkdSX1BMTFIpCisgICAgICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09GRikgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMU1JDKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMTSkgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNKSB8fAorICAgICAgICAgIChSRUFEX0JJVChwbGxfY29uZmlnLCBSQ0NfUExMQ0ZHUl9QTExOKSAhPSAoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMUCkgIT0gKCgoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUCkgPj4gMVUpIC0gMVUpIDw8IFJDQ19QTExDRkdSX1BMTFBfUG9zKSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMUSkgIT0gKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSA8PCBSQ0NfUExMQ0ZHUl9QTExRX1BvcykpIHx8CisgICAgICAgICAgKFJFQURfQklUKHBsbF9jb25maWcsIFJDQ19QTExDRkdSX1BMTFIpICE9IChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFIgPDwgUkNDX1BMTENGR1JfUExMUl9Qb3MpKSkKKyNlbHNlCisgICAgICBpZiAoKChSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFN0YXRlKSA9PSBSQ0NfUExMX09GRikgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMU1JDKSAhPSBSQ0NfT3NjSW5pdFN0cnVjdC0+UExMLlBMTFNvdXJjZSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMTSkgIT0gUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExNKSB8fAorICAgICAgICAgIChSRUFEX0JJVChwbGxfY29uZmlnLCBSQ0NfUExMQ0ZHUl9QTExOKSAhPSAoUkNDX09zY0luaXRTdHJ1Y3QtPlBMTC5QTExOIDw8IFJDQ19QTExDRkdSX1BMTE5fUG9zKSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMUCkgIT0gKCgoKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUCkgPj4gMVUpIC0gMVUpIDw8IFJDQ19QTExDRkdSX1BMTFBfUG9zKSkgfHwKKyAgICAgICAgICAoUkVBRF9CSVQocGxsX2NvbmZpZywgUkNDX1BMTENGR1JfUExMUSkgIT0gKFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMUSA8PCBSQ0NfUExMQ0ZHUl9QTExRX1BvcykpKQorI2VuZGlmCisgICAgICB7CisgICAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgICB9CiAgICAgfQogICB9CiAgIHJldHVybiBIQUxfT0s7CkBAIC03MDUsNyArNzI2LDcgQEAKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsKIAogICAvKiBDaGVjayBOdWxsIHBvaW50ZXIgKi8KLSAgaWYoUkNDX0Nsa0luaXRTdHJ1Y3QgPT0gTlVMTCkKKyAgaWYgKFJDQ19DbGtJbml0U3RydWN0ID09IE5VTEwpCiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CkBAIC03MTksMzAgKzc0MCwzMCBAQAogICAgICAoSENMSykgYW5kIHRoZSBzdXBwbHkgdm9sdGFnZSBvZiB0aGUgZGV2aWNlLiAqLwogCiAgIC8qIEluY3JlYXNpbmcgdGhlIENQVSBmcmVxdWVuY3kgKi8KLSAgaWYoRkxhdGVuY3kgPiBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpKQorICBpZiAoRkxhdGVuY3kgPiBfX0hBTF9GTEFTSF9HRVRfTEFURU5DWSgpKQogICB7CiAgICAgLyogUHJvZ3JhbSB0aGUgbmV3IG51bWJlciBvZiB3YWl0IHN0YXRlcyB0byB0aGUgTEFURU5DWSBiaXRzIGluIHRoZSBGTEFTSF9BQ1IgcmVnaXN0ZXIgKi8KICAgICBfX0hBTF9GTEFTSF9TRVRfTEFURU5DWShGTGF0ZW5jeSk7CiAKICAgICAvKiBDaGVjayB0aGF0IHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGlzIHRha2VuIGludG8gYWNjb3VudCB0byBhY2Nlc3MgdGhlIEZsYXNoCiAgICAgbWVtb3J5IGJ5IHJlYWRpbmcgdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLwotICAgIGlmKF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgIT0gRkxhdGVuY3kpCisgICAgaWYgKF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkgIT0gRkxhdGVuY3kpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAgIH0KIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhDTEsgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGlmKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09IFJDQ19DTE9DS1RZUEVfSENMSykKKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX0hDTEspID09IFJDQ19DTE9DS1RZUEVfSENMSykKICAgewogICAgIC8qIFNldCB0aGUgaGlnaGVzdCBBUEJ4IGRpdmlkZXJzIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBnbyB0aHJvdWdoCiAgICAgICAgYSBub24tc3BlYyBwaGFzZSB3aGF0ZXZlciB3ZSBkZWNyZWFzZSBvciBpbmNyZWFzZSBIQ0xLLiAqLwotICAgIGlmKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKQorICAgIGlmICgoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMSkgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMSkKICAgICB7CiAgICAgICBNT0RJRllfUkVHKFJDQy0+Q0ZHUiwgUkNDX0NGR1JfUFBSRTEsIFJDQ19IQ0xLX0RJVjE2KTsKICAgICB9CiAKLSAgICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMikgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMikKKyAgICBpZiAoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfUENMSzIpID09IFJDQ19DTE9DS1RZUEVfUENMSzIpCiAgICAgewogICAgICAgTU9ESUZZX1JFRyhSQ0MtPkNGR1IsIFJDQ19DRkdSX1BQUkUyLCAoUkNDX0hDTEtfRElWMTYgPDwgMykpOwogICAgIH0KQEAgLTc1MywyNCArNzc0LDI0IEBACiAgIH0KIAogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1lTQ0xLIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKChSQ0NfQ2xrSW5pdFN0cnVjdC0+Q2xvY2tUeXBlKSAmIFJDQ19DTE9DS1RZUEVfU1lTQ0xLKSA9PSBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykKKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1NZU0NMSykgPT0gUkNDX0NMT0NLVFlQRV9TWVNDTEspCiAgIHsKICAgICBhc3NlcnRfcGFyYW0oSVNfUkNDX1NZU0NMS1NPVVJDRShSQ0NfQ2xrSW5pdFN0cnVjdC0+U1lTQ0xLU291cmNlKSk7CiAKICAgICAvKiBIU0UgaXMgc2VsZWN0ZWQgYXMgU3lzdGVtIENsb2NrIFNvdXJjZSAqLwotICAgIGlmKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0UpCisgICAgaWYgKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9IU0UpCiAgICAgewogICAgICAgLyogQ2hlY2sgdGhlIEhTRSByZWFkeSBmbGFnICovCi0gICAgICBpZihfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSA9PSBSRVNFVCkKKyAgICAgIGlmIChfX0hBTF9SQ0NfR0VUX0ZMQUcoUkNDX0ZMQUdfSFNFUkRZKSA9PSBSRVNFVCkKICAgICAgIHsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9CiAgICAgLyogUExMIGlzIHNlbGVjdGVkIGFzIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KLSAgICBlbHNlIGlmKFJDQ19DbGtJbml0U3RydWN0LT5TWVNDTEtTb3VyY2UgPT0gUkNDX1NZU0NMS1NPVVJDRV9QTExDTEspCisgICAgZWxzZSBpZiAoUkNDX0Nsa0luaXRTdHJ1Y3QtPlNZU0NMS1NvdXJjZSA9PSBSQ0NfU1lTQ0xLU09VUkNFX1BMTENMSykKICAgICB7CiAgICAgICAvKiBDaGVjayB0aGUgUExMIHJlYWR5IGZsYWcgKi8KLSAgICAgIGlmKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpID09IFJFU0VUKQorICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfRkxBRyhSQ0NfRkxBR19QTExSRFkpID09IFJFU0VUKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtNzc5LDcgKzgwMCw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIENoZWNrIHRoZSBIU0kgcmVhZHkgZmxhZyAqLwotICAgICAgaWYoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgPT0gUkVTRVQpCisgICAgICBpZiAoX19IQUxfUkNDX0dFVF9GTEFHKFJDQ19GTEFHX0hTSVJEWSkgPT0gUkVTRVQpCiAgICAgICB7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CkBAIC04MDAsMzggKzgyMSwzOCBAQAogICB9CiAKICAgLyogRGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIGJlY2F1c2Ugb2YgbG93ZXIgQ1BVIGZyZXF1ZW5jeSAqLwotICBpZihGTGF0ZW5jeSA8IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCisgIGlmIChGTGF0ZW5jeSA8IF9fSEFMX0ZMQVNIX0dFVF9MQVRFTkNZKCkpCiAgIHsKICAgICAvKiBQcm9ncmFtIHRoZSBuZXcgbnVtYmVyIG9mIHdhaXQgc3RhdGVzIHRvIHRoZSBMQVRFTkNZIGJpdHMgaW4gdGhlIEZMQVNIX0FDUiByZWdpc3RlciAqLwogICAgIF9fSEFMX0ZMQVNIX1NFVF9MQVRFTkNZKEZMYXRlbmN5KTsKIAogICAgIC8qIENoZWNrIHRoYXQgdGhlIG5ldyBudW1iZXIgb2Ygd2FpdCBzdGF0ZXMgaXMgdGFrZW4gaW50byBhY2NvdW50IHRvIGFjY2VzcyB0aGUgRmxhc2gKICAgICBtZW1vcnkgYnkgcmVhZGluZyB0aGUgRkxBU0hfQUNSIHJlZ2lzdGVyICovCi0gICAgaWYoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkKKyAgICBpZiAoX19IQUxfRkxBU0hfR0VUX0xBVEVOQ1koKSAhPSBGTGF0ZW5jeSkKICAgICB7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KICAgfQogCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMSkgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMSkKKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsxKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIxQ0xLRGl2aWRlcikpOwogICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMSwgUkNDX0Nsa0luaXRTdHJ1Y3QtPkFQQjFDTEtEaXZpZGVyKTsKICAgfQogCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUENMSzIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICBpZigoKFJDQ19DbGtJbml0U3RydWN0LT5DbG9ja1R5cGUpICYgUkNDX0NMT0NLVFlQRV9QQ0xLMikgPT0gUkNDX0NMT0NLVFlQRV9QQ0xLMikKKyAgaWYgKCgoUkNDX0Nsa0luaXRTdHJ1Y3QtPkNsb2NrVHlwZSkgJiBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKSA9PSBSQ0NfQ0xPQ0tUWVBFX1BDTEsyKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19QQ0xLKFJDQ19DbGtJbml0U3RydWN0LT5BUEIyQ0xLRGl2aWRlcikpOwogICAgIE1PRElGWV9SRUcoUkNDLT5DRkdSLCBSQ0NfQ0ZHUl9QUFJFMiwgKChSQ0NfQ2xrSW5pdFN0cnVjdC0+QVBCMkNMS0RpdmlkZXIpIDw8IDMpKTsKICAgfQogCiAgIC8qIFVwZGF0ZSB0aGUgU3lzdGVtQ29yZUNsb2NrIGdsb2JhbCB2YXJpYWJsZSAqLwotICBTeXN0ZW1Db3JlQ2xvY2sgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpID4+IEFIQlByZXNjVGFibGVbKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX0hQUkUpPj4gUkNDX0NGR1JfSFBSRV9Qb3NdOworICBTeXN0ZW1Db3JlQ2xvY2sgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpID4+IEFIQlByZXNjVGFibGVbKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX0hQUkUpID4+IFJDQ19DRkdSX0hQUkVfUG9zXTsKIAogICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSBvZiB0aW1lIGJhc2UgY29uc2lkZXJpbmcgbmV3IHN5c3RlbSBjbG9ja3Mgc2V0dGluZ3MqLwotICBIQUxfSW5pdFRpY2sgKFRJQ0tfSU5UX1BSSU9SSVRZKTsKKyAgSEFMX0luaXRUaWNrKHV3VGlja1ByaW8pOwogCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC04ODgsNyArOTA5LDcgQEAKICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08oUkNDX01DT3gpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ09ESVYoUkNDX01DT0RpdikpOwogICAvKiBSQ0NfTUNPMSAqLwotICBpZihSQ0NfTUNPeCA9PSBSQ0NfTUNPMSkKKyAgaWYgKFJDQ19NQ094ID09IFJDQ19NQ08xKQogICB7CiAgICAgYXNzZXJ0X3BhcmFtKElTX1JDQ19NQ08xU09VUkNFKFJDQ19NQ09Tb3VyY2UpKTsKIApAQCAtOTkwLDcgKzEwMTEsNyBAQAogICAgIGNhc2UgUkNDX1NZU0NMS1NPVVJDRV9TVEFUVVNfSFNJOiAgLyogSFNJIHVzZWQgYXMgc3lzdGVtIGNsb2NrIHNvdXJjZSAqLwogICAgIHsKICAgICAgIHN5c2Nsb2NrZnJlcSA9IEhTSV9WQUxVRTsKLSAgICAgICBicmVhazsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFJDQ19TWVNDTEtTT1VSQ0VfU1RBVFVTX0hTRTogIC8qIEhTRSB1c2VkIGFzIHN5c3RlbSBjbG9jayAgc291cmNlICovCiAgICAgewpAQCAtMTAwNSwxNiArMTAyNiwxNiBAQAogICAgICAgaWYgKF9fSEFMX1JDQ19HRVRfUExMX09TQ1NPVVJDRSgpICE9IFJDQ19QTExDRkdSX1BMTFNSQ19IU0kpCiAgICAgICB7CiAgICAgICAgIC8qIEhTRSB1c2VkIGFzIFBMTCBjbG9jayBzb3VyY2UgKi8KLSAgICAgICAgcGxsdmNvID0gKHVpbnQzMl90KSAoKCgodWludDY0X3QpIEhTRV9WQUxVRSAqICgodWludDY0X3QpICgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3MpKSkpIC8gKHVpbnQ2NF90KXBsbG0pOworICAgICAgICBwbGx2Y28gPSAodWludDMyX3QpKCgoKHVpbnQ2NF90KSBIU0VfVkFMVUUgKiAoKHVpbnQ2NF90KSgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMTikgPj4gUkNDX1BMTENGR1JfUExMTl9Qb3MpKSkpIC8gKHVpbnQ2NF90KXBsbG0pOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAvKiBIU0kgdXNlZCBhcyBQTEwgY2xvY2sgc291cmNlICovCi0gICAgICAgIHBsbHZjbyA9ICh1aW50MzJfdCkgKCgoKHVpbnQ2NF90KSBIU0lfVkFMVUUgKiAoKHVpbnQ2NF90KSAoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKSkpKSAvICh1aW50NjRfdClwbGxtKTsKKyAgICAgICAgcGxsdmNvID0gKHVpbnQzMl90KSgoKCh1aW50NjRfdCkgSFNJX1ZBTFVFICogKCh1aW50NjRfdCkoKFJDQy0+UExMQ0ZHUiAmIFJDQ19QTExDRkdSX1BMTE4pID4+IFJDQ19QTExDRkdSX1BMTE5fUG9zKSkpKSAvICh1aW50NjRfdClwbGxtKTsKICAgICAgIH0KLSAgICAgIHBsbHAgPSAoKCgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMUCkgPj4gUkNDX1BMTENGR1JfUExMUF9Qb3MpICsgMSApICoyKTsKKyAgICAgIHBsbHAgPSAoKCgoUkNDLT5QTExDRkdSICYgUkNDX1BMTENGR1JfUExMUCkgPj4gUkNDX1BMTENGR1JfUExMUF9Qb3MpICsgMSkgKiAyKTsKIAotICAgICAgc3lzY2xvY2tmcmVxID0gcGxsdmNvL3BsbHA7CisgICAgICBzeXNjbG9ja2ZyZXEgPSBwbGx2Y28gLyBwbGxwOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGRlZmF1bHQ6CkBAIC0xMDQ3LDcgKzEwNjgsNyBAQAogdWludDMyX3QgSEFMX1JDQ19HZXRQQ0xLMUZyZXEodm9pZCkKIHsKICAgLyogR2V0IEhDTEsgc291cmNlIGFuZCBDb21wdXRlIFBDTEsxIGZyZXF1ZW5jeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICByZXR1cm4gKEhBTF9SQ0NfR2V0SENMS0ZyZXEoKSA+PiBBUEJQcmVzY1RhYmxlWyhSQ0MtPkNGR1IgJiBSQ0NfQ0ZHUl9QUFJFMSk+PiBSQ0NfQ0ZHUl9QUFJFMV9Qb3NdKTsKKyAgcmV0dXJuIChIQUxfUkNDX0dldEhDTEtGcmVxKCkgPj4gQVBCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTEpID4+IFJDQ19DRkdSX1BQUkUxX1Bvc10pOwogfQogCiAvKioKQEAgLTEwNTksNyArMTA4MCw3IEBACiB1aW50MzJfdCBIQUxfUkNDX0dldFBDTEsyRnJlcSh2b2lkKQogewogICAvKiBHZXQgSENMSyBzb3VyY2UgYW5kIENvbXB1dGUgUENMSzIgZnJlcXVlbmN5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIHJldHVybiAoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpPj4gQVBCUHJlc2NUYWJsZVsoUkNDLT5DRkdSICYgUkNDX0NGR1JfUFBSRTIpPj4gUkNDX0NGR1JfUFBSRTJfUG9zXSk7CisgIHJldHVybiAoSEFMX1JDQ19HZXRIQ0xLRnJlcSgpID4+IEFQQlByZXNjVGFibGVbKFJDQy0+Q0ZHUiAmIFJDQ19DRkdSX1BQUkUyKSA+PiBSQ0NfQ0ZHUl9QUFJFMl9Qb3NdKTsKIH0KIAogLyoqCkBAIC0xMDc1LDExICsxMDk2LDExIEBACiAgIFJDQ19Pc2NJbml0U3RydWN0LT5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0UgfCBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNJIHwgUkNDX09TQ0lMTEFUT1JUWVBFX0xTRSB8IFJDQ19PU0NJTExBVE9SVFlQRV9MU0k7CiAKICAgLyogR2V0IHRoZSBIU0UgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNFQllQKSA9PSBSQ0NfQ1JfSFNFQllQKQorICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfSFNFQllQKSA9PSBSQ0NfQ1JfSFNFQllQKQogICB7CiAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTRVN0YXRlID0gUkNDX0hTRV9CWVBBU1M7CiAgIH0KLSAgZWxzZSBpZigoUkNDLT5DUiAmUkNDX0NSX0hTRU9OKSA9PSBSQ0NfQ1JfSFNFT04pCisgIGVsc2UgaWYgKChSQ0MtPkNSICYgUkNDX0NSX0hTRU9OKSA9PSBSQ0NfQ1JfSFNFT04pCiAgIHsKICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogICB9CkBAIC0xMDg5LDcgKzExMTAsNyBAQAogICB9CiAKICAgLyogR2V0IHRoZSBIU0kgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gIGlmKChSQ0MtPkNSICZSQ0NfQ1JfSFNJT04pID09IFJDQ19DUl9IU0lPTikKKyAgaWYgKChSQ0MtPkNSICYgUkNDX0NSX0hTSU9OKSA9PSBSQ0NfQ1JfSFNJT04pCiAgIHsKICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJU3RhdGUgPSBSQ0NfSFNJX09OOwogICB9CkBAIC0xMDk4LDE0ICsxMTE5LDE0IEBACiAgICAgUkNDX09zY0luaXRTdHJ1Y3QtPkhTSVN0YXRlID0gUkNDX0hTSV9PRkY7CiAgIH0KIAotICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSA9ICh1aW50MzJfdCkoKFJDQy0+Q1IgJlJDQ19DUl9IU0lUUklNKSA+PiBSQ0NfQ1JfSFNJVFJJTV9Qb3MpOworICBSQ0NfT3NjSW5pdFN0cnVjdC0+SFNJQ2FsaWJyYXRpb25WYWx1ZSA9ICh1aW50MzJfdCkoKFJDQy0+Q1IgJiBSQ0NfQ1JfSFNJVFJJTSkgPj4gUkNDX0NSX0hTSVRSSU1fUG9zKTsKIAogICAvKiBHZXQgdGhlIExTRSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKFJDQy0+QkRDUiAmUkNDX0JEQ1JfTFNFQllQKSA9PSBSQ0NfQkRDUl9MU0VCWVApCisgIGlmICgoUkNDLT5CRENSICYgUkNDX0JEQ1JfTFNFQllQKSA9PSBSQ0NfQkRDUl9MU0VCWVApCiAgIHsKICAgICBSQ0NfT3NjSW5pdFN0cnVjdC0+TFNFU3RhdGUgPSBSQ0NfTFNFX0JZUEFTUzsKICAgfQotICBlbHNlIGlmKChSQ0MtPkJEQ1IgJlJDQ19CRENSX0xTRU9OKSA9PSBSQ0NfQkRDUl9MU0VPTikKKyAgZWxzZSBpZiAoKFJDQy0+QkRDUiAmIFJDQ19CRENSX0xTRU9OKSA9PSBSQ0NfQkRDUl9MU0VPTikKICAgewogICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CiAgIH0KQEAgLTExMTUsNyArMTEzNiw3IEBACiAgIH0KIAogICAvKiBHZXQgdGhlIExTSSBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKFJDQy0+Q1NSICZSQ0NfQ1NSX0xTSU9OKSA9PSBSQ0NfQ1NSX0xTSU9OKQorICBpZiAoKFJDQy0+Q1NSICYgUkNDX0NTUl9MU0lPTikgPT0gUkNDX0NTUl9MU0lPTikKICAgewogICAgIFJDQ19Pc2NJbml0U3RydWN0LT5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgIH0KQEAgLTExMjUsNyArMTE0Niw3IEBACiAgIH0KIAogICAvKiBHZXQgdGhlIFBMTCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgaWYoKFJDQy0+Q1IgJlJDQ19DUl9QTExPTikgPT0gUkNDX0NSX1BMTE9OKQorICBpZiAoKFJDQy0+Q1IgJiBSQ0NfQ1JfUExMT04pID09IFJDQ19DUl9QTExPTikKICAgewogICAgIFJDQ19Pc2NJbml0U3RydWN0LT5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX09OOwogICB9CkBAIC0xMTgwLDcgKzEyMDEsNyBAQAogdm9pZCBIQUxfUkNDX05NSV9JUlFIYW5kbGVyKHZvaWQpCiB7CiAgIC8qIENoZWNrIFJDQyBDU1NGIGZsYWcgICovCi0gIGlmKF9fSEFMX1JDQ19HRVRfSVQoUkNDX0lUX0NTUykpCisgIGlmIChfX0hBTF9SQ0NfR0VUX0lUKFJDQ19JVF9DU1MpKQogICB7CiAgICAgLyogUkNDIENsb2NrIFNlY3VyaXR5IFN5c3RlbSBpbnRlcnJ1cHQgdXNlciBjYWxsYmFjayAqLwogICAgIEhBTF9SQ0NfQ1NTQ2FsbGJhY2soKTsKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3JuZy5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfcm5nLmMKaW5kZXggM2UwNzNlMi4uNzA5NDA4OCAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfcm5nLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfcm5nLmMKQEAgLTUzMiw4ICs1MzIsMTYgQEAKIAogLyoqCiAgICogQGJyaWVmICBHZW5lcmF0ZXMgYSAzMi1iaXQgcmFuZG9tIG51bWJlci4KLSAgKiBAbm90ZSAgIEVhY2ggdGltZSB0aGUgcmFuZG9tIG51bWJlciBkYXRhIGlzIHJlYWQgdGhlIFJOR19GTEFHX0RSRFkgZmxhZwotICAqICAgICAgICAgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkLgorICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBjaGVja3MgdmFsdWUgb2YgUk5HX0ZMQUdfRFJEWSBmbGFnIHRvIGtub3cgaWYgdmFsaWQKKyAgKiAgICAgICAgIHJhbmRvbSBudW1iZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBEUiByZWdpc3RlciAoUk5HX0ZMQUdfRFJEWSBmbGFnIHNldCAKKyAgKiAgICAgICAgIHdoZW5ldmVyIGEgcmFuZG9tIG51bWJlciBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgUk5HX0RSIHJlZ2lzdGVyKS4KKyAgKiAgICAgICAgIEFmdGVyIHRyYW5zaXRpb25pbmcgZnJvbSAwIHRvIDEgKHJhbmRvbSBudW1iZXIgYXZhaWxhYmxlKSwgCisgICogICAgICAgICBSTkdfRkxBR19EUkRZIGZsYWcgcmVtYWlucyBoaWdoIHVudGlsIG91dHB1dCBidWZmZXIgYmVjb21lcyBlbXB0eSBhZnRlciByZWFkaW5nIAorICAqICAgICAgICAgZm91ciB3b3JkcyBmcm9tIHRoZSBSTkdfRFIgcmVnaXN0ZXIsIGkuZS4gZnVydGhlciBmdW5jdGlvbiBjYWxscyAKKyAgKiAgICAgICAgIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIGEgbmV3IHUzMiByYW5kb20gbnVtYmVyIChhZGRpdGlvbmFsIHdvcmRzIGFyZQorICAqICAgICAgICAgYXZhaWxhYmxlIGFuZCBjYW4gYmUgcmVhZCBieSB0aGUgYXBwbGljYXRpb24sIHRpbGwgUk5HX0ZMQUdfRFJEWSBmbGFnIHJlbWFpbnMgaGlnaCkuCisgICogQG5vdGUgICBXaGVuIG5vIG1vcmUgcmFuZG9tIG51bWJlciBkYXRhIGlzIGF2YWlsYWJsZSBpbiBEUiByZWdpc3RlciwgUk5HX0ZMQUdfRFJEWQorICAqICAgICAgICAgZmxhZyBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQuCiAgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCiAgICogQHBhcmFtICByYW5kb20zMmJpdCBwb2ludGVyIHRvIGdlbmVyYXRlZCByYW5kb20gbnVtYmVyIHZhcmlhYmxlIGlmIHN1Y2Nlc3NmdWwuCkBAIC02OTcsMTMgKzcwNSwxMyBAQAogICBpZiAoX19IQUxfUk5HX0dFVF9JVChocm5nLCBSTkdfSVRfQ0VJKSAhPSBSRVNFVCkKICAgewogICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgIGhybmctPkVycm9yQ29kZSA9IEhBTF9STkdfRVJST1JfU0VFRDsKKyAgICBocm5nLT5FcnJvckNvZGUgPSBIQUxfUk5HX0VSUk9SX0NMT0NLOwogICAgIHJuZ2Nsb2NrZXJyb3IgPSAxVTsKICAgfQogICBlbHNlIGlmIChfX0hBTF9STkdfR0VUX0lUKGhybmcsIFJOR19JVF9TRUkpICE9IFJFU0VUKQogICB7CiAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgaHJuZy0+RXJyb3JDb2RlID0gSEFMX1JOR19FUlJPUl9DTE9DSzsKKyAgICBocm5nLT5FcnJvckNvZGUgPSBIQUxfUk5HX0VSUk9SX1NFRUQ7CiAgICAgcm5nY2xvY2tlcnJvciA9IDFVOwogICB9CiAgIGVsc2UKQEAgLTc2OCw2ICs3NzYsMTEgQEAKIAogLyoqCiAgICogQGJyaWVmICBEYXRhIFJlYWR5IGNhbGxiYWNrIGluIG5vbi1ibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiBSTkdfRkxBR19EUkRZIGZsYWcgdmFsdWUgaXMgc2V0LCBmaXJzdCByYW5kb20gbnVtYmVyIGhhcyBiZWVuIHJlYWQKKyAgKiAgICAgICAgIGZyb20gRFIgcmVnaXN0ZXIgaW4gSVJRIEhhbmRsZXIgYW5kIGlzIHByb3ZpZGVkIGFzIGNhbGxiYWNrIHBhcmFtZXRlci4KKyAgKiAgICAgICAgIERlcGVuZGluZyBvbiB2YWxpZCBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgY29uZGl0aW9uaW5nIG91dHB1dCBidWZmZXIsCisgICogICAgICAgICBhZGRpdGlvbmFsIHdvcmRzIGNhbiBiZSByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcm9tIERSIHJlZ2lzdGVyIHRpbGwgCisgICogICAgICAgICBEUkRZIGJpdCByZW1haW5zIGhpZ2guCiAgICogQHBhcmFtICBocm5nIHBvaW50ZXIgdG8gYSBSTkdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBSTkcuCiAgICogQHBhcmFtICByYW5kb20zMmJpdCBnZW5lcmF0ZWQgcmFuZG9tIG51bWJlci4KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3J0Yy5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfcnRjLmMKaW5kZXggZGU1YTM0YS4uZGFkODY1NSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfcnRjLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfcnRjLmMKQEAgLTE1ODYsMTAgKzE1ODYsMTEgQEAKICAgKi8KIHZvaWQgSEFMX1JUQ19BbGFybUlSUUhhbmRsZXIoUlRDX0hhbmRsZVR5cGVEZWYqIGhydGMpCiB7Ci0gIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfSVQoaHJ0YywgUlRDX0lUX0FMUkEpKQorICAvKiBHZXQgdGhlIEFsYXJtQSBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX0FMUkEpICE9ICh1aW50MzJfdClSRVNFVCkKICAgewotICAgIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KLSAgICBpZigodWludDMyX3QpKGhydGMtPkluc3RhbmNlLT5DUiAmIFJUQ19JVF9BTFJBKSAhPSAodWludDMyX3QpUkVTRVQpCisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgQWxhcm1BIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19BTFJBRikgIT0gKHVpbnQzMl90KVJFU0VUKQogICAgIHsKICAgICAgIC8qIEFsYXJtQSBjYWxsYmFjayAqLwogICAgICNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCkBAIC0xNTk4LDE1ICsxNTk5LDE2IEBACiAgICAgICBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soaHJ0Yyk7CiAgICAgI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCi0gICAgICAvKiBDbGVhciB0aGUgQWxhcm0gaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCisgICAgICAvKiBDbGVhciB0aGUgQWxhcm1BIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLwogICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoaHJ0YyxSVENfRkxBR19BTFJBRik7CiAgICAgfQogICB9CiAKLSAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9JVChocnRjLCBSVENfSVRfQUxSQikpCisgIC8qIEdldCB0aGUgQWxhcm1CIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfQUxBUk1fR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfQUxSQikgIT0gKHVpbnQzMl90KVJFU0VUKQogICB7Ci0gICAgLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIEludGVycnVwdCAqLwotICAgIGlmKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0lUX0FMUkIpICE9ICh1aW50MzJfdClSRVNFVCkKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBBbGFybUIgSW50ZXJydXB0ICovCisgICAgaWYoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX0FMUkJGKSAhPSAodWludDMyX3QpUkVTRVQpCiAgICAgewogICAgICAgLyogQWxhcm1CIGNhbGxiYWNrICovCiAgICAgI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKQEAgLTE2MTUsNyArMTYxNyw3IEBACiAgICAgICBIQUxfUlRDRXhfQWxhcm1CRXZlbnRDYWxsYmFjayhocnRjKTsKICAgICAjZW5kaWYgLyogVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKLSAgICAgIC8qIENsZWFyIHRoZSBBbGFybSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgKi8KKyAgICAgIC8qIENsZWFyIHRoZSBBbGFybUIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCiAgICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRyhocnRjLFJUQ19GTEFHX0FMUkJGKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3J0Y19leC5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfcnRjX2V4LmMKaW5kZXggYzk4ZjBhZi4uOTM1OTI4MCAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfcnRjX2V4LmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfcnRjX2V4LmMKQEAgLTY1NiwxMCArNjU2LDExIEBACiAgICovCiB2b2lkIEhBTF9SVENFeF9UYW1wZXJUaW1lU3RhbXBJUlFIYW5kbGVyKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQogewotICBpZihfX0hBTF9SVENfVElNRVNUQU1QX0dFVF9JVChocnRjLCBSVENfSVRfVFMpKQorICAvKiBHZXQgdGhlIFRpbWVTdGFtcCBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RJTUVTVEFNUF9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UUykgIT0gKHVpbnQzMl90KVJFU0VUKQogICB7Ci0gICAgLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIEludGVycnVwdCAqLwotICAgIGlmKCh1aW50MzJfdCkoaHJ0Yy0+SW5zdGFuY2UtPkNSICYgUlRDX0lUX1RTKSAhPSAodWludDMyX3QpUkVTRVQpCisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVElNRVNUQU1QIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19USU1FU1RBTVBfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVFNGKSAhPSAodWludDMyX3QpUkVTRVQpCiAgICAgewogICAgICAgLyogVElNRVNUQU1QIGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQpAQCAtNjczLDEyICs2NzQsMTEgQEAKICAgICB9CiAgIH0KIAotICAvKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgSW50ZXJydXB0ICovCi0gIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDFGKT09IFNFVCkKKyAgLyogR2V0IHRoZSBUYW1wZXIxIGludGVycnVwdCBzb3VyY2UgZW5hYmxlIHN0YXR1cyAqLworICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9JVF9TT1VSQ0UoaHJ0YywgUlRDX0lUX1RBTVAgfCBSVENfSVRfVEFNUDEpICE9ICh1aW50MzJfdClSRVNFVCkKICAgewotICAgIC8qIEdldCB0aGUgVEFNUEVSIEludGVycnVwdCBlbmFibGUgYml0IGFuZCBwZW5kaW5nIGJpdCAqLwotICAgIGlmKCgoKGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJiBSVENfVEFNUENSX1RBTVBJRSkpICE9ICh1aW50MzJfdClSRVNFVCkgfHwgXAotICAgICAgICgoKGhydGMtPkluc3RhbmNlLT5UQU1QQ1IgJiBSVENfVEFNUENSX1RBTVAxSUUpKSAhPSAodWludDMyX3QpUkVTRVQpKQorICAgIC8qIEdldCB0aGUgcGVuZGluZyBzdGF0dXMgb2YgdGhlIFRhbXBlcjEgSW50ZXJydXB0ICovCisgICAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMUYpICE9ICh1aW50MzJfdClSRVNFVCkKICAgICB7CiAgICAgICAvKiBUYW1wZXIgY2FsbGJhY2sgKi8KICNpZiAoVVNFX0hBTF9SVENfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCkBAIC02OTIsMTIgKzY5MiwxMSBAQAogICAgIH0KICAgfQogCi0gIC8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBJbnRlcnJ1cHQgKi8KLSAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19UQU1QMkYpPT0gU0VUKQorICAvKiBHZXQgdGhlIFRhbXBlcjIgaW50ZXJydXB0IHNvdXJjZSBlbmFibGUgc3RhdHVzICovCisgIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0lUX1NPVVJDRShocnRjLCBSVENfSVRfVEFNUCB8IFJUQ19JVF9UQU1QMikgIT0gKHVpbnQzMl90KVJFU0VUKQogICB7Ci0gICAgLyogR2V0IHRoZSBUQU1QRVIgSW50ZXJydXB0IGVuYWJsZSBiaXQgYW5kIHBlbmRpbmcgYml0ICovCi0gICAgaWYoKCgoaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmIFJUQ19UQU1QQ1JfVEFNUElFKSkgIT0gKHVpbnQzMl90KVJFU0VUKSB8fCBcCi0gICAgICAgKCgoaHJ0Yy0+SW5zdGFuY2UtPlRBTVBDUiAmIFJUQ19UQU1QQ1JfVEFNUDJJRSkpICE9ICh1aW50MzJfdClSRVNFVCkpCisgICAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgVGFtcGVyMiBJbnRlcnJ1cHQgKi8KKyAgICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAyRikgIT0gKHVpbnQzMl90KVJFU0VUKQogICAgIHsKICAgICAgIC8qIFRhbXBlciBjYWxsYmFjayAqLwogI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKQEAgLTcxMSwxMiArNzEwLDExIEBACiAgICAgfQogICB9CiAKLSAgLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIEludGVycnVwdCAqLwotICBpZihfX0hBTF9SVENfVEFNUEVSX0dFVF9GTEFHKGhydGMsIFJUQ19GTEFHX1RBTVAzRik9PSBTRVQpCisgIC8qIEdldCB0aGUgVGFtcGVyMyBpbnRlcnJ1cHQgc291cmNlIGVuYWJsZSBzdGF0dXMgKi8KKyAgaWYoX19IQUxfUlRDX1RBTVBFUl9HRVRfSVRfU09VUkNFKGhydGMsIFJUQ19JVF9UQU1QIHwgUlRDX0lUX1RBTVAzKSAhPSAodWludDMyX3QpUkVTRVQpCiAgIHsKLSAgICAvKiBHZXQgdGhlIFRBTVBFUiBJbnRlcnJ1cHQgZW5hYmxlIGJpdCBhbmQgcGVuZGluZyBiaXQgKi8KLSAgICBpZigoKChocnRjLT5JbnN0YW5jZS0+VEFNUENSICYgUlRDX1RBTVBDUl9UQU1QSUUpKSAhPSAodWludDMyX3QpUkVTRVQpIHx8IFwKLSAgICAgICAoKChocnRjLT5JbnN0YW5jZS0+VEFNUENSICYgUlRDX1RBTVBDUl9UQU1QM0lFKSkgIT0gKHVpbnQzMl90KVJFU0VUKSkKKyAgICAvKiBHZXQgdGhlIHBlbmRpbmcgc3RhdHVzIG9mIHRoZSBUYW1wZXIzIEludGVycnVwdCAqLworICAgIGlmKF9fSEFMX1JUQ19UQU1QRVJfR0VUX0ZMQUcoaHJ0YywgUlRDX0ZMQUdfVEFNUDNGKSAhPSAodWludDMyX3QpUkVTRVQpCiAgICAgewogICAgICAgLyogVGFtcGVyIGNhbGxiYWNrICovCiAjaWYgKFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQpAQCAtMTIxMSwyNyArMTIwOSwyOSBAQAogCiAvKioKICAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBXYWtlIFVwIFRpbWVyIGludGVycnVwdCByZXF1ZXN0LgorICAqIEBub3RlICAgVW5saWtlIGFsYXJtIGludGVycnVwdCBsaW5lIChzaGFyZWQgYnkgQWxhcm1BIGFuZCBBbGFybUIpIGFuZCB0YW1wZXIKKyAgKiAgICAgICAgIGludGVycnVwdCBsaW5lIChzaGFyZWQgYnkgdGltZXN0YW1wIGFuZCB0YW1wZXJzKSB3YWtldXAgdGltZXIKKyAgKiAgICAgICAgIGludGVycnVwdCBsaW5lIGlzIGV4Y2x1c2l2ZSB0byB0aGUgd2FrZXVwIHRpbWVyLgorICAqICAgICAgICAgVGhlcmUgaXMgbm8gbmVlZCBpbiB0aGlzIGNhc2UgdG8gY2hlY2sgb24gdGhlIGludGVycnVwdCBlbmFibGUKKyAgKiAgICAgICAgIHN0YXR1cyB2aWEgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9JVF9TT1VSQ0UoKS4KICAgKiBAcGFyYW0gIGhydGMgcG9pbnRlciB0byBhIFJUQ19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFJUQy4KICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcihSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKIHsKLSAgaWYoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9JVChocnRjLCBSVENfSVRfV1VUKSkKKyAgLyogR2V0IHRoZSBwZW5kaW5nIHN0YXR1cyBvZiB0aGUgV0FLRVVQVElNRVIgSW50ZXJydXB0ICovCisgIGlmKF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9HRVRfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKSAhPSAodWludDMyX3QpUkVTRVQpCiAgIHsKLSAgICAvKiBHZXQgdGhlIHN0YXR1cyBvZiB0aGUgSW50ZXJydXB0ICovCi0gICAgaWYoKHVpbnQzMl90KShocnRjLT5JbnN0YW5jZS0+Q1IgJiBSVENfSVRfV1VUKSAhPSAodWludDMyX3QpUkVTRVQpCi0gICAgewotICAgICAgLyogV0FLRVVQVElNRVIgY2FsbGJhY2sgKi8KKyAgICAvKiBXQUtFVVBUSU1FUiBjYWxsYmFjayAqLwogI2lmIChVU0VfSEFMX1JUQ19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgIGhydGMtPldha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhocnRjKTsKKyAgICBocnRjLT5XYWtlVXBUaW1lckV2ZW50Q2FsbGJhY2soaHJ0Yyk7CiAjZWxzZQotICAgICAgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhocnRjKTsKKyAgICBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKGhydGMpOwogI2VuZGlmIC8qIFVTRV9IQUxfUlRDX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogCi0gICAgICAvKiBDbGVhciB0aGUgV0FLRVVQVElNRVIgaW50ZXJydXB0IHBlbmRpbmcgYml0ICovCi0gICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfQ0xFQVJfRkxBRyhocnRjLCBSVENfRkxBR19XVVRGKTsKLSAgICB9CisgICAgLyogQ2xlYXIgdGhlIFdBS0VVUFRJTUVSIGludGVycnVwdCBwZW5kaW5nIGJpdCAqLworICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKGhydGMsIFJUQ19GTEFHX1dVVEYpOwogICB9CiAKICAgLyogQ2xlYXIgdGhlIEVYVEkncyBsaW5lIEZsYWcgZm9yIFJUQyBXYWtlVXBUaW1lciAqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfc2FpLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9zYWkuYwppbmRleCAzYzJjZGRlLi5lODAyMmY0IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9zYWkuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9zYWkuYwpAQCAtMTMyLDEyICsxMzIsMTMgQEAKIAogICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQorICAgIFsuLl0KICAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfU0FJX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCiAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KLSAgICBVc2UgZnVuY3Rpb25zIEByZWYgSEFMX1NBSV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgorICAgIFVzZSBmdW5jdGlvbnMgSEFMX1NBSV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgogCi0gICAgRnVuY3Rpb24gQHJlZiBIQUxfU0FJX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKKyAgICBbLi5dCisgICAgRnVuY3Rpb24gSEFMX1NBSV9SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAoKykgUnhDcGx0Q2FsbGJhY2sgICAgIDogU0FJIHJlY2VpdmUgY29tcGxldGUuCiAgICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogU0FJIHJlY2VpdmUgaGFsZiBjb21wbGV0ZS4KICAgICAgICgrKSBUeENwbHRDYWxsYmFjayAgICAgOiBTQUkgdHJhbnNtaXQgY29tcGxldGUuCkBAIC0xNDUsMTMgKzE0NiwxNiBAQAogICAgICAgKCspIEVycm9yQ2FsbGJhY2sgICAgICA6IFNBSSBlcnJvci4KICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBTQUkgTXNwSW5pdC4KICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBTQUkgTXNwRGVJbml0LgorICAgIFsuLl0KICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIGNhbGxiYWNrIElECiAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KIAotICAgIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9TQUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAorICAgIFsuLl0KKyAgICBVc2UgZnVuY3Rpb24gSEFMX1NBSV9VblJlZ2lzdGVyQ2FsbGJhY2soKSB0byByZXNldCBhIGNhbGxiYWNrIHRvIHRoZSBkZWZhdWx0CiAgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCi0gICAgQHJlZiBIQUxfU0FJX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKKyAgICBIQUxfU0FJX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKICAgICBhbmQgdGhlIGNhbGxiYWNrIElELgorICAgIFsuLl0KICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgKCspIFJ4Q3BsdENhbGxiYWNrICAgICA6IFNBSSByZWNlaXZlIGNvbXBsZXRlLgogICAgICAgKCspIFJ4SGFsZkNwbHRDYWxsYmFjayA6IFNBSSByZWNlaXZlIGhhbGYgY29tcGxldGUuCkBAIC0xNjEsMjMgKzE2NSwyNiBAQAogICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IFNBSSBNc3BJbml0LgogICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IFNBSSBNc3BEZUluaXQuCiAKLSAgICBCeSBkZWZhdWx0LCBhZnRlciB0aGUgQHJlZiBIQUxfU0FJX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfU0FJX1NUQVRFX1JFU0VUCisgICAgWy4uXQorICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBIQUxfU0FJX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfU0FJX1NUQVRFX1JFU0VUCiAgICAgYWxsIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczoKLSAgICBleGFtcGxlcyBAcmVmIEhBTF9TQUlfUnhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfU0FJX0Vycm9yQ2FsbGJhY2soKS4KKyAgICBleGFtcGxlcyBIQUxfU0FJX1J4Q3BsdENhbGxiYWNrKCksIEhBTF9TQUlfRXJyb3JDYWxsYmFjaygpLgogICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgYXJlIHJlc3BlY3RpdmVseQotICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBAcmVmIEhBTF9TQUlfSW5pdAotICAgIGFuZCBAcmVmICBIQUxfU0FJX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KLSAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX1NBSV9Jbml0IGFuZCBAcmVmIEhBTF9TQUlfRGVJbml0CisgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEhBTF9TQUlfSW5pdAorICAgIGFuZCBIQUxfU0FJX0RlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4KKyAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEhBTF9TQUlfSW5pdCBhbmQgSEFMX1NBSV9EZUluaXQKICAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogCisgICAgWy4uXQogICAgIENhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQgaW4gUkVBRFkgc3RhdGUgb25seS4KICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkCiAgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCiAgICAgZHVyaW5nIHRoZSBJbml0L0RlSW5pdC4KICAgICBJbiB0aGF0IGNhc2UgZmlyc3QgcmVnaXN0ZXIgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCi0gICAgdXNpbmcgQHJlZiBIQUxfU0FJX1JlZ2lzdGVyQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfU0FJX0RlSW5pdAotICAgIG9yIEByZWYgSEFMX1NBSV9Jbml0IGZ1bmN0aW9uLgorICAgIHVzaW5nIEhBTF9TQUlfUmVnaXN0ZXJDYWxsYmFjayBiZWZvcmUgY2FsbGluZyBIQUxfU0FJX0RlSW5pdAorICAgIG9yIEhBTF9TQUlfSW5pdCBmdW5jdGlvbi4KIAorICAgIFsuLl0KICAgICBXaGVuIHRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TQUlfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgpAQCAtMjI4LDcgKzIzNSw2IEBACiAvKiogQGRlZmdyb3VwIFNBSV9Qcml2YXRlX0NvbnN0YW50cyAgU0FJIFByaXZhdGUgQ29uc3RhbnRzCiAgICogQHsKICAgKi8KLSNkZWZpbmUgU0FJX0ZJRk9fU0laRSAgICAgICAgIDgKICNkZWZpbmUgU0FJX0RFRkFVTFRfVElNRU9VVCAgIDQgLyogNG1zICovCiAvKioKICAgKiBAfQpAQCAtNTA3LDYgKzUxMyw4IEBACiAgICAgICBoc2FpLT5Jbml0Lk1ja2Rpdis9IDE7CiAgICAgfQogICB9CisgIC8qIENoZWNrIHRoZSBTQUkgQmxvY2sgbWFzdGVyIGNsb2NrIGRpdmlkZXIgcGFyYW1ldGVyICovCisgIGFzc2VydF9wYXJhbShJU19TQUlfQkxPQ0tfTUFTVEVSX0RJVklERVIoaHNhaS0+SW5pdC5NY2tkaXYpKTsKIAogICAvKiBDb21wdXRlIENLU1RSIGJpdHMgb2YgU0FJIENSMSBhY2NvcmRpbmcgQ2xvY2tTdHJvYmluZyBhbmQgQXVkaW9Nb2RlICovCiAgIGlmKChoc2FpLT5Jbml0LkF1ZGlvTW9kZSA9PSBTQUlfTU9ERU1BU1RFUl9UWCkgfHwgKGhzYWktPkluaXQuQXVkaW9Nb2RlID09IFNBSV9NT0RFU0xBVkVfVFgpKQpAQCAtMjM0NCw3ICsyMzUyLDcgQEAKIHsKICAgU0FJX0hhbmRsZVR5cGVEZWYqIGhzYWkgPSAoU0FJX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OwogCi0gIGlmKChoZG1hLT5JbnN0YW5jZS0+Q1IgJiBETUFfU3hDUl9DSVJDKSA9PSAwKQorICBpZiAoaGRtYS0+SW5pdC5Nb2RlICE9IERNQV9DSVJDVUxBUikKICAgewogICAgIGhzYWktPlhmZXJDb3VudCA9IDA7CiAKQEAgLTIzOTAsNyArMjM5OCw3IEBACiB7CiAgIFNBSV9IYW5kbGVUeXBlRGVmKiBoc2FpID0gKCBTQUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OwogCi0gaWYoKGhkbWEtPkluc3RhbmNlLT5DUiAmIERNQV9TeENSX0NJUkMpID09IDApCisgIGlmIChoZG1hLT5Jbml0Lk1vZGUgIT0gRE1BX0NJUkNVTEFSKQogICB7CiAgICAgLyogRGlzYWJsZSBSeCBETUEgUmVxdWVzdCAqLwogICAgIGhzYWktPkluc3RhbmNlLT5DUjEgJj0gKHVpbnQzMl90KSh+U0FJX3hDUjFfRE1BRU4pOwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfc2QuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3NkLmMKaW5kZXggNzgxZDU4OC4uMzNhMDg2MSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfc2QuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9zZC5jCkBAIC0zLDE2MSArMywxNjUgQEAKICAgKiBAZmlsZSAgICBzdG0zMmY3eHhfaGFsX3NkLmMKICAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICAqIEBicmllZiAgIFNEIGNhcmQgSEFMIG1vZHVsZSBkcml2ZXIuCi0gICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZyAKKyAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBTZWN1cmUgRGlnaXRhbCAoU0QpIHBlcmlwaGVyYWw6CiAgICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogICAqICAgICAgICAgICArIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKLSAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIAotICAqICAgICAgICAgICArIFNEIGNhcmQgQ29udHJvbCBmdW5jdGlvbnMKLSAgKiAgICAgICAgIAorICAqICAgICAgICAgICArIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKKyAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucworICAqCiAgIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KLSAgICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIGEgaGlnaCBsZXZlbCBjb21tdW5pY2F0aW9uIGxheWVyIGZvciByZWFkIGFuZCB3cml0ZSBmcm9tL3RvIAotICAgIHRoaXMgbWVtb3J5LiBUaGUgbmVlZGVkIFNUTTMyIGhhcmR3YXJlIHJlc291cmNlcyAoU0RNTUMgYW5kIEdQSU8pIGFyZSBwZXJmb3JtZWQgYnkgCi0gICAgdGhlIHVzZXIgaW4gSEFMX1NEX01zcEluaXQoKSBmdW5jdGlvbiAoTVNQIGxheWVyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEJhc2ljYWxseSwgdGhlIE1TUCBsYXllciBjb25maWd1cmF0aW9uIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB3ZSBwcm92aWRlIGluIHRoZSAKKyAgICBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIGEgaGlnaCBsZXZlbCBjb21tdW5pY2F0aW9uIGxheWVyIGZvciByZWFkIGFuZCB3cml0ZSBmcm9tL3RvCisgICAgdGhpcyBtZW1vcnkuIFRoZSBuZWVkZWQgU1RNMzIgaGFyZHdhcmUgcmVzb3VyY2VzIChTRE1NQyBhbmQgR1BJTykgYXJlIHBlcmZvcm1lZCBieQorICAgIHRoZSB1c2VyIGluIEhBTF9TRF9Nc3BJbml0KCkgZnVuY3Rpb24gKE1TUCBsYXllcikuCisgICAgQmFzaWNhbGx5LCB0aGUgTVNQIGxheWVyIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHdlIHByb3ZpZGUgaW4gdGhlCiAgICAgZXhhbXBsZXMuCiAgICAgWW91IGNhbiBlYXNpbHkgdGFpbG9yIHRoaXMgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gaGFyZHdhcmUgcmVzb3VyY2VzLgogCiAgIFsuLl0KLSAgICBUaGlzIGRyaXZlciBpcyBhIGdlbmVyaWMgbGF5ZXJlZCBkcml2ZXIgZm9yIFNETU1DIG1lbW9yaWVzIHdoaWNoIHVzZXMgdGhlIEhBTCAKLSAgICBTRE1NQyBkcml2ZXIgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIFNEIGFuZCB1U0QgY2FyZHMgZGV2aWNlcy4gCisgICAgVGhpcyBkcml2ZXIgaXMgYSBnZW5lcmljIGxheWVyZWQgZHJpdmVyIGZvciBTRE1NQyBtZW1vcmllcyB3aGljaCB1c2VzIHRoZSBIQUwKKyAgICBTRE1NQyBkcml2ZXIgZnVuY3Rpb25zIHRvIGludGVyZmFjZSB3aXRoIFNEIGFuZCB1U0QgY2FyZHMgZGV2aWNlcy4KICAgICBJdCBpcyB1c2VkIGFzIGZvbGxvd3M6Ci0gCi0gICAgKCMpSW5pdGlhbGl6ZSB0aGUgU0RNTUMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnQgdGhlIEhBTF9TRF9Nc3BJbml0KCkgQVBJOgotICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU0RNTUMgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19TRE1NQ19DTEtfRU5BQkxFKCk7IAorCisgICAgKCMpSW5pdGlhbGl6ZSB0aGUgU0RNTUMgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TRF9Nc3BJbml0KCkgQVBJOgorICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU0RNTUMgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19TRE1NQ19DTEtfRU5BQkxFKCk7CiAgICAgICAgICgjIykgU0RNTUMgcGlucyBjb25maWd1cmF0aW9uIGZvciBTRCBjYXJkCi0gICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU0RNTUMgR1BJT3MgdXNpbmcgdGhlIGZ1bmN0aW9ucyBfX0hBTF9SQ0NfR1BJT3hfQ0xLX0VOQUJMRSgpOyAgIAorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBjbG9jayBmb3IgdGhlIFNETU1DIEdQSU9zIHVzaW5nIHRoZSBmdW5jdGlvbnMgX19IQUxfUkNDX0dQSU94X0NMS19FTkFCTEUoKTsKICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTRE1NQyBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwIHVzaW5nIEhBTF9HUElPX0luaXQoKQogICAgICAgICAgICAgICAgICAgYW5kIGFjY29yZGluZyB0byB5b3VyIHBpbiBhc3NpZ25tZW50OwotICAgICAgICAoIyMpIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcyAoSEFMX1NEX1JlYWRCbG9ja3NfRE1BKCkKKyAgICAgICAgKCMjKSBETUEgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgRE1BIHByb2Nlc3MgKEhBTF9TRF9SZWFkQmxvY2tzX0RNQSgpCiAgICAgICAgICAgICAgYW5kIEhBTF9TRF9Xcml0ZUJsb2Nrc19ETUEoKSBBUElzKS4KLSAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2sgdXNpbmcgX19IQUxfUkNDX0RNQXhfQ0xLX0VOQUJMRSgpOyAKLSAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIHVzaW5nIHRoZSBmdW5jdGlvbiBIQUxfRE1BX0luaXQoKSB3aXRoIHByZWRlY2xhcmVkIGFuZCBmaWxsZWQuIAorICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBETUF4IGludGVyZmFjZSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfRE1BeF9DTEtfRU5BQkxFKCk7CisgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIERNQSB1c2luZyB0aGUgZnVuY3Rpb24gSEFMX0RNQV9Jbml0KCkgd2l0aCBwcmVkZWNsYXJlZCBhbmQgZmlsbGVkLgogICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3Mgd2hlbiB1c2luZyBETUEgdHJhbnNmZXIuCiAgICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNETU1DIGFuZCBETUEgaW50ZXJydXB0IHByaW9yaXRpZXMgdXNpbmcgZnVuY3Rpb25zCiAgICAgICAgICAgICAgICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eSgpOyBETUEgcHJpb3JpdHkgaXMgc3VwZXJpb3IgdG8gU0RNTUMncyBwcmlvcml0eQogICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIERNQSBhbmQgU0RNTUMgSVJRcyB1c2luZyBmdW5jdGlvbiBIQUxfTlZJQ19FbmFibGVJUlEoKQotICAgICAgICAgICAgKCsrKykgU0RNTUMgaW50ZXJydXB0cyBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1NEX0VOQUJMRV9JVCgpIAorICAgICAgICAgICAgKCsrKykgU0RNTUMgaW50ZXJydXB0cyBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1NEX0VOQUJMRV9JVCgpCiAgICAgICAgICAgICAgICAgICBhbmQgX19IQUxfU0RfRElTQUJMRV9JVCgpIGluc2lkZSB0aGUgY29tbXVuaWNhdGlvbiBwcm9jZXNzLgogICAgICAgICAgICAgKCsrKykgU0RNTUMgaW50ZXJydXB0cyBwZW5kaW5nIGJpdHMgYXJlIG1hbmFnZWQgdXNpbmcgdGhlIG1hY3JvcyBfX0hBTF9TRF9HRVRfSVQoKQogICAgICAgICAgICAgICAgICAgYW5kIF9fSEFMX1NEX0NMRUFSX0lUKCkKICAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfU0RfUmVhZEJsb2Nrc19JVCgpCiAgICAgICAgICAgICAgYW5kIEhBTF9TRF9Xcml0ZUJsb2Nrc19JVCgpIEFQSXMpLgotICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBTRE1NQyBpbnRlcnJ1cHQgcHJpb3JpdGllcyB1c2luZyBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoKTsKKyAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU0RNTUMgaW50ZXJydXB0IHByaW9yaXRpZXMgdXNpbmcgZnVuY3Rpb24gSEFMX05WSUNfU2V0UHJpb3JpdHkoKTsKICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBTRE1NQyBJUlFzIHVzaW5nIGZ1bmN0aW9uIEhBTF9OVklDX0VuYWJsZUlSUSgpCi0gICAgICAgICAgICAoKysrKSBTRE1NQyBpbnRlcnJ1cHRzIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MgX19IQUxfU0RfRU5BQkxFX0lUKCkgCisgICAgICAgICAgICAoKysrKSBTRE1NQyBpbnRlcnJ1cHRzIGFyZSBtYW5hZ2VkIHVzaW5nIHRoZSBtYWNyb3MgX19IQUxfU0RfRU5BQkxFX0lUKCkKICAgICAgICAgICAgICAgICAgIGFuZCBfX0hBTF9TRF9ESVNBQkxFX0lUKCkgaW5zaWRlIHRoZSBjb21tdW5pY2F0aW9uIHByb2Nlc3MuCiAgICAgICAgICAgICAoKysrKSBTRE1NQyBpbnRlcnJ1cHRzIHBlbmRpbmcgYml0cyBhcmUgbWFuYWdlZCB1c2luZyB0aGUgbWFjcm9zIF9fSEFMX1NEX0dFVF9JVCgpCiAgICAgICAgICAgICAgICAgICBhbmQgX19IQUxfU0RfQ0xFQVJfSVQoKQotICAgICgjKSBBdCB0aGlzIHN0YWdlLCB5b3UgY2FuIHBlcmZvcm0gU0QgcmVhZC93cml0ZS9lcmFzZSBvcGVyYXRpb25zIGFmdGVyIFNEIGNhcmQgaW5pdGlhbGl6YXRpb24gIAorICAgICgjKSBBdCB0aGlzIHN0YWdlLCB5b3UgY2FuIHBlcmZvcm0gU0QgcmVhZC93cml0ZS9lcmFzZSBvcGVyYXRpb25zIGFmdGVyIFNEIGNhcmQgaW5pdGlhbGl6YXRpb24KIAotICAgICAgICAgCisKICAgKioqIFNEIENhcmQgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gKioqCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KLSAgICBUbyBpbml0aWFsaXplIHRoZSBTRCBDYXJkLCB1c2UgdGhlIEhBTF9TRF9Jbml0KCkgZnVuY3Rpb24uIEl0IEluaXRpYWxpemVzIAotICAgIFNETU1DIElQIChTVE0zMiBzaWRlKSBhbmQgdGhlIFNEIENhcmQsIGFuZCBwdXQgaXQgaW50byBTdGFuZEJ5IFN0YXRlIChSZWFkeSBmb3IgZGF0YSB0cmFuc2ZlcikuIAorICAgIFRvIGluaXRpYWxpemUgdGhlIFNEIENhcmQsIHVzZSB0aGUgSEFMX1NEX0luaXQoKSBmdW5jdGlvbi4gSXQgSW5pdGlhbGl6ZXMKKyAgICBTRE1NQyBQZXJpcGhlcmFsKFNUTTMyIHNpZGUpIGFuZCB0aGUgU0QgQ2FyZCwgYW5kIHB1dCBpdCBpbnRvIFN0YW5kQnkgU3RhdGUgKFJlYWR5IGZvciBkYXRhIHRyYW5zZmVyKS4KICAgICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOgogCi0gICAgKCMpIEluaXRpYWxpemUgdGhlIFNETU1DIHBlcmlwaGVyYWwgaW50ZXJmYWNlIHdpdGggZGVmYXVsbHQgY29uZmlndXJhdGlvbi4KLSAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MgaXMgZG9uZSBhdCA0MDBLSHouIFlvdSBjYW4gY2hhbmdlIG9yIGFkYXB0IAotICAgICAgICB0aGlzIGZyZXF1ZW5jeSBieSBhZGp1c3RpbmcgdGhlICJDbG9ja0RpdiIgZmllbGQuIAorICAgICgjKSBBcHBseSB0aGUgU0QgQ2FyZCBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGF0IDQwMEtIeiBhbmQgY2hlY2sgdGhlIFNEIENhcmQKKyAgICAgICAgdHlwZSAoU3RhbmRhcmQgQ2FwYWNpdHkgb3IgSGlnaCBDYXBhY2l0eSkuIFlvdSBjYW4gY2hhbmdlIG9yIGFkYXB0IHRoaXMKKyAgICAgICAgZnJlcXVlbmN5IGJ5IGFkanVzdGluZyB0aGUgIkNsb2NrRGl2IiBmaWVsZC4KICAgICAgICAgVGhlIFNEIENhcmQgZnJlcXVlbmN5IChTRE1NQ19DSykgaXMgY29tcHV0ZWQgYXMgZm9sbG93czoKLSAgCisKICAgICAgICAgICAgU0RNTUNfQ0sgPSBTRE1NQ0NMSyAvIChDbG9ja0RpdiArIDIpCi0gIAotICAgICAgICBJbiBpbml0aWFsaXphdGlvbiBtb2RlIGFuZCBhY2NvcmRpbmcgdG8gdGhlIFNEIENhcmQgc3RhbmRhcmQsIAorCisgICAgICAgIEluIGluaXRpYWxpemF0aW9uIG1vZGUgYW5kIGFjY29yZGluZyB0byB0aGUgU0QgQ2FyZCBzdGFuZGFyZCwKICAgICAgICAgbWFrZSBzdXJlIHRoYXQgdGhlIFNETU1DX0NLIGZyZXF1ZW5jeSBkb2Vzbid0IGV4Y2VlZCA0MDBLSHouCiAKLSAgICAgICAgVGhpcyBwaGFzZSBvZiBpbml0aWFsaXphdGlvbiBpcyBkb25lIHRocm91Z2ggU0RNTUNfSW5pdCgpIGFuZCAKKyAgICAgICAgVGhpcyBwaGFzZSBvZiBpbml0aWFsaXphdGlvbiBpcyBkb25lIHRocm91Z2ggU0RNTUNfSW5pdCgpIGFuZAogICAgICAgICBTRE1NQ19Qb3dlclN0YXRlX09OKCkgU0RNTUMgbG93IGxldmVsIEFQSXMuCiAKICAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU0QgY2FyZC4gVGhlIEFQSSB1c2VkIGlzIEhBTF9TRF9Jbml0Q2FyZCgpLgotICAgICAgICBUaGlzIHBoYXNlIGFsbG93cyB0aGUgY2FyZCBpbml0aWFsaXphdGlvbiBhbmQgaWRlbnRpZmljYXRpb24gCisgICAgICAgIFRoaXMgcGhhc2UgYWxsb3dzIHRoZSBjYXJkIGluaXRpYWxpemF0aW9uIGFuZCBpZGVudGlmaWNhdGlvbgogICAgICAgICBhbmQgY2hlY2sgdGhlIFNEIENhcmQgdHlwZSAoU3RhbmRhcmQgQ2FwYWNpdHkgb3IgSGlnaCBDYXBhY2l0eSkKICAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIGZsb3cgaXMgY29tcGF0aWJsZSB3aXRoIFNEIHN0YW5kYXJkLgogCi0gICAgICAgIFRoaXMgQVBJIChIQUxfU0RfSW5pdENhcmQoKSkgY291bGQgYmUgdXNlZCBhbHNvIHRvIHJlaW5pdGlhbGl6ZSB0aGUgY2FyZCBpbiBjYXNlIAorICAgICAgICBUaGlzIEFQSSAoSEFMX1NEX0luaXRDYXJkKCkpIGNvdWxkIGJlIHVzZWQgYWxzbyB0byByZWluaXRpYWxpemUgdGhlIGNhcmQgaW4gY2FzZQogICAgICAgICBvZiBwbHVnLW9mZiBwbHVnLWluLgotICAKLSAgICAoIykgQ29uZmlndXJlIHRoZSBTRCBDYXJkIERhdGEgdHJhbnNmZXIgZnJlcXVlbmN5LiBCeSBEZWZhdWx0LCB0aGUgY2FyZCB0cmFuc2ZlciAKLSAgICAgICAgZnJlcXVlbmN5IGlzIHNldCB0byAyNE1Iei4gWW91IGNhbiBjaGFuZ2Ugb3IgYWRhcHQgdGhpcyBmcmVxdWVuY3kgYnkgYWRqdXN0aW5nIAotICAgICAgICB0aGUgIkNsb2NrRGl2IiBmaWVsZC4KLSAgICAgICAgSW4gdHJhbnNmZXIgbW9kZSBhbmQgYWNjb3JkaW5nIHRvIHRoZSBTRCBDYXJkIHN0YW5kYXJkLCBtYWtlIHN1cmUgdGhhdCB0aGUgCisKKyAgICAoIykgQ29uZmlndXJlIHRoZSBTRCBDYXJkIERhdGEgdHJhbnNmZXIgZnJlcXVlbmN5LiBZb3UgY2FuIGNoYW5nZSBvciBhZGFwdCB0aGlzCisgICAgICAgIGZyZXF1ZW5jeSBieSBhZGp1c3RpbmcgdGhlICJDbG9ja0RpdiIgZmllbGQuCisgICAgICAgIEluIHRyYW5zZmVyIG1vZGUgYW5kIGFjY29yZGluZyB0byB0aGUgU0QgQ2FyZCBzdGFuZGFyZCwgbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIFNETU1DX0NLIGZyZXF1ZW5jeSBkb2Vzbid0IGV4Y2VlZCAyNU1IeiBhbmQgNTBNSHogaW4gSGlnaC1zcGVlZCBtb2RlIHN3aXRjaC4KLSAgICAgICAgVG8gYmUgYWJsZSB0byB1c2UgYSBmcmVxdWVuY3kgaGlnaGVyIHRoYW4gMjRNSHosIHlvdSBzaG91bGQgdXNlIHRoZSBTRE1NQyAKLSAgICAgICAgcGVyaXBoZXJhbCBpbiBieXBhc3MgbW9kZS4gUmVmZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlIG1hbnVhbCAKKyAgICAgICAgVG8gYmUgYWJsZSB0byB1c2UgYSBmcmVxdWVuY3kgaGlnaGVyIHRoYW4gMjRNSHosIHlvdSBzaG91bGQgdXNlIHRoZSBTRE1NQworICAgICAgICBwZXJpcGhlcmFsIGluIGJ5cGFzcyBtb2RlLiBSZWZlciB0byB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2UgbWFudWFsCiAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuCi0gIAorCiAgICAgKCMpIFNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBTRCBDYXJkIGFjY29yZGluZyB0byB0aGUgYWRkcmVzcyByZWFkIHdpdGggdGhlIHN0ZXAgMi4KLSAgICAKKwogICAgICgjKSBDb25maWd1cmUgdGhlIFNEIENhcmQgaW4gd2lkZSBidXMgbW9kZTogNC1iaXRzIGRhdGEuCi0gIAorCiAgICoqKiBTRCBDYXJkIFJlYWQgb3BlcmF0aW9uICoqKgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgWy4uXSAKLSAgICAoKykgWW91IGNhbiByZWFkIGZyb20gU0QgY2FyZCBpbiBwb2xsaW5nIG1vZGUgYnkgdXNpbmcgZnVuY3Rpb24gSEFMX1NEX1JlYWRCbG9ja3MoKS4gCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZWFkIG9mIDUxMiBieXRlcyBibG9ja3MuCi0gICAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBvbmUgYmxvY2sgcmVhZCBvcGVyYXRpb24gb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCBvcGVyYXRpb24gCisgIFsuLl0KKyAgICAoKykgWW91IGNhbiByZWFkIGZyb20gU0QgY2FyZCBpbiBwb2xsaW5nIG1vZGUgYnkgdXNpbmcgZnVuY3Rpb24gSEFMX1NEX1JlYWRCbG9ja3MoKS4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0IG9ubHkgNTEyLWJ5dGVzIGJsb2NrIGxlbmd0aCAodGhlIGJsb2NrIHNpemUgc2hvdWxkIGJlCisgICAgICAgIGNob3NlbiBhcyA1MTIgYnl0ZXMpLgorICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uCiAgICAgICAgIGJ5IGFkanVzdGluZyB0aGUgIk51bWJlck9mQmxvY2tzIiBwYXJhbWV0ZXIuCiAgICAgICAgIEFmdGVyIHRoaXMsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lIGNvcnJlY3RseS4gVGhlIGNoZWNrIGlzIGRvbmUKICAgICAgICAgdGhyb3VnaCBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkgZnVuY3Rpb24gZm9yIFNEIGNhcmQgc3RhdGUuCiAKICAgICAoKykgWW91IGNhbiByZWFkIGZyb20gU0QgY2FyZCBpbiBETUEgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfU0RfUmVhZEJsb2Nrc19ETUEoKS4KLSAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHJlYWQgb2YgNTEyIGJ5dGVzIGJsb2Nrcy4KLSAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbiAKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0IG9ubHkgNTEyLWJ5dGVzIGJsb2NrIGxlbmd0aCAodGhlIGJsb2NrIHNpemUgc2hvdWxkIGJlCisgICAgICAgIGNob3NlbiBhcyA1MTIgYnl0ZXMpLgorICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uCiAgICAgICAgIGJ5IGFkanVzdGluZyB0aGUgIk51bWJlck9mQmxvY2tzIiBwYXJhbWV0ZXIuCiAgICAgICAgIEFmdGVyIHRoaXMsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lIGNvcnJlY3RseS4gVGhlIGNoZWNrIGlzIGRvbmUKICAgICAgICAgdGhyb3VnaCBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkgZnVuY3Rpb24gZm9yIFNEIGNhcmQgc3RhdGUuCiAgICAgICAgIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSBETUEgdHJhbnNmZXIgcHJvY2VzcyB0aHJvdWdoIHRoZSBTRCBSeCBpbnRlcnJ1cHQgZXZlbnQuCiAKICAgICAoKykgWW91IGNhbiByZWFkIGZyb20gU0QgY2FyZCBpbiBJbnRlcnJ1cHQgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfU0RfUmVhZEJsb2Nrc19JVCgpLgotICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgcmVhZCBvZiA1MTIgYnl0ZXMgYmxvY2tzLgotICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uIAorICAgICAgICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnQgb25seSA1MTItYnl0ZXMgYmxvY2sgbGVuZ3RoICh0aGUgYmxvY2sgc2l6ZSBzaG91bGQgYmUKKyAgICAgICAgY2hvc2VuIGFzIDUxMiBieXRlcykuCisgICAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBvbmUgYmxvY2sgcmVhZCBvcGVyYXRpb24gb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCBvcGVyYXRpb24KICAgICAgICAgYnkgYWRqdXN0aW5nIHRoZSAiTnVtYmVyT2ZCbG9ja3MiIHBhcmFtZXRlci4KICAgICAgICAgQWZ0ZXIgdGhpcywgeW91IGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zZmVyIGlzIGRvbmUgY29ycmVjdGx5LiBUaGUgY2hlY2sgaXMgZG9uZQogICAgICAgICB0aHJvdWdoIEhBTF9TRF9HZXRDYXJkU3RhdGUoKSBmdW5jdGlvbiBmb3IgU0QgY2FyZCBzdGF0ZS4KICAgICAgICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIElUIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgU0QgUnggaW50ZXJydXB0IGV2ZW50LgotICAKKwogICAqKiogU0QgQ2FyZCBXcml0ZSBvcGVyYXRpb24gKioqCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gIFsuLl0gCi0gICAgKCspIFlvdSBjYW4gd3JpdGUgdG8gU0QgY2FyZCBpbiBwb2xsaW5nIG1vZGUgYnkgdXNpbmcgZnVuY3Rpb24gSEFMX1NEX1dyaXRlQmxvY2tzKCkuIAotICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgcmVhZCBvZiA1MTIgYnl0ZXMgYmxvY2tzLgotICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIFsuLl0KKyAgICAoKykgWW91IGNhbiB3cml0ZSB0byBTRCBjYXJkIGluIHBvbGxpbmcgbW9kZSBieSB1c2luZyBmdW5jdGlvbiBIQUxfU0RfV3JpdGVCbG9ja3MoKS4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0IG9ubHkgNTEyLWJ5dGVzIGJsb2NrIGxlbmd0aCAodGhlIGJsb2NrIHNpemUgc2hvdWxkIGJlCisgICAgICAgIGNob3NlbiBhcyA1MTIgYnl0ZXMpLgorICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uCiAgICAgICAgIGJ5IGFkanVzdGluZyB0aGUgIk51bWJlck9mQmxvY2tzIiBwYXJhbWV0ZXIuCiAgICAgICAgIEFmdGVyIHRoaXMsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lIGNvcnJlY3RseS4gVGhlIGNoZWNrIGlzIGRvbmUKICAgICAgICAgdGhyb3VnaCBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkgZnVuY3Rpb24gZm9yIFNEIGNhcmQgc3RhdGUuCiAKICAgICAoKykgWW91IGNhbiB3cml0ZSB0byBTRCBjYXJkIGluIERNQSBtb2RlIGJ5IHVzaW5nIGZ1bmN0aW9uIEhBTF9TRF9Xcml0ZUJsb2Nrc19ETUEoKS4KLSAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHJlYWQgb2YgNTEyIGJ5dGVzIGJsb2Nrcy4KLSAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbiAKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0IG9ubHkgNTEyLWJ5dGVzIGJsb2NrIGxlbmd0aCAodGhlIGJsb2NrIHNpemUgc2hvdWxkIGJlCisgICAgICAgIGNob3NlbiBhcyA1MTIgYnl0ZXMpLgorICAgICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgb25lIGJsb2NrIHJlYWQgb3BlcmF0aW9uIG9yIG11bHRpcGxlIGJsb2NrIHJlYWQgb3BlcmF0aW9uCiAgICAgICAgIGJ5IGFkanVzdGluZyB0aGUgIk51bWJlck9mQmxvY2tzIiBwYXJhbWV0ZXIuCiAgICAgICAgIEFmdGVyIHRoaXMsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lIGNvcnJlY3RseS4gVGhlIGNoZWNrIGlzIGRvbmUKICAgICAgICAgdGhyb3VnaCBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkgZnVuY3Rpb24gZm9yIFNEIGNhcmQgc3RhdGUuCi0gICAgICAgIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSBETUEgdHJhbnNmZXIgcHJvY2VzcyB0aHJvdWdoIHRoZSBTRCBUeCBpbnRlcnJ1cHQgZXZlbnQuICAKKyAgICAgICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFR4IGludGVycnVwdCBldmVudC4KIAogICAgICgrKSBZb3UgY2FuIHdyaXRlIHRvIFNEIGNhcmQgaW4gSW50ZXJydXB0IG1vZGUgYnkgdXNpbmcgZnVuY3Rpb24gSEFMX1NEX1dyaXRlQmxvY2tzX0lUKCkuCi0gICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSByZWFkIG9mIDUxMiBieXRlcyBibG9ja3MuCi0gICAgICAgIFlvdSBjYW4gY2hvb3NlIGVpdGhlciBvbmUgYmxvY2sgcmVhZCBvcGVyYXRpb24gb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCBvcGVyYXRpb24gCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydCBvbmx5IDUxMi1ieXRlcyBibG9jayBsZW5ndGggKHRoZSBibG9jayBzaXplIHNob3VsZCBiZQorICAgICAgICBjaG9zZW4gYXMgNTEyIGJ5dGVzKS4KKyAgICAgICAgWW91IGNhbiBjaG9vc2UgZWl0aGVyIG9uZSBibG9jayByZWFkIG9wZXJhdGlvbiBvciBtdWx0aXBsZSBibG9jayByZWFkIG9wZXJhdGlvbgogICAgICAgICBieSBhZGp1c3RpbmcgdGhlICJOdW1iZXJPZkJsb2NrcyIgcGFyYW1ldGVyLgogICAgICAgICBBZnRlciB0aGlzLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgaXMgZG9uZSBjb3JyZWN0bHkuIFRoZSBjaGVjayBpcyBkb25lCiAgICAgICAgIHRocm91Z2ggSEFMX1NEX0dldENhcmRTdGF0ZSgpIGZ1bmN0aW9uIGZvciBTRCBjYXJkIHN0YXRlLgogICAgICAgICBZb3UgY291bGQgYWxzbyBjaGVjayB0aGUgSVQgdHJhbnNmZXIgcHJvY2VzcyB0aHJvdWdoIHRoZSBTRCBUeCBpbnRlcnJ1cHQgZXZlbnQuCi0gIAorCiAgICoqKiBTRCBjYXJkIHN0YXR1cyAqKioKLSAgPT09PT09PT09PT09PT09PT09PT09PSAKKyAgPT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCi0gICAgKCspIFRoZSBTRCBTdGF0dXMgY29udGFpbnMgc3RhdHVzIGJpdHMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgU0QgTWVtb3J5IAorICAgICgrKSBUaGUgU0QgU3RhdHVzIGNvbnRhaW5zIHN0YXR1cyBiaXRzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFNEIE1lbW9yeQogICAgICAgICBDYXJkIHByb3ByaWV0YXJ5IGZlYXR1cmVzLiBUbyBnZXQgU0QgY2FyZCBzdGF0dXMgdXNlIHRoZSBIQUxfU0RfR2V0Q2FyZFN0YXR1cygpLgogCiAgICoqKiBTRCBjYXJkIGluZm9ybWF0aW9uICoqKgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCiAgICAgKCspIFRvIGdldCBTRCBjYXJkIGluZm9ybWF0aW9uLCB5b3UgY2FuIHVzZSB0aGUgZnVuY3Rpb24gSEFMX1NEX0dldENhcmRJbmZvKCkuCiAgICAgICAgIEl0IHJldHVybnMgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTRCBjYXJkIHN1Y2ggYXMgYmxvY2sgc2l6ZSwgY2FyZCB0eXBlLApAQCAtMTY1LDEzICsxNjksMTEgQEAKIAogICAqKiogU0QgY2FyZCBDU0QgcmVnaXN0ZXIgKioqCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgWy4uXQogICAgICgrKSBUaGUgSEFMX1NEX0dldENhcmRDU0QoKSBBUEkgYWxsb3dzIHRvIGdldCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgQ1NEIHJlZ2lzdGVyLgogICAgICAgICBTb21lIG9mIHRoZSBDU0QgcGFyYW1ldGVycyBhcmUgdXNlZnVsIGZvciBjYXJkIGluaXRpYWxpemF0aW9uIGFuZCBpZGVudGlmaWNhdGlvbi4KIAogICAqKiogU0QgY2FyZCBDSUQgcmVnaXN0ZXIgKioqCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgWy4uXQogICAgICgrKSBUaGUgSEFMX1NEX0dldENhcmRDSUQoKSBBUEkgYWxsb3dzIHRvIGdldCB0aGUgcGFyYW1ldGVycyBvZiB0aGUgQ0lEIHJlZ2lzdGVyLgogICAgICAgICBTb21lIG9mIHRoZSBDU0QgcGFyYW1ldGVycyBhcmUgdXNlZnVsIGZvciBjYXJkIGluaXRpYWxpemF0aW9uIGFuZCBpZGVudGlmaWNhdGlvbi4KIApAQCAtMTc5LDcgKzE4MSw3IEBACiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgWy4uXQogICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gU0QgSEFMIGRyaXZlci4KLSAgICAgICAKKwogICAgICgrKSBfX0hBTF9TRF9FTkFCTEUgOiBFbmFibGUgdGhlIFNEIGRldmljZQogICAgICgrKSBfX0hBTF9TRF9ESVNBQkxFIDogRGlzYWJsZSB0aGUgU0QgZGV2aWNlCiAgICAgKCspIF9fSEFMX1NEX0RNQV9FTkFCTEU6IEVuYWJsZSB0aGUgU0RNTUMgRE1BIHRyYW5zZmVyCkBAIC0xODksOSArMTkxLDggQEAKICAgICAoKykgX19IQUxfU0RfR0VUX0ZMQUc6Q2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNEIGZsYWcgaXMgc2V0IG9yIG5vdAogICAgICgrKSBfX0hBTF9TRF9DTEVBUl9GTEFHOiBDbGVhciB0aGUgU0QncyBwZW5kaW5nIGZsYWdzCiAKLSAgWy4uXQotICAgIChAKSBZb3UgY2FuIHJlZmVyIHRvIHRoZSBTRCBIQUwgZHJpdmVyIGhlYWRlciBmaWxlIGZvciBtb3JlIHVzZWZ1bCBtYWNyb3MgCi0gICAgICAKKyAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgU0QgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zCisKICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KQEAgLTIyMiw3ICsyMjMsNyBAQAogICAgIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9TRF9Jbml0IGFuZCBpZiB0aGUgc3RhdGUgaXMgSEFMX1NEX1NUQVRFX1JFU0VUCiAgICAgYWxsIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucy4KICAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKLSAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfU0RfSW5pdCAKKyAgICByZXNldCB0byB0aGUgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9ucyBpbiB0aGUgQHJlZiBIQUxfU0RfSW5pdAogICAgIGFuZCBAcmVmICBIQUxfU0RfRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogICAgIElmIG5vdCwgTXNwSW5pdCBvciBNc3BEZUluaXQgYXJlIG5vdCBudWxsLCB0aGUgQHJlZiBIQUxfU0RfSW5pdCBhbmQgQHJlZiBIQUxfU0RfRGVJbml0CiAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyAocmVnaXN0ZXJlZCBiZWZvcmVoYW5kKQpAQCAtMjMyLDExICsyMzMsMTEgQEAKICAgICBpbiBSRUFEWSBvciBSRVNFVCBzdGF0ZSwgdGh1cyByZWdpc3RlcmVkICh1c2VyKSBNc3BJbml0L0RlSW5pdCBjYWxsYmFja3MgY2FuIGJlIHVzZWQKICAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgogICAgIEluIHRoYXQgY2FzZSBmaXJzdCByZWdpc3RlciB0aGUgTXNwSW5pdC9Nc3BEZUluaXQgdXNlciBjYWxsYmFja3MKLSAgICB1c2luZyBAcmVmIEhBTF9TRF9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1NEX0RlSW5pdCAKKyAgICB1c2luZyBAcmVmIEhBTF9TRF9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX1NEX0RlSW5pdAogICAgIG9yIEByZWYgSEFMX1NEX0luaXQgZnVuY3Rpb24uCiAKICAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKLSAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSAKKyAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQogICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCiAKICAgQGVuZHZlcmJhdGltCkBAIC0yNDksMTkgKzI1MCwyMSBAQAogICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgICoKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICovIAorICAqLwogCiAvKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2luY2x1ZGUgInN0bTMyZjd4eF9oYWwuaCIKIAorI2lmIGRlZmluZWQoU0RNTUMxKQorCiAvKiogQGFkZHRvZ3JvdXAgU1RNMzJGN3h4X0hBTF9Ecml2ZXIKICAgKiBAewogICAqLwogCi0vKiogQGFkZHRvZ3JvdXAgU0QgCisvKiogQGFkZHRvZ3JvdXAgU0QKICAgKiBAewogICAqLwogCkBAIC0yNzIsMTEgKzI3NSwxMSBAQAogLyoqIEBhZGR0b2dyb3VwIFNEX1ByaXZhdGVfRGVmaW5lcwogICAqIEB7CiAgICovCi0gICAgCisKIC8qKgogICAqIEB9CiAgICovCi0gIAorCiAvKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yODUsMTUgKzI4OCwxNSBAQAogICAqIEB7CiAgICovCiBzdGF0aWMgdWludDMyX3QgU0RfSW5pdENhcmQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKLXN0YXRpYyB1aW50MzJfdCBTRF9Qb3dlck9OKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCk7ICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIHVpbnQzMl90IFNEX1Bvd2VyT04oU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKIHN0YXRpYyB1aW50MzJfdCBTRF9TZW5kU0RTdGF0dXMoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCB1aW50MzJfdCAqcFNEc3RhdHVzKTsKIHN0YXRpYyB1aW50MzJfdCBTRF9TZW5kU3RhdHVzKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDMyX3QgKnBDYXJkU3RhdHVzKTsKIHN0YXRpYyB1aW50MzJfdCBTRF9XaWRlQnVzX0VuYWJsZShTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogc3RhdGljIHVpbnQzMl90IFNEX1dpZGVCdXNfRGlzYWJsZShTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogc3RhdGljIHVpbnQzMl90IFNEX0ZpbmRTQ1IoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCB1aW50MzJfdCAqcFNDUik7Ci1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RfUG93ZXJPRkYoU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTRF9Xcml0ZV9JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEX1JlYWRfSVQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKTsKK3N0YXRpYyB2b2lkIFNEX1Bvd2VyT0ZGKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCk7CitzdGF0aWMgdm9pZCBTRF9Xcml0ZV9JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QpOworc3RhdGljIHZvaWQgU0RfUmVhZF9JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QpOwogc3RhdGljIHZvaWQgU0RfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKIHN0YXRpYyB2b2lkIFNEX0RNQVJlY2VpdmVDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKIHN0YXRpYyB2b2lkIFNEX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKQEAgLTMwOSwxMyArMzEyLDEzIEBACiAgICovCiAKIC8qKiBAYWRkdG9ncm91cCBTRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxCi0gKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIGRlLWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAKKyAqICBAYnJpZWYgICBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zCiAgKgotQHZlcmJhdGltICAgIAorQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIFsuLl0gIAorICBbLi5dCiAgICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBpbml0aWFsaXplL2RlLWluaXRpYWxpemUgdGhlIFNECiAgICAgY2FyZCBkZXZpY2UgdG8gYmUgcmVhZHkgZm9yIHVzZS4KIApAQCAtMzI0LDkgKzMyNyw5IEBACiAgICovCiAKIC8qKgotICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNEIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIAorICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNEIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlCiAgICAgICAgICAgICBTRF9IYW5kbGVUeXBlRGVmIGFuZCBjcmVhdGUgdGhlIGFzc29jaWF0ZWQgaGFuZGxlLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gdGhlIFNEIGhhbmRsZSAgCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gdGhlIFNEIGhhbmRsZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX0luaXQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQpAQCAtMzUwLDcgKzM1Myw3IEBACiAgIHsKICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovCiAgICAgaHNkLT5Mb2NrID0gSEFMX1VOTE9DS0VEOwotI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgaW4gSEFMX1NEX1NUQVRFX1JFU0VUIG9ubHkgKi8KICAgICBoc2QtPlR4Q3BsdENhbGxiYWNrICAgID0gSEFMX1NEX1R4Q3BsdENhbGxiYWNrOwogICAgIGhzZC0+UnhDcGx0Q2FsbGJhY2sgICAgPSBIQUxfU0RfUnhDcGx0Q2FsbGJhY2s7CkBAIC0zNjcsMjAgKzM3MCwyMyBAQAogI2Vsc2UKICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgQ09SVEVYLi4uZXRjICovCiAgICAgSEFMX1NEX01zcEluaXQoaHNkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgIH0KIAogICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7CiAKICAgLyogSW5pdGlhbGl6ZSB0aGUgQ2FyZCBwYXJhbWV0ZXJzICovCi0gIEhBTF9TRF9Jbml0Q2FyZChoc2QpOworICBpZiAoSEFMX1NEX0luaXRDYXJkKGhzZCkgIT0gSEFMX09LKQorICB7CisgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgfQogCiAgIC8qIEluaXRpYWxpemUgdGhlIGVycm9yIGNvZGUgKi8KLSAgaHNkLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gIAorICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOworCiAgIC8qIEluaXRpYWxpemUgdGhlIFNEIG9wZXJhdGlvbiAqLwogICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgLyogSW5pdGlhbGl6ZSB0aGUgU0Qgc3RhdGUgKi8KICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKIApAQCAtMzg5LDE0ICszOTUsMTUgQEAKIAogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0QgQ2FyZC4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgU0QgY2FyZC4gSXQgY291bGQgYmUgdXNlZCB3aGVuIGEgY2FyZCAKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFNEIGNhcmQuIEl0IGNvdWxkIGJlIHVzZWQgd2hlbiBhIGNhcmQKICAgICAgICAgICAgIHJlLWluaXRpYWxpemF0aW9uIGlzIG5lZWRlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9Jbml0Q2FyZChTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICBTRF9Jbml0VHlwZURlZiBJbml0OwogICAKICAgLyogRGVmYXVsdCBTRE1NQyBwZXJpcGhlcmFsIGNvbmZpZ3VyYXRpb24gZm9yIFNEIGNhcmQgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTQwOCwyMCArNDE1LDIxIEBACiAgIEluaXQuQ2xvY2tEaXYgICAgICAgICAgICA9IFNETU1DX0lOSVRfQ0xLX0RJVjsKIAogICAvKiBJbml0aWFsaXplIFNETU1DIHBlcmlwaGVyYWwgaW50ZXJmYWNlIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uICovCi0gIFNETU1DX0luaXQoaHNkLT5JbnN0YW5jZSwgSW5pdCk7CisgIHN0YXR1cyA9IFNETU1DX0luaXQoaHNkLT5JbnN0YW5jZSwgSW5pdCk7CisgIGlmKHN0YXR1cyAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX0VSUk9SOworICB9CiAKICAgLyogRGlzYWJsZSBTRE1NQyBDbG9jayAqLwotICBfX0hBTF9TRF9ESVNBQkxFKGhzZCk7IAotICAKKyAgX19IQUxfU0RfRElTQUJMRShoc2QpOworCiAgIC8qIFNldCBQb3dlciBTdGF0ZSB0byBPTiAqLwotICBTRE1NQ19Qb3dlclN0YXRlX09OKGhzZC0+SW5zdGFuY2UpOwotICAKKyAgKHZvaWQpU0RNTUNfUG93ZXJTdGF0ZV9PTihoc2QtPkluc3RhbmNlKTsKKwogICAvKiBFbmFibGUgU0RNTUMgQ2xvY2sgKi8KICAgX19IQUxfU0RfRU5BQkxFKGhzZCk7Ci0gIAotICAvKiBSZXF1aXJlZCBwb3dlciB1cCB3YWl0aW5nIHRpbWUgYmVmb3JlIHN0YXJ0aW5nIHRoZSBTRCBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSAqLwotICBIQUxfRGVsYXkoMik7Ci0gIAorCiAgIC8qIElkZW50aWZ5IGNhcmQgb3BlcmF0aW5nIHZvbHRhZ2UgKi8KICAgZXJyb3JzdGF0ZSA9IFNEX1Bvd2VyT04oaHNkKTsKICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKQEAgLTQ0NSw3ICs0NTMsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERlLUluaXRpYWxpemVzIHRoZSBTRCBjYXJkLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfRGVJbml0KFNEX0hhbmRsZVR5cGVEZWYgKmhzZCkKQEAgLTQ1NSwxNiArNDYzLDE2IEBACiAgIHsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAorCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19TRE1NQ19BTExfSU5TVEFOQ0UoaHNkLT5JbnN0YW5jZSkpOwogCiAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfQlVTWTsKLSAgCi0gIC8qIFNldCBTRCBwb3dlciBzdGF0ZSB0byBvZmYgKi8gCisKKyAgLyogU2V0IFNEIHBvd2VyIHN0YXRlIHRvIG9mZiAqLwogICBTRF9Qb3dlck9GRihoc2QpOwotICAKLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKworI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgIGlmKGhzZC0+TXNwRGVJbml0Q2FsbGJhY2sgPT0gTlVMTCkKICAgewogICAgIGhzZC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU0RfTXNwRGVJbml0OwpAQCAtNDc1LDQxICs0ODMsNDEgQEAKICNlbHNlCiAgIC8qIERlLUluaXRpYWxpemUgdGhlIE1TUCBsYXllciAqLwogICBIQUxfU0RfTXNwRGVJbml0KGhzZCk7Ci0jZW5kaWYKLSAgCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKwogICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOwogICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFU0VUOwotICAKKwogICByZXR1cm4gSEFMX09LOwogfQogCiAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNEIE1TUC4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgaHNkOiBQb2ludGVyIHRvIFNEIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1NEX01zcEluaXQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChoc2QpOwotIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9TRF9Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgICovCiB9CiAKIC8qKgogICAqIEBicmllZiAgRGUtSW5pdGlhbGl6ZSBTRCBNU1AuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9TRF9Nc3BEZUluaXQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChoc2QpOwotIAotICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBTaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9TRF9Nc3BEZUluaXQgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAgKi8KIH0KQEAgLTUxOSwxNCArNTI3LDE0IEBACiAgICovCiAKIC8qKiBAYWRkdG9ncm91cCBTRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyCi0gKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlciBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgRGF0YSB0cmFuc2ZlciBmdW5jdGlvbnMKICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFsuLl0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgZGF0YSAKKyAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgZGF0YQogICAgIHRyYW5zZmVyIGZyb20vdG8gU0QgY2FyZC4KIAogQGVuZHZlcmJhdGltCkBAIC01MzQsMTIwICs1NDIsMTM2IEBACiAgICovCiAKIC8qKgotICAqIEBicmllZiAgUmVhZHMgYmxvY2socykgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIgCisgICogQGJyaWVmICBSZWFkcyBibG9jayhzKSBmcm9tIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlcgogICAqICAgICAgICAgaXMgbWFuYWdlZCBieSBwb2xsaW5nIG1vZGUuCiAgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjaGVjayBvbiB0aGUgY2FyZCBzdGF0ZSB0aHJvdWdoCiAgICogICAgICAgICBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUKLSAgKiBAcGFyYW0gIHBEYXRhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVjZWl2ZWQgZGF0YQotICAqIEBwYXJhbSAgQmxvY2tBZGQgQmxvY2sgQWRkcmVzcyBmcm9tIHdoZXJlIGRhdGEgaXMgdG8gYmUgcmVhZCAKLSAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzIE51bWJlciBvZiBTRCBibG9ja3MgdG8gcmVhZAotICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIFNEIGJsb2NrcyB0byByZWFkCisgICogQHBhcmFtICBUaW1lb3V0OiBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9SZWFkQmxvY2tzKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IEJsb2NrQWRkLCB1aW50MzJfdCBOdW1iZXJPZkJsb2NrcywgdWludDMyX3QgVGltZW91dCkKIHsKICAgU0RNTUNfRGF0YUluaXRUeXBlRGVmIGNvbmZpZzsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwotICB1aW50MzJfdCBjb3VudCA9IDAsICp0ZW1wYnVmZiA9ICh1aW50MzJfdCAqKXBEYXRhOwotICAKKyAgdWludDMyX3QgY291bnQsIGRhdGEsIGRhdGFyZW1haW5pbmc7CisgIHVpbnQzMl90IGFkZCA9IEJsb2NrQWRkOworICB1aW50OF90ICp0ZW1wYnVmZiA9IHBEYXRhOworCiAgIGlmKE5VTEwgPT0gcERhdGEpCiAgIHsKICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfUEFSQU07CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotIAorCiAgIGlmKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gICAgCi0gICAgaWYoKEJsb2NrQWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKSkKKyAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOworCisgICAgaWYoKGFkZCArIE51bWJlck9mQmxvY2tzKSA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwotICAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMID0gMDsKLSAgICAKKyAgICBoc2QtPkluc3RhbmNlLT5EQ1RSTCA9IDBVOworCiAgICAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TREhDX1NEWEMpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyOworICAgICAgYWRkICo9IDUxMlU7CiAgICAgfQotICAgICAgCisKICAgICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLwogICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCbG9ja0xlbmd0aChoc2QtPkluc3RhbmNlLCBCTE9DS1NJWkUpOwogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgICAgIAotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKLSAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLwotICAgIGNvbmZpZy5EYXRhVGltZU91dCAgID0gU0RNTUNfREFUQVRJTUVPVVQ7Ci0gICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBOdW1iZXJPZkJsb2NrcyAqIEJMT0NLU0laRTsKLSAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7Ci0gICAgY29uZmlnLlRyYW5zZmVyRGlyICAgPSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUM7Ci0gICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOwotICAgIGNvbmZpZy5EUFNNICAgICAgICAgID0gU0RNTUNfRFBTTV9FTkFCTEU7Ci0gICAgU0RNTUNfQ29uZmlnRGF0YShoc2QtPkluc3RhbmNlLCAmY29uZmlnKTsKLSAgICAKLSAgICAvKiBSZWFkIGJsb2NrKHMpIGluIHBvbGxpbmcgbW9kZSAqLwotICAgIGlmKE51bWJlck9mQmxvY2tzID4gMSkKLSAgICB7Ci0gICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0s7Ci0gICAgICAKLSAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkTXVsdGlCbG9jayhoc2QtPkluc3RhbmNlLCBCbG9ja0FkZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLOwotICAgICAgCi0gICAgICAvKiBSZWFkIFNpbmdsZSBCbG9jayBjb21tYW5kICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKLSAgICB9Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwogICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgICAgCisKKyAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLworICAgIGNvbmZpZy5EYXRhVGltZU91dCAgID0gU0RNTUNfREFUQVRJTUVPVVQ7CisgICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBOdW1iZXJPZkJsb2NrcyAqIEJMT0NLU0laRTsKKyAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CisgICAgY29uZmlnLlRyYW5zZmVyRGlyICAgPSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fU0RNTUM7CisgICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOworICAgIGNvbmZpZy5EUFNNICAgICAgICAgID0gU0RNTUNfRFBTTV9FTkFCTEU7CisgICAgKHZvaWQpU0RNTUNfQ29uZmlnRGF0YShoc2QtPkluc3RhbmNlLCAmY29uZmlnKTsKKworICAgIC8qIFJlYWQgYmxvY2socykgaW4gcG9sbGluZyBtb2RlICovCisgICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKKyAgICB7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0s7CisKKyAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRNdWx0aUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLOworCisgICAgICAvKiBSZWFkIFNpbmdsZSBCbG9jayBjb21tYW5kICovCisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CisgICAgfQorICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KKyAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOworICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKKyAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKwogICAgIC8qIFBvbGwgb24gU0RNTUMgZmxhZ3MgKi8KKyAgICBkYXRhcmVtYWluaW5nID0gY29uZmlnLkRhdGFMZW5ndGg7CiAgICAgd2hpbGUoIV9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWE9WRVJSIHwgU0RNTUNfRkxBR19EQ1JDRkFJTCB8IFNETU1DX0ZMQUdfRFRJTUVPVVQgfCBTRE1NQ19GTEFHX0RBVEFFTkQpKQogICAgIHsKLSAgICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWEZJRk9IRikpCisgICAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhGSUZPSEYpICYmIChkYXRhcmVtYWluaW5nID4gMFUpKQogICAgICAgewogICAgICAgICAvKiBSZWFkIGRhdGEgZnJvbSBTRE1NQyBSeCBGSUZPICovCiAgICAgICAgIGZvcihjb3VudCA9IDBVOyBjb3VudCA8IDhVOyBjb3VudCsrKQogICAgICAgICB7Ci0gICAgICAgICAgKih0ZW1wYnVmZiArIGNvdW50KSA9IFNETU1DX1JlYWRGSUZPKGhzZC0+SW5zdGFuY2UpOworICAgICAgICAgIGRhdGEgPSBTRE1NQ19SZWFkRklGTyhoc2QtPkluc3RhbmNlKTsKKyAgICAgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoZGF0YSAmIDB4RkZVKTsKKyAgICAgICAgICB0ZW1wYnVmZisrOworICAgICAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoKGRhdGEgPj4gOFUpICYgMHhGRlUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgICp0ZW1wYnVmZiA9ICh1aW50OF90KSgoZGF0YSA+PiAxNlUpICYgMHhGRlUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgICp0ZW1wYnVmZiA9ICh1aW50OF90KSgoZGF0YSA+PiAyNFUpICYgMHhGRlUpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOwogICAgICAgICB9Ci0gICAgICAgIHRlbXBidWZmICs9IDhVOwogICAgICAgfQotICAgICAgCi0gICAgICBpZigoVGltZW91dCA9PSAwVSl8fCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID49ICBUaW1lb3V0KSkKKworICAgICAgaWYoKChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPj0gIFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgIHsKICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KICAgICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9USU1FT1VUOwogICAgICAgICBoc2QtPlN0YXRlPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKICAgICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOwogICAgICAgfQogICAgIH0KICAgICAKICAgICAvKiBTZW5kIHN0b3AgdHJhbnNtaXNzaW9uIGNvbW1hbmQgaW4gY2FzZSBvZiBtdWx0aWJsb2NrIHJlYWQgKi8KICAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfREFUQUVORCkgJiYgKE51bWJlck9mQmxvY2tzID4gMVUpKQotICAgIHsgICAgCisgICAgewogICAgICAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TRUNVUkVEKQogICAgICAgewogICAgICAgICAvKiBTZW5kIHN0b3AgdHJhbnNtaXNzaW9uIGNvbW1hbmQgKi8KQEAgLTY1OCwxMSArNjgyLDEyIEBACiAgICAgICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogR2V0IGVycm9yIHN0YXRlICovCiAgICAgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX0RUSU1FT1VUKSkKICAgICB7CkBAIC02NzAsNiArNjk1LDcgQEAKICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RBVEFfVElNRU9VVDsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KICAgICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19EQ1JDRkFJTCkpCkBAIC02NzgsNiArNzA0LDcgQEAKICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RBVEFfQ1JDX0ZBSUw7CiAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgaHNkLT5Db250ZXh0ID0gU0RfQ09OVEVYVF9OT05FOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAgICAgZWxzZSBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhPVkVSUikpCkBAIC02ODYsMzAgKzcxMyw0NyBAQAogICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfUlhfT1ZFUlJVTjsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKLSAgICAvKiBFbXB0eSBGSUZPIGlmIHRoZXJlIGlzIHN0aWxsIGFueSBkYXRhICovCi0gICAgd2hpbGUgKChfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhEQVZMKSkpCisgICAgZWxzZQogICAgIHsKLSAgICAgICp0ZW1wYnVmZiA9IFNETU1DX1JlYWRGSUZPKGhzZC0+SW5zdGFuY2UpOworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KKworICAgIC8qIEVtcHR5IEZJRk8gaWYgdGhlcmUgaXMgc3RpbGwgYW55IGRhdGEgKi8KKyAgICB3aGlsZSAoKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWERBVkwpKSAmJiAoZGF0YXJlbWFpbmluZyA+IDBVKSkKKyAgICB7CisgICAgICBkYXRhID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoZGF0YSAmIDB4RkZVKTsKICAgICAgIHRlbXBidWZmKys7Ci0gICAgICAKLSAgICAgIGlmKChUaW1lb3V0ID09IDBVKXx8KChIQUxfR2V0VGljaygpLXRpY2tzdGFydCkgPj0gIFRpbWVvdXQpKQorICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKnRlbXBidWZmID0gKHVpbnQ4X3QpKChkYXRhID4+IDhVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoKGRhdGEgPj4gMTZVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAqdGVtcGJ1ZmYgPSAodWludDhfdCkoKGRhdGEgPj4gMjRVKSAmIDB4RkZVKTsKKyAgICAgIHRlbXBidWZmKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID49ICBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgICAgICAgCisgICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfVElNRU9VVDsKICAgICAgICAgaHNkLT5TdGF0ZT0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgICAKKyAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCiAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtNzI0LDIxICs3NjgsMjIgQEAKICAgKiAgICAgICAgIHRyYW5zZmVyIGlzIG1hbmFnZWQgYnkgcG9sbGluZyBtb2RlLgogICAqIEBub3RlICAgVGhpcyBBUEkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2hlY2sgb24gdGhlIGNhcmQgc3RhdGUgdGhyb3VnaAogICAqICAgICAgICAgSEFMX1NEX0dldENhcmRTdGF0ZSgpLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCi0gICogQHBhcmFtICBwRGF0YSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKLSAgKiBAcGFyYW0gIEJsb2NrQWRkIEJsb2NrIEFkZHJlc3Mgd2hlcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gIAotICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3MgTnVtYmVyIG9mIFNEIGJsb2NrcyB0byB3cml0ZQotICAqIEBwYXJhbSAgVGltZW91dCBTcGVjaWZ5IHRpbWVvdXQgdmFsdWUKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIFNEIGJsb2NrcyB0byB3cml0ZQorICAqIEBwYXJhbSAgVGltZW91dDogU3BlY2lmeSB0aW1lb3V0IHZhbHVlCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfV3JpdGVCbG9ja3MoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgQmxvY2tBZGQsIHVpbnQzMl90IE51bWJlck9mQmxvY2tzLCB1aW50MzJfdCBUaW1lb3V0KQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgdWludDMyX3QgKnRlbXBidWZmID0gKHVpbnQzMl90ICopcERhdGE7Ci0gIAorICB1aW50MzJfdCBjb3VudCwgZGF0YSwgZGF0YXJlbWFpbmluZzsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisgIHVpbnQ4X3QgKnRlbXBidWZmID0gcERhdGE7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9QQVJBTTsKQEAgLTc0Nyw5NCArNzkyLDEwOCBAQAogCiAgIGlmKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gICAgCi0gICAgaWYoKEJsb2NrQWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKSkKKyAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOworCisgICAgaWYoKGFkZCArIE51bWJlck9mQmxvY2tzKSA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwotICAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMID0gMDsKLSAgICAgCisgICAgaHNkLT5JbnN0YW5jZS0+RENUUkwgPSAwVTsKKwogICAgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0RIQ19TRFhDKQogICAgIHsKLSAgICAgIEJsb2NrQWRkICo9IDUxMjsKKyAgICAgIGFkZCAqPSA1MTJVOwogICAgIH0KLSAgICAKLSAgICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKKworICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCiAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIEJMT0NLU0laRSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7ICAKKyAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKLSAgICAvKiBXcml0ZSBCbG9ja3MgaW4gUG9sbGluZyBtb2RlICovCi0gICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKLSAgICB7Ci0gICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1dSSVRFX01VTFRJUExFX0JMT0NLOwotICAgICAgCi0gICAgICAvKiBXcml0ZSBNdWx0aSBCbG9jayBjb21tYW5kICovIAotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhoc2QtPkluc3RhbmNlLCBCbG9ja0FkZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSzsKLSAgICAgIAotICAgICAgLyogV3JpdGUgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKLSAgICB9Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7ICAKLSAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7Ci0gICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwotICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgLyogQ29uZmlndXJlIHRoZSBTRCBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8gCisKKyAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLwogICAgIGNvbmZpZy5EYXRhVGltZU91dCAgID0gU0RNTUNfREFUQVRJTUVPVVQ7CiAgICAgY29uZmlnLkRhdGFMZW5ndGggICAgPSBOdW1iZXJPZkJsb2NrcyAqIEJMT0NLU0laRTsKICAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CiAgICAgY29uZmlnLlRyYW5zZmVyRGlyICAgPSBTRE1NQ19UUkFOU0ZFUl9ESVJfVE9fQ0FSRDsKICAgICBjb25maWcuVHJhbnNmZXJNb2RlICA9IFNETU1DX1RSQU5TRkVSX01PREVfQkxPQ0s7CiAgICAgY29uZmlnLkRQU00gICAgICAgICAgPSBTRE1NQ19EUFNNX0VOQUJMRTsKLSAgICBTRE1NQ19Db25maWdEYXRhKGhzZC0+SW5zdGFuY2UsICZjb25maWcpOwotICAgIAorICAgICh2b2lkKVNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7CisKKyAgICAvKiBXcml0ZSBCbG9ja3MgaW4gUG9sbGluZyBtb2RlICovCisgICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKKyAgICB7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1dSSVRFX01VTFRJUExFX0JMT0NLOworCisgICAgICAvKiBXcml0ZSBNdWx0aSBCbG9jayBjb21tYW5kICovCisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kV3JpdGVNdWx0aUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSzsKKworICAgICAgLyogV3JpdGUgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CisgICAgfQorICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCisgICAgeworICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KKyAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOworICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKKyAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CisgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgIH0KKwogICAgIC8qIFdyaXRlIGJsb2NrKHMpIGluIHBvbGxpbmcgbW9kZSAqLworICAgIGRhdGFyZW1haW5pbmcgPSBjb25maWcuRGF0YUxlbmd0aDsKICAgICB3aGlsZSghX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX1RYVU5ERVJSIHwgU0RNTUNfRkxBR19EQ1JDRkFJTCB8IFNETU1DX0ZMQUdfRFRJTUVPVVQgfCBTRE1NQ19GTEFHX0RBVEFFTkQpKQogICAgIHsKLSAgICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19UWEZJRk9IRSkpCisgICAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfVFhGSUZPSEUpICYmIChkYXRhcmVtYWluaW5nID4gMFUpKQogICAgICAgewogICAgICAgICAvKiBXcml0ZSBkYXRhIHRvIFNETU1DIFR4IEZJRk8gKi8KICAgICAgICAgZm9yKGNvdW50ID0gMFU7IGNvdW50IDwgOFU7IGNvdW50KyspCiAgICAgICAgIHsKLSAgICAgICAgICBTRE1NQ19Xcml0ZUZJRk8oaHNkLT5JbnN0YW5jZSwgKHRlbXBidWZmICsgY291bnQpKTsKKyAgICAgICAgICBkYXRhID0gKHVpbnQzMl90KSgqdGVtcGJ1ZmYpOworICAgICAgICAgIHRlbXBidWZmKys7CisgICAgICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRlbXBidWZmKSA8PCA4VSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAgICAgZGF0YSB8PSAoKHVpbnQzMl90KSgqdGVtcGJ1ZmYpIDw8IDE2VSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAgICAgZGF0YSB8PSAoKHVpbnQzMl90KSgqdGVtcGJ1ZmYpIDw8IDI0VSk7CisgICAgICAgICAgdGVtcGJ1ZmYrKzsKKyAgICAgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICAgICAgKHZvaWQpU0RNTUNfV3JpdGVGSUZPKGhzZC0+SW5zdGFuY2UsICZkYXRhKTsKICAgICAgICAgfQotICAgICAgICB0ZW1wYnVmZiArPSA4VTsKICAgICAgIH0KLSAgICAgIAotICAgICAgaWYoKFRpbWVvdXQgPT0gMFUpfHwoKEhBTF9HZXRUaWNrKCktdGlja3N0YXJ0KSA+PSAgVGltZW91dCkpCisKKyAgICAgIGlmKCgoSEFMX0dldFRpY2soKS10aWNrc3RhcnQpID49ICBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgCisgICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICAvKiBTZW5kIHN0b3AgdHJhbnNtaXNzaW9uIGNvbW1hbmQgaW4gY2FzZSBvZiBtdWx0aWJsb2NrIHdyaXRlICovCiAgICAgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX0RBVEFFTkQpICYmIChOdW1iZXJPZkJsb2NrcyA+IDFVKSkKLSAgICB7IAorICAgIHsKICAgICAgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0VDVVJFRCkKICAgICAgIHsKICAgICAgICAgLyogU2VuZCBzdG9wIHRyYW5zbWlzc2lvbiBjb21tYW5kICovCkBAIC04NDIsMTQgKzkwMSwxNSBAQAogICAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICAgICAgICB7CiAgICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsgIAorICAgICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICAgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qIEdldCBlcnJvciBzdGF0ZSAqLwogICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19EVElNRU9VVCkpCiAgICAgewpAQCAtODU3LDE0ICs5MTcsMTYgQEAKICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RBVEFfVElNRU9VVDsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KICAgICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19EQ1JDRkFJTCkpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RBVEFfQ1JDX0ZBSUw7ICAgICAgCisgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfREFUQV9DUkNfRkFJTDsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KICAgICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19UWFVOREVSUikpCkBAIC04NzMsMTQgKzkzNSwxOSBAQAogICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfVFhfVU5ERVJSVU47CiAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgaHNkLT5Db250ZXh0ID0gU0RfQ09OVEVYVF9OT05FOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAgIAorICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfREFUQV9GTEFHUyk7CisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwotICAgIAorCiAgICAgcmV0dXJuIEhBTF9PSzsKICAgfQogICBlbHNlCkBAIC04OTEsOTggKzk1OCwxMDAgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBSZWFkcyBibG9jayhzKSBmcm9tIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlciAKLSAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuIAorICAqIEBicmllZiAgUmVhZHMgYmxvY2socykgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIKKyAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuCiAgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjaGVjayBvbiB0aGUgY2FyZCBzdGF0ZSB0aHJvdWdoCiAgICogICAgICAgICBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkuCi0gICogQG5vdGUgICBZb3UgY291bGQgYWxzbyBjaGVjayB0aGUgSVQgdHJhbnNmZXIgcHJvY2VzcyB0aHJvdWdoIHRoZSBTRCBSeCAKKyAgKiBAbm90ZSAgIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSBJVCB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFJ4CiAgICogICAgICAgICBpbnRlcnJ1cHQgZXZlbnQuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUgICAgICAgICAgICAgICAgIAotICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSByZWNlaXZlZCBkYXRhCi0gICogQHBhcmFtICBCbG9ja0FkZCBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkIAotICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3MgTnVtYmVyIG9mIGJsb2NrcyB0byByZWFkLgorICAqIEBwYXJhbSAgaHNkOiBQb2ludGVyIHRvIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgcmVjZWl2ZWQgZGF0YQorICAqIEBwYXJhbSAgQmxvY2tBZGQ6IEJsb2NrIEFkZHJlc3MgZnJvbSB3aGVyZSBkYXRhIGlzIHRvIGJlIHJlYWQKKyAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzOiBOdW1iZXIgb2YgYmxvY2tzIHRvIHJlYWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfUmVhZEJsb2Nrc19JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MzJfdCBCbG9ja0FkZCwgdWludDMyX3QgTnVtYmVyT2ZCbG9ja3MpCiB7CiAgIFNETU1DX0RhdGFJbml0VHlwZURlZiBjb25maWc7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IGVycm9yc3RhdGU7CisgIHVpbnQzMl90IGFkZCA9IEJsb2NrQWRkOworCiAgIGlmKE5VTEwgPT0gcERhdGEpCiAgIHsKICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfUEFSQU07CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKKwogICBpZihoc2QtPlN0YXRlID09IEhBTF9TRF9TVEFURV9SRUFEWSkKICAgewotICAgIGhzZC0+RXJyb3JDb2RlID0gSEFMX0RNQV9FUlJPUl9OT05FOwotICAgIAotICAgIGlmKChCbG9ja0FkZCArIE51bWJlck9mQmxvY2tzKSA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCisgICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKKworICAgIGlmKChhZGQgKyBOdW1iZXJPZkJsb2NrcykgPiAoaHNkLT5TZENhcmQuTG9nQmxvY2tOYnIpKQogICAgIHsKICAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9BRERSX09VVF9PRl9SQU5HRTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9CVVNZOwotICAgIAorCiAgICAgLyogSW5pdGlhbGl6ZSBkYXRhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KICAgICBoc2QtPkluc3RhbmNlLT5EQ1RSTCA9IDBVOwotICAgIAotICAgIGhzZC0+cFJ4QnVmZlB0ciA9ICh1aW50MzJfdCAqKXBEYXRhOworCisgICAgaHNkLT5wUnhCdWZmUHRyID0gcERhdGE7CiAgICAgaHNkLT5SeFhmZXJTaXplID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7Ci0gICAgCisKICAgICBfX0hBTF9TRF9FTkFCTEVfSVQoaHNkLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1JYT1ZFUlIgfCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfRkxBR19SWEZJRk9IRikpOwotICAgIAorCiAgICAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TREhDX1NEWEMpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyVTsKKyAgICAgIGFkZCAqPSA1MTJVOwogICAgIH0KLSAgICAKLSAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKKworICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIEJMT0NLU0laRSk7CisgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLworICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOworICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIHRoZSBTRCBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8KICAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOwogICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CiAgICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOwogICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX1NETU1DOwogICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKICAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7Ci0gICAgCi0gICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIEJMT0NLU0laRSk7Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKLSAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KKyAgICAodm9pZClTRE1NQ19Db25maWdEYXRhKGhzZC0+SW5zdGFuY2UsICZjb25maWcpOwogCiAgICAgLyogUmVhZCBCbG9ja3MgaW4gSVQgbW9kZSAqLwogICAgIGlmKE51bWJlck9mQmxvY2tzID4gMVUpCiAgICAgewogICAgICAgaHNkLT5Db250ZXh0ID0gKFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSyB8IFNEX0NPTlRFWFRfSVQpOwotICAgICAgCisKICAgICAgIC8qIFJlYWQgTXVsdGkgQmxvY2sgY29tbWFuZCAqLwotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRNdWx0aUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkTXVsdGlCbG9jayhoc2QtPkluc3RhbmNlLCBhZGQpOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgaHNkLT5Db250ZXh0ID0gKFNEX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0sgfCBTRF9DT05URVhUX0lUKTsKLSAgICAgIAorCiAgICAgICAvKiBSZWFkIFNpbmdsZSBCbG9jayBjb21tYW5kICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRSZWFkU2luZ2xlQmxvY2soaHNkLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIEhBTF9PSzsKICAgfQogICBlbHNlCkBAIC05OTIsOTkgKzEwNjEsMTAxIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgV3JpdGVzIGJsb2NrKHMpIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlciAKLSAgKiAgICAgICAgIGlzIG1hbmFnZWQgaW4gaW50ZXJydXB0IG1vZGUuIAorICAqIEBicmllZiAgV3JpdGVzIGJsb2NrKHMpIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgaW4gYSBjYXJkLiBUaGUgRGF0YSB0cmFuc2ZlcgorICAqICAgICAgICAgaXMgbWFuYWdlZCBpbiBpbnRlcnJ1cHQgbW9kZS4KICAgKiBAbm90ZSAgIFRoaXMgQVBJIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGNoZWNrIG9uIHRoZSBjYXJkIHN0YXRlIHRocm91Z2gKICAgKiAgICAgICAgIEhBTF9TRF9HZXRDYXJkU3RhdGUoKS4KLSAgKiBAbm90ZSAgIFlvdSBjb3VsZCBhbHNvIGNoZWNrIHRoZSBJVCB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFR4IAotICAqICAgICAgICAgaW50ZXJydXB0IGV2ZW50LiAKLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBkYXRhIHRvIHRyYW5zbWl0Ci0gICogQHBhcmFtICBCbG9ja0FkZCBCbG9jayBBZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0dGVuICAgIAotICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3MgTnVtYmVyIG9mIGJsb2NrcyB0byB3cml0ZQorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIElUIHRyYW5zZmVyIHByb2Nlc3MgdGhyb3VnaCB0aGUgU0QgVHgKKyAgKiAgICAgICAgIGludGVycnVwdCBldmVudC4KKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgdG8gdHJhbnNtaXQKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIHdoZXJlIGRhdGEgd2lsbCBiZSB3cml0dGVuCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIGJsb2NrcyB0byB3cml0ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX1dyaXRlQmxvY2tzX0lUKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IEJsb2NrQWRkLCB1aW50MzJfdCBOdW1iZXJPZkJsb2NrcykKIHsKICAgU0RNTUNfRGF0YUluaXRUeXBlRGVmIGNvbmZpZzsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9QQVJBTTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAorCiAgIGlmKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gICAgCi0gICAgaWYoKEJsb2NrQWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKSkKKyAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOworCisgICAgaWYoKGFkZCArIE51bWJlck9mQmxvY2tzKSA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwogICAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMID0gMFU7Ci0gICAgCi0gICAgaHNkLT5wVHhCdWZmUHRyID0gKHVpbnQzMl90ICopcERhdGE7CisKKyAgICBoc2QtPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKICAgICBoc2QtPlR4WGZlclNpemUgPSBCTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrczsKLSAgICAKKwogICAgIC8qIEVuYWJsZSB0cmFuc2ZlciBpbnRlcnJ1cHRzICovCi0gICAgX19IQUxfU0RfRU5BQkxFX0lUKGhzZCwgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUiB8IFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19GTEFHX1RYRklGT0hFKSk7IAotICAgIAorICAgIF9fSEFMX1NEX0VOQUJMRV9JVChoc2QsIChTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUIHwgU0RNTUNfSVRfVFhVTkRFUlIgfCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfRkxBR19UWEZJRk9IRSkpOworCiAgICAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TREhDX1NEWEMpCiAgICAgewotICAgICAgQmxvY2tBZGQgKj0gNTEyVTsKKyAgICAgIGFkZCAqPSA1MTJVOwogICAgIH0KLSAgICAKLSAgICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKKworICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCiAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIEJMT0NLU0laRSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogV3JpdGUgQmxvY2tzIGluIFBvbGxpbmcgbW9kZSAqLwogICAgIGlmKE51bWJlck9mQmxvY2tzID4gMVUpCiAgICAgewogICAgICAgaHNkLT5Db250ZXh0ID0gKFNEX0NPTlRFWFRfV1JJVEVfTVVMVElQTEVfQkxPQ0t8IFNEX0NPTlRFWFRfSVQpOwotICAgICAgCi0gICAgICAvKiBXcml0ZSBNdWx0aSBCbG9jayBjb21tYW5kICovIAotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhoc2QtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisKKyAgICAgIC8qIFdyaXRlIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZU11bHRpQmxvY2soaHNkLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGhzZC0+Q29udGV4dCA9IChTRF9DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSyB8IFNEX0NPTlRFWFRfSVQpOwotICAgICAgCi0gICAgICAvKiBXcml0ZSBTaW5nbGUgQmxvY2sgY29tbWFuZCAqLyAKLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKKworICAgICAgLyogV3JpdGUgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZVNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CiAgICAgfQogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAKKyAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKLSAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgU0QgRFBTTSAoRGF0YSBQYXRoIFN0YXRlIE1hY2hpbmUpICovCiAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKICAgICBjb25maWcuRGF0YUxlbmd0aCAgICA9IEJMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOwogICAgIGNvbmZpZy5EYXRhQmxvY2tTaXplID0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNTEyQjsKICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19DQVJEOwogICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKICAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7Ci0gICAgCisgICAgKHZvaWQpU0RNTUNfQ29uZmlnRGF0YShoc2QtPkluc3RhbmNlLCAmY29uZmlnKTsKKwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtMTA5NCwxMTEgKzExNjUsMTIyIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgUmVhZHMgYmxvY2socykgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGluIGEgY2FyZC4gVGhlIERhdGEgdHJhbnNmZXIgCi0gICogICAgICAgICBpcyBtYW5hZ2VkIGJ5IERNQSBtb2RlLiAKKyAgKiBAYnJpZWYgIFJlYWRzIGJsb2NrKHMpIGZyb20gYSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBhIGNhcmQuIFRoZSBEYXRhIHRyYW5zZmVyCisgICogICAgICAgICBpcyBtYW5hZ2VkIGJ5IERNQSBtb2RlLgogICAqIEBub3RlICAgVGhpcyBBUEkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2hlY2sgb24gdGhlIGNhcmQgc3RhdGUgdGhyb3VnaAogICAqICAgICAgICAgSEFMX1NEX0dldENhcmRTdGF0ZSgpLgotICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFJ4IAorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFJ4CiAgICogICAgICAgICBpbnRlcnJ1cHQgZXZlbnQuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciBTRCBoYW5kbGUgICAgICAgICAgICAgICAgIAotICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSByZWNlaXZlZCBkYXRhCi0gICogQHBhcmFtICBCbG9ja0FkZCBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkICAKLSAgKiBAcGFyYW0gIE51bWJlck9mQmxvY2tzIE51bWJlciBvZiBibG9ja3MgdG8gcmVhZC4KKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJlY2VpdmVkIGRhdGEKKyAgKiBAcGFyYW0gIEJsb2NrQWRkOiBCbG9jayBBZGRyZXNzIGZyb20gd2hlcmUgZGF0YSBpcyB0byBiZSByZWFkCisgICogQHBhcmFtICBOdW1iZXJPZkJsb2NrczogTnVtYmVyIG9mIGJsb2NrcyB0byByZWFkLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX1JlYWRCbG9ja3NfRE1BKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDhfdCAqcERhdGEsIHVpbnQzMl90IEJsb2NrQWRkLCB1aW50MzJfdCBOdW1iZXJPZkJsb2NrcykKIHsKICAgU0RNTUNfRGF0YUluaXRUeXBlRGVmIGNvbmZpZzsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKyAgdWludDMyX3QgYWRkID0gQmxvY2tBZGQ7CisKICAgaWYoTlVMTCA9PSBwRGF0YSkKICAgewogICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9QQVJBTTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9Ci0gIAorCiAgIGlmKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFQURZKQogICB7Ci0gICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfRE1BX0VSUk9SX05PTkU7Ci0gICAgCi0gICAgaWYoKEJsb2NrQWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKSkKKyAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOworCisgICAgaWYoKGFkZCArIE51bWJlck9mQmxvY2tzKSA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBJbml0aWFsaXplIGRhdGEgY29udHJvbCByZWdpc3RlciAqLwogICAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMID0gMFU7Ci0gICAgCisKICAgICBfX0hBTF9TRF9FTkFCTEVfSVQoaHNkLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1JYT1ZFUlIgfCBTRE1NQ19JVF9EQVRBRU5EKSk7Ci0gICAgCisKICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwogICAgIGhzZC0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU0RfRE1BUmVjZWl2ZUNwbHQ7Ci0gICAgCisKICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLwogICAgIGhzZC0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNEX0RNQUVycm9yOwotICAgIAorCiAgICAgLyogU2V0IHRoZSBETUEgQWJvcnQgY2FsbGJhY2sgKi8KICAgICBoc2QtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOwotICAgIAotICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KLSAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzZC0+aGRtYXJ4LCAodWludDMyX3QpJmhzZC0+SW5zdGFuY2UtPkZJRk8sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KShCTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNCk7Ci0gICAgCi0gICAgLyogRW5hYmxlIFNEIERNQSB0cmFuc2ZlciAqLwotICAgIF9fSEFMX1NEX0RNQV9FTkFCTEUoaHNkKTsKLSAgICAKLSAgICBpZihoc2QtPlNkQ2FyZC5DYXJkVHlwZSAhPSBDQVJEX1NESENfU0RYQykKLSAgICB7Ci0gICAgICBCbG9ja0FkZCAqPSA1MTJVOwotICAgIH0KLSAgICAKLSAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLyAKLSAgICBjb25maWcuRGF0YVRpbWVPdXQgICA9IFNETU1DX0RBVEFUSU1FT1VUOwotICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7Ci0gICAgY29uZmlnLkRhdGFCbG9ja1NpemUgPSBTRE1NQ19EQVRBQkxPQ0tfU0laRV81MTJCOwotICAgIGNvbmZpZy5UcmFuc2ZlckRpciAgID0gU0RNTUNfVFJBTlNGRVJfRElSX1RPX1NETU1DOwotICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKLSAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7CiAKLSAgICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaHNkLT5JbnN0YW5jZSwgQkxPQ0tTSVpFKTsKLSAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQorICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KKyAgICBpZihIQUxfRE1BX1N0YXJ0X0lUKGhzZC0+aGRtYXJ4LCAodWludDMyX3QpJmhzZC0+SW5zdGFuY2UtPkZJRk8sICh1aW50MzJfdClwRGF0YSwgKHVpbnQzMl90KShCTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNFUpICE9IEhBTF9PSykKICAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKKyAgICAgIF9fSEFMX1NEX0RJU0FCTEVfSVQoaHNkLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1JYT1ZFUlIgfCBTRE1NQ19JVF9EQVRBRU5EKSk7CisgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKKyAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9ETUE7CiAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgICAgIAotICAgIC8qIFJlYWQgQmxvY2tzIGluIERNQSBtb2RlICovCi0gICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKLSAgICB7Ci0gICAgICBoc2QtPkNvbnRleHQgPSAoU0RfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLIHwgU0RfQ09OVEVYVF9ETUEpOwotICAgICAgCi0gICAgICAvKiBSZWFkIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8gCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZE11bHRpQmxvY2soaHNkLT5JbnN0YW5jZSwgQmxvY2tBZGQpOwotICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaHNkLT5Db250ZXh0ID0gKFNEX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0sgfCBTRF9DT05URVhUX0RNQSk7Ci0gICAgICAKLSAgICAgIC8qIFJlYWQgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8gCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKGhzZC0+SW5zdGFuY2UsIEJsb2NrQWRkKTsKLSAgICB9Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKLSAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0gICAgICByZXR1cm4gSEFMX0VSUk9SOwotICAgIH0KKyAgICAgIC8qIEVuYWJsZSBTRCBETUEgdHJhbnNmZXIgKi8KKyAgICAgIF9fSEFMX1NEX0RNQV9FTkFCTEUoaHNkKTsKIAotICAgIHJldHVybiBIQUxfT0s7CisgICAgICBpZihoc2QtPlNkQ2FyZC5DYXJkVHlwZSAhPSBDQVJEX1NESENfU0RYQykKKyAgICAgIHsKKyAgICAgICAgYWRkICo9IDUxMlU7CisgICAgICB9CisKKyAgICAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovCisgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaHNkLT5JbnN0YW5jZSwgQkxPQ0tTSVpFKTsKKyAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCisgICAgICB7CisgICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCisgICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOworICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOworICAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgICByZXR1cm4gSEFMX0VSUk9SOworICAgICAgfQorCisgICAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLworICAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKKyAgICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisgICAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CisgICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19TRE1NQzsKKyAgICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKKyAgICAgIGNvbmZpZy5EUFNNICAgICAgICAgID0gU0RNTUNfRFBTTV9FTkFCTEU7CisgICAgICAodm9pZClTRE1NQ19Db25maWdEYXRhKGhzZC0+SW5zdGFuY2UsICZjb25maWcpOworCisgICAgICAvKiBSZWFkIEJsb2NrcyBpbiBETUEgbW9kZSAqLworICAgICAgaWYoTnVtYmVyT2ZCbG9ja3MgPiAxVSkKKyAgICAgIHsKKyAgICAgICAgaHNkLT5Db250ZXh0ID0gKFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSyB8IFNEX0NPTlRFWFRfRE1BKTsKKworICAgICAgICAvKiBSZWFkIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRNdWx0aUJsb2NrKGhzZC0+SW5zdGFuY2UsIGFkZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGhzZC0+Q29udGV4dCA9IChTRF9DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLIHwgU0RfQ09OVEVYVF9ETUEpOworCisgICAgICAgIC8qIFJlYWQgU2luZ2xlIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFJlYWRTaW5nbGVCbG9jayhoc2QtPkluc3RhbmNlLCBhZGQpOworICAgICAgfQorICAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKKyAgICAgIHsKKyAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KKyAgICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgICAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CisgICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKKyAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIEhBTF9PSzsKKyAgICB9CiAgIH0KICAgZWxzZQogICB7CkBAIC0xMjA3LDExMiArMTI4OSwxMjQgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBXcml0ZXMgYmxvY2socykgdG8gYSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBhIGNhcmQuIFRoZSBEYXRhIHRyYW5zZmVyIAotICAqICAgICAgICAgaXMgbWFuYWdlZCBieSBETUEgbW9kZS4gCisgICogQGJyaWVmICBXcml0ZXMgYmxvY2socykgdG8gYSBzcGVjaWZpZWQgYWRkcmVzcyBpbiBhIGNhcmQuIFRoZSBEYXRhIHRyYW5zZmVyCisgICogICAgICAgICBpcyBtYW5hZ2VkIGJ5IERNQSBtb2RlLgogICAqIEBub3RlICAgVGhpcyBBUEkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2hlY2sgb24gdGhlIGNhcmQgc3RhdGUgdGhyb3VnaAogICAqICAgICAgICAgSEFMX1NEX0dldENhcmRTdGF0ZSgpLgotICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFR4IAorICAqIEBub3RlICAgWW91IGNvdWxkIGFsc28gY2hlY2sgdGhlIERNQSB0cmFuc2ZlciBwcm9jZXNzIHRocm91Z2ggdGhlIFNEIFR4CiAgICogICAgICAgICBpbnRlcnJ1cHQgZXZlbnQuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUKLSAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgZGF0YSB0byB0cmFuc21pdAotICAqIEBwYXJhbSAgQmxvY2tBZGQgQmxvY2sgQWRkcmVzcyB3aGVyZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiAgCi0gICogQHBhcmFtICBOdW1iZXJPZkJsb2NrcyBOdW1iZXIgb2YgYmxvY2tzIHRvIHdyaXRlCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBwRGF0YTogUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBkYXRhIHRvIHRyYW5zbWl0CisgICogQHBhcmFtICBCbG9ja0FkZDogQmxvY2sgQWRkcmVzcyB3aGVyZSBkYXRhIHdpbGwgYmUgd3JpdHRlbgorICAqIEBwYXJhbSAgTnVtYmVyT2ZCbG9ja3M6IE51bWJlciBvZiBibG9ja3MgdG8gd3JpdGUKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9Xcml0ZUJsb2Nrc19ETUEoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCB1aW50OF90ICpwRGF0YSwgdWludDMyX3QgQmxvY2tBZGQsIHVpbnQzMl90IE51bWJlck9mQmxvY2tzKQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7Ci0gIAorICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MzJfdCBhZGQgPSBCbG9ja0FkZDsKKwogICBpZihOVUxMID09IHBEYXRhKQogICB7CiAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX1BBUkFNOwogICAgIHJldHVybiBIQUxfRVJST1I7CiAgIH0KLSAgCisKICAgaWYoaHNkLT5TdGF0ZSA9PSBIQUxfU0RfU1RBVEVfUkVBRFkpCiAgIHsKLSAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKLSAgICBpZigoQmxvY2tBZGQgKyBOdW1iZXJPZkJsb2NrcykgPiAoaHNkLT5TZENhcmQuTG9nQmxvY2tOYnIpKQorICAgIGhzZC0+RXJyb3JDb2RlID0gSEFMX1NEX0VSUk9SX05PTkU7CisKKyAgICBpZigoYWRkICsgTnVtYmVyT2ZCbG9ja3MpID4gKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKSkKICAgICB7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfQUREUl9PVVRfT0ZfUkFOR0U7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfQlVTWTsKLSAgICAKKwogICAgIC8qIEluaXRpYWxpemUgZGF0YSBjb250cm9sIHJlZ2lzdGVyICovCiAgICAgaHNkLT5JbnN0YW5jZS0+RENUUkwgPSAwVTsKLSAgICAKKwogICAgIC8qIEVuYWJsZSBTRCBFcnJvciBpbnRlcnJ1cHRzICovCi0gICAgX19IQUxfU0RfRU5BQkxFX0lUKGhzZCwgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUikpOyAgICAKLSAgICAKKyAgICBfX0hBTF9TRF9FTkFCTEVfSVQoaHNkLCAoU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVCB8IFNETU1DX0lUX1RYVU5ERVJSKSk7ICAgCisKICAgICAvKiBTZXQgdGhlIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLwogICAgIGhzZC0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gU0RfRE1BVHJhbnNtaXRDcGx0OwotICAgIAorCiAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8KICAgICBoc2QtPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTRF9ETUFFcnJvcjsKLSAgICAKKwogICAgIC8qIFNldCB0aGUgRE1BIEFib3J0IGNhbGxiYWNrICovCiAgICAgaHNkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gTlVMTDsKLSAgICAKKwogICAgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0RIQ19TRFhDKQogICAgIHsKLSAgICAgIEJsb2NrQWRkICo9IDUxMlU7CisgICAgICBhZGQgKj0gNTEyVTsKICAgICB9Ci0gICAgCi0gICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCisKKyAgICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLwogICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCbG9ja0xlbmd0aChoc2QtPkluc3RhbmNlLCBCTE9DS1NJWkUpOwogICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAKKyAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIC8qIFdyaXRlIEJsb2NrcyBpbiBQb2xsaW5nIG1vZGUgKi8KICAgICBpZihOdW1iZXJPZkJsb2NrcyA+IDFVKQogICAgIHsKICAgICAgIGhzZC0+Q29udGV4dCA9IChTRF9DT05URVhUX1dSSVRFX01VTFRJUExFX0JMT0NLIHwgU0RfQ09OVEVYVF9ETUEpOwotICAgICAgCi0gICAgICAvKiBXcml0ZSBNdWx0aSBCbG9jayBjb21tYW5kICovIAotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhoc2QtPkluc3RhbmNlLCBCbG9ja0FkZCk7CisKKyAgICAgIC8qIFdyaXRlIE11bHRpIEJsb2NrIGNvbW1hbmQgKi8KKyAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRXcml0ZU11bHRpQmxvY2soaHNkLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgIGhzZC0+Q29udGV4dCA9IChTRF9DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSyB8IFNEX0NPTlRFWFRfRE1BKTsKLSAgICAgIAorCiAgICAgICAvKiBXcml0ZSBTaW5nbGUgQmxvY2sgY29tbWFuZCAqLwotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlU2luZ2xlQmxvY2soaHNkLT5JbnN0YW5jZSwgQmxvY2tBZGQpOworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFdyaXRlU2luZ2xlQmxvY2soaHNkLT5JbnN0YW5jZSwgYWRkKTsKICAgICB9CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgLyogRW5hYmxlIFNETU1DIERNQSB0cmFuc2ZlciAqLwogICAgIF9fSEFMX1NEX0RNQV9FTkFCTEUoaHNkKTsKLSAgICAKKwogICAgIC8qIEVuYWJsZSB0aGUgRE1BIENoYW5uZWwgKi8KLSAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzZC0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHNkLT5JbnN0YW5jZS0+RklGTywgKHVpbnQzMl90KShCTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNCk7Ci0gICAgCi0gICAgLyogQ29uZmlndXJlIHRoZSBTRCBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8gCi0gICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgICBjb25maWcuRGF0YUxlbmd0aCAgICA9IEJMT0NLU0laRSAqIE51bWJlck9mQmxvY2tzOwotICAgIGNvbmZpZy5EYXRhQmxvY2tTaXplID0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNTEyQjsKLSAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19DQVJEOwotICAgIGNvbmZpZy5UcmFuc2Zlck1vZGUgID0gU0RNTUNfVFJBTlNGRVJfTU9ERV9CTE9DSzsKLSAgICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICAgIFNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7Ci0gICAgCi0gICAgcmV0dXJuIEhBTF9PSzsKKyAgICBpZihIQUxfRE1BX1N0YXJ0X0lUKGhzZC0+aGRtYXR4LCAodWludDMyX3QpcERhdGEsICh1aW50MzJfdCkmaHNkLT5JbnN0YW5jZS0+RklGTywgKHVpbnQzMl90KShCTE9DS1NJWkUgKiBOdW1iZXJPZkJsb2NrcykvNFUpICE9IEhBTF9PSykKKyAgICB7CisgICAgICBfX0hBTF9TRF9ESVNBQkxFX0lUKGhzZCwgKFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9UWFVOREVSUikpOyAgIAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfRE1BOworICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKKyAgICAgIHJldHVybiBIQUxfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBDb25maWd1cmUgdGhlIFNEIERQU00gKERhdGEgUGF0aCBTdGF0ZSBNYWNoaW5lKSAqLworICAgICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKKyAgICAgIGNvbmZpZy5EYXRhTGVuZ3RoICAgID0gQkxPQ0tTSVpFICogTnVtYmVyT2ZCbG9ja3M7CisgICAgICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzUxMkI7CisgICAgICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19DQVJEOworICAgICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOworICAgICAgY29uZmlnLkRQU00gICAgICAgICAgPSBTRE1NQ19EUFNNX0VOQUJMRTsKKyAgICAgICh2b2lkKVNETU1DX0NvbmZpZ0RhdGEoaHNkLT5JbnN0YW5jZSwgJmNvbmZpZyk7CisKKyAgICAgIHJldHVybiBIQUxfT0s7CisgICAgfQogICB9CiAgIGVsc2UKICAgewpAQCAtMTMyNCwzMyArMTQxOCwzNSBAQAogICAqIEBicmllZiAgRXJhc2VzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGFyZWEgb2YgdGhlIGdpdmVuIFNEIGNhcmQuCiAgICogQG5vdGUgICBUaGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBjaGVjayBvbiB0aGUgY2FyZCBzdGF0ZSB0aHJvdWdoCiAgICogICAgICAgICBIQUxfU0RfR2V0Q2FyZFN0YXRlKCkuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUgCi0gICogQHBhcmFtICBCbG9ja1N0YXJ0QWRkIFN0YXJ0IEJsb2NrIGFkZHJlc3MKLSAgKiBAcGFyYW0gIEJsb2NrRW5kQWRkIEVuZCBCbG9jayBhZGRyZXNzCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBCbG9ja1N0YXJ0QWRkOiBTdGFydCBCbG9jayBhZGRyZXNzCisgICogQHBhcmFtICBCbG9ja0VuZEFkZDogRW5kIEJsb2NrIGFkZHJlc3MKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9FcmFzZShTRF9IYW5kbGVUeXBlRGVmICpoc2QsIHVpbnQzMl90IEJsb2NrU3RhcnRBZGQsIHVpbnQzMl90IEJsb2NrRW5kQWRkKQogewotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7Ci0gIAorICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MzJfdCBzdGFydF9hZGQgPSBCbG9ja1N0YXJ0QWRkOworICB1aW50MzJfdCBlbmRfYWRkID0gQmxvY2tFbmRBZGQ7CisKICAgaWYoaHNkLT5TdGF0ZSA9PSBIQUxfU0RfU1RBVEVfUkVBRFkpCiAgIHsKLSAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9ETUFfRVJST1JfTk9ORTsKLSAgICAKLSAgICBpZihCbG9ja0VuZEFkZCA8IEJsb2NrU3RhcnRBZGQpCisgICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKKworICAgIGlmKGVuZF9hZGQgPCBzdGFydF9hZGQpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX1BBUkFNOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCi0gICAgaWYoQmxvY2tFbmRBZGQgPiAoaHNkLT5TZENhcmQuTG9nQmxvY2tOYnIpKQorCisgICAgaWYoZW5kX2FkZCA+IChoc2QtPlNkQ2FyZC5Mb2dCbG9ja05icikpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0FERFJfT1VUX09GX1JBTkdFOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX0JVU1k7Ci0gICAgCisKICAgICAvKiBDaGVjayBpZiB0aGUgY2FyZCBjb21tYW5kIGNsYXNzIHN1cHBvcnRzIGVyYXNlIGNvbW1hbmQgKi8KICAgICBpZigoKGhzZC0+U2RDYXJkLkNsYXNzKSAmIFNETU1DX0NDQ0NfRVJBU0UpID09IDBVKQogICAgIHsKQEAgLTEzNjAsNjIgKzE0NTYsNjIgQEAKICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KLSAgICAKKwogICAgIGlmKChTRE1NQ19HZXRSZXNwb25zZShoc2QtPkluc3RhbmNlLCBTRE1NQ19SRVNQMSkgJiBTRE1NQ19DQVJEX0xPQ0tFRCkgPT0gU0RNTUNfQ0FSRF9MT0NLRUQpCiAgICAgewogICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgCisgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKICAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9MT0NLX1VOTE9DS19GQUlMRUQ7CiAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICAvKiBHZXQgc3RhcnQgYW5kIGVuZCBibG9jayBmb3IgaGlnaCBjYXBhY2l0eSBjYXJkcyAqLwogICAgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0RIQ19TRFhDKQogICAgIHsKLSAgICAgIEJsb2NrU3RhcnRBZGQgKj0gNTEyVTsKLSAgICAgIEJsb2NrRW5kQWRkICAgKj0gNTEyVTsKKyAgICAgIHN0YXJ0X2FkZCAqPSA1MTJVOworICAgICAgZW5kX2FkZCAgICo9IDUxMlU7CiAgICAgfQotICAgIAorCiAgICAgLyogQWNjb3JkaW5nIHRvIHNkLWNhcmQgc3BlYyAxLjAgRVJBU0VfR1JPVVBfU1RBUlQgKENNRDMyKSBhbmQgZXJhc2VfZ3JvdXBfZW5kKENNRDMzKSAqLwogICAgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0VDVVJFRCkKICAgICB7CiAgICAgICAvKiBTZW5kIENNRDMyIFNEX0VSQVNFX0dSUF9TVEFSVCB3aXRoIGFyZ3VtZW50IGFzIGFkZHIgICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU0RFcmFzZVN0YXJ0QWRkKGhzZC0+SW5zdGFuY2UsIEJsb2NrU3RhcnRBZGQpOworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNERXJhc2VTdGFydEFkZChoc2QtPkluc3RhbmNlLCBzdGFydF9hZGQpOwogICAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICAgIHsKICAgICAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKICAgICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKICAgICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvKiBTZW5kIENNRDMzIFNEX0VSQVNFX0dSUF9FTkQgd2l0aCBhcmd1bWVudCBhcyBhZGRyICAqLwotICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNERXJhc2VFbmRBZGQoaHNkLT5JbnN0YW5jZSwgQmxvY2tFbmRBZGQpOworICAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNERXJhc2VFbmRBZGQoaHNkLT5JbnN0YW5jZSwgZW5kX2FkZCk7CiAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICAgICAgewogICAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsgCisgICAgICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIC8qIFNlbmQgQ01EMzggRVJBU0UgKi8KICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kRXJhc2UoaHNkLT5JbnN0YW5jZSk7CiAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7IAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7CiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQotICAgIAorCiAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKLSAgICAKKwogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtMTQyNiwxMzUgKzE1MjIsMTUzIEBACiAKIC8qKgogICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFNEIGNhcmQgaW50ZXJydXB0IHJlcXVlc3QuCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIHZvaWQgSEFMX1NEX0lSUUhhbmRsZXIoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7Ci0gIAorICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MzJfdCBjb250ZXh0ID0gaHNkLT5Db250ZXh0OworCiAgIC8qIENoZWNrIGZvciBTRE1NQyBpbnRlcnJ1cHQgZmxhZ3MgKi8KLSAgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19JVF9EQVRBRU5EKSAhPSBSRVNFVCkKKyAgaWYoKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWEZJRk9IRikgIT0gUkVTRVQpICYmICgoY29udGV4dCAmIFNEX0NPTlRFWFRfSVQpICE9IDBVKSkKICAgewotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX0RBVEFFTkQpOyAKKyAgICBTRF9SZWFkX0lUKGhzZCk7CisgIH0KKworICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19EQVRBRU5EKSAhPSBSRVNFVCkKKyAgeworICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX0RBVEFFTkQpOworCisgICAgX19IQUxfU0RfRElTQUJMRV9JVChoc2QsIFNETU1DX0lUX0RBVEFFTkQgIHwgU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSIHwgU0RNTUNfSVRfUlhPVkVSUiAgfCBTRE1NQ19JVF9UWEZJRk9IRSB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE1NQ19JVF9SWEZJRk9IRik7CisKKyAgICBoc2QtPkluc3RhbmNlLT5EQ1RSTCAmPSB+KFNETU1DX0RDVFJMX0RURU4pOwogICAgIAotICAgIF9fSEFMX1NEX0RJU0FCTEVfSVQoaHNkLCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKLSAgICAKLSAgICBpZigoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9JVCkgIT0gUkVTRVQpCisgICAgaWYoKGNvbnRleHQgJiBTRF9DT05URVhUX0lUKSAhPSAwVSkKICAgICB7Ci0gICAgICBpZigoKGhzZC0+Q29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgIT0gUkVTRVQpIHx8ICgoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gUkVTRVQpKQorICAgICAgaWYoKChjb250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gMFUpKQogICAgICAgewogICAgICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhzZC0+SW5zdGFuY2UpOwogICAgICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICAgICAgICB7CiAgICAgICAgICAgaHNkLT5FcnJvckNvZGUgfD0gZXJyb3JzdGF0ZTsKLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyNpZiBkZWZpbmVkIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgICAgIGhzZC0+RXJyb3JDYWxsYmFjayhoc2QpOwogI2Vsc2UKICAgICAgICAgICBIQUxfU0RfRXJyb3JDYWxsYmFjayhoc2QpOwotI2VuZGlmCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgICAgfQogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgICAgIAorICAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKKwogICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKLSAgICAgIGlmKCgoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSykgIT0gUkVTRVQpIHx8ICgoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSAhPSBSRVNFVCkpCisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CisgICAgICBpZigoKGNvbnRleHQgJiBTRF9DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSAhPSAwVSkpCiAgICAgICB7Ci0jaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgICAgaHNkLT5SeENwbHRDYWxsYmFjayhoc2QpOwogI2Vsc2UKICAgICAgICAgSEFMX1NEX1J4Q3BsdENhbGxiYWNrKGhzZCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgIGhzZC0+VHhDcGx0Q2FsbGJhY2soaHNkKTsKLSNlbHNlICAgICAgCisjZWxzZQogICAgICAgICBIQUxfU0RfVHhDcGx0Q2FsbGJhY2soaHNkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQotICAgIGVsc2UgaWYoKGhzZC0+Q29udGV4dCAmIFNEX0NPTlRFWFRfRE1BKSAhPSBSRVNFVCkKKyAgICBlbHNlIGlmKChjb250ZXh0ICYgU0RfQ09OVEVYVF9ETUEpICE9IDBVKQogICAgIHsKLSAgICAgIGlmKChoc2QtPkNvbnRleHQgJiBTRF9DT05URVhUX1dSSVRFX01VTFRJUExFX0JMT0NLKSAhPSBSRVNFVCkKKyAgICAgIGlmKChjb250ZXh0ICYgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gMFUpCiAgICAgICB7CiAgICAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaHNkLT5JbnN0YW5jZSk7CiAgICAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgICAgIHsKICAgICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwotI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQorI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgICAgaHNkLT5FcnJvckNhbGxiYWNrKGhzZCk7CiAjZWxzZQogICAgICAgICAgIEhBTF9TRF9FcnJvckNhbGxiYWNrKGhzZCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZigoKGhzZC0+Q29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0spID09IFJFU0VUKSAmJiAoKGhzZC0+Q29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgPT0gUkVTRVQpKQorICAgICAgaWYoKChjb250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSykgPT0gMFUpICYmICgoY29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgPT0gMFUpKQogICAgICAgewogICAgICAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BRU4gYml0CiAgICAgICAgIGluIHRoZSBTRCBEQ1RSTCByZWdpc3RlciAqLwogICAgICAgICBoc2QtPkluc3RhbmNlLT5EQ1RSTCAmPSAodWludDMyX3QpfigodWludDMyX3QpU0RNTUNfRENUUkxfRE1BRU4pOwotICAgICAgICAKKwogICAgICAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwotICAgICAgICAKLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKworI2lmIGRlZmluZWQgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTKSAmJiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMVUpCiAgICAgICAgIGhzZC0+VHhDcGx0Q2FsbGJhY2soaHNkKTsKLSNlbHNlICAgICAgCisjZWxzZQogICAgICAgICBIQUxfU0RfVHhDcGx0Q2FsbGJhY2soaHNkKTsKLSNlbmRpZgorI2VuZGlmIC8qIFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICB9CiAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgfQogICB9Ci0gIAotICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfSVRfVFhGSUZPSEUpICE9IFJFU0VUKQorCisgIGVsc2UgaWYoKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19UWEZJRk9IRSkgIT0gUkVTRVQpICYmICgoY29udGV4dCAmIFNEX0NPTlRFWFRfSVQpICE9IDBVKSkKICAgewotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX1RYRklGT0hFKTsKLSAgICAKICAgICBTRF9Xcml0ZV9JVChoc2QpOwogICB9Ci0gIAotICBlbHNlIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfSVRfUlhGSUZPSEYpICE9IFJFU0VUKQotICB7Ci0gICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhGSUZPSEYpOwotICAgIAotICAgIFNEX1JlYWRfSVQoaHNkKTsKLSAgfQotICAKLSAgZWxzZSBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVQgfCBTRE1NQ19JVF9SWE9WRVJSIHwgU0RNTUNfSVRfVFhVTkRFUlIpICE9IFJFU0VUKQorCisgIGVsc2UgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX0RDUkNGQUlMIHwgU0RNTUNfRkxBR19EVElNRU9VVCB8IFNETU1DX0ZMQUdfUlhPVkVSUiB8IFNETU1DX0ZMQUdfVFhVTkRFUlIpICE9IFJFU0VUKQogICB7CiAgICAgLyogU2V0IEVycm9yIGNvZGUgKi8KLSAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0lUX0RDUkNGQUlMKSAhPSBSRVNFVCkKKyAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRENSQ0ZBSUwpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9EQVRBX0NSQ19GQUlMOyAKKyAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9EQVRBX0NSQ19GQUlMOwogICAgIH0KLSAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0lUX0RUSU1FT1VUKSAhPSBSRVNFVCkKKyAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRFRJTUVPVVQpICE9IFJFU0VUKQogICAgIHsKLSAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9EQVRBX1RJTUVPVVQ7IAorICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RBVEFfVElNRU9VVDsKICAgICB9Ci0gICAgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19JVF9SWE9WRVJSKSAhPSBSRVNFVCkKKyAgICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhPVkVSUikgIT0gUkVTRVQpCiAgICAgewotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX1JYX09WRVJSVU47IAorICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX1JYX09WRVJSVU47CiAgICAgfQotICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfSVRfVFhVTkRFUlIpICE9IFJFU0VUKQorICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19UWFVOREVSUikgIT0gUkVTRVQpCiAgICAgewotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX1RYX1VOREVSUlVOOyAKKyAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9UWF9VTkRFUlJVTjsKICAgICB9CiAKICAgICAvKiBDbGVhciBBbGwgZmxhZ3MgKi8KLSAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgICAKKyAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCiAgICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwogICAgIF9fSEFMX1NEX0RJU0FCTEVfSVQoaHNkLCBTRE1NQ19JVF9EQVRBRU5EIHwgU0RNTUNfSVRfRENSQ0ZBSUwgfCBTRE1NQ19JVF9EVElNRU9VVHxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKLSAgICAKLSAgICBpZigoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9ETUEpICE9IFJFU0VUKQorCisgICAgaHNkLT5FcnJvckNvZGUgfD0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhzZC0+SW5zdGFuY2UpOworCisgICAgaWYoKGNvbnRleHQgJiBTRF9DT05URVhUX0lUKSAhPSAwVSkKICAgICB7Ci0gICAgICAvKiBBYm9ydCB0aGUgU0QgRE1BIFN0cmVhbXMgKi8KLSAgICAgIGlmKGhzZC0+aGRtYXR4ICE9IE5VTEwpCisgICAgICAvKiBTZXQgdGhlIFNEIHN0YXRlIHRvIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgICAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CisjaWYgZGVmaW5lZCAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKKyAgICAgIGhzZC0+RXJyb3JDYWxsYmFjayhoc2QpOworI2Vsc2UKKyAgICAgIEhBTF9TRF9FcnJvckNhbGxiYWNrKGhzZCk7CisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KKyAgICB9CisgICAgZWxzZSBpZigoY29udGV4dCAmIFNEX0NPTlRFWFRfRE1BKSAhPSAwVSkKKyAgICB7CisgICAgICAvKiBBYm9ydCB0aGUgU0QgRE1BIGNoYW5uZWwgKi8KKyAgICAgIGlmKCgoY29udGV4dCAmIFNEX0NPTlRFWFRfV1JJVEVfU0lOR0xFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gMFUpKQogICAgICAgewogICAgICAgICAvKiBTZXQgdGhlIERNQSBUeCBhYm9ydCBjYWxsYmFjayAqLwogICAgICAgICBoc2QtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTRF9ETUFUeEFib3J0OwpAQCAtMTU2NCw3ICsxNjc4LDcgQEAKICAgICAgICAgICBTRF9ETUFUeEFib3J0KGhzZC0+aGRtYXR4KTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZWxzZSBpZihoc2QtPmhkbWFyeCAhPSBOVUxMKQorICAgICAgZWxzZSBpZigoKGNvbnRleHQgJiBTRF9DT05URVhUX1JFQURfU0lOR0xFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX01VTFRJUExFX0JMT0NLKSAhPSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIFNldCB0aGUgRE1BIFJ4IGFib3J0IGNhbGxiYWNrICovCiAgICAgICAgIGhzZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNEX0RNQVJ4QWJvcnQ7CkBAIC0xNTc4LDI5ICsxNjkyLDI4IEBACiAgICAgICB7CiAgICAgICAgIGhzZC0+RXJyb3JDb2RlID0gSEFMX1NEX0VSUk9SX05PTkU7CiAgICAgICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0jaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisgICAgICAgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKKyNpZiBkZWZpbmVkIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUykgJiYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDFVKQogICAgICAgICBoc2QtPkFib3J0Q3BsdENhbGxiYWNrKGhzZCk7CiAjZWxzZQogICAgICAgICBIQUxfU0RfQWJvcnRDYWxsYmFjayhoc2QpOwotI2VuZGlmCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgIH0KICAgICB9Ci0gICAgZWxzZSBpZigoaHNkLT5Db250ZXh0ICYgU0RfQ09OVEVYVF9JVCkgIT0gUkVTRVQpCisgICAgZWxzZQogICAgIHsKLSAgICAgIC8qIFNldCB0aGUgU0Qgc3RhdGUgdG8gcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLwotICAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKLSNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgIGhzZC0+RXJyb3JDYWxsYmFjayhoc2QpOwotI2Vsc2UKLSAgICAgIEhBTF9TRF9FcnJvckNhbGxiYWNrKGhzZCk7Ci0jZW5kaWYKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9CiAgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CiB9CiAKIC8qKgogICAqIEBicmllZiByZXR1cm4gdGhlIFNEIHN0YXRlCi0gICogQHBhcmFtIGhzZCBQb2ludGVyIHRvIHNkIGhhbmRsZQorICAqIEBwYXJhbSBoc2Q6IFBvaW50ZXIgdG8gc2QgaGFuZGxlCiAgICogQHJldHZhbCBIQUwgc3RhdGUKICAgKi8KIEhBTF9TRF9TdGF0ZVR5cGVEZWYgSEFMX1NEX0dldFN0YXRlKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCkKQEAgLTE2MTAsNyArMTcyMyw3IEBACiAKIC8qKgogKiBAYnJpZWYgIFJldHVybiB0aGUgU0QgZXJyb3IgY29kZQotKiBAcGFyYW0gIGhzZCAgUG9pbnRlciB0byBhIFNEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyogQHBhcmFtICBoc2QgOiBQb2ludGVyIHRvIGEgU0RfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KICogQHJldHZhbCBTRCBFcnJvciBDb2RlCiAqLwpAQCAtMTYyMSwxMCArMTczNCwxMCBAQAogCiAvKioKICAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcwotICAqIEBwYXJhbSBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gaHNkOiBQb2ludGVyIHRvIFNEIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwotIF9fd2VhayB2b2lkIEhBTF9TRF9UeENwbHRDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QpCitfX3dlYWsgdm9pZCBIQUxfU0RfVHhDcGx0Q2FsbGJhY2soU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewogICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgIFVOVVNFRChoc2QpOwpAQCAtMTYzNiwxNCArMTc0OSwxNCBAQAogCiAvKioKICAgKiBAYnJpZWYgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrcwotICAqIEBwYXJhbSBoc2QgUG9pbnRlciBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gaHNkOiBQb2ludGVyIFNEIGhhbmRsZQogICAqIEByZXR2YWwgTm9uZQogICAqLwogX193ZWFrIHZvaWQgSEFMX1NEX1J4Q3BsdENhbGxiYWNrKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHNkKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgICB0aGUgSEFMX1NEX1J4Q3BsdENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICAqLwpAQCAtMTY1MSw1MSArMTc2NCw1MSBAQAogCiAvKioKICAgKiBAYnJpZWYgU0QgZXJyb3IgY2FsbGJhY2tzCi0gICogQHBhcmFtIGhzZCBQb2ludGVyIFNEIGhhbmRsZQorICAqIEBwYXJhbSBoc2Q6IFBvaW50ZXIgU0QgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCiBfX3dlYWsgdm9pZCBIQUxfU0RfRXJyb3JDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7CiAgIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICAgVU5VU0VEKGhzZCk7Ci0gCisKICAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICAgdGhlIEhBTF9TRF9FcnJvckNhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCi0gICAqLyAKKyAgICovCiB9CiAKIC8qKgogICAqIEBicmllZiBTRCBBYm9ydCBjYWxsYmFja3MKLSAgKiBAcGFyYW0gaHNkIFBvaW50ZXIgU0QgaGFuZGxlCisgICogQHBhcmFtIGhzZDogUG9pbnRlciBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KIF9fd2VhayB2b2lkIEhBTF9TRF9BYm9ydENhbGxiYWNrKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCkKIHsKICAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogICBVTlVTRUQoaHNkKTsKLSAKKwogICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCi0gICAgICAgICAgICB0aGUgSEFMX1NEX0Vycm9yQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKLSAgICovIAorICAgICAgICAgICAgdGhlIEhBTF9TRF9BYm9ydENhbGxiYWNrIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCisgICAqLwogfQogCi0jaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKIC8qKgogICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFNEIENhbGxiYWNrCi0gICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCisgICogICAgICAgICBUbyBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sKICAgKiBAcGFyYW0gaHNkIDogU0QgaGFuZGxlCi0gICogQHBhcmFtIENhbGxiYWNrSWQgOiBJZCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAorICAqIEBwYXJhbSBDYWxsYmFja0lEIDogSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX1RYX0NQTFRfQ0JfSUQgICAgU0QgVHggQ29tcGxldGUgQ2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX1JYX0NQTFRfQ0JfSUQgICAgU0QgUnggQ29tcGxldGUgQ2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX0VSUk9SX0NCX0lEICAgICAgU0QgRXJyb3IgQ2FsbGJhY2sgSUQKICAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX0FCT1JUX0NCX0lEICAgICAgU0QgQWJvcnQgQ2FsbGJhY2sgSUQKLSAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX01TUF9JTklUX0NCX0lEICAgU0QgTXNwSW5pdCBDYWxsYmFjayBJRCAKLSAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX01TUF9ERUlOSVRfQ0JfSUQgU0QgTXNwRGVJbml0IENhbGxiYWNrIElEICAKKyAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX1NEX01TUF9JTklUX0NCX0lEICAgU0QgTXNwSW5pdCBDYWxsYmFjayBJRAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfTVNQX0RFSU5JVF9DQl9JRCBTRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQKICAgKiBAcGFyYW0gcENhbGxiYWNrIDogcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAgKiBAcmV0dmFsIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX1JlZ2lzdGVyQ2FsbGJhY2soU0RfSGFuZGxlVHlwZURlZiAqaHNkLCBIQUxfU0RfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJZCwgcFNEX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfUmVnaXN0ZXJDYWxsYmFjayhTRF9IYW5kbGVUeXBlRGVmICpoc2QsIEhBTF9TRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwU0RfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogCkBAIC0xNzA4LDEwICsxODIxLDEwIEBACiAKICAgLyogUHJvY2VzcyBsb2NrZWQgKi8KICAgX19IQUxfTE9DSyhoc2QpOwotICAKKwogICBpZihoc2QtPlN0YXRlID09IEhBTF9TRF9TVEFURV9SRUFEWSkKICAgewotICAgIHN3aXRjaCAoQ2FsbGJhY2tJZCkKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewogICAgIGNhc2UgSEFMX1NEX1RYX0NQTFRfQ0JfSUQgOgogICAgICAgaHNkLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKQEAgLTE3MzMsNyArMTg0Niw3IEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0IDoKICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgIGJyZWFrOwpAQCAtMTc0MSw3ICsxODU0LDcgQEAKICAgfQogICBlbHNlIGlmIChoc2QtPlN0YXRlID09IEhBTF9TRF9TVEFURV9SRVNFVCkKICAgewotICAgIHN3aXRjaCAoQ2FsbGJhY2tJZCkKKyAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICAgewogICAgIGNhc2UgSEFMX1NEX01TUF9JTklUX0NCX0lEIDoKICAgICAgIGhzZC0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwpAQCAtMTc1MSw3ICsxODY0LDcgQEAKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQgOgogICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgYnJlYWs7CkBAIC0xNzYwLDcgKzE4NzMsNyBAQAogICBlbHNlCiAgIHsKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KLSAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICB9CkBAIC0xNzcyLDI4ICsxODg1LDI4IEBACiAKIC8qKgogICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFVzZXIgU0QgQ2FsbGJhY2sKLSAgKiAgICAgICAgIFNEIENhbGxiYWNrIGlzIHJlZGlyZWN0ZWQgdG8gdGhlIHdlYWsgKHN1cmNoYXJnZWQpIHByZWRlZmluZWQgY2FsbGJhY2sgCisgICogICAgICAgICBTRCBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgICogQHBhcmFtIGhzZCA6IFNEIGhhbmRsZQotICAqIEBwYXJhbSBDYWxsYmFja0lkIDogSWQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAorICAqIEBwYXJhbSBDYWxsYmFja0lEIDogSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZAogICAqICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfVFhfQ1BMVF9DQl9JRCAgICBTRCBUeCBDb21wbGV0ZSBDYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfUlhfQ1BMVF9DQl9JRCAgICBTRCBSeCBDb21wbGV0ZSBDYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfRVJST1JfQ0JfSUQgICAgICBTRCBFcnJvciBDYWxsYmFjayBJRAogICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfQUJPUlRfQ0JfSUQgICAgICBTRCBBYm9ydCBDYWxsYmFjayBJRAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfTVNQX0lOSVRfQ0JfSUQgICBTRCBNc3BJbml0IENhbGxiYWNrIElEIAotICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfTVNQX0RFSU5JVF9DQl9JRCBTRCBNc3BEZUluaXQgQ2FsbGJhY2sgSUQgIAorICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU0RfTVNQX0lOSVRfQ0JfSUQgICBTRCBNc3BJbml0IENhbGxiYWNrIElECisgICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9TRF9NU1BfREVJTklUX0NCX0lEIFNEIE1zcERlSW5pdCBDYWxsYmFjayBJRAogICAqIEByZXR2YWwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfVW5SZWdpc3RlckNhbGxiYWNrKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgSEFMX1NEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSWQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfVW5SZWdpc3RlckNhbGxiYWNrKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgSEFMX1NEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIAogICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGhzZCk7Ci0gIAorCiAgIGlmKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFQURZKQogICB7Ci0gICAgc3dpdGNoIChDYWxsYmFja0lkKQorICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7CiAgICAgY2FzZSBIQUxfU0RfVFhfQ1BMVF9DQl9JRCA6CiAgICAgICBoc2QtPlR4Q3BsdENhbGxiYWNrID0gSEFMX1NEX1R4Q3BsdENhbGxiYWNrOwpAQCAtMTgxNSw3ICsxOTI4LDcgQEAKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQgOgogICAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsgCisgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgYnJlYWs7CkBAIC0xODIzLDcgKzE5MzYsNyBAQAogICB9CiAgIGVsc2UgaWYgKGhzZC0+U3RhdGUgPT0gSEFMX1NEX1NUQVRFX1JFU0VUKQogICB7Ci0gICAgc3dpdGNoIChDYWxsYmFja0lkKQorICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7CiAgICAgY2FzZSBIQUxfU0RfTVNQX0lOSVRfQ0JfSUQgOgogICAgICAgaHNkLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU0RfTXNwSW5pdDsKQEAgLTE4MzMsNyArMTk0Niw3IEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0IDoKICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgIGJyZWFrOwpAQCAtMTg0Miw3ICsxOTU1LDcgQEAKICAgZWxzZQogICB7CiAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCi0gICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7IAorICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgfQpAQCAtMTg1MSwyMSArMTk2NCwyMSBAQAogICBfX0hBTF9VTkxPQ0soaHNkKTsKICAgcmV0dXJuIHN0YXR1czsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAKIC8qKgogICAqIEB9CiAgICovCiAKIC8qKiBAYWRkdG9ncm91cCBTRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzCi0gKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMgCisgKiAgQGJyaWVmICAgbWFuYWdlbWVudCBmdW5jdGlvbnMKICAqCi1AdmVyYmF0aW0gICAKK0B2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBbLi5dCi0gICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBTRCBjYXJkIAorICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgU0QgY2FyZAogICAgIG9wZXJhdGlvbnMgYW5kIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbgogCiBAZW5kdmVyYmF0aW0KQEAgLTE4NzUsODAgKzE5ODgsMzIgQEAKIC8qKgogICAqIEBicmllZiAgUmV0dXJucyBpbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGNhcmQgd2hpY2ggYXJlIHN0b3JlZCBvbgogICAqICAgICAgICAgdGhlIENJRCByZWdpc3Rlci4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgcENJRCBQb2ludGVyIHRvIGEgSEFMX1NEX0NhcmRDSURUeXBlRGVmIHN0cnVjdHVyZSB0aGF0ICAKLSAgKiAgICAgICAgIGNvbnRhaW5zIGFsbCBDSUQgcmVnaXN0ZXIgcGFyYW1ldGVycyAKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDSUQ6IFBvaW50ZXIgdG8gYSBIQUxfU0RfQ2FyZENJRFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgIAorICAqICAgICAgICAgY29udGFpbnMgYWxsIENJRCByZWdpc3RlciBwYXJhbWV0ZXJzCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfR2V0Q2FyZENJRChTRF9IYW5kbGVUeXBlRGVmICpoc2QsIEhBTF9TRF9DYXJkQ0lEVHlwZURlZiAqcENJRCkKIHsKLSAgdWludDMyX3QgdG1wID0gMDsKLSAgCi0gIC8qIEJ5dGUgMCAqLwotICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q0lEWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENJRC0+TWFudWZhY3R1cmVySUQgPSB0bXA7Ci0gIAotICAvKiBCeXRlIDEgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChoc2QtPkNJRFswXSAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgcENJRC0+T0VNX0FwcGxpSUQgPSB0bXAgPDwgODsKLSAgCi0gIC8qIEJ5dGUgMiAqLwotICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q0lEWzBdICYgMHgwMDAwMDBGRjAwKSA+PiA4KTsKLSAgcENJRC0+T0VNX0FwcGxpSUQgfD0gdG1wOwotICAKLSAgLyogQnl0ZSAzICovCi0gIHRtcCA9ICh1aW50OF90KShoc2QtPkNJRFswXSAmIDB4MDAwMDAwRkYpOwotICBwQ0lELT5Qcm9kTmFtZTEgPSB0bXAgPDwgMjQ7Ci0gIAotICAvKiBCeXRlIDQgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChoc2QtPkNJRFsxXSAmIDB4RkYwMDAwMDBVKSA+PiAyNCk7Ci0gIHBDSUQtPlByb2ROYW1lMSB8PSB0bXAgPDwgMTY7Ci0gIAotICAvKiBCeXRlIDUgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChoc2QtPkNJRFsxXSAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgcENJRC0+UHJvZE5hbWUxIHw9IHRtcCA8PCA4OwotICAKLSAgLyogQnl0ZSA2ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DSURbMV0gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENJRC0+UHJvZE5hbWUxIHw9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgNyAqLwotICB0bXAgPSAodWludDhfdCkoaHNkLT5DSURbMV0gJiAweDAwMDAwMEZGKTsKLSAgcENJRC0+UHJvZE5hbWUyID0gdG1wOwotICAKLSAgLyogQnl0ZSA4ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DSURbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjQpOwotICBwQ0lELT5Qcm9kUmV2ID0gdG1wOwotICAKLSAgLyogQnl0ZSA5ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DSURbMl0gJiAweDAwRkYwMDAwKSA+PiAxNik7Ci0gIHBDSUQtPlByb2RTTiA9IHRtcCA8PCAyNDsKLSAgCi0gIC8qIEJ5dGUgMTAgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChoc2QtPkNJRFsyXSAmIDB4MDAwMEZGMDApID4+IDgpOwotICBwQ0lELT5Qcm9kU04gfD0gdG1wIDw8IDE2OwotICAKLSAgLyogQnl0ZSAxMSAqLwotICB0bXAgPSAodWludDhfdCkoaHNkLT5DSURbMl0gJiAweDAwMDAwMEZGKTsKLSAgcENJRC0+UHJvZFNOIHw9IHRtcCA8PCA4OwotICAKLSAgLyogQnl0ZSAxMiAqLwotICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q0lEWzNdICYgMHhGRjAwMDAwMFUpID4+IDI0KTsKLSAgcENJRC0+UHJvZFNOIHw9IHRtcDsKLSAgCi0gIC8qIEJ5dGUgMTMgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKChoc2QtPkNJRFszXSAmIDB4MDBGRjAwMDApID4+IDE2KTsKLSAgcENJRC0+UmVzZXJ2ZWQxICAgfD0gKHRtcCAmIDB4RjApID4+IDQ7Ci0gIHBDSUQtPk1hbnVmYWN0RGF0ZSA9ICh0bXAgJiAweDBGKSA8PCA4OwotICAKLSAgLyogQnl0ZSAxNCAqLwotICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q0lEWzNdICYgMHgwMDAwRkYwMCkgPj4gOCk7Ci0gIHBDSUQtPk1hbnVmYWN0RGF0ZSB8PSB0bXA7Ci0gIAotICAvKiBCeXRlIDE1ICovCi0gIHRtcCA9ICh1aW50OF90KShoc2QtPkNJRFszXSAmIDB4MDAwMDAwRkYpOwotICBwQ0lELT5DSURfQ1JDICAgPSAodG1wICYgMHhGRSkgPj4gMTsKLSAgcENJRC0+UmVzZXJ2ZWQyID0gMTsKKyAgcENJRC0+TWFudWZhY3R1cmVySUQgPSAodWludDhfdCkoKGhzZC0+Q0lEWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0VSk7CisKKyAgcENJRC0+T0VNX0FwcGxpSUQgPSAodWludDE2X3QpKChoc2QtPkNJRFswXSAmIDB4MDBGRkZGMDBVKSA+PiA4VSk7CisKKyAgcENJRC0+UHJvZE5hbWUxID0gKCgoaHNkLT5DSURbMF0gJiAweDAwMDAwMEZGVSkgPDwgMjRVKSB8ICgoaHNkLT5DSURbMV0gJiAweEZGRkZGRjAwVSkgPj4gOFUpKTsKKworICBwQ0lELT5Qcm9kTmFtZTIgPSAodWludDhfdCkoaHNkLT5DSURbMV0gJiAweDAwMDAwMEZGVSk7CisKKyAgcENJRC0+UHJvZFJldiA9ICh1aW50OF90KSgoaHNkLT5DSURbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjRVKTsKKworICBwQ0lELT5Qcm9kU04gPSAoKChoc2QtPkNJRFsyXSAmIDB4MDBGRkZGRkZVKSA8PCA4VSkgfCAoKGhzZC0+Q0lEWzNdICYgMHhGRjAwMDAwMFUpID4+IDI0VSkpOworCisgIHBDSUQtPlJlc2VydmVkMSA9ICh1aW50OF90KSgoaHNkLT5DSURbM10gJiAweDAwRjAwMDAwVSkgPj4gMjBVKTsKKworICBwQ0lELT5NYW51ZmFjdERhdGUgPSAodWludDE2X3QpKChoc2QtPkNJRFszXSAmIDB4MDAwRkZGMDBVKSA+PiA4VSk7CisKKyAgcENJRC0+Q0lEX0NSQyA9ICh1aW50OF90KSgoaHNkLT5DSURbM10gJiAweDAwMDAwMEZFVSkgPj4gMVUpOworCisgIHBDSUQtPlJlc2VydmVkMiA9IDFVOwogCiAgIHJldHVybiBIQUxfT0s7CiB9CkBAIC0xOTU2LDI0NCArMjAyMSwxNzEgQEAKIC8qKgogICAqIEBicmllZiAgUmV0dXJucyBpbmZvcm1hdGlvbiB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGNhcmQgd2hpY2ggYXJlIHN0b3JlZCBvbgogICAqICAgICAgICAgdGhlIENTRCByZWdpc3Rlci4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgcENTRCBQb2ludGVyIHRvIGEgSEFMX1NEX0NhcmRDU0RUeXBlRGVmIHN0cnVjdHVyZSB0aGF0ICAKLSAgKiAgICAgICAgIGNvbnRhaW5zIGFsbCBDU0QgcmVnaXN0ZXIgcGFyYW1ldGVycyAgCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBwQ1NEOiBQb2ludGVyIHRvIGEgSEFMX1NEX0NhcmRDU0RUeXBlRGVmIHN0cnVjdHVyZSB0aGF0ICAKKyAgKiAgICAgICAgIGNvbnRhaW5zIGFsbCBDU0QgcmVnaXN0ZXIgcGFyYW1ldGVycwogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX0dldENhcmRDU0QoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCBIQUxfU0RfQ2FyZENTRFR5cGVEZWYgKnBDU0QpCiB7Ci0gIHVpbnQzMl90IHRtcCA9IDA7Ci0gIAotICAvKiBCeXRlIDAgKi8KLSAgdG1wID0gKGhzZC0+Q1NEWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0OwotICBwQ1NELT5DU0RTdHJ1Y3QgICAgICA9ICh1aW50OF90KSgodG1wICYgMHhDMCkgPj4gNik7Ci0gIHBDU0QtPlN5c1NwZWNWZXJzaW9uID0gKHVpbnQ4X3QpKCh0bXAgJiAweDNDKSA+PiAyKTsKLSAgcENTRC0+UmVzZXJ2ZWQxICAgICAgPSB0bXAgJiAweDAzOwotICAKLSAgLyogQnl0ZSAxICovCi0gIHRtcCA9IChoc2QtPkNTRFswXSAmIDB4MDBGRjAwMDApID4+IDE2OwotICBwQ1NELT5UQUFDID0gKHVpbnQ4X3QpdG1wOwotICAKLSAgLyogQnl0ZSAyICovCi0gIHRtcCA9IChoc2QtPkNTRFswXSAmIDB4MDAwMEZGMDApID4+IDg7Ci0gIHBDU0QtPk5TQUMgPSAodWludDhfdCl0bXA7Ci0gIAotICAvKiBCeXRlIDMgKi8KLSAgdG1wID0gaHNkLT5DU0RbMF0gJiAweDAwMDAwMEZGOwotICBwQ1NELT5NYXhCdXNDbGtGcmVjID0gKHVpbnQ4X3QpdG1wOwotICAKLSAgLyogQnl0ZSA0ICovCi0gIHRtcCA9IChoc2QtPkNTRFsxXSAmIDB4RkYwMDAwMDBVKSA+PiAyNDsKLSAgcENTRC0+Q2FyZENvbWRDbGFzc2VzID0gKHVpbnQxNl90KSh0bXAgPDwgNCk7Ci0gIAotICAvKiBCeXRlIDUgKi8KLSAgdG1wID0gKGhzZC0+Q1NEWzFdICYgMHgwMEZGMDAwMFUpID4+IDE2OwotICBwQ1NELT5DYXJkQ29tZENsYXNzZXMgfD0gKHVpbnQxNl90KSgodG1wICYgMHhGMCkgPj4gNCk7Ci0gIHBDU0QtPlJkQmxvY2tMZW4gICAgICAgPSAodWludDhfdCkodG1wICYgMHgwRik7Ci0gIAotICAvKiBCeXRlIDYgKi8KLSAgdG1wID0gKGhzZC0+Q1NEWzFdICYgMHgwMDAwRkYwMFUpID4+IDg7Ci0gIHBDU0QtPlBhcnRCbG9ja1JlYWQgICA9ICh1aW50OF90KSgodG1wICYgMHg4MCkgPj4gNyk7Ci0gIHBDU0QtPldyQmxvY2tNaXNhbGlnbiA9ICh1aW50OF90KSgodG1wICYgMHg0MCkgPj4gNik7Ci0gIHBDU0QtPlJkQmxvY2tNaXNhbGlnbiA9ICh1aW50OF90KSgodG1wICYgMHgyMCkgPj4gNSk7Ci0gIHBDU0QtPkRTUkltcGwgICAgICAgICA9ICh1aW50OF90KSgodG1wICYgMHgxMCkgPj4gNCk7Ci0gIHBDU0QtPlJlc2VydmVkMiAgICAgICA9IDA7IC8qITwgUmVzZXJ2ZWQgKi8KLSAgICAgICAKKyAgcENTRC0+Q1NEU3RydWN0ID0gKHVpbnQ4X3QpKChoc2QtPkNTRFswXSAmIDB4QzAwMDAwMDBVKSA+PiAzMFUpOworCisgIHBDU0QtPlN5c1NwZWNWZXJzaW9uID0gKHVpbnQ4X3QpKChoc2QtPkNTRFswXSAmIDB4M0MwMDAwMDBVKSA+PiAyNlUpOworCisgIHBDU0QtPlJlc2VydmVkMSA9ICh1aW50OF90KSgoaHNkLT5DU0RbMF0gJiAweDAzMDAwMDAwVSkgPj4gMjRVKTsKKworICBwQ1NELT5UQUFDID0gKHVpbnQ4X3QpKChoc2QtPkNTRFswXSAmIDB4MDBGRjAwMDBVKSA+PiAxNlUpOworCisgIHBDU0QtPk5TQUMgPSAodWludDhfdCkoKGhzZC0+Q1NEWzBdICYgMHgwMDAwRkYwMFUpID4+IDhVKTsKKworICBwQ1NELT5NYXhCdXNDbGtGcmVjID0gKHVpbnQ4X3QpKGhzZC0+Q1NEWzBdICYgMHgwMDAwMDBGRlUpOworCisgIHBDU0QtPkNhcmRDb21kQ2xhc3NlcyA9ICh1aW50MTZfdCkoKGhzZC0+Q1NEWzFdICYgMHhGRkYwMDAwMFUpID4+IDIwVSk7CisKKyAgcENTRC0+UmRCbG9ja0xlbiA9ICh1aW50OF90KSgoaHNkLT5DU0RbMV0gJiAweDAwMEYwMDAwVSkgPj4gMTZVKTsKKworICBwQ1NELT5QYXJ0QmxvY2tSZWFkICAgPSAodWludDhfdCkoKGhzZC0+Q1NEWzFdICYgMHgwMDAwODAwMFUpID4+IDE1VSk7CisKKyAgcENTRC0+V3JCbG9ja01pc2FsaWduID0gKHVpbnQ4X3QpKChoc2QtPkNTRFsxXSAmIDB4MDAwMDQwMDBVKSA+PiAxNFUpOworCisgIHBDU0QtPlJkQmxvY2tNaXNhbGlnbiA9ICh1aW50OF90KSgoaHNkLT5DU0RbMV0gJiAweDAwMDAyMDAwVSkgPj4gMTNVKTsKKworICBwQ1NELT5EU1JJbXBsID0gKHVpbnQ4X3QpKChoc2QtPkNTRFsxXSAmIDB4MDAwMDEwMDBVKSA+PiAxMlUpOworCisgIHBDU0QtPlJlc2VydmVkMiA9IDBVOyAvKiE8IFJlc2VydmVkICovCisKICAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgPT0gQ0FSRF9TRFNDKQogICB7Ci0gICAgcENTRC0+RGV2aWNlU2l6ZSA9ICh0bXAgJiAweDAzKSA8PCAxMDsKLSAgICAKLSAgICAvKiBCeXRlIDcgKi8KLSAgICB0bXAgPSAodWludDhfdCkoaHNkLT5DU0RbMV0gJiAweDAwMDAwMEZGVSk7Ci0gICAgcENTRC0+RGV2aWNlU2l6ZSB8PSAodG1wKSA8PCAyOwotICAgIAotICAgIC8qIEJ5dGUgOCAqLwotICAgIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjQpOwotICAgIHBDU0QtPkRldmljZVNpemUgfD0gKHRtcCAmIDB4QzApID4+IDY7Ci0gICAgCi0gICAgcENTRC0+TWF4UmRDdXJyZW50VkRETWluID0gKHRtcCAmIDB4MzgpID4+IDM7Ci0gICAgcENTRC0+TWF4UmRDdXJyZW50VkRETWF4ID0gKHRtcCAmIDB4MDcpOwotICAgIAotICAgIC8qIEJ5dGUgOSAqLwotICAgIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDAwRkYwMDAwVSkgPj4gMTYpOwotICAgIHBDU0QtPk1heFdyQ3VycmVudFZERE1pbiA9ICh0bXAgJiAweEUwKSA+PiA1OwotICAgIHBDU0QtPk1heFdyQ3VycmVudFZERE1heCA9ICh0bXAgJiAweDFDKSA+PiAyOwotICAgIHBDU0QtPkRldmljZVNpemVNdWwgICAgICA9ICh0bXAgJiAweDAzKSA8PCAxOwotICAgIC8qIEJ5dGUgMTAgKi8KLSAgICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q1NEWzJdICYgMHgwMDAwRkYwMFUpID4+IDgpOwotICAgIHBDU0QtPkRldmljZVNpemVNdWwgfD0gKHRtcCAmIDB4ODApID4+IDc7Ci0gICAgCi0gICAgaHNkLT5TZENhcmQuQmxvY2tOYnIgID0gKHBDU0QtPkRldmljZVNpemUgKyAxKSA7Ci0gICAgaHNkLT5TZENhcmQuQmxvY2tOYnIgKj0gKDEgPDwgKHBDU0QtPkRldmljZVNpemVNdWwgKyAyKSk7Ci0gICAgaHNkLT5TZENhcmQuQmxvY2tTaXplID0gMSA8PCAocENTRC0+UmRCbG9ja0xlbik7CisgICAgcENTRC0+RGV2aWNlU2l6ZSA9ICgoKGhzZC0+Q1NEWzFdICYgMHgwMDAwMDNGRlUpIDw8IDJVKSB8ICgoaHNkLT5DU0RbMl0gJiAweEMwMDAwMDAwVSkgPj4gMzBVKSk7CiAKLSAgICBoc2QtPlNkQ2FyZC5Mb2dCbG9ja05iciA9ICAoaHNkLT5TZENhcmQuQmxvY2tOYnIpICogKChoc2QtPlNkQ2FyZC5CbG9ja1NpemUpIC8gNTEyKTsgCi0gICAgaHNkLT5TZENhcmQuTG9nQmxvY2tTaXplID0gNTEyOworICAgIHBDU0QtPk1heFJkQ3VycmVudFZERE1pbiA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDM4MDAwMDAwVSkgPj4gMjdVKTsKKworICAgIHBDU0QtPk1heFJkQ3VycmVudFZERE1heCA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDA3MDAwMDAwVSkgPj4gMjRVKTsKKworICAgIHBDU0QtPk1heFdyQ3VycmVudFZERE1pbiA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDAwRTAwMDAwVSkgPj4gMjFVKTsKKworICAgIHBDU0QtPk1heFdyQ3VycmVudFZERE1heCA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDAwMUMwMDAwVSkgPj4gMThVKTsKKworICAgIHBDU0QtPkRldmljZVNpemVNdWwgPSAodWludDhfdCkoKGhzZC0+Q1NEWzJdICYgMHgwMDAzODAwMFUpID4+IDE1VSk7CisKKyAgICBoc2QtPlNkQ2FyZC5CbG9ja05iciAgPSAocENTRC0+RGV2aWNlU2l6ZSArIDFVKSA7CisgICAgaHNkLT5TZENhcmQuQmxvY2tOYnIgKj0gKDFVTCA8PCAoKHBDU0QtPkRldmljZVNpemVNdWwgJiAweDA3VSkgKyAyVSkpOworICAgIGhzZC0+U2RDYXJkLkJsb2NrU2l6ZSA9ICgxVUwgPDwgKHBDU0QtPlJkQmxvY2tMZW4gJiAweDBGVSkpOworCisgICAgaHNkLT5TZENhcmQuTG9nQmxvY2tOYnIgPSAgKGhzZC0+U2RDYXJkLkJsb2NrTmJyKSAqICgoaHNkLT5TZENhcmQuQmxvY2tTaXplKSAvIDUxMlUpOworICAgIGhzZC0+U2RDYXJkLkxvZ0Jsb2NrU2l6ZSA9IDUxMlU7CiAgIH0KICAgZWxzZSBpZihoc2QtPlNkQ2FyZC5DYXJkVHlwZSA9PSBDQVJEX1NESENfU0RYQykKICAgewogICAgIC8qIEJ5dGUgNyAqLwotICAgIHRtcCA9ICh1aW50OF90KShoc2QtPkNTRFsxXSAmIDB4MDAwMDAwRkZVKTsKLSAgICBwQ1NELT5EZXZpY2VTaXplID0gKHRtcCAmIDB4M0YpIDw8IDE2OwotICAgIAotICAgIC8qIEJ5dGUgOCAqLwotICAgIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjQpOwotICAgIAotICAgIHBDU0QtPkRldmljZVNpemUgfD0gKHRtcCA8PCA4KTsKLSAgICAKLSAgICAvKiBCeXRlIDkgKi8KLSAgICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q1NEWzJdICYgMHgwMEZGMDAwMFUpID4+IDE2KTsKLSAgICAKLSAgICBwQ1NELT5EZXZpY2VTaXplIHw9ICh0bXApOwotICAgIAotICAgIC8qIEJ5dGUgMTAgKi8KLSAgICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q1NEWzJdICYgMHgwMDAwRkYwMFUpID4+IDgpOwotICAgIAotICAgIGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyID0gaHNkLT5TZENhcmQuQmxvY2tOYnIgPSAoKCh1aW50NjRfdClwQ1NELT5EZXZpY2VTaXplICsgMSkgKiAxMDI0KTsKLSAgICBoc2QtPlNkQ2FyZC5Mb2dCbG9ja1NpemUgPSBoc2QtPlNkQ2FyZC5CbG9ja1NpemUgPSA1MTI7CisgICAgcENTRC0+RGV2aWNlU2l6ZSA9ICgoKGhzZC0+Q1NEWzFdICYgMHgwMDAwMDAzRlUpIDw8IDE2VSkgfCAoKGhzZC0+Q1NEWzJdICYgMHhGRkZGMDAwMFUpID4+IDE2VSkpOworCisgICAgaHNkLT5TZENhcmQuQmxvY2tOYnIgPSAoKHBDU0QtPkRldmljZVNpemUgKyAxVSkgKiAxMDI0VSk7CisgICAgaHNkLT5TZENhcmQuTG9nQmxvY2tOYnIgPSBoc2QtPlNkQ2FyZC5CbG9ja05icjsKKyAgICBoc2QtPlNkQ2FyZC5CbG9ja1NpemUgPSA1MTJVOworICAgIGhzZC0+U2RDYXJkLkxvZ0Jsb2NrU2l6ZSA9IGhzZC0+U2RDYXJkLkJsb2NrU2l6ZTsKICAgfQogICBlbHNlCiAgIHsKICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgIAorICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFOwogICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAKLSAgcENTRC0+RXJhc2VHclNpemUgPSAodG1wICYgMHg0MCkgPj4gNjsKLSAgcENTRC0+RXJhc2VHck11bCAgPSAodG1wICYgMHgzRikgPDwgMTsKLSAgCi0gIC8qIEJ5dGUgMTEgKi8KLSAgdG1wID0gKHVpbnQ4X3QpKGhzZC0+Q1NEWzJdICYgMHgwMDAwMDBGRik7Ci0gIHBDU0QtPkVyYXNlR3JNdWwgICAgIHw9ICh0bXAgJiAweDgwKSA+PiA3OwotICBwQ1NELT5XclByb3RlY3RHclNpemUgPSAodG1wICYgMHg3Rik7Ci0gIAotICAvKiBCeXRlIDEyICovCi0gIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweEZGMDAwMDAwVSkgPj4gMjQpOwotICBwQ1NELT5XclByb3RlY3RHckVuYWJsZSA9ICh0bXAgJiAweDgwKSA+PiA3OwotICBwQ1NELT5NYW5EZWZsRUNDICAgICAgICA9ICh0bXAgJiAweDYwKSA+PiA1OwotICBwQ1NELT5XclNwZWVkRmFjdCAgICAgICA9ICh0bXAgJiAweDFDKSA+PiAyOwotICBwQ1NELT5NYXhXckJsb2NrTGVuICAgICA9ICh0bXAgJiAweDAzKSA8PCAyOwotICAKLSAgLyogQnl0ZSAxMyAqLwotICB0bXAgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHgwMEZGMDAwMCkgPj4gMTYpOwotICBwQ1NELT5NYXhXckJsb2NrTGVuICAgICAgfD0gKHRtcCAmIDB4QzApID4+IDY7Ci0gIHBDU0QtPldyaXRlQmxvY2tQYVBhcnRpYWwgPSAodG1wICYgMHgyMCkgPj4gNTsKLSAgcENTRC0+UmVzZXJ2ZWQzICAgICAgICAgICA9IDA7Ci0gIHBDU0QtPkNvbnRlbnRQcm90ZWN0QXBwbGkgPSAodG1wICYgMHgwMSk7Ci0gIAotICAvKiBCeXRlIDE0ICovCi0gIHRtcCA9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweDAwMDBGRjAwKSA+PiA4KTsKLSAgcENTRC0+RmlsZUZvcm1hdEdyb3VvcCA9ICh0bXAgJiAweDgwKSA+PiA3OwotICBwQ1NELT5Db3B5RmxhZyAgICAgICAgID0gKHRtcCAmIDB4NDApID4+IDY7Ci0gIHBDU0QtPlBlcm1XclByb3RlY3QgICAgPSAodG1wICYgMHgyMCkgPj4gNTsKLSAgcENTRC0+VGVtcFdyUHJvdGVjdCAgICA9ICh0bXAgJiAweDEwKSA+PiA0OwotICBwQ1NELT5GaWxlRm9ybWF0ICAgICAgID0gKHRtcCAmIDB4MEMpID4+IDI7Ci0gIHBDU0QtPkVDQyAgICAgICAgICAgICAgPSAodG1wICYgMHgwMyk7Ci0gIAotICAvKiBCeXRlIDE1ICovCi0gIHRtcCA9ICh1aW50OF90KShoc2QtPkNTRFszXSAmIDB4MDAwMDAwRkYpOwotICBwQ1NELT5DU0RfQ1JDICAgPSAodG1wICYgMHhGRSkgPj4gMTsKKworICBwQ1NELT5FcmFzZUdyU2l6ZSA9ICh1aW50OF90KSgoaHNkLT5DU0RbMl0gJiAweDAwMDA0MDAwVSkgPj4gMTRVKTsKKworICBwQ1NELT5FcmFzZUdyTXVsID0gKHVpbnQ4X3QpKChoc2QtPkNTRFsyXSAmIDB4MDAwMDNGODBVKSA+PiA3VSk7CisKKyAgcENTRC0+V3JQcm90ZWN0R3JTaXplID0gKHVpbnQ4X3QpKGhzZC0+Q1NEWzJdICYgMHgwMDAwMDA3RlUpOworCisgIHBDU0QtPldyUHJvdGVjdEdyRW5hYmxlID0gKHVpbnQ4X3QpKChoc2QtPkNTRFszXSAmIDB4ODAwMDAwMDBVKSA+PiAzMVUpOworCisgIHBDU0QtPk1hbkRlZmxFQ0MgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHg2MDAwMDAwMFUpID4+IDI5VSk7CisKKyAgcENTRC0+V3JTcGVlZEZhY3QgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHgxQzAwMDAwMFUpID4+IDI2VSk7CisKKyAgcENTRC0+TWF4V3JCbG9ja0xlbj0gKHVpbnQ4X3QpKChoc2QtPkNTRFszXSAmIDB4MDNDMDAwMDBVKSA+PiAyMlUpOworCisgIHBDU0QtPldyaXRlQmxvY2tQYVBhcnRpYWwgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHgwMDIwMDAwMFUpID4+IDIxVSk7CisKKyAgcENTRC0+UmVzZXJ2ZWQzID0gMDsKKworICBwQ1NELT5Db250ZW50UHJvdGVjdEFwcGxpID0gKHVpbnQ4X3QpKChoc2QtPkNTRFszXSAmIDB4MDAwMTAwMDBVKSA+PiAxNlUpOworCisgIHBDU0QtPkZpbGVGb3JtYXRHcm91cCA9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweDAwMDA4MDAwVSkgPj4gMTVVKTsKKworICBwQ1NELT5Db3B5RmxhZyA9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweDAwMDA0MDAwVSkgPj4gMTRVKTsKKworICBwQ1NELT5QZXJtV3JQcm90ZWN0ID0gKHVpbnQ4X3QpKChoc2QtPkNTRFszXSAmIDB4MDAwMDIwMDBVKSA+PiAxM1UpOworCisgIHBDU0QtPlRlbXBXclByb3RlY3QgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHgwMDAwMTAwMFUpID4+IDEyVSk7CisKKyAgcENTRC0+RmlsZUZvcm1hdCA9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweDAwMDAwQzAwVSkgPj4gMTBVKTsKKworICBwQ1NELT5FQ0M9ICh1aW50OF90KSgoaHNkLT5DU0RbM10gJiAweDAwMDAwMzAwVSkgPj4gOFUpOworCisgIHBDU0QtPkNTRF9DUkMgPSAodWludDhfdCkoKGhzZC0+Q1NEWzNdICYgMHgwMDAwMDBGRVUpID4+IDFVKTsKKwogICBwQ1NELT5SZXNlcnZlZDQgPSAxOwotICAKKwogICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEdldHMgdGhlIFNEIHN0YXR1cyBpbmZvLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlICAgICAgCi0gICogQHBhcmFtICBwU3RhdHVzIFBvaW50ZXIgdG8gdGhlIEhBTF9TRF9DYXJkU3RhdHVzVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCAKLSAgKiAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgU0QgY2FyZCBzdGF0dXMgaW5mb3JtYXRpb24gCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBwU3RhdHVzOiBQb2ludGVyIHRvIHRoZSBIQUxfU0RfQ2FyZFN0YXR1c1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgCisgICogICAgICAgICB3aWxsIGNvbnRhaW4gdGhlIFNEIGNhcmQgc3RhdHVzIGluZm9ybWF0aW9uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfU0RfR2V0Q2FyZFN0YXR1cyhTRF9IYW5kbGVUeXBlRGVmICpoc2QsIEhBTF9TRF9DYXJkU3RhdHVzVHlwZURlZiAqcFN0YXR1cykKIHsKLSAgdWludDMyX3QgdG1wID0gMDsKICAgdWludDMyX3Qgc2Rfc3RhdHVzWzE2XTsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKwogICBlcnJvcnN0YXRlID0gU0RfU2VuZFNEU3RhdHVzKGhzZCwgc2Rfc3RhdHVzKTsKLSAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfT0spCisgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgIHsKICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOyAgIAorICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwogICAgIGhzZC0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CiAgIGVsc2UKICAgewotICAgIC8qIEJ5dGUgMCAqLwotICAgIHRtcCA9IChzZF9zdGF0dXNbMF0gJiAweEMwKSA+PiA2OwotICAgIHBTdGF0dXMtPkRhdGFCdXNXaWR0aCA9ICh1aW50OF90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDAgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzBdICYgMHgyMCkgPj4gNTsKLSAgICBwU3RhdHVzLT5TZWN1cmVkTW9kZSA9ICh1aW50OF90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDIgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzBdICYgMHgwMEZGMDAwMFUpID4+IDE2OwotICAgIHBTdGF0dXMtPkNhcmRUeXBlID0gKHVpbnQxNl90KSh0bXAgPDwgOCk7Ci0gICAgCi0gICAgLyogQnl0ZSAzICovCi0gICAgdG1wID0gKHNkX3N0YXR1c1swXSAmIDB4RkYwMDAwMDBVKSA+PiAyNDsKLSAgICBwU3RhdHVzLT5DYXJkVHlwZSB8PSAodWludDE2X3QpdG1wOwotICAgIAotICAgIC8qIEJ5dGUgNCAqLwotICAgIHRtcCA9IChzZF9zdGF0dXNbMV0gJiAweEZGKTsKLSAgICBwU3RhdHVzLT5Qcm90ZWN0ZWRBcmVhU2l6ZSA9ICh1aW50MzJfdCkodG1wIDw8IDI0KTsKLSAgICAKLSAgICAvKiBCeXRlIDUgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzFdICYgMHhGRjAwKSA+PiA4OwotICAgIHBTdGF0dXMtPlByb3RlY3RlZEFyZWFTaXplIHw9ICh1aW50MzJfdCkodG1wIDw8IDE2KTsKLSAgICAKLSAgICAvKiBCeXRlIDYgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzFdICYgMHhGRjAwMDApID4+IDE2OwotICAgIHBTdGF0dXMtPlByb3RlY3RlZEFyZWFTaXplIHw9ICh1aW50MzJfdCkodG1wIDw8IDgpOwotICAgIAotICAgIC8qIEJ5dGUgNyAqLwotICAgIHRtcCA9IChzZF9zdGF0dXNbMV0gJiAweEZGMDAwMDAwVSkgPj4gMjQ7Ci0gICAgcFN0YXR1cy0+UHJvdGVjdGVkQXJlYVNpemUgfD0gKHVpbnQzMl90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDggKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzJdICYgMHhGRik7Ci0gICAgcFN0YXR1cy0+U3BlZWRDbGFzcyA9ICh1aW50OF90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDkgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzJdICYgMHhGRjAwKSA+PiA4OwotICAgIHBTdGF0dXMtPlBlcmZvcm1hbmNlTW92ZSA9ICh1aW50OF90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDEwICovCi0gICAgdG1wID0gKHNkX3N0YXR1c1syXSAmIDB4RjAwMDAwKSA+PiAyMDsKLSAgICBwU3RhdHVzLT5BbGxvY2F0aW9uVW5pdFNpemUgPSAodWludDhfdCl0bXA7Ci0gICAgCi0gICAgLyogQnl0ZSAxMSAqLwotICAgIHRtcCA9IChzZF9zdGF0dXNbMl0gJiAweEZGMDAwMDAwVSkgPj4gMjQ7Ci0gICAgcFN0YXR1cy0+RXJhc2VTaXplID0gKHVpbnQxNl90KSh0bXAgPDwgOCk7Ci0gICAgCi0gICAgLyogQnl0ZSAxMiAqLwotICAgIHRtcCA9IChzZF9zdGF0dXNbM10gJiAweEZGKTsKLSAgICBwU3RhdHVzLT5FcmFzZVNpemUgfD0gKHVpbnQxNl90KXRtcDsKLSAgICAKLSAgICAvKiBCeXRlIDEzICovCi0gICAgdG1wID0gKHNkX3N0YXR1c1szXSAmIDB4RkMwMCkgPj4gMTA7Ci0gICAgcFN0YXR1cy0+RXJhc2VUaW1lb3V0ID0gKHVpbnQ4X3QpdG1wOwotICAgIAotICAgIC8qIEJ5dGUgMTMgKi8KLSAgICB0bXAgPSAoc2Rfc3RhdHVzWzNdICYgMHgwMzAwKSA+PiA4OwotICAgIHBTdGF0dXMtPkVyYXNlT2Zmc2V0ID0gKHVpbnQ4X3QpdG1wOworICAgIHBTdGF0dXMtPkRhdGFCdXNXaWR0aCA9ICh1aW50OF90KSgoc2Rfc3RhdHVzWzBdICYgMHhDMFUpID4+IDZVKTsKKworICAgIHBTdGF0dXMtPlNlY3VyZWRNb2RlID0gKHVpbnQ4X3QpKChzZF9zdGF0dXNbMF0gJiAweDIwVSkgPj4gNVUpOworCisgICAgcFN0YXR1cy0+Q2FyZFR5cGUgPSAodWludDE2X3QpKCgoc2Rfc3RhdHVzWzBdICYgMHgwMEZGMDAwMFUpID4+IDhVKSB8ICgoc2Rfc3RhdHVzWzBdICYgMHhGRjAwMDAwMFUpID4+IDI0VSkpOworCisgICAgcFN0YXR1cy0+UHJvdGVjdGVkQXJlYVNpemUgPSAoKChzZF9zdGF0dXNbMV0gJiAweEZGVSkgPDwgMjRVKSAgICB8ICgoc2Rfc3RhdHVzWzFdICYgMHhGRjAwVSkgPDwgOFUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNkX3N0YXR1c1sxXSAmIDB4RkYwMDAwVSkgPj4gOFUpIHwgKChzZF9zdGF0dXNbMV0gJiAweEZGMDAwMDAwVSkgPj4gMjRVKSk7CisKKyAgICBwU3RhdHVzLT5TcGVlZENsYXNzID0gKHVpbnQ4X3QpKHNkX3N0YXR1c1syXSAmIDB4RkZVKTsKKworICAgIHBTdGF0dXMtPlBlcmZvcm1hbmNlTW92ZSA9ICh1aW50OF90KSgoc2Rfc3RhdHVzWzJdICYgMHhGRjAwVSkgPj4gOFUpOworCisgICAgcFN0YXR1cy0+QWxsb2NhdGlvblVuaXRTaXplID0gKHVpbnQ4X3QpKChzZF9zdGF0dXNbMl0gJiAweEYwMDAwMFUpID4+IDIwVSk7CisKKyAgICBwU3RhdHVzLT5FcmFzZVNpemUgPSAodWludDE2X3QpKCgoc2Rfc3RhdHVzWzJdICYgMHhGRjAwMDAwMFUpID4+IDE2VSkgfCAoc2Rfc3RhdHVzWzNdICYgMHhGRlUpKTsKKworICAgIHBTdGF0dXMtPkVyYXNlVGltZW91dCA9ICh1aW50OF90KSgoc2Rfc3RhdHVzWzNdICYgMHhGQzAwVSkgPj4gMTBVKTsKKworICAgIHBTdGF0dXMtPkVyYXNlT2Zmc2V0ID0gKHVpbnQ4X3QpKChzZF9zdGF0dXNbM10gJiAweDAzMDBVKSA+PiA4VSk7CiAgIH0KLSAgCisKICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQGJyaWVmICBHZXRzIHRoZSBTRCBjYXJkIGluZm8uCi0gICogQHBhcmFtICBoc2QgUG9pbnRlciB0byBTRCBoYW5kbGUgICAgICAKLSAgKiBAcGFyYW0gIHBDYXJkSW5mbyBQb2ludGVyIHRvIHRoZSBIQUxfU0RfQ2FyZEluZm9UeXBlRGVmIHN0cnVjdHVyZSB0aGF0IAotICAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSBTRCBjYXJkIHN0YXR1cyBpbmZvcm1hdGlvbiAKKyAgKiBAcGFyYW0gIGhzZDogUG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBDYXJkSW5mbzogUG9pbnRlciB0byB0aGUgSEFMX1NEX0NhcmRJbmZvVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdAorICAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSBTRCBjYXJkIHN0YXR1cyBpbmZvcm1hdGlvbgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NEX0dldENhcmRJbmZvKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgSEFMX1NEX0NhcmRJbmZvVHlwZURlZiAqcENhcmRJbmZvKQpAQCAtMjIwNiwxNSArMjE5OCwxNSBAQAogICBwQ2FyZEluZm8tPkJsb2NrU2l6ZSAgICA9ICh1aW50MzJfdCkoaHNkLT5TZENhcmQuQmxvY2tTaXplKTsKICAgcENhcmRJbmZvLT5Mb2dCbG9ja05iciAgPSAodWludDMyX3QpKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrTmJyKTsKICAgcENhcmRJbmZvLT5Mb2dCbG9ja1NpemUgPSAodWludDMyX3QpKGhzZC0+U2RDYXJkLkxvZ0Jsb2NrU2l6ZSk7Ci0gIAorCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKIC8qKgotICAqIEBicmllZiAgRW5hYmxlcyB3aWRlIGJ1cyBvcGVyYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgY2FyZCBpZiBzdXBwb3J0ZWQgYnkgCisgICogQGJyaWVmICBFbmFibGVzIHdpZGUgYnVzIG9wZXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBjYXJkIGlmIHN1cHBvcnRlZCBieQogICAqICAgICAgICAgY2FyZC4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZSAgICAgICAKLSAgKiBAcGFyYW0gIFdpZGVNb2RlIFNwZWNpZmllcyB0aGUgU0QgY2FyZCB3aWRlIGJ1cyBtb2RlIAorICAqIEBwYXJhbSAgaHNkOiBQb2ludGVyIHRvIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgV2lkZU1vZGU6IFNwZWNpZmllcyB0aGUgU0QgY2FyZCB3aWRlIGJ1cyBtb2RlCiAgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfQlVTX1dJREVfOEI6IDgtYml0IGRhdGEgdHJhbnNmZXIKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfQlVTX1dJREVfNEI6IDQtYml0IGRhdGEgdHJhbnNmZXIKQEAgLTIyMjQsMTUgKzIyMTYsMTUgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9Db25maWdXaWRlQnVzT3BlcmF0aW9uKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDMyX3QgV2lkZU1vZGUpCiB7CiAgIFNETU1DX0luaXRUeXBlRGVmIEluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IGVycm9yc3RhdGU7CisKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1NETU1DX0JVU19XSURFKFdpZGVNb2RlKSk7Ci0gIAotICAvKiBDaG5hZ2UgU2F0dGUgKi8KKworICAvKiBDaGFuZ2UgU3RhdGUgKi8KICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9CVVNZOwotICAKLSAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TRUNVUkVEKSAKKworICBpZihoc2QtPlNkQ2FyZC5DYXJkVHlwZSAhPSBDQVJEX1NFQ1VSRUQpCiAgIHsKICAgICBpZihXaWRlTW9kZSA9PSBTRE1NQ19CVVNfV0lERV84QikKICAgICB7CkBAIC0yMjQxLDEzICsyMjMzLDEzIEBACiAgICAgZWxzZSBpZihXaWRlTW9kZSA9PSBTRE1NQ19CVVNfV0lERV80QikKICAgICB7CiAgICAgICBlcnJvcnN0YXRlID0gU0RfV2lkZUJ1c19FbmFibGUoaHNkKTsKLSAgICAgIAorCiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgIH0KICAgICBlbHNlIGlmKFdpZGVNb2RlID09IFNETU1DX0JVU19XSURFXzFCKQogICAgIHsKICAgICAgIGVycm9yc3RhdGUgPSBTRF9XaWRlQnVzX0Rpc2FibGUoaHNkKTsKLSAgICAgIAorCiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBlcnJvcnN0YXRlOwogICAgIH0KICAgICBlbHNlCkBAIC0yMjU1LDEzICsyMjQ3LDEzIEBACiAgICAgICAvKiBXaWRlTW9kZSBpcyBub3QgYSB2YWxpZCBhcmd1bWVudCovCiAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfUEFSQU07CiAgICAgfQotICB9ICAKKyAgfQogICBlbHNlCiAgIHsKICAgICAvKiBNTUMgQ2FyZCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSAqLwogICAgIGhzZC0+RXJyb3JDb2RlIHw9IEhBTF9TRF9FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFOwogICB9Ci0gIAorCiAgIGlmKGhzZC0+RXJyb3JDb2RlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KQEAgLTIyNzgsNzMgKzIyNzAsODkgQEAKICAgICBJbml0LkJ1c1dpZGUgICAgICAgICAgICAgPSBXaWRlTW9kZTsKICAgICBJbml0LkhhcmR3YXJlRmxvd0NvbnRyb2wgPSBoc2QtPkluaXQuSGFyZHdhcmVGbG93Q29udHJvbDsKICAgICBJbml0LkNsb2NrRGl2ICAgICAgICAgICAgPSBoc2QtPkluaXQuQ2xvY2tEaXY7Ci0gICAgU0RNTUNfSW5pdChoc2QtPkluc3RhbmNlLCBJbml0KTsKKyAgICAodm9pZClTRE1NQ19Jbml0KGhzZC0+SW5zdGFuY2UsIEluaXQpOwogICB9CiAKICAgLyogQ2hhbmdlIFN0YXRlICovCiAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0gIAorCiAgIHJldHVybiBIQUxfT0s7CiB9CiAKLQogLyoqCiAgICogQGJyaWVmICBHZXRzIHRoZSBjdXJyZW50IHNkIGNhcmQgZGF0YSBzdGF0ZS4KLSAgKiBAcGFyYW0gIGhzZCBwb2ludGVyIHRvIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgaHNkOiBwb2ludGVyIHRvIFNEIGhhbmRsZQogICAqIEByZXR2YWwgQ2FyZCBzdGF0ZQogICAqLwogSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYgSEFMX1NEX0dldENhcmRTdGF0ZShTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7Ci0gIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmIGNhcmRzdGF0ZSA9ICBIQUxfU0RfQ0FSRF9UUkFOU0ZFUjsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOworICB1aW50MzJfdCBjYXJkc3RhdGU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIHVpbnQzMl90IHJlc3AxID0gMDsKLSAgCisKICAgZXJyb3JzdGF0ZSA9IFNEX1NlbmRTdGF0dXMoaHNkLCAmcmVzcDEpOwotICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgewogICAgIGhzZC0+RXJyb3JDb2RlIHw9IGVycm9yc3RhdGU7CiAgIH0KIAotICBjYXJkc3RhdGUgPSAoSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYpKChyZXNwMSA+PiA5KSAmIDB4MEYpOwotICAKLSAgcmV0dXJuIGNhcmRzdGF0ZTsKKyAgY2FyZHN0YXRlID0gKChyZXNwMSA+PiA5VSkgJiAweDBGVSk7CisKKyAgcmV0dXJuIChIQUxfU0RfQ2FyZFN0YXRlVHlwZURlZiljYXJkc3RhdGU7CiB9CiAKIC8qKgogICAqIEBicmllZiAgQWJvcnQgdGhlIGN1cnJlbnQgdHJhbnNmZXIgYW5kIGRpc2FibGUgdGhlIFNELgotICAqIEBwYXJhbSAgaHNkIHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogQHBhcmFtICBoc2Q6IHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNEIG1vZHVsZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9BYm9ydChTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7CiAgIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmIENhcmRTdGF0ZTsKLSAgCisgIHVpbnQzMl90IGNvbnRleHQgPSBoc2QtPkNvbnRleHQ7CisKICAgLyogRElzYWJsZSBBbGwgaW50ZXJydXB0cyAqLwogICBfX0hBTF9TRF9ESVNBQkxFX0lUKGhzZCwgU0RNTUNfSVRfREFUQUVORCB8IFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVR8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RNTUNfSVRfVFhVTkRFUlJ8IFNETU1DX0lUX1JYT1ZFUlIpOwotICAKKwogICAvKiBDbGVhciBBbGwgZmxhZ3MgKi8KLSAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19GTEFHUyk7Ci0gIAotICBpZigoaHNkLT5oZG1hdHggIT0gTlVMTCkgfHwgKGhzZC0+aGRtYXJ4ICE9IE5VTEwpKQorICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCisgIENMRUFSX0JJVChoc2QtPkluc3RhbmNlLT5EQ1RSTCwgU0RNTUNfRENUUkxfRFRFTik7CisKKyAgaWYgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9ETUEpICE9IDBVKQogICB7CiAgICAgLyogRGlzYWJsZSB0aGUgU0QgRE1BIHJlcXVlc3QgKi8KICAgICBoc2QtPkluc3RhbmNlLT5EQ1RSTCAmPSAodWludDMyX3QpfigodWludDMyX3QpU0RNTUNfRENUUkxfRE1BRU4pOwotICAgIAotICAgIC8qIEFib3J0IHRoZSBTRCBETUEgVHggU3RyZWFtICovCi0gICAgaWYoaHNkLT5oZG1hdHggIT0gTlVMTCkKKworICAgIC8qIEFib3J0IHRoZSBTRCBETUEgVHggY2hhbm5lbCAqLworICAgIGlmICgoKGNvbnRleHQgJiBTRF9DT05URVhUX1dSSVRFX1NJTkdMRV9CTE9DSykgIT0gMFUpIHx8ICgoY29udGV4dCAmIFNEX0NPTlRFWFRfV1JJVEVfTVVMVElQTEVfQkxPQ0spICE9IDBVKSkKICAgICB7Ci0gICAgICBIQUxfRE1BX0Fib3J0KGhzZC0+aGRtYXR4KTsKKyAgICAgIGlmKEhBTF9ETUFfQWJvcnQoaHNkLT5oZG1hdHgpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RNQTsKKyAgICAgIH0KICAgICB9Ci0gICAgLyogQWJvcnQgdGhlIFNEIERNQSBSeCBTdHJlYW0gKi8KLSAgICBpZihoc2QtPmhkbWFyeCAhPSBOVUxMKQorICAgIC8qIEFib3J0IHRoZSBTRCBETUEgUnggY2hhbm5lbCAqLworICAgIGVsc2UgaWYgKCgoY29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9TSU5HTEVfQkxPQ0spICE9IDBVKSB8fCAoKGNvbnRleHQgJiBTRF9DT05URVhUX1JFQURfTVVMVElQTEVfQkxPQ0spICE9IDBVKSkKICAgICB7Ci0gICAgICBIQUxfRE1BX0Fib3J0KGhzZC0+aGRtYXJ4KTsKKyAgICAgIGlmKEhBTF9ETUFfQWJvcnQoaHNkLT5oZG1hcngpICE9IEhBTF9PSykKKyAgICAgIHsKKyAgICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RNQTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9CiAgIH0KLSAgCisKICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKworICAvKiBJbml0aWFsaXplIHRoZSBTRCBvcGVyYXRpb24gKi8KKyAgaHNkLT5Db250ZXh0ID0gU0RfQ09OVEVYVF9OT05FOworCiAgIENhcmRTdGF0ZSA9IEhBTF9TRF9HZXRDYXJkU3RhdGUoaHNkKTsKICAgaWYoKENhcmRTdGF0ZSA9PSBIQUxfU0RfQ0FSRF9SRUNFSVZJTkcpIHx8IChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfU0VORElORykpCiAgIHsKQEAgLTIzNTksNTEgKzIzNjcsNTggQEAKIAogLyoqCiAgICogQGJyaWVmICBBYm9ydCB0aGUgY3VycmVudCB0cmFuc2ZlciBhbmQgZGlzYWJsZSB0aGUgU0QgKElUIG1vZGUpLgotICAqIEBwYXJhbSAgaHNkIHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogQHBhcmFtICBoc2Q6IHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNEIG1vZHVsZS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TRF9BYm9ydF9JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7CiAgIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmIENhcmRTdGF0ZTsKLSAgICAKLSAgLyogRElzYWJsZSBBbGwgaW50ZXJydXB0cyAqLworICB1aW50MzJfdCBjb250ZXh0ID0gaHNkLT5Db250ZXh0OworCisgIC8qIERpc2FibGUgQWxsIGludGVycnVwdHMgKi8KICAgX19IQUxfU0RfRElTQUJMRV9JVChoc2QsIFNETU1DX0lUX0RBVEFFTkQgfCBTRE1NQ19JVF9EQ1JDRkFJTCB8IFNETU1DX0lUX0RUSU1FT1VUfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETU1DX0lUX1RYVU5ERVJSfCBTRE1NQ19JVF9SWE9WRVJSKTsKLSAgCi0gIC8qIENsZWFyIEFsbCBmbGFncyAqLwotICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgCi0gIGlmKChoc2QtPmhkbWF0eCAhPSBOVUxMKSB8fCAoaHNkLT5oZG1hcnggIT0gTlVMTCkpCisKKyAgQ0xFQVJfQklUKGhzZC0+SW5zdGFuY2UtPkRDVFJMLCBTRE1NQ19EQ1RSTF9EVEVOKTsKKworICBpZiAoKGNvbnRleHQgJiBTRF9DT05URVhUX0RNQSkgIT0gMFUpCiAgIHsKICAgICAvKiBEaXNhYmxlIHRoZSBTRCBETUEgcmVxdWVzdCAqLwogICAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClTRE1NQ19EQ1RSTF9ETUFFTik7Ci0gICAgCi0gICAgLyogQWJvcnQgdGhlIFNEIERNQSBUeCBTdHJlYW0gKi8KLSAgICBpZihoc2QtPmhkbWF0eCAhPSBOVUxMKQorCisgICAgLyogQWJvcnQgdGhlIFNEIERNQSBUeCBjaGFubmVsICovCisgICAgaWYgKCgoY29udGV4dCAmIFNEX0NPTlRFWFRfV1JJVEVfU0lOR0xFX0JMT0NLKSAhPSAwVSkgfHwgKChjb250ZXh0ICYgU0RfQ09OVEVYVF9XUklURV9NVUxUSVBMRV9CTE9DSykgIT0gMFUpKQogICAgIHsKLSAgICAgIGhzZC0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9ICBTRF9ETUFUeEFib3J0OworICAgICAgaHNkLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU0RfRE1BVHhBYm9ydDsKICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHNkLT5oZG1hdHgpICE9IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgaHNkLT5oZG1hdHggPSBOVUxMOwogICAgICAgfQogICAgIH0KLSAgICAvKiBBYm9ydCB0aGUgU0QgRE1BIFJ4IFN0cmVhbSAqLwotICAgIGlmKGhzZC0+aGRtYXJ4ICE9IE5VTEwpCisgICAgLyogQWJvcnQgdGhlIFNEIERNQSBSeCBjaGFubmVsICovCisgICAgZWxzZSBpZiAoKChjb250ZXh0ICYgU0RfQ09OVEVYVF9SRUFEX1NJTkdMRV9CTE9DSykgIT0gMFUpIHx8ICgoY29udGV4dCAmIFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSykgIT0gMFUpKQogICAgIHsKLSAgICAgIGhzZC0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayA9ICBTRF9ETUFSeEFib3J0OworICAgICAgaHNkLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU0RfRE1BUnhBYm9ydDsKICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHNkLT5oZG1hcngpICE9IEhBTF9PSykKICAgICAgIHsKICAgICAgICAgaHNkLT5oZG1hcnggPSBOVUxMOwogICAgICAgfQogICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0KICAgfQotICAKICAgLyogTm8gdHJhbnNmZXIgb25nb2luZyBvbiBib3RoIERNQSBjaGFubmVscyovCi0gIGlmKChoc2QtPmhkbWF0eCA9PSBOVUxMKSAmJiAoaHNkLT5oZG1hcnggPT0gTlVMTCkpCisgIGVsc2UKICAgeworICAgIC8qIENsZWFyIEFsbCBmbGFncyAqLworICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfREFUQV9GTEFHUyk7CisKICAgICBDYXJkU3RhdGUgPSBIQUxfU0RfR2V0Q2FyZFN0YXRlKGhzZCk7CiAgICAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAgICAgaWYoKENhcmRTdGF0ZSA9PSBIQUxfU0RfQ0FSRF9SRUNFSVZJTkcpIHx8IChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfU0VORElORykpCiAgICAgewogICAgICAgaHNkLT5FcnJvckNvZGUgPSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaHNkLT5JbnN0YW5jZSk7CkBAIC0yNDE0LDUzICsyNDI5LDUzIEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0jaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCisjaWYgZGVmaW5lZCAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MpICYmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxVSkKICAgICAgIGhzZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNkKTsKICNlbHNlCiAgICAgICBIQUxfU0RfQWJvcnRDYWxsYmFjayhoc2QpOwotI2VuZGlmCisjZW5kaWYgLyogVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICB9CiAgIH0KLSAgCisKICAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQH0KICAgKi8KLSAgCisKIC8qKgogICAqIEB9CiAgICovCi0gIAotLyogUHJpdmF0ZSBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIAorCisvKiBQcml2YXRlIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIFNEX1ByaXZhdGVfRnVuY3Rpb25zCiAgICogQHsKICAgKi8KIAogLyoqCi0gICogQGJyaWVmICBETUEgU0QgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjayAKLSAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEBicmllZiAgRE1BIFNEIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyB2b2lkIFNEX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgICAgIAorc3RhdGljIHZvaWQgU0RfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewogICBTRF9IYW5kbGVUeXBlRGVmKiBoc2QgPSAoU0RfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOwotICAKKwogICAvKiBFbmFibGUgREFUQUVORCBJbnRlcnJ1cHQgKi8KICAgX19IQUxfU0RfRU5BQkxFX0lUKGhzZCwgKFNETU1DX0lUX0RBVEFFTkQpKTsKIH0KIAogLyoqCi0gICogQGJyaWVmICBETUEgU0QgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrIAotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQGJyaWVmICBETUEgU0QgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgdm9pZCBTRF9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkgIAorc3RhdGljIHZvaWQgU0RfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCiB7CiAgIFNEX0hhbmRsZVR5cGVEZWYqIGhzZCA9IChTRF9IYW5kbGVUeXBlRGVmKiApKGhkbWEtPlBhcmVudCk7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IGVycm9yc3RhdGU7CisKICAgLyogU2VuZCBzdG9wIGNvbW1hbmQgaW4gbXVsdGlibG9jayB3cml0ZSAqLwogICBpZihoc2QtPkNvbnRleHQgPT0gKFNEX0NPTlRFWFRfUkVBRF9NVUxUSVBMRV9CTE9DSyB8IFNEX0NPTlRFWFRfRE1BKSkKICAgewpAQCAtMjQ3NSwxNSArMjQ5MCwxNiBAQAogI2VuZGlmCiAgICAgfQogICB9Ci0gIAorCiAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBETUFFTiBiaXQKICAgaW4gdGhlIFNEIERDVFJMIHJlZ2lzdGVyICovCiAgIGhzZC0+SW5zdGFuY2UtPkRDVFJMICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClTRE1NQ19EQ1RSTF9ETUFFTik7Ci0gIAorCiAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAKKyAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKKwogICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOworICBoc2QtPkNvbnRleHQgPSBTRF9DT05URVhUX05PTkU7CiAKICNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgaHNkLT5SeENwbHRDYWxsYmFjayhoc2QpOwpAQCAtMjQ5MywzNSArMjUwOSwzOSBAQAogfQogCiAvKioKLSogQGJyaWVmICBETUEgU0QgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjayAKLSogQHBhcmFtICBoZG1hIERNQSBoYW5kbGUKLSogQHJldHZhbCBOb25lCi0qLwotc3RhdGljIHZvaWQgU0RfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCisgICogQGJyaWVmICBETUEgU0QgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjaworICAqIEBwYXJhbSAgaGRtYTogRE1BIGhhbmRsZQorICAqIEByZXR2YWwgTm9uZQorICAqLworc3RhdGljIHZvaWQgU0RfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCiB7CiAgIFNEX0hhbmRsZVR5cGVEZWYqIGhzZCA9IChTRF9IYW5kbGVUeXBlRGVmKiApKGhkbWEtPlBhcmVudCk7CiAgIEhBTF9TRF9DYXJkU3RhdGVUeXBlRGVmIENhcmRTdGF0ZTsKLSAgCisgIHVpbnQzMl90IFJ4RXJyb3JDb2RlLCBUeEVycm9yQ29kZTsKKwogICAvKiBpZiBETUEgZXJyb3IgaXMgRklGTyBlcnJvciBpZ25vcmUgaXQgKi8KICAgaWYoSEFMX0RNQV9HZXRFcnJvcihoZG1hKSAhPSBIQUxfRE1BX0VSUk9SX0ZFKQogICB7Ci0gICAgaWYoKGhzZC0+aGRtYXJ4LT5FcnJvckNvZGUgPT0gSEFMX0RNQV9FUlJPUl9URSkgfHwgKGhzZC0+aGRtYXR4LT5FcnJvckNvZGUgPT0gSEFMX0RNQV9FUlJPUl9URSkpCisgICAgUnhFcnJvckNvZGUgPSBoc2QtPmhkbWFyeC0+RXJyb3JDb2RlOworICAgIFR4RXJyb3JDb2RlID0gaHNkLT5oZG1hdHgtPkVycm9yQ29kZTsgIAorICAgIGlmKChSeEVycm9yQ29kZSA9PSBIQUxfRE1BX0VSUk9SX1RFKSB8fCAoVHhFcnJvckNvZGUgPT0gSEFMX0RNQV9FUlJPUl9URSkpCiAgICAgewogICAgICAgLyogQ2xlYXIgQWxsIGZsYWdzICovCiAgICAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgICAgIAorCiAgICAgICAvKiBEaXNhYmxlIEFsbCBpbnRlcnJ1cHRzICovCiAgICAgICBfX0hBTF9TRF9ESVNBQkxFX0lUKGhzZCwgU0RNTUNfSVRfREFUQUVORCB8IFNETU1DX0lUX0RDUkNGQUlMIHwgU0RNTUNfSVRfRFRJTUVPVVR8XAogICAgICAgICBTRE1NQ19JVF9UWFVOREVSUnwgU0RNTUNfSVRfUlhPVkVSUik7Ci0gICAgICAKKwogICAgICAgaHNkLT5FcnJvckNvZGUgfD0gSEFMX1NEX0VSUk9SX0RNQTsKICAgICAgIENhcmRTdGF0ZSA9IEhBTF9TRF9HZXRDYXJkU3RhdGUoaHNkKTsKICAgICAgIGlmKChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfUkVDRUlWSU5HKSB8fCAoQ2FyZFN0YXRlID09IEhBTF9TRF9DQVJEX1NFTkRJTkcpKQogICAgICAgewogICAgICAgICBoc2QtPkVycm9yQ29kZSB8PSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaHNkLT5JbnN0YW5jZSk7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaHNkLT5TdGF0ZT0gSEFMX1NEX1NUQVRFX1JFQURZOworICAgICAgaHNkLT5Db250ZXh0ID0gU0RfQ09OVEVYVF9OT05FOwogICAgIH0KIAogI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQpAQCAtMjUzMywxMTUgKzI1NTMsMTAyIEBACiB9CiAKIC8qKgotICAqIEBicmllZiAgRE1BIFNEIFR4IEFib3J0IGNhbGxiYWNrIAotICAqIEBwYXJhbSAgaGRtYSBETUEgaGFuZGxlCisgICogQGJyaWVmICBETUEgU0QgVHggQWJvcnQgY2FsbGJhY2sKKyAgKiBAcGFyYW0gIGhkbWE6IERNQSBoYW5kbGUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXN0YXRpYyB2b2lkIFNEX0RNQVR4QWJvcnQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpICAgCitzdGF0aWMgdm9pZCBTRF9ETUFUeEFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQogewogICBTRF9IYW5kbGVUeXBlRGVmKiBoc2QgPSAoU0RfSGFuZGxlVHlwZURlZiogKShoZG1hLT5QYXJlbnQpOwogICBIQUxfU0RfQ2FyZFN0YXRlVHlwZURlZiBDYXJkU3RhdGU7Ci0gIAotICBpZihoc2QtPmhkbWF0eCAhPSBOVUxMKQorCisgIC8qIENsZWFyIEFsbCBmbGFncyAqLworICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCisgIENhcmRTdGF0ZSA9IEhBTF9TRF9HZXRDYXJkU3RhdGUoaHNkKTsKKyAgaHNkLT5TdGF0ZSA9IEhBTF9TRF9TVEFURV9SRUFEWTsKKyAgaHNkLT5Db250ZXh0ID0gU0RfQ09OVEVYVF9OT05FOworICBpZigoQ2FyZFN0YXRlID09IEhBTF9TRF9DQVJEX1JFQ0VJVklORykgfHwgKENhcmRTdGF0ZSA9PSBIQUxfU0RfQ0FSRF9TRU5ESU5HKSkKICAgewotICAgIGhzZC0+aGRtYXR4ID0gTlVMTDsKKyAgICBoc2QtPkVycm9yQ29kZSB8PSBTRE1NQ19DbWRTdG9wVHJhbnNmZXIoaHNkLT5JbnN0YW5jZSk7CiAgIH0KLSAgCi0gIC8qIEFsbCBETUEgY2hhbm5lbHMgYXJlIGFib3J0ZWQgKi8KLSAgaWYoaHNkLT5oZG1hcnggPT0gTlVMTCkKKworICBpZihoc2QtPkVycm9yQ29kZSA9PSBIQUxfU0RfRVJST1JfTk9ORSkKICAgewotICAgIENhcmRTdGF0ZSA9IEhBTF9TRF9HZXRDYXJkU3RhdGUoaHNkKTsKLSAgICBoc2QtPkVycm9yQ29kZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7Ci0gICAgaWYoKENhcmRTdGF0ZSA9PSBIQUxfU0RfQ0FSRF9SRUNFSVZJTkcpIHx8IChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfU0VORElORykpCi0gICAgewotICAgICAgaHNkLT5FcnJvckNvZGUgfD0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhzZC0+SW5zdGFuY2UpOwotICAgICAgCi0gICAgICBpZihoc2QtPkVycm9yQ29kZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICAgIHsKICNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgICAgaHNkLT5BYm9ydENwbHRDYWxsYmFjayhoc2QpOworICAgIGhzZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNkKTsKICNlbHNlCi0gICAgICAgIEhBTF9TRF9BYm9ydENhbGxiYWNrKGhzZCk7CisgICAgSEFMX1NEX0Fib3J0Q2FsbGJhY2soaHNkKTsKICNlbmRpZgotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeworICB9CisgIGVsc2UKKyAgewogI2lmIChVU0VfSEFMX1NEX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQotICAgICAgICBoc2QtPkVycm9yQ2FsbGJhY2soaHNkKTsKKyAgICBoc2QtPkVycm9yQ2FsbGJhY2soaHNkKTsKICNlbHNlCi0gICAgICAgIEhBTF9TRF9FcnJvckNhbGxiYWNrKGhzZCk7CisgICAgSEFMX1NEX0Vycm9yQ2FsbGJhY2soaHNkKTsKICNlbmRpZgotICAgICAgfQotICAgIH0KICAgfQogfQogCiAvKioKLSAgKiBAYnJpZWYgIERNQSBTRCBSeCBBYm9ydCBjYWxsYmFjayAKLSAgKiBAcGFyYW0gIGhkbWEgRE1BIGhhbmRsZQorICAqIEBicmllZiAgRE1BIFNEIFJ4IEFib3J0IGNhbGxiYWNrCisgICogQHBhcmFtICBoZG1hOiBETUEgaGFuZGxlCiAgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgdm9pZCBTRF9ETUFSeEFib3J0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKSAgIAorc3RhdGljIHZvaWQgU0RfRE1BUnhBYm9ydChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKIHsKICAgU0RfSGFuZGxlVHlwZURlZiogaHNkID0gKFNEX0hhbmRsZVR5cGVEZWYqICkoaGRtYS0+UGFyZW50KTsKICAgSEFMX1NEX0NhcmRTdGF0ZVR5cGVEZWYgQ2FyZFN0YXRlOwotICAKLSAgaWYoaHNkLT5oZG1hcnggIT0gTlVMTCkKKworICAvKiBDbGVhciBBbGwgZmxhZ3MgKi8KKyAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX1NUQVRJQ19EQVRBX0ZMQUdTKTsKKworICBDYXJkU3RhdGUgPSBIQUxfU0RfR2V0Q2FyZFN0YXRlKGhzZCk7CisgIGhzZC0+U3RhdGUgPSBIQUxfU0RfU1RBVEVfUkVBRFk7CisgIGhzZC0+Q29udGV4dCA9IFNEX0NPTlRFWFRfTk9ORTsKKyAgaWYoKENhcmRTdGF0ZSA9PSBIQUxfU0RfQ0FSRF9SRUNFSVZJTkcpIHx8IChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfU0VORElORykpCiAgIHsKLSAgICBoc2QtPmhkbWFyeCA9IE5VTEw7CisgICAgaHNkLT5FcnJvckNvZGUgfD0gU0RNTUNfQ21kU3RvcFRyYW5zZmVyKGhzZC0+SW5zdGFuY2UpOwogICB9Ci0gIAotICAvKiBBbGwgRE1BIGNoYW5uZWxzIGFyZSBhYm9ydGVkICovCi0gIGlmKGhzZC0+aGRtYXR4ID09IE5VTEwpCisKKyAgaWYoaHNkLT5FcnJvckNvZGUgPT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgIHsKLSAgICBDYXJkU3RhdGUgPSBIQUxfU0RfR2V0Q2FyZFN0YXRlKGhzZCk7Ci0gICAgaHNkLT5FcnJvckNvZGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKLSAgICBoc2QtPlN0YXRlID0gSEFMX1NEX1NUQVRFX1JFQURZOwotICAgIGlmKChDYXJkU3RhdGUgPT0gSEFMX1NEX0NBUkRfUkVDRUlWSU5HKSB8fCAoQ2FyZFN0YXRlID09IEhBTF9TRF9DQVJEX1NFTkRJTkcpKQotICAgIHsKLSAgICAgIGhzZC0+RXJyb3JDb2RlIHw9IFNETU1DX0NtZFN0b3BUcmFuc2Zlcihoc2QtPkluc3RhbmNlKTsKLSAgICAgIAotICAgICAgaWYoaHNkLT5FcnJvckNvZGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCi0gICAgICB7CiAjaWYgKFVTRV9IQUxfU0RfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCi0gICAgICAgIGhzZC0+QWJvcnRDcGx0Q2FsbGJhY2soaHNkKTsKKyAgICBoc2QtPkFib3J0Q3BsdENhbGxiYWNrKGhzZCk7CiAjZWxzZQotICAgICAgICBIQUxfU0RfQWJvcnRDYWxsYmFjayhoc2QpOworICAgIEhBTF9TRF9BYm9ydENhbGxiYWNrKGhzZCk7CiAjZW5kaWYKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKKyAgfQorICBlbHNlCisgIHsKICNpZiAoVVNFX0hBTF9TRF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLSAgICAgICAgaHNkLT5FcnJvckNhbGxiYWNrKGhzZCk7CisgICAgaHNkLT5FcnJvckNhbGxiYWNrKGhzZCk7CiAjZWxzZQotICAgICAgICBIQUxfU0RfRXJyb3JDYWxsYmFjayhoc2QpOworICAgIEhBTF9TRF9FcnJvckNhbGxiYWNrKGhzZCk7CiAjZW5kaWYKLSAgICAgIH0KLSAgICB9CiAgIH0KIH0KIAotCiAvKioKICAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBzZCBjYXJkLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCiAgICogQHJldHZhbCBTRCBDYXJkIGVycm9yIHN0YXRlCiAgICovCiBzdGF0aWMgdWludDMyX3QgU0RfSW5pdENhcmQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewogICBIQUxfU0RfQ2FyZENTRFR5cGVEZWYgQ1NEOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7Ci0gIHVpbnQxNl90IHNkX3JjYSA9IDE7Ci0gIAorICB1aW50MzJfdCBlcnJvcnN0YXRlOworICB1aW50MTZfdCBzZF9yY2EgPSAxVTsKKwogICAvKiBDaGVjayB0aGUgcG93ZXIgU3RhdGUgKi8KLSAgaWYoU0RNTUNfR2V0UG93ZXJTdGF0ZShoc2QtPkluc3RhbmNlKSA9PSAwKSAKKyAgaWYoU0RNTUNfR2V0UG93ZXJTdGF0ZShoc2QtPkluc3RhbmNlKSA9PSAwVSkKICAgewogICAgIC8qIFBvd2VyIG9mZiAqLwogICAgIHJldHVybiBIQUxfU0RfRVJST1JfUkVRVUVTVF9OT1RfQVBQTElDQUJMRTsKICAgfQotICAKLSAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TRUNVUkVEKSAKKworICBpZihoc2QtPlNkQ2FyZC5DYXJkVHlwZSAhPSBDQVJEX1NFQ1VSRUQpCiAgIHsKICAgICAvKiBTZW5kIENNRDIgQUxMX1NFTkRfQ0lEICovCiAgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRDSUQoaHNkLT5JbnN0YW5jZSk7CkBAIC0yNjUyLDE0ICsyNjU5LDE0IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgIC8qIEdldCBDYXJkIGlkZW50aWZpY2F0aW9uIG51bWJlciBkYXRhICovCi0gICAgICBoc2QtPkNJRFswXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKTsKLSAgICAgIGhzZC0+Q0lEWzFdID0gU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDIpOwotICAgICAgaHNkLT5DSURbMl0gPSBTRE1NQ19HZXRSZXNwb25zZShoc2QtPkluc3RhbmNlLCBTRE1NQ19SRVNQMyk7Ci0gICAgICBoc2QtPkNJRFszXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1A0KTsKKyAgICAgIGhzZC0+Q0lEWzBVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKTsKKyAgICAgIGhzZC0+Q0lEWzFVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AyKTsKKyAgICAgIGhzZC0+Q0lEWzJVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AzKTsKKyAgICAgIGhzZC0+Q0lEWzNVXSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1A0KTsKICAgICB9CiAgIH0KLSAgCi0gIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0VDVVJFRCkgCisKKyAgaWYoaHNkLT5TZENhcmQuQ2FyZFR5cGUgIT0gQ0FSRF9TRUNVUkVEKQogICB7CiAgICAgLyogU2VuZCBDTUQzIFNFVF9SRUxfQUREUiB3aXRoIGFyZ3VtZW50IDAgKi8KICAgICAvKiBTRCBDYXJkIHB1Ymxpc2hlcyBpdHMgUkNBLiAqLwpAQCAtMjY2OSwxMSArMjY3NiwxMSBAQAogICAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgICAgfQogICB9Ci0gIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0VDVVJFRCkgCisgIGlmKGhzZC0+U2RDYXJkLkNhcmRUeXBlICE9IENBUkRfU0VDVVJFRCkKICAgewogICAgIC8qIEdldCB0aGUgU0QgY2FyZCBSQ0EgKi8KICAgICBoc2QtPlNkQ2FyZC5SZWxDYXJkQWRkID0gc2RfcmNhOwotICAgIAorCiAgICAgLyogU2VuZCBDTUQ5IFNFTkRfQ1NEIHdpdGggYXJndW1lbnQgYXMgY2FyZCdzIFJDQSAqLwogICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTZW5kQ1NEKGhzZC0+SW5zdGFuY2UsICh1aW50MzJfdCkoaHNkLT5TZENhcmQuUmVsQ2FyZEFkZCA8PCAxNlUpKTsKICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQpAQCAtMjY4OSwyMiArMjY5NiwyNSBAQAogICAgICAgaHNkLT5DU0RbM1VdID0gU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDQpOwogICAgIH0KICAgfQotICAKKwogICAvKiBHZXQgdGhlIENhcmQgQ2xhc3MgKi8KLSAgaHNkLT5TZENhcmQuQ2xhc3MgPSAoU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDIpID4+IDIwKTsKLSAgCisgIGhzZC0+U2RDYXJkLkNsYXNzID0gKFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AyKSA+PiAyMFUpOworCiAgIC8qIEdldCBDU0QgcGFyYW1ldGVycyAqLwotICBIQUxfU0RfR2V0Q2FyZENTRChoc2QsICZDU0QpOworICBpZiAoSEFMX1NEX0dldENhcmRDU0QoaHNkLCAmQ1NEKSAhPSBIQUxfT0spCisgIHsKKyAgICByZXR1cm4gSEFMX1NEX0VSUk9SX1VOU1VQUE9SVEVEX0ZFQVRVUkU7CisgIH0KIAogICAvKiBTZWxlY3QgdGhlIENhcmQgKi8KLSAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbERlc2VsKGhzZC0+SW5zdGFuY2UsICh1aW50MzJfdCkoKCh1aW50MzJfdCloc2QtPlNkQ2FyZC5SZWxDYXJkQWRkKSA8PCAxNikpOworICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kU2VsRGVzZWwoaHNkLT5JbnN0YW5jZSwgKHVpbnQzMl90KSgoKHVpbnQzMl90KWhzZC0+U2RDYXJkLlJlbENhcmRBZGQpIDw8IDE2VSkpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KIAotICAvKiBDb25maWd1cmUgU0RNTUMgcGVyaXBoZXJhbCBpbnRlcmZhY2UgKi8gICAgIAotICBTRE1NQ19Jbml0KGhzZC0+SW5zdGFuY2UsIGhzZC0+SW5pdCk7CisgIC8qIENvbmZpZ3VyZSBTRE1NQyBwZXJpcGhlcmFsIGludGVyZmFjZSAqLworICAodm9pZClTRE1NQ19Jbml0KGhzZC0+SW5zdGFuY2UsIGhzZC0+SW5pdCk7CiAKICAgLyogQWxsIGNhcmRzIGFyZSBpbml0aWFsaXplZCAqLwogICByZXR1cm4gSEFMX1NEX0VSUk9SX05PTkU7CkBAIC0yNzE0LDE2MyArMjcyNCwxNTEgQEAKICAgKiBAYnJpZWYgIEVucXVpcmVzIGNhcmRzIGFib3V0IHRoZWlyIG9wZXJhdGluZyB2b2x0YWdlIGFuZCBjb25maWd1cmVzIGNsb2NrCiAgICogICAgICAgICBjb250cm9scyBhbmQgc3RvcmVzIFNEIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSBuZWVkZWQgaW4gZnV0dXJlCiAgICogICAgICAgICBpbiB0aGUgU0QgaGFuZGxlLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCiAgICogQHJldHZhbCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IFNEX1Bvd2VyT04oU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewotICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgdWludDMyX3QgcmVzcG9uc2UgPSAwLCB2YWxpZHZvbHRhZ2UgPSAwOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7Ci0gIAorICBfX0lPIHVpbnQzMl90IGNvdW50ID0gMFU7CisgIHVpbnQzMl90IHJlc3BvbnNlID0gMFUsIHZhbGlkdm9sdGFnZSA9IDBVOworICB1aW50MzJfdCBlcnJvcnN0YXRlOworCiAgIC8qIENNRDA6IEdPX0lETEVfU1RBVEUgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEdvSWRsZVN0YXRlKGhzZC0+SW5zdGFuY2UpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KLSAgCisKICAgLyogQ01EODogU0VORF9JRl9DT05EOiBDb21tYW5kIGF2YWlsYWJsZSBvbmx5IG9uIFYyLjAgY2FyZHMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZE9wZXJDb25kKGhzZC0+SW5zdGFuY2UpOwogICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgaHNkLT5TZENhcmQuQ2FyZFZlcnNpb24gPSBDQVJEX1YxX1g7Ci0gICAgICAKLSAgICAvKiBTZW5kIEFDTUQ0MSBTRF9BUFBfT1BfQ09ORCB3aXRoIEFyZ3VtZW50IDB4ODAxMDAwMDAgKi8KLSAgICB3aGlsZSh2YWxpZHZvbHRhZ2UgPT0gMCkKKyAgICAvKiBDTUQwOiBHT19JRExFX1NUQVRFICovCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEdvSWRsZVN0YXRlKGhzZC0+SW5zdGFuY2UpOworICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewotICAgICAgaWYoY291bnQrKyA9PSBTRE1NQ19NQVhfVk9MVF9UUklBTCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9JTlZBTElEX1ZPTFRSQU5HRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogU0VORCBDTUQ1NSBBUFBfQ01EIHdpdGggUkNBIGFzIDAgKi8KLSAgICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRBcHBDb21tYW5kKGhzZC0+SW5zdGFuY2UsIDApOwotICAgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9VTlNVUFBPUlRFRF9GRUFUVVJFOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBTZW5kIENNRDQxICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwT3BlckNvbW1hbmQoaHNkLT5JbnN0YW5jZSwgU0RNTUNfU1REX0NBUEFDSVRZKTsKLSAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIQUxfU0RfRVJST1JfVU5TVVBQT1JURURfRkVBVFVSRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogR2V0IGNvbW1hbmQgcmVzcG9uc2UgKi8KLSAgICAgIHJlc3BvbnNlID0gU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOwotICAgICAgCi0gICAgICAvKiBHZXQgb3BlcmF0aW5nIHZvbHRhZ2UqLwotICAgICAgdmFsaWR2b2x0YWdlID0gKCgocmVzcG9uc2UgPj4gMzEpID09IDEpID8gMSA6IDApOworICAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgICAgfQotICAgIC8qIENhcmQgdHlwZSBpcyBTRFNDICovCi0gICAgaHNkLT5TZENhcmQuQ2FyZFR5cGUgPSBDQVJEX1NEU0M7CisKICAgfQogICBlbHNlCiAgIHsKICAgICBoc2QtPlNkQ2FyZC5DYXJkVmVyc2lvbiA9IENBUkRfVjJfWDsKLSAgICAgICAgCi0gICAgLyogU2VuZCBBQ01ENDEgU0RfQVBQX09QX0NPTkQgd2l0aCBBcmd1bWVudCAweDgwMTAwMDAwICovCi0gICAgd2hpbGUodmFsaWR2b2x0YWdlID09IDApCisgIH0KKworICBpZiggaHNkLT5TZENhcmQuQ2FyZFZlcnNpb24gPT0gQ0FSRF9WMl9YKQorICB7CisgICAgLyogU0VORCBDTUQ1NSBBUFBfQ01EIHdpdGggUkNBIGFzIDAgKi8KKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAwKTsKKyAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICAgIHsKLSAgICAgIGlmKGNvdW50KysgPT0gU0RNTUNfTUFYX1ZPTFRfVFJJQUwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBIQUxfU0RfRVJST1JfSU5WQUxJRF9WT0xUUkFOR0U7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIFNFTkQgQ01ENTUgQVBQX0NNRCB3aXRoIFJDQSBhcyAwICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAwKTsKLSAgICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBlcnJvcnN0YXRlOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBTZW5kIENNRDQxICovCi0gICAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwT3BlckNvbW1hbmQoaHNkLT5JbnN0YW5jZSwgU0RNTUNfSElHSF9DQVBBQ0lUWSk7Ci0gICAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQotICAgICAgewotICAgICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogR2V0IGNvbW1hbmQgcmVzcG9uc2UgKi8KLSAgICAgIHJlc3BvbnNlID0gU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpOwotICAgICAgCi0gICAgICAvKiBHZXQgb3BlcmF0aW5nIHZvbHRhZ2UqLwotICAgICAgdmFsaWR2b2x0YWdlID0gKCgocmVzcG9uc2UgPj4gMzEpID09IDEpID8gMSA6IDApOwotICAgIH0KLSAgICAKLSAgICBpZigocmVzcG9uc2UgJiBTRE1NQ19ISUdIX0NBUEFDSVRZKSA9PSBTRE1NQ19ISUdIX0NBUEFDSVRZKSAvKiAocmVzcG9uc2UgJj0gU0RfSElHSF9DQVBBQ0lUWSkgKi8KLSAgICB7Ci0gICAgICBoc2QtPlNkQ2FyZC5DYXJkVHlwZSA9IENBUkRfU0RIQ19TRFhDOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaHNkLT5TZENhcmQuQ2FyZFR5cGUgPSBDQVJEX1NEU0M7CisgICAgICByZXR1cm4gSEFMX1NEX0VSUk9SX1VOU1VQUE9SVEVEX0ZFQVRVUkU7CiAgICAgfQogICB9Ci0gIAorICAvKiBTRCBDQVJEICovCisgIC8qIFNlbmQgQUNNRDQxIFNEX0FQUF9PUF9DT05EIHdpdGggQXJndW1lbnQgMHg4MDEwMDAwMCAqLworICB3aGlsZSgoY291bnQgPCBTRE1NQ19NQVhfVk9MVF9UUklBTCkgJiYgKHZhbGlkdm9sdGFnZSA9PSAwVSkpCisgIHsKKyAgICAvKiBTRU5EIENNRDU1IEFQUF9DTUQgd2l0aCBSQ0EgYXMgMCAqLworICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRBcHBDb21tYW5kKGhzZC0+SW5zdGFuY2UsIDApOworICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCisgICAgeworICAgICAgcmV0dXJuIGVycm9yc3RhdGU7CisgICAgfQorCisgICAgLyogU2VuZCBDTUQ0MSAqLworICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRBcHBPcGVyQ29tbWFuZChoc2QtPkluc3RhbmNlLCBTRE1NQ19WT0xUQUdFX1dJTkRPV19TRCB8IFNETU1DX0hJR0hfQ0FQQUNJVFkgfCBTRF9TV0lUQ0hfMV84Vl9DQVBBQ0lUWSk7CisgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKKyAgICB7CisgICAgICByZXR1cm4gSEFMX1NEX0VSUk9SX1VOU1VQUE9SVEVEX0ZFQVRVUkU7CisgICAgfQorCisgICAgLyogR2V0IGNvbW1hbmQgcmVzcG9uc2UgKi8KKyAgICByZXNwb25zZSA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKTsKKworICAgIC8qIEdldCBvcGVyYXRpbmcgdm9sdGFnZSovCisgICAgdmFsaWR2b2x0YWdlID0gKCgocmVzcG9uc2UgPj4gMzFVKSA9PSAxVSkgPyAxVSA6IDBVKTsKKworICAgIGNvdW50Kys7CisgIH0KKworICBpZihjb3VudCA+PSBTRE1NQ19NQVhfVk9MVF9UUklBTCkKKyAgeworICAgIHJldHVybiBIQUxfU0RfRVJST1JfSU5WQUxJRF9WT0xUUkFOR0U7CisgIH0KKworICBpZigocmVzcG9uc2UgJiBTRE1NQ19ISUdIX0NBUEFDSVRZKSA9PSBTRE1NQ19ISUdIX0NBUEFDSVRZKSAvKiAocmVzcG9uc2UgJj0gU0RfSElHSF9DQVBBQ0lUWSkgKi8KKyAgeworICAgIGhzZC0+U2RDYXJkLkNhcmRUeXBlID0gQ0FSRF9TREhDX1NEWEM7CisgIH0KKyAgZWxzZQorICB7CisgICAgaHNkLT5TZENhcmQuQ2FyZFR5cGUgPSBDQVJEX1NEU0M7CisgIH0KKworCiAgIHJldHVybiBIQUxfU0RfRVJST1JfTk9ORTsKIH0KIAogLyoqCiAgICogQGJyaWVmICBUdXJucyB0aGUgU0RNTUMgb3V0cHV0IHNpZ25hbHMgb2ZmLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCi0gICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RfUG93ZXJPRkYoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQorc3RhdGljIHZvaWQgU0RfUG93ZXJPRkYoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewogICAvKiBTZXQgUG93ZXIgU3RhdGUgdG8gT0ZGICovCi0gIFNETU1DX1Bvd2VyU3RhdGVfT0ZGKGhzZC0+SW5zdGFuY2UpOwotICAKLSAgcmV0dXJuIEhBTF9PSzsKKyAgKHZvaWQpU0RNTUNfUG93ZXJTdGF0ZV9PRkYoaHNkLT5JbnN0YW5jZSk7CiB9CiAKIC8qKgogICAqIEBicmllZiAgU2VuZCBTdGF0dXMgaW5mbyBjb21tYW5kLgotICAqIEBwYXJhbSAgaHNkIHBvaW50ZXIgdG8gU0QgaGFuZGxlCi0gICogQHBhcmFtICBwU0RzdGF0dXMgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBTRCBjYXJkIHN0YXR1cyAKKyAgKiBAcGFyYW0gIGhzZDogcG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIHBTRHN0YXR1czogUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBTRCBjYXJkIHN0YXR1cwogICAqICAgICAgICAgU0QgU3RhdHVzIHJlZ2lzdGVyKQogICAqIEByZXR2YWwgZXJyb3Igc3RhdGUKICAgKi8KIHN0YXRpYyB1aW50MzJfdCBTRF9TZW5kU0RTdGF0dXMoU0RfSGFuZGxlVHlwZURlZiAqaHNkLCB1aW50MzJfdCAqcFNEc3RhdHVzKQogewogICBTRE1NQ19EYXRhSW5pdFR5cGVEZWYgY29uZmlnOwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gSEFMX1NEX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7Ci0gIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgCisgIHVpbnQzMl90IGNvdW50OworICB1aW50MzJfdCAqcERhdGEgPSBwU0RzdGF0dXM7CisKICAgLyogQ2hlY2sgU0QgcmVzcG9uc2UgKi8KICAgaWYoKFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKSAmIFNETU1DX0NBUkRfTE9DS0VEKSA9PSBTRE1NQ19DQVJEX0xPQ0tFRCkKICAgewogICAgIHJldHVybiBIQUxfU0RfRVJST1JfTE9DS19VTkxPQ0tfRkFJTEVEOwogICB9Ci0gIAorCiAgIC8qIFNldCBibG9jayBzaXplIGZvciBjYXJkIGlmIGl0IGlzIG5vdCBlcXVhbCB0byBjdXJyZW50IGJsb2NrIHNpemUgZm9yIGNhcmQgKi8KLSAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIDY0KTsKKyAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJsb2NrTGVuZ3RoKGhzZC0+SW5zdGFuY2UsIDY0VSk7CiAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgIHsKICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfTk9ORTsKICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgfQotICAKKwogICAvKiBTZW5kIENNRDU1ICovCi0gIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRBcHBDb21tYW5kKGhzZC0+SW5zdGFuY2UsICh1aW50MzJfdCkoaHNkLT5TZENhcmQuUmVsQ2FyZEFkZCA8PCAxNikpOworICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAodWludDMyX3QpKGhzZC0+U2RDYXJkLlJlbENhcmRBZGQgPDwgMTZVKSk7CiAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgIHsKICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfTk9ORTsKICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgfQotICAKLSAgLyogQ29uZmlndXJlIHRoZSBTRCBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8gCisKKyAgLyogQ29uZmlndXJlIHRoZSBTRCBEUFNNIChEYXRhIFBhdGggU3RhdGUgTWFjaGluZSkgKi8KICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgY29uZmlnLkRhdGFMZW5ndGggICAgPSA2NDsKKyAgY29uZmlnLkRhdGFMZW5ndGggICAgPSA2NFU7CiAgIGNvbmZpZy5EYXRhQmxvY2tTaXplID0gU0RNTUNfREFUQUJMT0NLX1NJWkVfNjRCOwogICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19TRE1NQzsKICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOwogICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICBTRE1NQ19Db25maWdEYXRhKGhzZC0+SW5zdGFuY2UsICZjb25maWcpOwotICAKKyAgKHZvaWQpU0RNTUNfQ29uZmlnRGF0YShoc2QtPkluc3RhbmNlLCAmY29uZmlnKTsKKwogICAvKiBTZW5kIEFDTUQxMyAoU0RfQVBQX1NUQVVTKSAgd2l0aCBhcmd1bWVudCBhcyBjYXJkJ3MgUkNBICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTdGF0dXNSZWdpc3Rlcihoc2QtPkluc3RhbmNlKTsKICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKQEAgLTI4NzgsMjYgKzI4NzYsMjUgQEAKICAgICBoc2QtPkVycm9yQ29kZSB8PSBIQUxfU0RfRVJST1JfTk9ORTsKICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgfQotICAKKwogICAvKiBHZXQgc3RhdHVzIGRhdGEgKi8KICAgd2hpbGUoIV9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWE9WRVJSIHwgU0RNTUNfRkxBR19EQ1JDRkFJTCB8IFNETU1DX0ZMQUdfRFRJTUVPVVQgfCBTRE1NQ19GTEFHX0RCQ0tFTkQpKQogICB7CiAgICAgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX1JYRklGT0hGKSkKICAgICB7Ci0gICAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDg7IGNvdW50KyspCisgICAgICBmb3IoY291bnQgPSAwVTsgY291bnQgPCA4VTsgY291bnQrKykKICAgICAgIHsKLSAgICAgICAgKihwU0RzdGF0dXMgKyBjb3VudCkgPSBTRE1NQ19SZWFkRklGTyhoc2QtPkluc3RhbmNlKTsKKyAgICAgICAgKnBEYXRhID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7CisgICAgICAgIHBEYXRhKys7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIHBTRHN0YXR1cyArPSA4OwogICAgIH0KLSAgICAKKwogICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgU0RNTUNfREFUQVRJTUVPVVQpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9USU1FT1VUOwogICAgIH0KICAgfQotICAKKwogICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRFRJTUVPVVQpKQogICB7CiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9EQVRBX1RJTUVPVVQ7CkBAIC0yOTEwLDg4ICsyOTA3LDkyIEBACiAgIHsKICAgICByZXR1cm4gSEFMX1NEX0VSUk9SX1JYX09WRVJSVU47CiAgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CiAKICAgd2hpbGUgKChfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhEQVZMKSkpCiAgIHsKLSAgICAqcFNEc3RhdHVzID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7Ci0gICAgcFNEc3RhdHVzKys7Ci0gICAgCisgICAgKnBEYXRhID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7CisgICAgcERhdGErKzsKKwogICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgU0RNTUNfREFUQVRJTUVPVVQpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9USU1FT1VUOwogICAgIH0KICAgfQotICAKKwogICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBzdGF0dXMgZmxhZ3MqLwotICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0ZMQUdTKTsKLSAgCisgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfREFUQV9GTEFHUyk7CisKICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9OT05FOwogfQogCiAvKioKICAgKiBAYnJpZWYgIFJldHVybnMgdGhlIGN1cnJlbnQgY2FyZCdzIHN0YXR1cy4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgcENhcmRTdGF0dXMgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBTRCBjYXJkIAotICAqICAgICAgICAgc3RhdHVzIChDYXJkIFN0YXR1cyByZWdpc3RlcikgIAorICAqIEBwYXJhbSAgaHNkOiBQb2ludGVyIHRvIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgcENhcmRTdGF0dXM6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgU0QgY2FyZAorICAqICAgICAgICAgc3RhdHVzIChDYXJkIFN0YXR1cyByZWdpc3RlcikKICAgKiBAcmV0dmFsIGVycm9yIHN0YXRlCiAgICovCiBzdGF0aWMgdWludDMyX3QgU0RfU2VuZFN0YXR1cyhTRF9IYW5kbGVUeXBlRGVmICpoc2QsIHVpbnQzMl90ICpwQ2FyZFN0YXR1cykKIHsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKwogICBpZihwQ2FyZFN0YXR1cyA9PSBOVUxMKQogICB7CiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9QQVJBTTsKICAgfQotICAKKwogICAvKiBTZW5kIFN0YXR1cyBjb21tYW5kICovCi0gIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTZW5kU3RhdHVzKGhzZC0+SW5zdGFuY2UsICh1aW50MzJfdCkoaHNkLT5TZENhcmQuUmVsQ2FyZEFkZCA8PCAxNikpOwotICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZFNlbmRTdGF0dXMoaHNkLT5JbnN0YW5jZSwgKHVpbnQzMl90KShoc2QtPlNkQ2FyZC5SZWxDYXJkQWRkIDw8IDE2VSkpOworICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KLSAgCisKICAgLyogR2V0IFNEIGNhcmQgc3RhdHVzICovCiAgICpwQ2FyZFN0YXR1cyA9IFNETU1DX0dldFJlc3BvbnNlKGhzZC0+SW5zdGFuY2UsIFNETU1DX1JFU1AxKTsKLSAgCisKICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9OT05FOwogfQogCiAvKioKICAgKiBAYnJpZWYgIEVuYWJsZXMgdGhlIFNETU1DIHdpZGUgYnVzIG1vZGUuCi0gICogQHBhcmFtICBoc2QgcG9pbnRlciB0byBTRCBoYW5kbGUKKyAgKiBAcGFyYW0gIGhzZDogcG9pbnRlciB0byBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIGVycm9yIHN0YXRlCiAgICovCiBzdGF0aWMgdWludDMyX3QgU0RfV2lkZUJ1c19FbmFibGUoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewotICB1aW50MzJfdCBzY3JbMl0gPSB7MCwgMH07Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKLSAgCisgIHVpbnQzMl90IHNjclsyVV0gPSB7MFUsIDBVfTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKKwogICBpZigoU0RNTUNfR2V0UmVzcG9uc2UoaHNkLT5JbnN0YW5jZSwgU0RNTUNfUkVTUDEpICYgU0RNTUNfQ0FSRF9MT0NLRUQpID09IFNETU1DX0NBUkRfTE9DS0VEKQogICB7CiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9MT0NLX1VOTE9DS19GQUlMRUQ7CiAgIH0KLSAgCisKICAgLyogR2V0IFNDUiBSZWdpc3RlciAqLwogICBlcnJvcnN0YXRlID0gU0RfRmluZFNDUihoc2QsIHNjcik7Ci0gIGlmKGVycm9yc3RhdGUgIT0gSEFMX09LKQorICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KLSAgCisKICAgLyogSWYgcmVxdWVzdGVkIGNhcmQgc3VwcG9ydHMgd2lkZSBidXMgb3BlcmF0aW9uICovCi0gIGlmKChzY3JbMV0gJiBTRE1NQ19XSURFX0JVU19TVVBQT1JUKSAhPSBTRE1NQ19BTExaRVJPKQorICBpZigoc2NyWzFVXSAmIFNETU1DX1dJREVfQlVTX1NVUFBPUlQpICE9IFNETU1DX0FMTFpFUk8pCiAgIHsKICAgICAvKiBTZW5kIENNRDU1IEFQUF9DTUQgd2l0aCBhcmd1bWVudCBhcyBjYXJkJ3MgUkNBLiovCi0gICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEFwcENvbW1hbmQoaHNkLT5JbnN0YW5jZSwgKHVpbnQzMl90KShoc2QtPlNkQ2FyZC5SZWxDYXJkQWRkIDw8IDE2KSk7Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfT0spCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEFwcENvbW1hbmQoaHNkLT5JbnN0YW5jZSwgKHVpbnQzMl90KShoc2QtPlNkQ2FyZC5SZWxDYXJkQWRkIDw8IDE2VSkpOworICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgICAgfQotICAgIAorCiAgICAgLyogU2VuZCBBQ01ENiBBUFBfQ01EIHdpdGggYXJndW1lbnQgYXMgMiBmb3Igd2lkZSBidXMgbW9kZSAqLwotICAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRCdXNXaWR0aChoc2QtPkluc3RhbmNlLCAyKTsKLSAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQnVzV2lkdGgoaHNkLT5JbnN0YW5jZSwgMlUpOworICAgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgICAgewogICAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgICAgfQpAQCAtMzAwNiw0MyArMzAwNyw0MyBAQAogCiAvKioKICAgKiBAYnJpZWYgIERpc2FibGVzIHRoZSBTRE1NQyB3aWRlIGJ1cyBtb2RlLgotICAqIEBwYXJhbSAgaHNkIFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCiAgICogQHJldHZhbCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IFNEX1dpZGVCdXNfRGlzYWJsZShTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7Ci0gIHVpbnQzMl90IHNjclsyXSA9IHswLCAwfTsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IEhBTF9TRF9FUlJPUl9OT05FOwotICAKKyAgdWludDMyX3Qgc2NyWzJVXSA9IHswVSwgMFV9OworICB1aW50MzJfdCBlcnJvcnN0YXRlOworCiAgIGlmKChTRE1NQ19HZXRSZXNwb25zZShoc2QtPkluc3RhbmNlLCBTRE1NQ19SRVNQMSkgJiBTRE1NQ19DQVJEX0xPQ0tFRCkgPT0gU0RNTUNfQ0FSRF9MT0NLRUQpCiAgIHsKICAgICByZXR1cm4gSEFMX1NEX0VSUk9SX0xPQ0tfVU5MT0NLX0ZBSUxFRDsKICAgfQotICAKKwogICAvKiBHZXQgU0NSIFJlZ2lzdGVyICovCiAgIGVycm9yc3RhdGUgPSBTRF9GaW5kU0NSKGhzZCwgc2NyKTsKLSAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfT0spCisgIGlmKGVycm9yc3RhdGUgIT0gSEFMX1NEX0VSUk9SX05PTkUpCiAgIHsKICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgfQotICAKKwogICAvKiBJZiByZXF1ZXN0ZWQgY2FyZCBzdXBwb3J0cyAxIGJpdCBtb2RlIG9wZXJhdGlvbiAqLwotICBpZigoc2NyWzFdICYgU0RNTUNfU0lOR0xFX0JVU19TVVBQT1JUKSAhPSBTRE1NQ19BTExaRVJPKQorICBpZigoc2NyWzFVXSAmIFNETU1DX1NJTkdMRV9CVVNfU1VQUE9SVCkgIT0gU0RNTUNfQUxMWkVSTykKICAgewogICAgIC8qIFNlbmQgQ01ENTUgQVBQX0NNRCB3aXRoIGFyZ3VtZW50IGFzIGNhcmQncyBSQ0EgKi8KLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAodWludDMyX3QpKGhzZC0+U2RDYXJkLlJlbENhcmRBZGQgPDwgMTYpKTsKLSAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAodWludDMyX3QpKGhzZC0+U2RDYXJkLlJlbENhcmRBZGQgPDwgMTZVKSk7CisgICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgICB7CiAgICAgICByZXR1cm4gZXJyb3JzdGF0ZTsKICAgICB9Ci0gICAgCisKICAgICAvKiBTZW5kIEFDTUQ2IEFQUF9DTUQgd2l0aCBhcmd1bWVudCBhcyAwIGZvciBzaW5nbGUgYnVzIG1vZGUgKi8KLSAgICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQnVzV2lkdGgoaHNkLT5JbnN0YW5jZSwgMCk7Ci0gICAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfT0spCisgICAgZXJyb3JzdGF0ZSA9IFNETU1DX0NtZEJ1c1dpZHRoKGhzZC0+SW5zdGFuY2UsIDBVKTsKKyAgICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICAgIHsKICAgICAgIHJldHVybiBlcnJvcnN0YXRlOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBIQUxfU0RfRVJST1JfTk9ORTsKICAgfQogICBlbHNlCkBAIC0zMDUwLDUxICszMDUxLDUyIEBACiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9SRVFVRVNUX05PVF9BUFBMSUNBQkxFOwogICB9CiB9Ci0gIAotICAKKworCiAvKioKICAgKiBAYnJpZWYgIEZpbmRzIHRoZSBTRCBjYXJkIFNDUiByZWdpc3RlciB2YWx1ZS4KLSAgKiBAcGFyYW0gIGhzZCBQb2ludGVyIHRvIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgcFNDUiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFNDUiB2YWx1ZSAgCisgICogQHBhcmFtICBoc2Q6IFBvaW50ZXIgdG8gU0QgaGFuZGxlCisgICogQHBhcmFtICBwU0NSOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFNDUiB2YWx1ZQogICAqIEByZXR2YWwgZXJyb3Igc3RhdGUKICAgKi8KIHN0YXRpYyB1aW50MzJfdCBTRF9GaW5kU0NSKFNEX0hhbmRsZVR5cGVEZWYgKmhzZCwgdWludDMyX3QgKnBTQ1IpCiB7CiAgIFNETU1DX0RhdGFJbml0VHlwZURlZiBjb25maWc7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBIQUxfU0RfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKLSAgdWludDMyX3QgaW5kZXggPSAwOwotICB1aW50MzJfdCB0ZW1wc2NyWzJdID0gezAsIDB9OwotICAKKyAgdWludDMyX3QgaW5kZXggPSAwVTsKKyAgdWludDMyX3QgdGVtcHNjclsyVV0gPSB7MFUsIDBVfTsKKyAgdWludDMyX3QgKnNjciA9IHBTQ1I7CisKICAgLyogU2V0IEJsb2NrIFNpemUgVG8gOCBCeXRlcyAqLwotICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaHNkLT5JbnN0YW5jZSwgOCk7Ci0gIGlmKGVycm9yc3RhdGUgIT0gSEFMX09LKQorICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQmxvY2tMZW5ndGgoaHNkLT5JbnN0YW5jZSwgOFUpOworICBpZihlcnJvcnN0YXRlICE9IEhBTF9TRF9FUlJPUl9OT05FKQogICB7CiAgICAgcmV0dXJuIGVycm9yc3RhdGU7CiAgIH0KIAogICAvKiBTZW5kIENNRDU1IEFQUF9DTUQgd2l0aCBhcmd1bWVudCBhcyBjYXJkJ3MgUkNBICovCi0gIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRBcHBDb21tYW5kKGhzZC0+SW5zdGFuY2UsICh1aW50MzJfdCkoKGhzZC0+U2RDYXJkLlJlbENhcmRBZGQpIDw8IDE2KSk7Ci0gIGlmKGVycm9yc3RhdGUgIT0gSEFMX09LKQorICBlcnJvcnN0YXRlID0gU0RNTUNfQ21kQXBwQ29tbWFuZChoc2QtPkluc3RhbmNlLCAodWludDMyX3QpKChoc2QtPlNkQ2FyZC5SZWxDYXJkQWRkKSA8PCAxNlUpKTsKKyAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgewogICAgIHJldHVybiBlcnJvcnN0YXRlOwogICB9CiAKICAgY29uZmlnLkRhdGFUaW1lT3V0ICAgPSBTRE1NQ19EQVRBVElNRU9VVDsKLSAgY29uZmlnLkRhdGFMZW5ndGggICAgPSA4OworICBjb25maWcuRGF0YUxlbmd0aCAgICA9IDhVOwogICBjb25maWcuRGF0YUJsb2NrU2l6ZSA9IFNETU1DX0RBVEFCTE9DS19TSVpFXzhCOwogICBjb25maWcuVHJhbnNmZXJEaXIgICA9IFNETU1DX1RSQU5TRkVSX0RJUl9UT19TRE1NQzsKICAgY29uZmlnLlRyYW5zZmVyTW9kZSAgPSBTRE1NQ19UUkFOU0ZFUl9NT0RFX0JMT0NLOwogICBjb25maWcuRFBTTSAgICAgICAgICA9IFNETU1DX0RQU01fRU5BQkxFOwotICBTRE1NQ19Db25maWdEYXRhKGhzZC0+SW5zdGFuY2UsICZjb25maWcpOwotICAKKyAgKHZvaWQpU0RNTUNfQ29uZmlnRGF0YShoc2QtPkluc3RhbmNlLCAmY29uZmlnKTsKKwogICAvKiBTZW5kIEFDTUQ1MSBTRF9BUFBfU0VORF9TQ1Igd2l0aCBhcmd1bWVudCBhcyAwICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19DbWRTZW5kU0NSKGhzZC0+SW5zdGFuY2UpOwotICBpZihlcnJvcnN0YXRlICE9IEhBTF9PSykKKyAgaWYoZXJyb3JzdGF0ZSAhPSBIQUxfU0RfRVJST1JfTk9ORSkKICAgewogICAgIHJldHVybiBlcnJvcnN0YXRlOwogICB9Ci0gIAorCiAgIHdoaWxlKCFfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhPVkVSUiB8IFNETU1DX0ZMQUdfRENSQ0ZBSUwgfCBTRE1NQ19GTEFHX0RUSU1FT1VUIHwgU0RNTUNfRkxBR19EQkNLRU5EKSkKICAgewogICAgIGlmKF9fSEFMX1NEX0dFVF9GTEFHKGhzZCwgU0RNTUNfRkxBR19SWERBVkwpKQpAQCAtMzEwMiw0MiArMzEwNCw0MyBAQAogICAgICAgKih0ZW1wc2NyICsgaW5kZXgpID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7CiAgICAgICBpbmRleCsrOwogICAgIH0KLSAgICAKKwogICAgIGlmKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+PSAgU0RNTUNfREFUQVRJTUVPVVQpCiAgICAgewogICAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9USU1FT1VUOwogICAgIH0KICAgfQotICAKKwogICBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRFRJTUVPVVQpKQogICB7CiAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRFRJTUVPVVQpOwotICAgIAorCiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9EQVRBX1RJTUVPVVQ7CiAgIH0KICAgZWxzZSBpZihfX0hBTF9TRF9HRVRfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRENSQ0ZBSUwpKQogICB7CiAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX0ZMQUdfRENSQ0ZBSUwpOwotICAgIAorCiAgICAgcmV0dXJuIEhBTF9TRF9FUlJPUl9EQVRBX0NSQ19GQUlMOwogICB9CiAgIGVsc2UgaWYoX19IQUxfU0RfR0VUX0ZMQUcoaHNkLCBTRE1NQ19GTEFHX1JYT1ZFUlIpKQogICB7CiAgICAgX19IQUxfU0RfQ0xFQVJfRkxBRyhoc2QsIFNETU1DX0ZMQUdfUlhPVkVSUik7Ci0gICAgCisKICAgICByZXR1cm4gSEFMX1NEX0VSUk9SX1JYX09WRVJSVU47CiAgIH0KICAgZWxzZQogICB7CiAgICAgLyogTm8gZXJyb3IgZmxhZyBzZXQgKi8KICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fSEFMX1NEX0NMRUFSX0ZMQUcoaHNkLCBTRE1NQ19TVEFUSUNfRkxBR1MpOwotICAgIAotICAgICoocFNDUiArIDEpID0gKCh0ZW1wc2NyWzBdICYgU0RNTUNfMFRPN0JJVFMpIDw8IDI0KSAgfCAoKHRlbXBzY3JbMF0gJiBTRE1NQ184VE8xNUJJVFMpIDw8IDgpIHxcCi0gICAgICAoKHRlbXBzY3JbMF0gJiBTRE1NQ18xNlRPMjNCSVRTKSA+PiA4KSB8ICgodGVtcHNjclswXSAmIFNETU1DXzI0VE8zMUJJVFMpID4+IDI0KTsKLSAgICAKLSAgICAqKHBTQ1IpID0gKCh0ZW1wc2NyWzFdICYgU0RNTUNfMFRPN0JJVFMpIDw8IDI0KSAgfCAoKHRlbXBzY3JbMV0gJiBTRE1NQ184VE8xNUJJVFMpIDw8IDgpIHxcCi0gICAgICAoKHRlbXBzY3JbMV0gJiBTRE1NQ18xNlRPMjNCSVRTKSA+PiA4KSB8ICgodGVtcHNjclsxXSAmIFNETU1DXzI0VE8zMUJJVFMpID4+IDI0KTsKKyAgICBfX0hBTF9TRF9DTEVBUl9GTEFHKGhzZCwgU0RNTUNfU1RBVElDX0RBVEFfRkxBR1MpOworCisgICAgKnNjciA9ICgoKHRlbXBzY3JbMV0gJiBTRE1NQ18wVE83QklUUykgPDwgMjQpICB8ICgodGVtcHNjclsxXSAmIFNETU1DXzhUTzE1QklUUykgPDwgOCkgfFwKKyAgICAgICAgICAgICgodGVtcHNjclsxXSAmIFNETU1DXzE2VE8yM0JJVFMpID4+IDgpIHwgKCh0ZW1wc2NyWzFdICYgU0RNTUNfMjRUTzMxQklUUykgPj4gMjQpKTsKKyAgICBzY3IrKzsKKyAgICAqc2NyID0gKCgodGVtcHNjclswXSAmIFNETU1DXzBUTzdCSVRTKSA8PCAyNCkgIHwgKCh0ZW1wc2NyWzBdICYgU0RNTUNfOFRPMTVCSVRTKSA8PCA4KSB8XAorICAgICAgICAgICAgKCh0ZW1wc2NyWzBdICYgU0RNTUNfMTZUTzIzQklUUykgPj4gOCkgfCAoKHRlbXBzY3JbMF0gJiBTRE1NQ18yNFRPMzFCSVRTKSA+PiAyNCkpOworCiAgIH0KIAogICByZXR1cm4gSEFMX1NEX0VSUk9SX05PTkU7CkBAIC0zMTQ1LDUwICszMTQ4LDgwIEBACiAKIC8qKgogICAqIEBicmllZiAgV3JhcCB1cCByZWFkaW5nIGluIG5vbi1ibG9ja2luZyBtb2RlLgotICAqIEBwYXJhbSAgaHNkIHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogQHBhcmFtICBoc2Q6IHBvaW50ZXIgdG8gYSBTRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqIEByZXR2YWwgTm9uZQogICAqLwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNEX1JlYWRfSVQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQorc3RhdGljIHZvaWQgU0RfUmVhZF9JVChTRF9IYW5kbGVUeXBlRGVmICpoc2QpCiB7Ci0gIHVpbnQzMl90IGNvdW50ID0gMDsKLSAgdWludDMyX3QqIHRtcDsKKyAgdWludDMyX3QgY291bnQsIGRhdGEsIGRhdGFyZW1haW5pbmc7CisgIHVpbnQ4X3QqIHRtcDsKIAotICB0bXAgPSAodWludDMyX3QqKWhzZC0+cFJ4QnVmZlB0cjsKLSAgCi0gIC8qIFJlYWQgZGF0YSBmcm9tIFNETU1DIFJ4IEZJRk8gKi8KLSAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA4OyBjb3VudCsrKQorICB0bXAgPSBoc2QtPnBSeEJ1ZmZQdHI7CisgIGRhdGFyZW1haW5pbmcgPSBoc2QtPlJ4WGZlclNpemU7CisKKyAgaWYgKGRhdGFyZW1haW5pbmcgPiAwVSkKICAgewotICAgICoodG1wICsgY291bnQpID0gU0RNTUNfUmVhZEZJRk8oaHNkLT5JbnN0YW5jZSk7CisgICAgLyogUmVhZCBkYXRhIGZyb20gU0RNTUMgUnggRklGTyAqLworICAgIGZvcihjb3VudCA9IDBVOyBjb3VudCA8IDhVOyBjb3VudCsrKQorICAgIHsKKyAgICAgIGRhdGEgPSBTRE1NQ19SZWFkRklGTyhoc2QtPkluc3RhbmNlKTsKKyAgICAgICp0bXAgPSAodWludDhfdCkoZGF0YSAmIDB4RkZVKTsKKyAgICAgIHRtcCsrOworICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKnRtcCA9ICh1aW50OF90KSgoZGF0YSA+PiA4VSkgJiAweEZGVSk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgICp0bXAgPSAodWludDhfdCkoKGRhdGEgPj4gMTZVKSAmIDB4RkZVKTsKKyAgICAgIHRtcCsrOworICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKnRtcCA9ICh1aW50OF90KSgoZGF0YSA+PiAyNFUpICYgMHhGRlUpOworICAgICAgdG1wKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgfQorCisgICAgaHNkLT5wUnhCdWZmUHRyID0gdG1wOworICAgIGhzZC0+UnhYZmVyU2l6ZSA9IGRhdGFyZW1haW5pbmc7CiAgIH0KLSAgCi0gIGhzZC0+cFJ4QnVmZlB0ciArPSA4OwotICAKLSAgcmV0dXJuIEhBTF9PSzsKIH0KIAogLyoqCiAgICogQGJyaWVmICBXcmFwIHVwIHdyaXRpbmcgaW4gbm9uLWJsb2NraW5nIG1vZGUuCi0gICogQHBhcmFtICBoc2QgcG9pbnRlciB0byBhIFNEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiBAcGFyYW0gIGhzZDogcG9pbnRlciB0byBhIFNEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICogQHJldHZhbCBIQUwgc3RhdHVzCisgICogQHJldHZhbCBOb25lCiAgICovCi1zdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU0RfV3JpdGVfSVQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQorc3RhdGljIHZvaWQgU0RfV3JpdGVfSVQoU0RfSGFuZGxlVHlwZURlZiAqaHNkKQogewotICB1aW50MzJfdCBjb3VudCA9IDA7Ci0gIHVpbnQzMl90KiB0bXA7Ci0gIAotICB0bXAgPSAodWludDMyX3QqKWhzZC0+cFR4QnVmZlB0cjsKLSAgCi0gIC8qIFdyaXRlIGRhdGEgdG8gU0RNTUMgVHggRklGTyAqLwotICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDg7IGNvdW50KyspCisgIHVpbnQzMl90IGNvdW50LCBkYXRhLCBkYXRhcmVtYWluaW5nOworICB1aW50OF90KiB0bXA7CisKKyAgdG1wID0gaHNkLT5wVHhCdWZmUHRyOworICBkYXRhcmVtYWluaW5nID0gaHNkLT5UeFhmZXJTaXplOworCisgIGlmIChkYXRhcmVtYWluaW5nID4gMFUpCiAgIHsKLSAgICBTRE1NQ19Xcml0ZUZJRk8oaHNkLT5JbnN0YW5jZSwgKHRtcCArIGNvdW50KSk7CisgICAgLyogV3JpdGUgZGF0YSB0byBTRE1NQyBUeCBGSUZPICovCisgICAgZm9yKGNvdW50ID0gMFU7IGNvdW50IDwgOFU7IGNvdW50KyspCisgICAgeworICAgICAgZGF0YSA9ICh1aW50MzJfdCkoKnRtcCk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRtcCkgPDwgOFUpOworICAgICAgdG1wKys7CisgICAgICBkYXRhcmVtYWluaW5nLS07CisgICAgICBkYXRhIHw9ICgodWludDMyX3QpKCp0bXApIDw8IDE2VSk7CisgICAgICB0bXArKzsKKyAgICAgIGRhdGFyZW1haW5pbmctLTsKKyAgICAgIGRhdGEgfD0gKCh1aW50MzJfdCkoKnRtcCkgPDwgMjRVKTsKKyAgICAgIHRtcCsrOworICAgICAgZGF0YXJlbWFpbmluZy0tOworICAgICAgKHZvaWQpU0RNTUNfV3JpdGVGSUZPKGhzZC0+SW5zdGFuY2UsICZkYXRhKTsKKyAgICB9CisKKyAgICBoc2QtPnBUeEJ1ZmZQdHIgPSB0bXA7CisgICAgaHNkLT5UeFhmZXJTaXplID0gZGF0YXJlbWFpbmluZzsKICAgfQotICAKLSAgaHNkLT5wVHhCdWZmUHRyICs9IDg7Ci0gIAotICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKQEAgLTMyMDUsNCArMzIzOCw2IEBACiAgICogQH0KICAgKi8KIAorI2VuZGlmIC8qIFNETU1DMSAqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfc21hcnRjYXJkLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuYwppbmRleCBlNDc1OTg1Li5jOTY0YWQwIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmQuYwpAQCAtMTkyLDggKzE5Miw4IEBACiAvKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qKiBAZGVmZ3JvdXAgU01BUlRDQVJEX1ByaXZhdGVfQ29uc3RhbnRzIFNNQVJUQ0FSRCBQcml2YXRlIENvbnN0YW50cwotICogQHsKLSAqLworICAqIEB7CisgICovCiAjZGVmaW5lIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUICAgICAgICAgICAgICAgMTAwMFUgICAgICAvKiE8IFNNQVJUQ0FSRCBUWCBvciBSWCBlbmFibGUgYWNrbm93bGVkZ2UgdGltZS1vdXQgdmFsdWUgICovCiAKICNkZWZpbmUgVVNBUlRfQ1IxX0ZJRUxEUyAgICAgICgodWludDMyX3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFVTQVJUX0NSMV9QUyAgIHwgXApAQCAtMjI1LDcgKzIyNSw4IEBACiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1NldENvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CiBzdGF0aWMgdm9pZCBTTUFSVENBUkRfQWR2RmVhdHVyZUNvbmZpZyhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CiBzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX0NoZWNrSWRsZVN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKTsKLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU01BUlRDQVJEX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQzMl90IEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CiBzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kVHhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CiBzdGF0aWMgdm9pZCBTTUFSVENBUkRfRW5kUnhUcmFuc2ZlcihTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCk7CiBzdGF0aWMgdm9pZCBTTUFSVENBUkRfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKQEAgLTQ3MSw3ICs0NzIsOCBAQAogICAqIEBwYXJhbSAgcENhbGxiYWNrIHBvaW50ZXIgdG8gdGhlIENhbGxiYWNrIGZ1bmN0aW9uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9SZWdpc3RlckNhbGxiYWNrKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9TTUFSVENBUkRfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFNNQVJUQ0FSRF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAKQEAgLTU4NCw3ICs1ODYsOCBAQAogICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NNQVJUQ0FSRF9NU1BERUlOSVRfQ0JfSUQgTXNwRGVJbml0IENhbGxiYWNrIElECiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1VuUmVnaXN0ZXJDYWxsYmFjayhTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgSEFMX1NNQVJUQ0FSRF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9VblJlZ2lzdGVyQ2FsbGJhY2soU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfU01BUlRDQVJEX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQpCiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIApAQCAtNzI4LDI5ICs3MzEsMzAgQEAKICAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX1J4Q3BsdENhbGxiYWNrKCkKICAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Vycm9yQ2FsbGJhY2soKQogCisgIFsuLl0KICAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzIGNvdWxkIGJlIGFib3J0ZWQgdXNpbmcgQWJvcnQgQVBJJ3MgOgotICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydCgpCi0gICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXQoKQotICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKQotICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydF9JVCgpCi0gICAgICAgICgrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRfSVQoKQotICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmUoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRfSVQoKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRUcmFuc21pdF9JVCgpCisgICAgICAgICgrKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoKQogCiAgICAgKCMpIEZvciBBYm9ydCBzZXJ2aWNlcyBiYXNlZCBvbiBpbnRlcnJ1cHRzIChIQUxfU01BUlRDQVJEX0Fib3J0eHh4X0lUKSwgYSBzZXQgb2YgQWJvcnQgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZDoKLSAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRDcGx0Q2FsbGJhY2soKQotICAgICAgICAoKykgSEFMX1NNQVJUQ0FSRF9BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrKCkKLSAgICAgICAgKCspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0Q3BsdENhbGxiYWNrKCkKKyAgICAgICAgKCsrKSBIQUxfU01BUlRDQVJEX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQorICAgICAgICAoKyspIEhBTF9TTUFSVENBUkRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKIAogICAgICgjKSBJbiBOb24tQmxvY2tpbmcgbW9kZSB0cmFuc2ZlcnMsIHBvc3NpYmxlIGVycm9ycyBhcmUgc3BsaXQgaW50byAyIGNhdGVnb3JpZXMuCiAgICAgICAgIEVycm9ycyBhcmUgaGFuZGxlZCBhcyBmb2xsb3dzIDoKLSAgICAgICAoKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBSZWNvdmVyYWJsZSBhbmQgbm9uIGJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgZ28gdGlsbCBlbmQsIGJ1dCBlcnJvciBzZXZlcml0eSBpcwotICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgotICAgICAgICAgICBSZWNlaXZlZCBjaGFyYWN0ZXIgaXMgdGhlbiByZXRyaWV2ZWQgYW5kIHN0b3JlZCBpbiBSeCBidWZmZXIsIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwKLSAgICAgICAgICAgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuIFRyYW5zZmVyIGlzIGtlcHQgb25nb2luZyBvbiBTTUFSVENBUkQgc2lkZS4KLSAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgotICAgICAgICgrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIEJsb2NraW5nIDogVHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZCBwcm9wZXJseSBhbmQgaXMgYWJvcnRlZC4KLSAgICAgICAgICAgVGhpcyBjb25jZXJucyBGcmFtZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSB0cmFubWlzc2lvbiwgT3ZlcnJ1biBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gYW5kIGFsbCBlcnJvcnMgaW4gRE1BIG1vZGUuCi0gICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCisgICAgICAgKCsrKSBFcnJvciBpcyBjb25zaWRlcmVkIGFzIFJlY292ZXJhYmxlIGFuZCBub24gYmxvY2tpbmcgOiBUcmFuc2ZlciBjb3VsZCBnbyB0aWxsIGVuZCwgYnV0IGVycm9yIHNldmVyaXR5IGlzCisgICAgICAgICAgICB0byBiZSBldmFsdWF0ZWQgYnkgdXNlciA6IHRoaXMgY29uY2VybnMgRnJhbWUgRXJyb3IsIFBhcml0eSBFcnJvciBvciBOb2lzZSBFcnJvciBpbiBJbnRlcnJ1cHQgbW9kZSByZWNlcHRpb24gLgorICAgICAgICAgICAgUmVjZWl2ZWQgY2hhcmFjdGVyIGlzIHRoZW4gcmV0cmlldmVkIGFuZCBzdG9yZWQgaW4gUnggYnVmZmVyLCBFcnJvciBjb2RlIGlzIHNldCB0byBhbGxvdyB1c2VyIHRvIGlkZW50aWZ5IGVycm9yIHR5cGUsCisgICAgICAgICAgICBhbmQgSEFMX1NNQVJUQ0FSRF9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayBpcyBleGVjdXRlZC4gVHJhbnNmZXIgaXMga2VwdCBvbmdvaW5nIG9uIFNNQVJUQ0FSRCBzaWRlLgorICAgICAgICAgICAgSWYgdXNlciB3YW50cyB0byBhYm9ydCBpdCwgQWJvcnQgc2VydmljZXMgc2hvdWxkIGJlIGNhbGxlZCBieSB1c2VyLgorICAgICAgICgrKykgRXJyb3IgaXMgY29uc2lkZXJlZCBhcyBCbG9ja2luZyA6IFRyYW5zZmVyIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgcHJvcGVybHkgYW5kIGlzIGFib3J0ZWQuCisgICAgICAgICAgICBUaGlzIGNvbmNlcm5zIEZyYW1lIEVycm9yIGluIEludGVycnVwdCBtb2RlIHRyYW5taXNzaW9uLCBPdmVycnVuIEVycm9yIGluIEludGVycnVwdCBtb2RlIHJlY2VwdGlvbiBhbmQgYWxsIGVycm9ycyBpbiBETUEgbW9kZS4KKyAgICAgICAgICAgIEVycm9yIGNvZGUgaXMgc2V0IHRvIGFsbG93IHVzZXIgdG8gaWRlbnRpZnkgZXJyb3IgdHlwZSwgYW5kIEhBTF9TTUFSVENBUkRfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuCiAKIEBlbmR2ZXJiYXRpbQogICAqIEB7CkBAIC03NjUsNyArNzY5LDggQEAKICAgKiBAcGFyYW0gIFRpbWVvdXQgIFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1RyYW5zbWl0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfVHJhbnNtaXQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUaW1lb3V0KQogewogICB1aW50MzJfdCB0aWNrc3RhcnQ7CiAgIHVpbnQ4X3QgICpwdG1wZGF0YSA9IHBEYXRhOwpAQCAtODExLDcgKzgxNiw4IEBACiAgICAgICBoc21hcnRjYXJkLT5JbnN0YW5jZS0+VERSID0gKHVpbnQ4X3QpKCpwdG1wZGF0YSAmIDB4RkZVKTsKICAgICAgIHB0bXBkYXRhKys7CiAgICAgfQotICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fRkxBRyhoc21hcnRjYXJkKSwgUkVTRVQsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQorICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBTTUFSVENBUkRfVFJBTlNNSVNTSU9OX0NPTVBMRVRJT05fRkxBRyhoc21hcnRjYXJkKSwgUkVTRVQsIHRpY2tzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCkgIT0gSEFMX09LKQogICAgIHsKICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICB9CkBAIC04NDgsNyArODU0LDggQEAKICAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfUmVjZWl2ZShTTUFSVENBUkRfSGFuZGxlVHlwZURlZiAqaHNtYXJ0Y2FyZCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfU01BUlRDQVJEX1JlY2VpdmUoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHRpY2tzdGFydDsKICAgdWludDhfdCAgKnB0bXBkYXRhID0gcERhdGE7CkBAIC0xMDU5LDcgKzEwNjYsOCBAQAogICAgIGhzbWFydGNhcmQtPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOwogCiAgICAgLyogRW5hYmxlIHRoZSBTTUFSVENBUkQgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KLSAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoc21hcnRjYXJkLT5oZG1hdHgsICh1aW50MzJfdCloc21hcnRjYXJkLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIsIFNpemUpID09IEhBTF9PSykKKyAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChoc21hcnRjYXJkLT5oZG1hdHgsICh1aW50MzJfdCloc21hcnRjYXJkLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzbWFydGNhcmQtPkluc3RhbmNlLT5URFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSkgPT0gSEFMX09LKQogICAgIHsKICAgICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KICAgICAgIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+SUNSLCBVU0FSVF9JQ1JfVENDRik7CkBAIC0xMTM1LDcgKzExNDMsOCBAQAogICAgIGhzbWFydGNhcmQtPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBOVUxMOwogCiAgICAgLyogRW5hYmxlIHRoZSBETUEgY2hhbm5lbCAqLwotICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCwgKHVpbnQzMl90KSZoc21hcnRjYXJkLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciwgU2l6ZSkgPT0gSEFMX09LKQorICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGhzbWFydGNhcmQtPmhkbWFyeCwgKHVpbnQzMl90KSZoc21hcnRjYXJkLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHNtYXJ0Y2FyZC0+cFJ4QnVmZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaXplKSA9PSBIQUxfT0spCiAgICAgewogICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgX19IQUxfVU5MT0NLKGhzbWFydGNhcmQpOwpAQCAtMTE4OCw3ICsxMTk3LDggQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TTUFSVENBUkRfQWJvcnQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCiB7CiAgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCi0gIENMRUFSX0JJVChoc21hcnRjYXJkLT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKKyAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsCisgICAgICAgICAgICAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUgfCBVU0FSVF9DUjFfUlRPSUUgfCBVU0FSVF9DUjFfRU9CSUUpKTsKICAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19FSUUpOwogCiAgIC8qIERpc2FibGUgdGhlIFNNQVJUQ0FSRCBETUEgVHggcmVxdWVzdCBpZiBlbmFibGVkICovCkBAIC0xMjQ2LDcgKzEyNTYsOSBAQAogICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOwogCiAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCi0gIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CkBAIC0xMzc1LDcgKzEzODcsOSBAQAogICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOwogCiAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCi0gIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCiAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOwpAQCAtMTQwMyw3ICsxNDE3LDggQEAKICAgdWludDMyX3QgYWJvcnRjcGx0ID0gMVU7CiAKICAgLyogRGlzYWJsZSBSVE9JRSwgRU9CSUUsIFRYRUlFLCBUQ0lFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KLSAgQ0xFQVJfQklUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOworICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSwKKyAgICAgICAgICAgIChVU0FSVF9DUjFfUlhORUlFIHwgVVNBUlRfQ1IxX1BFSUUgfCBVU0FSVF9DUjFfVFhFSUUgfCBVU0FSVF9DUjFfVENJRSB8IFVTQVJUX0NSMV9SVE9JRSB8IFVTQVJUX0NSMV9FT0JJRSkpOwogICBDTEVBUl9CSVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CiAKICAgLyogSWYgRE1BIFR4IGFuZC9vciBETUEgUnggSGFuZGxlcyBhcmUgYXNzb2NpYXRlZCB0byBTTUFSVENBUkQgSGFuZGxlLCBETUEgQWJvcnQgY29tcGxldGUgY2FsbGJhY2tzIHNob3VsZCBiZSBpbml0aWFsaXNlZApAQCAtMTUwMCw3ICsxNTE1LDkgQEAKICAgICBoc21hcnRjYXJkLT5FcnJvckNvZGUgPSBIQUxfU01BUlRDQVJEX0VSUk9SX05PTkU7CiAKICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLwotICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPmdTdGF0ZSBhbmQgaHNtYXJ0Y2FyZC0+UnhTdGF0ZSB0byBSZWFkeSAqLwogICAgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOwpAQCAtMTYyNyw3ICsxNjQ0LDcgQEAKICAgKiBAbm90ZSAgIFRoaXMgcHJvY2VkdXJlIGlzIGV4ZWN1dGVkIGluIEludGVycnVwdCBtb2RlLCBtZWFuaW5nIHRoYXQgYWJvcnQgcHJvY2VkdXJlIGNvdWxkIGJlCiAgICogICAgICAgICBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZCBvbmx5IHdoZW4gdXNlciBhYm9ydCBjb21wbGV0ZSBjYWxsYmFjayBpcyBleGVjdXRlZCAobm90IHdoZW4gZXhpdGluZyBmdW5jdGlvbikuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NNQVJUQ0FSRF9BYm9ydFJlY2VpdmVfSVQoU01BUlRDQVJEX0hhbmRsZVR5cGVEZWYgKmhzbWFydGNhcmQpCiB7CiAgIC8qIERpc2FibGUgUlRPSUUsIEVPQklFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KQEAgLTE2NjksNyArMTY4Niw5IEBACiAgICAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CiAKICAgICAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCi0gICAgICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworICAgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0NMRUFSX0VPQkYpOwogCiAgICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KICAgICAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOwpAQCAtMTY5Myw3ICsxNzEyLDkgQEAKICAgICBoc21hcnRjYXJkLT5SeElTUiA9IE5VTEw7CiAKICAgICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLwotICAgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgICAgX19IQUxfU01BUlRDQVJEX0NMRUFSX0ZMQUcoaHNtYXJ0Y2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgICAvKiBSZXN0b3JlIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KICAgICBoc21hcnRjYXJkLT5SeFN0YXRlID0gSEFMX1NNQVJUQ0FSRF9TVEFURV9SRUFEWTsKQEAgLTE3MzEsNyArMTc1Miw3IEBACiAgIHsKICAgICAvKiBTTUFSVENBUkQgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IDBVKQotICAgICAgICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1JYTkVJRSkgIT0gMFUpKQorICAgICAgICAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SWE5FSUUpICE9IDBVKSkKICAgICB7CiAgICAgICBpZiAoaHNtYXJ0Y2FyZC0+UnhJU1IgIT0gTlVMTCkKICAgICAgIHsKQEAgLTE3OTMsNyArMTgxNCw3IEBACiAgICAgewogICAgICAgLyogU01BUlRDQVJEIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JYTkUpICE9IDBVKQotICAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCisgICAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCiAgICAgICB7CiAgICAgICAgIGlmIChoc21hcnRjYXJkLT5SeElTUiAhPSBOVUxMKQogICAgICAgICB7CkBAIC0xOTQ2LDcgKzE5NjcsNyBAQAogCiAgIC8qIFNNQVJUQ0FSRCBpbiBtb2RlIFRyYW5zbWl0dGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1RYRSkgIT0gMFUpCi0gICAgICYmICgoY3IxaXRzICYgVVNBUlRfQ1IxX1RYRUlFKSAhPSAwVSkpCisgICAgICAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9UWEVJRSkgIT0gMFUpKQogICB7CiAgICAgaWYgKGhzbWFydGNhcmQtPlR4SVNSICE9IE5VTEwpCiAgICAgewpAQCAtMTk1OCw3ICsxOTc5LDcgQEAKICAgLyogU01BUlRDQVJEIGluIG1vZGUgVHJhbnNtaXR0ZXIgKHRyYW5zbWlzc2lvbiBlbmQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmIChfX0hBTF9TTUFSVENBUkRfR0VUX0lUKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKSAhPSBSRVNFVCkKICAgewotICAgIGlmKF9fSEFMX1NNQVJUQ0FSRF9HRVRfSVRfU09VUkNFKGhzbWFydGNhcmQsIGhzbWFydGNhcmQtPkFkdmFuY2VkSW5pdC5UeENvbXBsZXRpb25JbmRpY2F0aW9uKSAhPSBSRVNFVCkKKyAgICBpZiAoX19IQUxfU01BUlRDQVJEX0dFVF9JVF9TT1VSQ0UoaHNtYXJ0Y2FyZCwgaHNtYXJ0Y2FyZC0+QWR2YW5jZWRJbml0LlR4Q29tcGxldGlvbkluZGljYXRpb24pICE9IFJFU0VUKQogICAgIHsKICAgICAgIFNNQVJUQ0FSRF9FbmRUcmFuc21pdF9JVChoc21hcnRjYXJkKTsKICAgICAgIHJldHVybjsKQEAgLTIwOTUsNyArMjExNiw4IEBACiBIQUxfU01BUlRDQVJEX1N0YXRlVHlwZURlZiBIQUxfU01BUlRDQVJEX0dldFN0YXRlKFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkKQogewogICAvKiBSZXR1cm4gU01BUlRDQVJEIGhhbmRsZSBzdGF0ZSAqLwotICB1aW50MzJfdCB0ZW1wMSwgdGVtcDI7CisgIHVpbnQzMl90IHRlbXAxOworICB1aW50MzJfdCB0ZW1wMjsKICAgdGVtcDEgPSAodWludDMyX3QpaHNtYXJ0Y2FyZC0+Z1N0YXRlOwogICB0ZW1wMiA9ICh1aW50MzJfdCloc21hcnRjYXJkLT5SeFN0YXRlOwogCkBAIC0yMTU1LDYgKzIxNzcsNyBAQAogICB1aW50MzJfdCB0bXByZWc7CiAgIFNNQVJUQ0FSRF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2U7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCA9IEhBTF9PSzsKKyAgdWludDMyX3QgcGNsazsKIAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfU01BUlRDQVJEX0lOU1RBTkNFKGhzbWFydGNhcmQtPkluc3RhbmNlKSk7CkBAIC0yMTc3LDcgKzIyMDAsNyBAQAogICAgKiBDb25maWd1cmUgdGhlIFBhcml0eSBhbmQgTW9kZToKICAgICogIHNldCBQUyBiaXQgYWNjb3JkaW5nIHRvIGhzbWFydGNhcmQtPkluaXQuUGFyaXR5IHZhbHVlCiAgICAqICBzZXQgVEUgYW5kIFJFIGJpdHMgYWNjb3JkaW5nIHRvIGhzbWFydGNhcmQtPkluaXQuTW9kZSB2YWx1ZSAqLwotICB0bXByZWcgPSAodWludDMyX3QpIChoc21hcnRjYXJkLT5Jbml0LlBhcml0eSB8IGhzbWFydGNhcmQtPkluaXQuTW9kZSB8IGhzbWFydGNhcmQtPkluaXQuV29yZExlbmd0aCk7CisgIHRtcHJlZyA9ICh1aW50MzJfdCkoaHNtYXJ0Y2FyZC0+SW5pdC5QYXJpdHkgfCBoc21hcnRjYXJkLT5Jbml0Lk1vZGUgfCBoc21hcnRjYXJkLT5Jbml0LldvcmRMZW5ndGgpOwogICBNT0RJRllfUkVHKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9GSUVMRFMsIHRtcHJlZyk7CiAKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMjIwLDE2ICsyMjQzLDE5IEBACiAgIHN3aXRjaCAoY2xvY2tzb3VyY2UpCiAgIHsKICAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9QQ0xLMToKLSAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKEhBTF9SQ0NfR2V0UENMSzFGcmVxKCkgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKKyAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgocGNsayArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlIC8gMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfUENMSzI6Ci0gICAgICB0bXByZWcgPSAodWludDE2X3QpKChIQUxfUkNDX0dldFBDTEsyRnJlcSgpICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CisgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKTsKKyAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKHBjbGsgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgU01BUlRDQVJEX0NMT0NLU09VUkNFX0hTSToKICAgICAgIHRtcHJlZyA9ICh1aW50MTZfdCkoKEhTSV9WQUxVRSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlIC8gMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBTTUFSVENBUkRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgotICAgICAgdG1wcmVnID0gKHVpbnQxNl90KSgoSEFMX1JDQ19HZXRTeXNDbG9ja0ZyZXEoKSArIChoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlIC8gMlUpKSAvIGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUpOworICAgICAgcGNsayA9IEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCk7CisgICAgICB0bXByZWcgPSAodWludDE2X3QpKChwY2xrICsgKGhzbWFydGNhcmQtPkluaXQuQmF1ZFJhdGUgLyAyVSkpIC8gaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFNNQVJUQ0FSRF9DTE9DS1NPVVJDRV9MU0U6CiAgICAgICB0bXByZWcgPSAodWludDE2X3QpKChMU0VfVkFMVUUgKyAoaHNtYXJ0Y2FyZC0+SW5pdC5CYXVkUmF0ZSAvIDJVKSkgLyBoc21hcnRjYXJkLT5Jbml0LkJhdWRSYXRlKTsKQEAgLTIzNDAsNyArMjM2Niw4IEBACiAgIGlmICgoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMSAmIFVTQVJUX0NSMV9URSkgPT0gVVNBUlRfQ1IxX1RFKQogICB7CiAgICAgLyogV2FpdCB1bnRpbCBURUFDSyBmbGFnIGlzIHNldCAqLwotICAgIGlmIChTTUFSVENBUkRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChoc21hcnRjYXJkLCBVU0FSVF9JU1JfVEVBQ0ssIFJFU0VULCB0aWNrc3RhcnQsIFNNQVJUQ0FSRF9URUFDS19SRUFDS19USU1FT1VUKSAhPSBIQUxfT0spCisgICAgaWYgKFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGhzbWFydGNhcmQsIFVTQVJUX0lTUl9URUFDSywgUkVTRVQsIHRpY2tzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX1RFQUNLX1JFQUNLX1RJTUVPVVQpICE9IEhBTF9PSykKICAgICB7CiAgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCiAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7CkBAIC0yMzY3LDcgKzIzOTQsOCBAQAogICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNNQVJUQ0FSRF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFNNQVJUQ0FSRF9IYW5kbGVUeXBlRGVmICpoc21hcnRjYXJkLCB1aW50MzJfdCBGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KICAgd2hpbGUgKChfX0hBTF9TTUFSVENBUkRfR0VUX0ZMQUcoaHNtYXJ0Y2FyZCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQpAQCAtMjQ5MSw3ICsyNTE5LDcgQEAKICAgLyogU3RvcCBTTUFSVENBUkQgRE1BIFR4IHJlcXVlc3QgaWYgb25nb2luZyAqLwogICBpZiAoaHNtYXJ0Y2FyZC0+Z1N0YXRlID09IEhBTF9TTUFSVENBUkRfU1RBVEVfQlVTWV9UWCkKICAgewotICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzbWFydGNhcmQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFUKSkKKyAgICBpZiAoSEFMX0lTX0JJVF9TRVQoaHNtYXJ0Y2FyZC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKQogICAgIHsKICAgICAgIGhzbWFydGNhcmQtPlR4WGZlckNvdW50ID0gMFU7CiAgICAgICBTTUFSVENBUkRfRW5kVHhUcmFuc2Zlcihoc21hcnRjYXJkKTsKQEAgLTI1NzAsNyArMjU5OCw5IEBACiAgIGhzbWFydGNhcmQtPkVycm9yQ29kZSA9IEhBTF9TTUFSVENBUkRfRVJST1JfTk9ORTsKIAogICAvKiBDbGVhciB0aGUgRXJyb3IgZmxhZ3MgaW4gdGhlIElDUiByZWdpc3RlciAqLwotICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLCBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwgU01BUlRDQVJEX0NMRUFSX0VPQkYpOworICBfX0hBTF9TTUFSVENBUkRfQ0xFQVJfRkxBRyhoc21hcnRjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfT1JFRiB8IFNNQVJUQ0FSRF9DTEVBUl9ORUYgfCBTTUFSVENBUkRfQ0xFQVJfUEVGIHwgU01BUlRDQVJEX0NMRUFSX0ZFRiB8IFNNQVJUQ0FSRF9DTEVBUl9SVE9GIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUlRDQVJEX0NMRUFSX0VPQkYpOwogCiAgIC8qIFJlc3RvcmUgaHNtYXJ0Y2FyZC0+Z1N0YXRlIGFuZCBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCiAgIGhzbWFydGNhcmQtPmdTdGF0ZSAgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOwpAQCAtMjYxNyw3ICsyNjQ3LDkgQEAKICAgaHNtYXJ0Y2FyZC0+RXJyb3JDb2RlID0gSEFMX1NNQVJUQ0FSRF9FUlJPUl9OT05FOwogCiAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCi0gIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5nU3RhdGUgYW5kIGhzbWFydGNhcmQtPlJ4U3RhdGUgdG8gUmVhZHkgKi8KICAgaHNtYXJ0Y2FyZC0+Z1N0YXRlICA9IEhBTF9TTUFSVENBUkRfU1RBVEVfUkVBRFk7CkBAIC0yNjc3LDcgKzI3MDksOSBAQAogICBoc21hcnRjYXJkLT5SeFhmZXJDb3VudCA9IDBVOwogCiAgIC8qIENsZWFyIHRoZSBFcnJvciBmbGFncyBpbiB0aGUgSUNSIHJlZ2lzdGVyICovCi0gIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfCBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CisgIF9fSEFMX1NNQVJUQ0FSRF9DTEVBUl9GTEFHKGhzbWFydGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNQVJUQ0FSRF9DTEVBUl9PUkVGIHwgU01BUlRDQVJEX0NMRUFSX05FRiB8IFNNQVJUQ0FSRF9DTEVBUl9QRUYgfCBTTUFSVENBUkRfQ0xFQVJfRkVGIHwgU01BUlRDQVJEX0NMRUFSX1JUT0YgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUFSVENBUkRfQ0xFQVJfRU9CRik7CiAKICAgLyogUmVzdG9yZSBoc21hcnRjYXJkLT5SeFN0YXRlIHRvIFJlYWR5ICovCiAgIGhzbWFydGNhcmQtPlJ4U3RhdGUgPSBIQUxfU01BUlRDQVJEX1NUQVRFX1JFQURZOwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfc21hcnRjYXJkX2V4LmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmRfZXguYwppbmRleCBhNTg4MWUyLi5jOTE5YzAzIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmRfZXguYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF9zbWFydGNhcmRfZXguYwpAQCAtMTY1LDEyICsxNjUsNiBAQAogLyoqIEBkZWZncm91cCBTTUFSVENBUkRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIEV4dGVuZGVkIFBlcmlwaGVyYWwgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICAqIEBicmllZiAgIFNNQVJUQ0FSRCBUcmFuc21pdCBhbmQgUmVjZWl2ZSBmdW5jdGlvbnMKICAgKgotQHZlcmJhdGltCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgWy4uXQotQGVuZHZlcmJhdGltCiAgICogQHsKICAgKi8KIApAQCAtMTc4LDI4ICsxNzIsMTIgQEAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFNNQVJUQ0FSRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIEV4dGVuZGVkIFBlcmlwaGVyYWwgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwotICAqICBAYnJpZWYgICBTTUFSVENBUkQgY29udHJvbCBmdW5jdGlvbnMKLSAgKgotQHZlcmJhdGltCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMgIyMjIyMKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgWy4uXQotQGVuZHZlcmJhdGltCi0gICogQHsKLSAgKi8KLQogCiAvKioKICAgKiBAfQogICAqLwogCi0vKioKLSAgKiBAfQotICAqLwotCi0vKiogQGRlZmdyb3VwIFNNQVJUQ0FSREV4X1ByaXZhdGVfRnVuY3Rpb25zICBTTUFSVENBUkQgRXh0ZW5kZWQgcHJpdmF0ZSBGdW5jdGlvbnMKKy8qKiBAZGVmZ3JvdXAgU01BUlRDQVJERXhfUHJpdmF0ZV9GdW5jdGlvbnMgIFNNQVJUQ0FSRCBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucwogICAqIEB7CiAgICovCiAKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3NtYnVzLmMgYi9TcmMvc3RtMzJmN3h4X2hhbF9zbWJ1cy5jCmluZGV4IGYyMzEwNWQuLmEwMWQ5ZjggMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3NtYnVzLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfc21idXMuYwpAQCAtODksMTIgKzg5LDEyIEBACiAKICAgICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KKyAgICBbLi5dCiAgICAgIFRoZSBjb21waWxhdGlvbiBmbGFnIFVTRV9IQUxfU01CVVNfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KICAgICAgVXNlIEZ1bmN0aW9ucyBAcmVmIEhBTF9TTUJVU19SZWdpc3RlckNhbGxiYWNrKCkgb3IgQHJlZiBIQUxfU01CVVNfUmVnaXN0ZXJBZGRyQ2FsbGJhY2soKQogICAgICB0byByZWdpc3RlciBhbiBpbnRlcnJ1cHQgY2FsbGJhY2suCi0KKyAgICBbLi5dCiAgICAgIEZ1bmN0aW9uIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKICAgICAgICAoKykgTWFzdGVyVHhDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgTWFzdGVyIHRyYW5zbWlzc2lvbiBlbmQgb2YgdHJhbnNmZXIuCiAgICAgICAgKCspIE1hc3RlclJ4Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIE1hc3RlciByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyLgpAQCAtMTA2LDkgKzEwNiw5IEBACiAgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICAgIDogY2FsbGJhY2sgZm9yIE1zcCBEZUluaXQuCiAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICAgICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KLQorICAgIFsuLl0KICAgICAgRm9yIHNwZWNpZmljIGNhbGxiYWNrIEFkZHJDYWxsYmFjayB1c2UgZGVkaWNhdGVkIHJlZ2lzdGVyIGNhbGxiYWNrcyA6IEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQWRkckNhbGxiYWNrLgotCisgICAgWy4uXQogICAgICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgICAgd2VhayBmdW5jdGlvbi4KICAgICAgQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckNhbGxiYWNrIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKQEAgLTEyMiw5ICsxMjIsOSBAQAogICAgICAgICgrKSBFcnJvckNhbGxiYWNrICAgICAgICA6IGNhbGxiYWNrIGZvciBlcnJvciBkZXRlY3Rpb24uCiAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICAgIDogY2FsbGJhY2sgZm9yIE1zcCBJbml0LgogICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgICA6IGNhbGxiYWNrIGZvciBNc3AgRGVJbml0LgotCisgICAgWy4uXQogICAgICBGb3IgY2FsbGJhY2sgQWRkckNhbGxiYWNrIHVzZSBkZWRpY2F0ZWQgcmVnaXN0ZXIgY2FsbGJhY2tzIDogQHJlZiBIQUxfU01CVVNfVW5SZWdpc3RlckFkZHJDYWxsYmFjay4KLQorICAgIFsuLl0KICAgICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEByZWYgSEFMX1NNQlVTX0luaXQoKSBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgQHJlZiBIQUxfSTJDX1NUQVRFX1JFU0VUCiAgICAgIGFsbCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKICAgICAgZXhhbXBsZXMgQHJlZiBIQUxfU01CVVNfTWFzdGVyVHhDcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfU01CVVNfTWFzdGVyUnhDcGx0Q2FsbGJhY2soKS4KQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogICAgICBJZiBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBAcmVmIEhBTF9TTUJVU19Jbml0KCkvIEByZWYgSEFMX1NNQlVTX0RlSW5pdCgpCiAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkgd2hhdGV2ZXIgdGhlIHN0YXRlLgotCisgICAgWy4uXQogICAgICBDYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQvdW5yZWdpc3RlcmVkIGluIEByZWYgSEFMX0kyQ19TVEFURV9SRUFEWSBzdGF0ZSBvbmx5LgogICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0L01zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZC91bnJlZ2lzdGVyZWQKICAgICAgaW4gQHJlZiBIQUxfSTJDX1NUQVRFX1JFQURZIG9yIEByZWYgSEFMX0kyQ19TVEFURV9SRVNFVCBzdGF0ZSwKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICBUaGVuLCB0aGUgdXNlciBmaXJzdCByZWdpc3RlcnMgdGhlIE1zcEluaXQvTXNwRGVJbml0IHVzZXIgY2FsbGJhY2tzCiAgICAgIHVzaW5nIEByZWYgSEFMX1NNQlVTX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBAcmVmIEhBTF9TTUJVU19EZUluaXQoKQogICAgICBvciBAcmVmIEhBTF9TTUJVU19Jbml0KCkgZnVuY3Rpb24uCi0KKyAgICBbLi5dCiAgICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGZsYWcgVVNFX0hBTF9TTUJVU19SRUdJU1RFUl9DQUxMQkFDS1MgaXMgc2V0IHRvIDAgb3IKICAgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RyYXRpb24gZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIGFuZCBhbGwgY2FsbGJhY2tzCiAgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF90aW0uYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3RpbS5jCmluZGV4IDUxNjUxMjguLmIzMzY1ZDYgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3RpbS5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX3RpbS5jCkBAIC05OCwxOCArOTgsMjIgQEAKICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorICBbLi5dCiAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfVElNX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCiAgIGFsbG93cyB0aGUgdXNlciB0byBjb25maWd1cmUgZHluYW1pY2FsbHkgdGhlIGRyaXZlciBjYWxsYmFja3MuCiAKKyAgWy4uXQogICBVc2UgRnVuY3Rpb24gQHJlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrLgogICBAcmVmIEhBTF9USU1fUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKICAgdGhlIENhbGxiYWNrIElEIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCiAKKyAgWy4uXQogICBVc2UgZnVuY3Rpb24gQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8gdGhlIGRlZmF1bHQKICAgd2VhayBmdW5jdGlvbi4KICAgQHJlZiBIQUxfVElNX1VuUmVnaXN0ZXJDYWxsYmFjayB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsCiAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCiAKKyAgWy4uXQogICBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICgrKSBCYXNlX01zcEluaXRDYWxsYmFjayAgICAgICAgICAgICAgOiBUSU0gQmFzZSBNc3AgSW5pdCBDYWxsYmFjay4KICAgICAoKykgQmFzZV9Nc3BEZUluaXRDYWxsYmFjayAgICAgICAgICAgIDogVElNIEJhc2UgTXNwIERlSW5pdCBDYWxsYmFjay4KQEAgLTE0MCwxNSArMTQ0LDE4IEBACiAgICAgKCspIEJyZWFrQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICA6IFRJTSBCcmVhayBDYWxsYmFjay4KICAgICAoKykgQnJlYWsyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIDogVElNIEJyZWFrMiBDYWxsYmFjay4KIAorICBbLi5dCiBCeSBkZWZhdWx0LCBhZnRlciB0aGUgSW5pdCBhbmQgd2hlbiB0aGUgc3RhdGUgaXMgSEFMX1RJTV9TVEFURV9SRVNFVAogYWxsIGludGVycnVwdCBjYWxsYmFja3MgYXJlIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIGZ1bmN0aW9uczoKICAgZXhhbXBsZXMgQHJlZiBIQUxfVElNX1RyaWdnZXJDYWxsYmFjaygpLCBAcmVmIEhBTF9USU1fRXJyb3JDYWxsYmFjaygpLgogCisgIFsuLl0KICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQgYW5kIE1zcERlSW5pdCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrCiAgIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgSW5pdCAvIERlSW5pdCBvbmx5IHdoZW4gdGhlc2UgY2FsbGJhY2tzIGFyZSBudWxsCiAgIChub3QgcmVnaXN0ZXJlZCBiZWZvcmVoYW5kKS4gSWYgbm90LCBNc3BJbml0IG9yIE1zcERlSW5pdCBhcmUgbm90IG51bGwsIHRoZSBJbml0IC8gRGVJbml0CiAgICAga2VlcCBhbmQgdXNlIHRoZSB1c2VyIE1zcEluaXQgLyBNc3BEZUluaXQgY2FsbGJhY2tzKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkKIAorICBbLi5dCiAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIC8gdW5yZWdpc3RlcmVkIGluIEhBTF9USU1fU1RBVEVfUkVBRFkgc3RhdGUgb25seS4KICAgICBFeGNlcHRpb24gZG9uZSBNc3BJbml0IC8gTXNwRGVJbml0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgLyB1bnJlZ2lzdGVyZWQKICAgICBpbiBIQUxfVElNX1NUQVRFX1JFQURZIG9yIEhBTF9USU1fU1RBVEVfUkVTRVQgc3RhdGUsCkBAIC0xNTYsNiArMTYzLDcgQEAKICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcwogICAgICAgdXNpbmcgQHJlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soKSBiZWZvcmUgY2FsbGluZyBEZUluaXQgb3IgSW5pdCBmdW5jdGlvbi4KIAorICBbLi5dCiAgICAgICBXaGVuIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9USU1fUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgYW5kIGFsbCBjYWxsYmFja3MKICAgICAgIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd2VhayBmdW5jdGlvbnMuCkBAIC0yMTYsNyArMjI0LDcgQEAKIHN0YXRpYyB2b2lkIFRJTV9ETUFUcmlnZ2VyQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBUSU1fRE1BVHJpZ2dlckhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBUSU1fU2xhdmVUaW1lcl9TZXRDb25maWcoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNX1NsYXZlQ29uZmlnVHlwZURlZiAqc1NsYXZlQ29uZmlnKTsKIC8qKgogICAqIEB9CiAgICovCkBAIC0yMjcsOCArMjM1LDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBUSU0gVGltZSBCYXNlIGZ1bmN0aW9ucwotICogIEBicmllZiAgICBUaW1lIEJhc2UgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgVGltZSBCYXNlIGZ1bmN0aW9ucworICAqCiBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICMjIyMjIFRpbWUgQmFzZSBmdW5jdGlvbnMgIyMjIyMKQEAgLTQ4MiwxMSArNDkwLDExIEBACiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKICAgICB7CkBAIC01NTksOCArNTY3LDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMKLSAqCisgICogIEBicmllZiAgICBUSU0gT3V0cHV0IENvbXBhcmUgZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBPdXRwdXQgQ29tcGFyZSBmdW5jdGlvbnMgIyMjIyMKQEAgLTkyOSwxNiArOTM3LDE2IEBACiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX09DX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBMZW5ndGgpCiB7Ci0gICB1aW50MzJfdCB0bXBzbWNyOworICB1aW50MzJfdCB0bXBzbWNyOwogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKICAgICB7CkBAIC0xMTM2LDggKzExNDQsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAzIFRJTSBQV00gZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRJTSBQV00gZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgVElNIFBXTSBmdW5jdGlvbnMKKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBUSU0gUFdNIGZ1bmN0aW9ucyAjIyMjIwpAQCAtMTUxMywxMSArMTUyMSwxMSBAQAogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDWF9JTlNUQU5DRShodGltLT5JbnN0YW5jZSwgQ2hhbm5lbCkpOwogCi0gIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKSkKKyAgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkKICAgewogICAgIHJldHVybiBIQUxfQlVTWTsKICAgfQotICBlbHNlIGlmICgoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkpCisgIGVsc2UgaWYgKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpCiAgIHsKICAgICBpZiAoKHBEYXRhID09IE5VTEwpICYmIChMZW5ndGggPiAwVSkpCiAgICAgewpAQCAtMTcxNCw4ICsxNzIyLDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBUSU0gSW5wdXQgQ2FwdHVyZSBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgIyMjIyMgVElNIElucHV0IENhcHR1cmUgZnVuY3Rpb25zICMjIyMjCkBAIC0yMDYxLDExICsyMDY5LDExIEBACiAgIGFzc2VydF9wYXJhbShJU19USU1fQ0NYX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX0NDX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgocERhdGEgPT0gTlVMTCkgJiYgKExlbmd0aCA+IDBVKSkKICAgICB7CkBAIC0yMjQ5LDggKzIyNTcsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRJTSBPbmUgUHVsc2UgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMKKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIE9uZSBQdWxzZSBmdW5jdGlvbnMgIyMjIyMKQEAgLTI1NjMsOCArMjU3MSw4IEBACiAgICovCiAKIC8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDYgVElNIEVuY29kZXIgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucwotICoKKyAgKiAgQGJyaWVmICAgIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucworICAqCiBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFRJTSBFbmNvZGVyIGZ1bmN0aW9ucyAjIyMjIwpAQCAtMjYwOSwxNSArMjYxNywxNSBAQAogICB9CiAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOwogICBhc3NlcnRfcGFyYW0oSVNfVElNX0NPVU5URVJfTU9ERShodGltLT5Jbml0LkNvdW50ZXJNb2RlKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fQ0xPQ0tESVZJU0lPTl9ESVYoaHRpbS0+SW5pdC5DbG9ja0RpdmlzaW9uKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fQVVUT1JFTE9BRF9QUkVMT0FEKGh0aW0tPkluaXQuQXV0b1JlbG9hZFByZWxvYWQpKTsKLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX01PREUoc0NvbmZpZy0+RW5jb2Rlck1vZGUpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19TRUxFQ1RJT04oc0NvbmZpZy0+SUMxU2VsZWN0aW9uKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fSUNfU0VMRUNUSU9OKHNDb25maWctPklDMlNlbGVjdGlvbikpOwotICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX1BPTEFSSVRZKHNDb25maWctPklDMVBvbGFyaXR5KSk7Ci0gIGFzc2VydF9wYXJhbShJU19USU1fSUNfUE9MQVJJVFkoc0NvbmZpZy0+SUMyUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoc0NvbmZpZy0+SUMxUG9sYXJpdHkpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSSU5QVVRfUE9MQVJJVFkoc0NvbmZpZy0+SUMyUG9sYXJpdHkpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9JQ19QUkVTQ0FMRVIoc0NvbmZpZy0+SUMxUHJlc2NhbGVyKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fSUNfUFJFU0NBTEVSKHNDb25maWctPklDMlByZXNjYWxlcikpOwogICBhc3NlcnRfcGFyYW0oSVNfVElNX0lDX0ZJTFRFUihzQ29uZmlnLT5JQzFGaWx0ZXIpKTsKQEAgLTI3NzUsNyArMjc4Myw3IEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RhcnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90IENoYW5uZWwpCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCi0gIGFzc2VydF9wYXJhbShJU19USU1fQ0MyX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fRU5DT0RFUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKIAogICAvKiBFbmFibGUgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGNoYW5uZWxzICovCiAgIHN3aXRjaCAoQ2hhbm5lbCkKQEAgLTI4MTksNyArMjgyNyw3IEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOwogCiAgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgogICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCkBAIC0yODY1LDcgKzI4NzMsNyBAQAogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBDaGFubmVsKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwotICBhc3NlcnRfcGFyYW0oSVNfVElNX0NDMl9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CiAKICAgLyogRW5hYmxlIHRoZSBlbmNvZGVyIGludGVyZmFjZSBjaGFubmVscyAqLwogICAvKiBFbmFibGUgdGhlIGNhcHR1cmUgY29tcGFyZSBJbnRlcnJ1cHRzIDEgYW5kL29yIDIgKi8KQEAgLTI5MTUsNyArMjkyMyw3IEBACiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0VuY29kZXJfU3RvcF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQzJfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOwogCiAgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgogICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCkBAIC0yOTY2LDE2ICsyOTc0LDE3IEBACiAgICogQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gVElNIHBlcmlwaGVyYWwgdG8gbWVtb3J5LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwgdWludDMyX3QgKnBEYXRhMiwgdWludDE2X3QgTGVuZ3RoKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9FbmNvZGVyX1N0YXJ0X0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCwgdWludDMyX3QgKnBEYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBEYXRhMiwgdWludDE2X3QgTGVuZ3RoKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwotICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9DQ19JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOworICBhc3NlcnRfcGFyYW0oSVNfVElNX0VOQ09ERVJfSU5URVJGQUNFX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgoKChwRGF0YTEgPT0gTlVMTCkgfHwgKHBEYXRhMiA9PSBOVUxMKSkpICYmIChMZW5ndGggPiAwVSkpCiAgICAgewpAQCAtMzEwMyw3ICszMTEyLDcgQEAKIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRW5jb2Rlcl9TdG9wX0RNQShUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQ2hhbm5lbCkKIHsKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfQ0NfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX1RJTV9FTkNPREVSX0lOVEVSRkFDRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpOwogCiAgIC8qIERpc2FibGUgdGhlIElucHV0IENhcHR1cmUgY2hhbm5lbHMgMSBhbmQgMgogICAgIChpbiB0aGUgRW5jb2RlckludGVyZmFjZSB0aGUgdHdvIHBvc3NpYmxlIGNoYW5uZWxzIHRoYXQgY2FuIGJlIHVzZWQgYXJlIFRJTV9DSEFOTkVMXzEgYW5kIFRJTV9DSEFOTkVMXzIpICovCkBAIC0zMTQ5LDggKzMxNTgsOCBAQAogICAqIEB9CiAgICovCiAvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA3IFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50Ci0gKiAgQGJyaWVmICAgIFRJTSBJUlEgaGFuZGxlciBtYW5hZ2VtZW50Ci0gKgorICAqICBAYnJpZWYgICAgVElNIElSUSBoYW5kbGVyIG1hbmFnZW1lbnQKKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAjIyMjIwpAQCAtMzM2Myw4ICszMzcyLDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBUSU1fRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwOCBUSU0gUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwotICogIEBicmllZiAgICBUSU0gUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucwotICoKKyAgKiAgQGJyaWVmICAgIFRJTSBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCkBAIC0zNzM4LDkgKzM3NDcsMTQgQEAKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgQGFyZyBUSU1fQ0hBTk5FTF8xOiBUSU0gQ2hhbm5lbCAxIHNlbGVjdGVkCiAgICogICAgICAgICAgICBAYXJnIFRJTV9DSEFOTkVMXzI6IFRJTSBDaGFubmVsIDIgc2VsZWN0ZWQKKyAgKiBAbm90ZSAgVG8gb3V0cHV0IGEgd2F2ZWZvcm0gd2l0aCBhIG1pbmltdW0gZGVsYXkgdXNlciBjYW4gZW5hYmxlIHRoZSBmYXN0CisgICogICAgICAgIG1vZGUgYnkgY2FsbGluZyB0aGUgQHJlZiBfX0hBTF9USU1fRU5BQkxFX09DeEZBU1QgbWFjcm8uIFRoZW4gQ0N4CisgICogICAgICAgIG91dHB1dCBpcyBmb3JjZWQgaW4gcmVzcG9uc2UgdG8gdGhlIGVkZ2UgZGV0ZWN0aW9uIG9uIFRJeCBpbnB1dCwKKyAgKiAgICAgICAgd2l0aG91dCB0YWtpbmcgaW4gYWNjb3VudCB0aGUgY29tcGFyaXNvbi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZiAqc0NvbmZpZywgdWludDMyX3QgT3V0cHV0Q2hhbm5lbCwgIHVpbnQzMl90IElucHV0Q2hhbm5lbCkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fT25lUHVsc2VfQ29uZmlnQ2hhbm5lbChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgIFRJTV9PbmVQdWxzZV9Jbml0VHlwZURlZiAqc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPdXRwdXRDaGFubmVsLCAgdWludDMyX3QgSW5wdXRDaGFubmVsKQogewogICBUSU1fT0NfSW5pdFR5cGVEZWYgdGVtcDE7CiAKQEAgLTM4OTQsMTEgKzM5MDgsMTEgQEAKICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfU09VUkNFKEJ1cnN0UmVxdWVzdFNyYykpOwogICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQV9MRU5HVEgoQnVyc3RMZW5ndGgpKTsKIAotICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpCiAgIHsKICAgICByZXR1cm4gSEFMX0JVU1k7CiAgIH0KLSAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKQogICB7CiAgICAgaWYgKChCdXJzdEJ1ZmZlciA9PSBOVUxMKSAmJiAoQnVyc3RMZW5ndGggPiAwVSkpCiAgICAgewpAQCAtMzk0MSw3ICszOTU1LDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CiAKICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHN0cmVhbSAqLwotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMV0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzFdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtMzk1Nyw3ICszOTcyLDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CiAKICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHN0cmVhbSAqLwotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDMl0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtMzk3Myw3ICszOTg5LDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CiAKICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHN0cmVhbSAqLwotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDM10sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzNdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtMzk4OSw3ICs0MDA2LDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLT5YZmVyRXJyb3JDYWxsYmFjayA9IFRJTV9ETUFFcnJvciA7CiAKICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHN0cmVhbSAqLwotICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX0NDNF0sICh1aW50MzJfdClCdXJzdEJ1ZmZlciwgKHVpbnQzMl90KSZodGltLT5JbnN0YW5jZS0+RE1BUiwgKChCdXJzdExlbmd0aCkgPj4gOFUpICsgMVUpICE9IEhBTF9PSykKKyAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DQzRdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtNDAwNSw3ICs0MDIzLDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9DT01NVVRBVElPTl0tPlhmZXJFcnJvckNhbGxiYWNrID0gVElNX0RNQUVycm9yIDsKIAogICAgICAgLyogRW5hYmxlIHRoZSBETUEgc3RyZWFtICovCi0gICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLCAodWludDMyX3QpQnVyc3RCdWZmZXIsICh1aW50MzJfdCkmaHRpbS0+SW5zdGFuY2UtPkRNQVIsICgoQnVyc3RMZW5ndGgpID4+IDhVKSArIDFVKSAhPSBIQUxfT0spCisgICAgICBpZiAoSEFMX0RNQV9TdGFydF9JVChodGltLT5oZG1hW1RJTV9ETUFfSURfQ09NTVVUQVRJT05dLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtNDAyMSw3ICs0MDQwLDggQEAKICAgICAgIGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXS0+WGZlckVycm9yQ2FsbGJhY2sgPSBUSU1fRE1BRXJyb3IgOwogCiAgICAgICAvKiBFbmFibGUgdGhlIERNQSBzdHJlYW0gKi8KLSAgICAgIGlmIChIQUxfRE1BX1N0YXJ0X0lUKGh0aW0tPmhkbWFbVElNX0RNQV9JRF9UUklHR0VSXSwgKHVpbnQzMl90KUJ1cnN0QnVmZmVyLCAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQorICAgICAgaWYgKEhBTF9ETUFfU3RhcnRfSVQoaHRpbS0+aGRtYVtUSU1fRE1BX0lEX1RSSUdHRVJdLCAodWludDMyX3QpQnVyc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpJmh0aW0tPkluc3RhbmNlLT5ETUFSLCAoKEJ1cnN0TGVuZ3RoKSA+PiA4VSkgKyAxVSkgIT0gSEFMX09LKQogICAgICAgewogICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgfQpAQCAtNDE1MSw4ICs0MTcxLDggQEAKICAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIEJ1cnN0TGVuZ3RoIGlzIGVxdWFsIHRvIERNQSBkYXRhIHRyYW5zZmVyIGxlbmd0aC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fRE1BQnVyc3RfUmVhZFN0YXJ0KFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCBCdXJzdEJhc2VBZGRyZXNzLCB1aW50MzJfdCBCdXJzdFJlcXVlc3RTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgKkJ1cnN0QnVmZmVyLCB1aW50MzJfdCAgQnVyc3RMZW5ndGgpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX0RNQUJ1cnN0X1JlYWRTdGFydChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgQnVyc3RCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJ1cnN0UmVxdWVzdFNyYywgdWludDMyX3QgICpCdXJzdEJ1ZmZlciwgdWludDMyX3QgIEJ1cnN0TGVuZ3RoKQogewogICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogICBhc3NlcnRfcGFyYW0oSVNfVElNX0RNQUJVUlNUX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CkBAIC00MTYwLDExICs0MTgwLDExIEBACiAgIGFzc2VydF9wYXJhbShJU19USU1fRE1BX1NPVVJDRShCdXJzdFJlcXVlc3RTcmMpKTsKICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9ETUFfTEVOR1RIKEJ1cnN0TGVuZ3RoKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgoQnVyc3RCdWZmZXIgPT0gTlVMTCkgJiYgKEJ1cnN0TGVuZ3RoID4gMFUpKQogICAgIHsKQEAgLTQ0NjUsNyArNDQ4NSw3IEBACiAgICAgICAvKiBXaGVuIE9DUmVmIGNsZWFyIGZlYXR1cmUgaXMgdXNlZCB3aXRoIEVUUiBzb3VyY2UsIEVUUiBwcmVzY2FsZXIgbXVzdCBiZSBvZmYgKi8KICAgICAgIGlmIChzQ2xlYXJJbnB1dENvbmZpZy0+Q2xlYXJJbnB1dFByZXNjYWxlciAhPSBUSU1fQ0xFQVJJTlBVVFBSRVNDQUxFUl9ESVYxKQogICAgICAgewotICAgICAgICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKKyAgICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOwogICAgICAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CiAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICB9CkBAIC00NzgwLDkgKzQ4MDAsOSBAQAogCiAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9CVVNZOwogCi0gIGlmKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKKyAgaWYgKFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhodGltLCBzU2xhdmVDb25maWcpICE9IEhBTF9PSykKICAgewotICAgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOworICAgIGh0aW0tPlN0YXRlID0gSEFMX1RJTV9TVEFURV9SRUFEWTsKICAgICBfX0hBTF9VTkxPQ0soaHRpbSk7CiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQpAQCAtNDgxMCw3ICs0ODMwLDcgQEAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1fU2xhdmVDb25maWdTeW5jaHJvX0lUKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fU0xBVkVfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKQEAgLTQ4MjEsOSArNDg0MSw5IEBACiAKICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX0JVU1k7CiAKLSAgaWYoVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKGh0aW0sIHNTbGF2ZUNvbmZpZykgIT0gSEFMX09LKQorICBpZiAoVElNX1NsYXZlVGltZXJfU2V0Q29uZmlnKGh0aW0sIHNTbGF2ZUNvbmZpZykgIT0gSEFMX09LKQogICB7Ci0gICAgICBodGltLT5TdGF0ZSA9IEhBTF9USU1fU1RBVEVfUkVBRFk7CisgICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOwogICAgIF9fSEFMX1VOTE9DSyhodGltKTsKICAgICByZXR1cm4gSEFMX0VSUk9SOwogICB9CkBAIC00OTEzLDggKzQ5MzMsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFRJTV9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA5IFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgIFRJTSBDYWxsYmFja3MgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMKKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgVElNIENhbGxiYWNrcyBmdW5jdGlvbnMgIyMjIyMKQEAgLTUxMTgsNyArNTEzOCw4IEBACiAgICogICAgICAgICAgQHBhcmFtIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAqICAgICAgICAgIEByZXR2YWwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNX1JlZ2lzdGVyQ2FsbGJhY2soVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIEhBTF9USU1fQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCwgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTV9SZWdpc3RlckNhbGxiYWNrKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCBIQUxfVElNX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRJTV9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAKQEAgLTU1NzgsOCArNTU5OSw4IEBACiAgICovCiAKIC8qKiBAZGVmZ3JvdXAgVElNX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDEwIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucwotICogIEBicmllZiAgIFRJTSBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucwotICoKKyAgKiAgQGJyaWVmICAgVElNIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zICMjIyMjCkBAIC02MzY1LDcgKzYzODYsNyBAQAogICAqIEByZXR2YWwgTm9uZQogICAqLwogc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFRJTV9TbGF2ZVRpbWVyX1NldENvbmZpZyhUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fU2xhdmVDb25maWdUeXBlRGVmICpzU2xhdmVDb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9TbGF2ZUNvbmZpZ1R5cGVEZWYgKnNTbGF2ZUNvbmZpZykKIHsKICAgdWludDMyX3QgdG1wc21jcjsKICAgdWludDMyX3QgdG1wY2NtcjE7CmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2hhbF90aW1fZXguYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3RpbV9leC5jCmluZGV4IDE4OTU0MTQuLjdkZDkxZGYgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3RpbV9leC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfaGFsX3RpbV9leC5jCkBAIC03Myw3ICs3Myw3IEBACiAgICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCisgICovCiAKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2hhbC5oIgpAQCAtMzk3LDExICszOTcsMTEgQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9IQUxMX1NFTlNPUl9JTlRFUkZBQ0VfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKIAotICBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfQlVTWSkpCisgIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpCiAgIHsKICAgICByZXR1cm4gSEFMX0JVU1k7CiAgIH0KLSAgZWxzZSBpZiAoKGh0aW0tPlN0YXRlID09IEhBTF9USU1fU1RBVEVfUkVBRFkpKQorICBlbHNlIGlmIChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKQogICB7CiAgICAgaWYgKCgodWludDMyX3QpcERhdGEgPT0gMFUpICYmIChMZW5ndGggPiAwVSkpCiAgICAgewpAQCAtNzA5LDExICs3MDksMTEgQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgoKHVpbnQzMl90KXBEYXRhID09IDBVKSAmJiAoTGVuZ3RoID4gMFUpKQogICAgIHsKQEAgLTExMTcsMTEgKzExMTcsMTEgQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1RJTV9DQ1hOX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlLCBDaGFubmVsKSk7CiAKLSAgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX0JVU1kpKQorICBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9CVVNZKQogICB7CiAgICAgcmV0dXJuIEhBTF9CVVNZOwogICB9Ci0gIGVsc2UgaWYgKChodGltLT5TdGF0ZSA9PSBIQUxfVElNX1NUQVRFX1JFQURZKSkKKyAgZWxzZSBpZiAoaHRpbS0+U3RhdGUgPT0gSEFMX1RJTV9TVEFURV9SRUFEWSkKICAgewogICAgIGlmICgoKHVpbnQzMl90KXBEYXRhID09IDBVKSAmJiAoTGVuZ3RoID4gMFUpKQogICAgIHsKQEAgLTE0NjYsNyArMTQ2Niw4IEBACiAgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkgc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKQEAgLTE1MjEsNyArMTUyMiw4IEBACiAgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkgc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfSVQoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sIHVpbnQzMl90ICBJbnB1dFRyaWdnZXIsIHVpbnQzMl90ICBDb21tdXRhdGlvblNvdXJjZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9USU1FeF9Db25maWdDb21tdXRFdmVudF9JVChUSU1fSGFuZGxlVHlwZURlZiAqaHRpbSwgdWludDMyX3QgIElucHV0VHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKQEAgLTE1NzcsNyArMTU3OSw4IEBACiAgICogICAgICAgICAgICBAYXJnIFRJTV9DT01NVVRBVElPTl9TT0ZUV0FSRTogIENvbW11dGF0aW9uIHNvdXJjZSBpcyBzZXQgYnkgc29mdHdhcmUgdXNpbmcgdGhlIENPTUcgYml0CiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLCB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVElNRXhfQ29uZmlnQ29tbXV0RXZlbnRfRE1BKFRJTV9IYW5kbGVUeXBlRGVmICpodGltLCB1aW50MzJfdCAgSW5wdXRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgQ29tbXV0YXRpb25Tb3VyY2UpCiB7CiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fQ09NTVVUQVRJT05fRVZFTlRfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKQEAgLTE2MzIsNyArMTYzNSw3IEBACiAgIHVpbnQzMl90IHRtcHNtY3I7CiAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX1RJTV9TWU5DSFJPX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CisgIGFzc2VydF9wYXJhbShJU19USU1fTUFTVEVSX0lOU1RBTkNFKGh0aW0tPkluc3RhbmNlKSk7CiAgIGFzc2VydF9wYXJhbShJU19USU1fVFJHT19TT1VSQ0Uoc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcikpOwogICBhc3NlcnRfcGFyYW0oSVNfVElNX01TTV9TVEFURShzTWFzdGVyQ29uZmlnLT5NYXN0ZXJTbGF2ZU1vZGUpKTsKIApAQCAtMTY2NSwxNiArMTY2OCwxOSBAQAogICAvKiBTZWxlY3QgdGhlIFRSR08gc291cmNlICovCiAgIHRtcGNyMiB8PSAgc01hc3RlckNvbmZpZy0+TWFzdGVyT3V0cHV0VHJpZ2dlcjsKIAotICAvKiBSZXNldCB0aGUgTVNNIEJpdCAqLwotICB0bXBzbWNyICY9IH5USU1fU01DUl9NU007Ci0gIC8qIFNldCBtYXN0ZXIgbW9kZSAqLwotICB0bXBzbWNyIHw9IHNNYXN0ZXJDb25maWctPk1hc3RlclNsYXZlTW9kZTsKLQogICAvKiBVcGRhdGUgVElNeCBDUjIgKi8KICAgaHRpbS0+SW5zdGFuY2UtPkNSMiA9IHRtcGNyMjsKIAotICAvKiBVcGRhdGUgVElNeCBTTUNSICovCi0gIGh0aW0tPkluc3RhbmNlLT5TTUNSID0gdG1wc21jcjsKKyAgaWYgKElTX1RJTV9TTEFWRV9JTlNUQU5DRShodGltLT5JbnN0YW5jZSkpCisgIHsKKyAgICAvKiBSZXNldCB0aGUgTVNNIEJpdCAqLworICAgIHRtcHNtY3IgJj0gflRJTV9TTUNSX01TTTsKKyAgICAvKiBTZXQgbWFzdGVyIG1vZGUgKi8KKyAgICB0bXBzbWNyIHw9IHNNYXN0ZXJDb25maWctPk1hc3RlclNsYXZlTW9kZTsKKworICAgIC8qIFVwZGF0ZSBUSU14IFNNQ1IgKi8KKyAgICBodGltLT5JbnN0YW5jZS0+U01DUiA9IHRtcHNtY3I7CisgIH0KIAogICAvKiBDaGFuZ2UgdGhlIGh0aW0gc3RhdGUgKi8KICAgaHRpbS0+U3RhdGUgPSBIQUxfVElNX1NUQVRFX1JFQURZOwpAQCAtMTY5MCw2ICsxNjk2LDkgQEAKICAgKiBAcGFyYW0gIGh0aW0gVElNIGhhbmRsZQogICAqIEBwYXJhbSAgc0JyZWFrRGVhZFRpbWVDb25maWcgcG9pbnRlciB0byBhIFRJTV9Db25maWdCcmVha0RlYWRDb25maWdUeXBlRGVmIHN0cnVjdHVyZSB0aGF0CiAgICogICAgICAgICBjb250YWlucyB0aGUgQkRUUiBSZWdpc3RlciBjb25maWd1cmF0aW9uICBpbmZvcm1hdGlvbiBmb3IgdGhlIFRJTSBwZXJpcGhlcmFsLgorICAqIEBub3RlICAgSW50ZXJydXB0cyBjYW4gYmUgZ2VuZXJhdGVkIHdoZW4gYW4gYWN0aXZlIGxldmVsIGlzIGRldGVjdGVkIG9uIHRoZQorICAqICAgICAgICAgYnJlYWsgaW5wdXQsIHRoZSBicmVhayAyIGlucHV0IG9yIHRoZSBzeXN0ZW0gYnJlYWsgaW5wdXQuIEJyZWFrCisgICogICAgICAgICBpbnRlcnJ1cHQgY2FuIGJlIGVuYWJsZWQgYnkgY2FsbGluZyB0aGUgQHJlZiBfX0hBTF9USU1fRU5BQkxFX0lUIG1hY3JvLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1RJTUV4X0NvbmZpZ0JyZWFrRGVhZFRpbWUoVElNX0hhbmRsZVR5cGVEZWYgKmh0aW0sCkBAIC0xNzYzLDEwICsxNzcyLDEwIEBACiAKIHsKICAgdWludDMyX3QgdG1wb3J4OwotICB1aW50MzJfdCBia2luX2VuYWJsZV9tYXNrID0gMFU7Ci0gIHVpbnQzMl90IGJraW5fcG9sYXJpdHlfbWFzayA9IDBVOwotICB1aW50MzJfdCBia2luX2VuYWJsZV9iaXRwb3MgPSAwVTsKLSAgdWludDMyX3QgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSAwVTsKKyAgdWludDMyX3QgYmtpbl9lbmFibGVfbWFzazsKKyAgdWludDMyX3QgYmtpbl9wb2xhcml0eV9tYXNrOworICB1aW50MzJfdCBia2luX2VuYWJsZV9iaXRwb3M7CisgIHVpbnQzMl90IGJraW5fcG9sYXJpdHlfYml0cG9zOwogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19USU1fQlJFQUtfSU5TVEFOQ0UoaHRpbS0+SW5zdGFuY2UpKTsKQEAgLTE4MDAsMTEgKzE4MDksMTkgQEAKICAgICB7CiAgICAgICBia2luX2VuYWJsZV9tYXNrID0gVElNMV9BRjFfQktERjFCS0U7CiAgICAgICBia2luX2VuYWJsZV9iaXRwb3MgPSA4OworICAgICAgYmtpbl9wb2xhcml0eV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X2JpdHBvcyA9IDBVOwogICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICBia2luX2VuYWJsZV9tYXNrID0gMFU7CisgICAgICBia2luX3BvbGFyaXR5X21hc2sgPSAwVTsKKyAgICAgIGJraW5fZW5hYmxlX2JpdHBvcyA9IDBVOworICAgICAgYmtpbl9wb2xhcml0eV9iaXRwb3MgPSAwVTsKICAgICAgIGJyZWFrOworICAgIH0KICAgfQogCiAgIHN3aXRjaCAoQnJlYWtJbnB1dCkKQEAgLTIwNTQsNyArMjA3MSw3IEBACiAgICovCiAKIC8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGRlZmdyb3VwIFRJTUV4X1ByaXZhdGVfRnVuY3Rpb25zIFRJTSBFeHRlbmRlZCBQcml2YXRlIEZ1bmN0aW9ucworLyoqIEBkZWZncm91cCBUSU1FeF9Qcml2YXRlX0Z1bmN0aW9ucyBUSU1FeCBQcml2YXRlIEZ1bmN0aW9ucwogICAqIEB7CiAgICovCiAKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3VhcnQuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3VhcnQuYwppbmRleCA5YjA5YmRiLi4wZTU1N2RlIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF91YXJ0LmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfdWFydC5jCkBAIC0zMjYsNyArMzI2LDYgQEAKIAogICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKIAotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CiAKICAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLwpAQCAtMzQ2LDcgKzM0NSw2IEBACiAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMiwgKFVTQVJUX0NSMl9MSU5FTiB8IFVTQVJUX0NSMl9DTEtFTikpOwogICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIChVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKSk7CiAKLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKIAogICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLwpAQCAtMzkzLDcgKzM5MSw2IEBACiAKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CiAKLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOwogCiAgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KQEAgLTQxNiw3ICs0MTMsNiBAQAogICAvKiBFbmFibGUgdGhlIEhhbGYtRHVwbGV4IG1vZGUgYnkgc2V0dGluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8KICAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0hEU0VMKTsKIAotICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfVUFSVF9FTkFCTEUoaHVhcnQpOwogCiAgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1YXJ0LT5nU3RhdGUgYW5kIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCkBAIC00ODEsNyArNDc3LDYgQEAKIAogICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKIAotICAvKiBEaXNhYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX1VBUlRfRElTQUJMRShodWFydCk7CiAKICAgLyogU2V0IHRoZSBVQVJUIENvbW11bmljYXRpb24gcGFyYW1ldGVycyAqLwpAQCAtNTA3LDcgKzUwMiw2IEBACiAgIC8qIFNldCB0aGUgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBsZW5ndGguICovCiAgIE1PRElGWV9SRUcoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9MQkRMLCBCcmVha0RldGVjdExlbmd0aCk7CiAKLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKIAogICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLwpAQCAtNTY3LDcgKzU2MSw2IEBACiAKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CiAKLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOwogCiAgIC8qIFNldCB0aGUgVUFSVCBDb21tdW5pY2F0aW9uIHBhcmFtZXRlcnMgKi8KQEAgLTU5Niw3ICs1ODksNiBAQAogICAvKiBTZXQgdGhlIHdha2UgdXAgbWV0aG9kIGJ5IHNldHRpbmcgdGhlIFdBS0UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8KICAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1dBS0UsIFdha2VVcE1ldGhvZCk7CiAKLSAgLyogRW5hYmxlIHRoZSBQZXJpcGhlcmFsICovCiAgIF9fSEFMX1VBUlRfRU5BQkxFKGh1YXJ0KTsKIAogICAvKiBURUFDSyBhbmQvb3IgUkVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodWFydC0+Z1N0YXRlIGFuZCBodWFydC0+UnhTdGF0ZSB0byBSZWFkeSAqLwpAQCAtNjIyLDcgKzYxNCw2IEBACiAKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CiAKLSAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogICBfX0hBTF9VQVJUX0RJU0FCTEUoaHVhcnQpOwogCiAgIGh1YXJ0LT5JbnN0YW5jZS0+Q1IxID0gMHgwVTsKQEAgLTY0NSw3ICs2MzYsNiBAQAogICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CiAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVTRVQ7CiAKLSAgLyogUHJvY2VzcyBVbmxvY2sgKi8KICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAogICByZXR1cm4gSEFMX09LOwpAQCAtNzA0LDE4ICs2OTQsMTggQEAKICAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfUmVnaXN0ZXJDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBIQUxfVUFSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVUFSVF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQogewogICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAKICAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQogICB7Ci0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogCiAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgfQotICAvKiBQcm9jZXNzIGxvY2tlZCAqLworCiAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgIGlmIChodWFydC0+Z1N0YXRlID09IEhBTF9VQVJUX1NUQVRFX1JFQURZKQpAQCAtNzY4LDEwICs3NTgsOCBAQAogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAKLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC03ODksMjQgKzc3NywxOSBAQAogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgICAgICBodWFydC0+RXJyb3JDb2RlIHw9IEhBTF9VQVJUX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAKLSAgICAgICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICAgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgZWxzZQogICB7Ci0gICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogCi0gICAgLyogUmV0dXJuIGVycm9yIHN0YXR1cyAqLwogICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgIH0KIAotICAvKiBSZWxlYXNlIExvY2sgKi8KICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAogICByZXR1cm4gc3RhdHVzOwpAQCAtODM3LDcgKzgyMCw2IEBACiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIAotICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICBfX0hBTF9MT0NLKGh1YXJ0KTsKIAogICBpZiAoSEFMX1VBUlRfU1RBVEVfUkVBRFkgPT0gaHVhcnQtPmdTdGF0ZSkKQEAgLTg3Niw2ICs4NTgsMTIgQEAKICAgICAgICAgaHVhcnQtPkFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayA9IEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgICAvKiBMZWdhY3kgd2VhayBBYm9ydFJlY2VpdmVDcGx0Q2FsbGJhY2sgICovCiAgICAgICAgIGJyZWFrOwogCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKyAgICAgIGNhc2UgSEFMX1VBUlRfV0FLRVVQX0NCX0lEIDoKKyAgICAgICAgaHVhcnQtPldha2V1cENhbGxiYWNrID0gSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjazsgICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayBXYWtldXBDYWxsYmFjayAgICAgICAgICAgICovCisgICAgICAgIGJyZWFrOworCisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KICAgICAgIGNhc2UgSEFMX1VBUlRfTVNQSU5JVF9DQl9JRCA6CiAgICAgICAgIGh1YXJ0LT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfVUFSVF9Nc3BJbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgTXNwSW5pdENhbGxiYWNrICAgICAgICAgICAqLwogICAgICAgICBicmVhazsKQEAgLTg4NSwxMCArODczLDggQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQgOgotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtOTA2LDI0ICs4OTIsMTkgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQgOgotICAgICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogCi0gICAgICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKIAotICAgIC8qIFJldHVybiBlcnJvciBzdGF0dXMgKi8KICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogICB9CiAKLSAgLyogUmVsZWFzZSBMb2NrICovCiAgIF9fSEFMX1VOTE9DSyhodWFydCk7CiAKICAgcmV0dXJuIHN0YXR1czsKQEAgLTk5Miw2ICs5NzMsMTEgQEAKICAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0Q3BsdENhbGxiYWNrKCkKICAgICAgICAgKCspIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRDcGx0Q2FsbGJhY2soKQogICAgICAgICAoKykgSEFMX1VBUlRfQWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrKCkKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorCisgICAgKCMpIFdha2V1cCBmcm9tIFN0b3AgbW9kZSBDYWxsYmFjazoKKyAgICAgICAgKCspIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2soKQorI2VuZGlmCiAKICAgICAoIykgSW4gTm9uLUJsb2NraW5nIG1vZGUgdHJhbnNmZXJzLCBwb3NzaWJsZSBlcnJvcnMgYXJlIHNwbGl0IGludG8gMiBjYXRlZ29yaWVzLgogICAgICAgICBFcnJvcnMgYXJlIGhhbmRsZWQgYXMgZm9sbG93cyA6CkBAIC0xMDEzLDkgKzk5OSwxMiBAQAogCiAvKioKICAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgc2VudCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgcHJvdmlkZWQgdGhyb3VnaCBwRGF0YS4KICAgKiBAcGFyYW0gaHVhcnQgICBVQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSBTaXplICAgIEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQuCisgICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSBTaXplICAgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuCiAgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTEwMzMsNyArMTAyMiw2IEBACiAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKICAgICB9CiAKLSAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CkBAIC0xMDQ1LDcgKzEwMzMsNyBAQAogICAgIGh1YXJ0LT5UeFhmZXJTaXplICA9IFNpemU7CiAgICAgaHVhcnQtPlR4WGZlckNvdW50ID0gU2l6ZTsKIAotICAgICAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KKyAgICAvKiBJbiBjYXNlIG9mIDliaXRzL05vIFBhcml0eSB0cmFuc2ZlciwgcERhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBhcyBhIHVpbnQxNl90IHBvaW50ZXIgKi8KICAgICBpZiAoKGh1YXJ0LT5Jbml0LldvcmRMZW5ndGggPT0gVUFSVF9XT1JETEVOR1RIXzlCKSAmJiAoaHVhcnQtPkluaXQuUGFyaXR5ID09IFVBUlRfUEFSSVRZX05PTkUpKQogICAgIHsKICAgICAgIHBkYXRhOGJpdHMgID0gTlVMTDsKQEAgLTEwNTcsNiArMTA0NSw4IEBACiAgICAgICBwZGF0YTE2Yml0cyA9IE5VTEw7CiAgICAgfQogCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKwogICAgIHdoaWxlIChodWFydC0+VHhYZmVyQ291bnQgPiAwVSkKICAgICB7CiAgICAgICBpZiAoVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KGh1YXJ0LCBVQVJUX0ZMQUdfVFhFLCBSRVNFVCwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCkBAIC0xMDg0LDkgKzEwNzQsNiBAQAogICAgIC8qIEF0IGVuZCBvZiBUeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5nU3RhdGUgdG8gUmVhZHkgKi8KICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAKLSAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCi0gICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKLQogICAgIHJldHVybiBIQUxfT0s7CiAgIH0KICAgZWxzZQpAQCAtMTA5Nyw5ICsxMDg0LDEyIEBACiAKIC8qKgogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIHRoZSByZWNlaXZlZCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcERhdGEuCiAgICogQHBhcmFtIGh1YXJ0ICAgVUFSVCBoYW5kbGUuCi0gICogQHBhcmFtIHBEYXRhICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSAgICBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gcERhdGEgICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtIFNpemUgICAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuCiAgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTExMTgsNyArMTEwOCw2IEBACiAgICAgICByZXR1cm4gIEhBTF9FUlJPUjsKICAgICB9CiAKLSAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CkBAIC0xMTQ2LDYgKzExMzUsOCBAQAogICAgICAgcGRhdGExNmJpdHMgPSBOVUxMOwogICAgIH0KIAorICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKICAgICAvKiBhcyBsb25nIGFzIGRhdGEgaGF2ZSB0byBiZSByZWNlaXZlZCAqLwogICAgIHdoaWxlIChodWFydC0+UnhYZmVyQ291bnQgPiAwVSkKICAgICB7CkBAIC0xMTY5LDkgKzExNjAsNiBAQAogICAgIC8qIEF0IGVuZCBvZiBSeCBwcm9jZXNzLCByZXN0b3JlIGh1YXJ0LT5SeFN0YXRlIHRvIFJlYWR5ICovCiAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKIAotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KLSAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOwotCiAgICAgcmV0dXJuIEhBTF9PSzsKICAgfQogICBlbHNlCkBAIC0xMTgyLDkgKzExNzAsMTIgQEAKIAogLyoqCiAgICogQGJyaWVmIFNlbmQgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIHRoZSBzZW50IGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIKKyAgKiAgICAgICAgIG9mIHUxNiBwcm92aWRlZCB0aHJvdWdoIHBEYXRhLgogICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfVHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMTk3LDcgKzExODgsNiBAQAogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAKLSAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgID0gcERhdGE7CkBAIC0xMjE4LDcgKzEyMDgsNiBAQAogICAgICAgaHVhcnQtPlR4SVNSID0gVUFSVF9UeElTUl84QklUOwogICAgIH0KIAotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgICAgLyogRW5hYmxlIHRoZSBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyIEVtcHR5IGludGVycnVwdCAqLwpAQCAtMTIzNCw5ICsxMjIzLDEyIEBACiAKIC8qKgogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBEYXRhLgogICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0lUKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQ4X3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQpAQCAtMTI0OSw3ICsxMjQxLDYgQEAKICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgfQogCi0gICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgICBfX0hBTF9MT0NLKGh1YXJ0KTsKIAogICAgIGh1YXJ0LT5wUnhCdWZmUHRyICA9IHBEYXRhOwpAQCAtMTI3Niw3ICsxMjY3LDYgQEAKICAgICAgIGh1YXJ0LT5SeElTUiA9IFVBUlRfUnhJU1JfOEJJVDsKICAgICB9CiAKLSAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAogICAgIC8qIEVuYWJsZSB0aGUgVUFSVCBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGFuZCBEYXRhIFJlZ2lzdGVyIE5vdCBFbXB0eSBpbnRlcnJ1cHQgKi8KQEAgLTEyOTIsOSArMTI4MiwxMiBAQAogCiAvKioKICAgKiBAYnJpZWYgU2VuZCBhbiBhbW91bnQgb2YgZGF0YSBpbiBETUEgbW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gVUFSVCBwYXJpdHkgaXMgbm90IGVuYWJsZWQgKFBDRSA9IDApLCBhbmQgV29yZCBMZW5ndGggaXMgY29uZmlndXJlZCB0byA5IGJpdHMgKE0xLU0wID0gMDEpLAorICAqICAgICAgICAgdGhlIHNlbnQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IHByb3ZpZGVkIHRocm91Z2ggcERhdGEuCiAgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgotICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSBTaXplICBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtIFNpemUgIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9UcmFuc21pdF9ETUEoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDhfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMzA3LDcgKzEzMDAsNiBAQAogICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICB9CiAKLSAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgICAgaHVhcnQtPnBUeEJ1ZmZQdHIgID0gcERhdGE7CkBAIC0xMzM3LDcgKzEzMjksNiBAQAogICAgICAgICAvKiBTZXQgZXJyb3IgY29kZSB0byBETUEgKi8KICAgICAgICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX0RNQTsKIAotICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CiAKICAgICAgICAgLyogUmVzdG9yZSBodWFydC0+Z1N0YXRlIHRvIHJlYWR5ICovCkBAIC0xMzQ5LDcgKzEzNDAsNiBAQAogICAgIC8qIENsZWFyIHRoZSBUQyBmbGFnIGluIHRoZSBJQ1IgcmVnaXN0ZXIgKi8KICAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfVENGKTsKIAotICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgRE1BVCBiaXQKQEAgLTEzNjgsOSArMTM1OCwxMiBAQAogICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgogICAqIEBub3RlICAgV2hlbiB0aGUgVUFSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4KICAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBEYXRhLgogICAqIEBwYXJhbSBodWFydCBVQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQuCisgICogQHBhcmFtIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gU2l6ZSAgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9SZWNlaXZlX0RNQShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCB1aW50OF90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKQEAgLTEzODMsNyArMTM3Niw2IEBACiAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgIH0KIAotICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgICAgX19IQUxfTE9DSyhodWFydCk7CiAKICAgICBodWFydC0+cFJ4QnVmZlB0ciA9IHBEYXRhOwpAQCAtMTQxMiw3ICsxNDA0LDYgQEAKICAgICAgICAgLyogU2V0IGVycm9yIGNvZGUgdG8gRE1BICovCiAgICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgPSBIQUxfVUFSVF9FUlJPUl9ETUE7CiAKLSAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgICAgICAgIC8qIFJlc3RvcmUgaHVhcnQtPmdTdGF0ZSB0byByZWFkeSAqLwpAQCAtMTQyMSw3ICsxNDEyLDYgQEAKICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgIH0KICAgICB9Ci0gICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgIF9fSEFMX1VOTE9DSyhodWFydCk7CiAKICAgICAvKiBFbmFibGUgdGhlIFVBUlQgUGFyaXR5IEVycm9yIEludGVycnVwdCAqLwpAQCAtMTQ1Miw3ICsxNDQyLDYgQEAKICAgY29uc3QgSEFMX1VBUlRfU3RhdGVUeXBlRGVmIGdzdGF0ZSA9IGh1YXJ0LT5nU3RhdGU7CiAgIGNvbnN0IEhBTF9VQVJUX1N0YXRlVHlwZURlZiByeHN0YXRlID0gaHVhcnQtPlJ4U3RhdGU7CiAKLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgX19IQUxfTE9DSyhodWFydCk7CiAKICAgaWYgKChIQUxfSVNfQklUX1NFVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0RNQVQpKSAmJgpAQCAtMTQ3Miw3ICsxNDYxLDYgQEAKICAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjMsIFVTQVJUX0NSM19ETUFSKTsKICAgfQogCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAogICByZXR1cm4gSEFMX09LOwpAQCAtMTQ4NSw3ICsxNDczLDYgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0RNQVJlc3VtZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQogewotICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICBfX0hBTF9MT0NLKGh1YXJ0KTsKIAogICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9CVVNZX1RYKQpAQCAtMTUwNiw3ICsxNDkzLDYgQEAKICAgICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUik7CiAgIH0KIAotICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhodWFydCk7CiAKICAgcmV0dXJuIEhBTF9PSzsKQEAgLTE1OTEsNyArMTU3Nyw3IEBACiAgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQogICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKIHsKICAgLyogRGlzYWJsZSBUWEVJRSwgVENJRSwgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCkBAIC0xNjYzLDcgKzE2NDksNiBAQAogICBodWFydC0+Z1N0YXRlICA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOwogICBodWFydC0+UnhTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOwogCi0gIC8qIFJlc2V0IEhhbmRsZSBFcnJvckNvZGUgdG8gTm8gRXJyb3IgKi8KICAgaHVhcnQtPkVycm9yQ29kZSA9IEhBTF9VQVJUX0VSUk9SX05PTkU7CiAKICAgcmV0dXJuIEhBTF9PSzsKQEAgLTE2ODAsNyArMTY2NSw3IEBACiAgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQogICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRUcmFuc21pdChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQogewogICAvKiBEaXNhYmxlIFRYRUlFIGFuZCBUQ0lFIGludGVycnVwdHMgKi8KQEAgLTE3MzIsNyArMTcxNyw3IEBACiAgICogICAgICAgICAgIC0gU2V0IGhhbmRsZSBTdGF0ZSB0byBSRUFEWQogICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gYmxvY2tpbmcgbW9kZSA6IHdoZW4gZXhpdGluZyBmdW5jdGlvbiwgQWJvcnQgaXMgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQuCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCi0qLworICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfQWJvcnRSZWNlaXZlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCiB7CiAgIC8qIERpc2FibGUgUlhORSwgUEUgYW5kIEVSUiAoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKSBpbnRlcnJ1cHRzICovCkBAIC0xNzkyLDcgKzE3NzcsNyBAQAogICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKICAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKLSovCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydF9JVChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQogewogICB1aW50MzJfdCBhYm9ydGNwbHQgPSAxVTsKQEAgLTE5MzEsNyArMTkxNiw3IEBACiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQogICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwotKi8KKyAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VQVJUX0Fib3J0VHJhbnNtaXRfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKIHsKICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCkBAIC0yMDE1LDcgKzIwMDAsNyBAQAogICAqIEBub3RlICAgVGhpcyBwcm9jZWR1cmUgaXMgZXhlY3V0ZWQgaW4gSW50ZXJydXB0IG1vZGUsIG1lYW5pbmcgdGhhdCBhYm9ydCBwcm9jZWR1cmUgY291bGQgYmUKICAgKiAgICAgICAgIGNvbnNpZGVyZWQgYXMgY29tcGxldGVkIG9ubHkgd2hlbiB1c2VyIGFib3J0IGNvbXBsZXRlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIChub3Qgd2hlbiBleGl0aW5nIGZ1bmN0aW9uKS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKLSovCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9BYm9ydFJlY2VpdmVfSVQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKIHsKICAgLyogRGlzYWJsZSBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgKi8KQEAgLTIxMTAsNyArMjA5NSw3IEBACiAgIHVpbnQzMl90IGVycm9yY29kZTsKIAogICAvKiBJZiBubyBlcnJvciBvY2N1cnMgKi8KLSAgZXJyb3JmbGFncyA9IChpc3JmbGFncyAmICh1aW50MzJfdCkoVVNBUlRfSVNSX1BFIHwgVVNBUlRfSVNSX0ZFIHwgVVNBUlRfSVNSX09SRSB8IFVTQVJUX0lTUl9ORSkpOworICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FIHwgVVNBUlRfSVNSX1JUT0YpKTsKICAgaWYgKGVycm9yZmxhZ3MgPT0gMFUpCiAgIHsKICAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTIxNjQsMTAgKzIxNDksMTggQEAKICAgICAgIGh1YXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VBUlRfRVJST1JfT1JFOwogICAgIH0KIAotICAgIC8qIENhbGwgVUFSVCBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZCBiZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogVUFSVCBSZWNlaXZlciBUaW1lb3V0IGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JUT0YpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SVE9JRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1VBUlRfQ0xFQVJfRkxBRyhodWFydCwgVUFSVF9DTEVBUl9SVE9GKTsKKworICAgICAgaHVhcnQtPkVycm9yQ29kZSB8PSBIQUxfVUFSVF9FUlJPUl9SVE87CisgICAgfQorCisgICAgLyogQ2FsbCBVQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIGlmIChodWFydC0+RXJyb3JDb2RlICE9IEhBTF9VQVJUX0VSUk9SX05PTkUpCiAgICAgewotICAgICAgLyogVUFSVCBpbiBtb2RlIFJlY2VpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAvKiBVQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfUlhORSkgIT0gMFUpCiAgICAgICAgICAgJiYgKChjcjFpdHMgJiBVU0FSVF9DUjFfUlhORUlFKSAhPSAwVSkpCiAgICAgICB7CkBAIC0yMTc3LDExICsyMTcwLDE0IEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgLyogSWYgT3ZlcnJ1biBlcnJvciBvY2N1cnMsIG9yIGlmIGFueSBlcnJvciBvY2N1cnMgaW4gRE1BIG1vZGUgcmVjZXB0aW9uLAotICAgICAgICAgY29uc2lkZXIgZXJyb3IgYXMgYmxvY2tpbmcgKi8KKyAgICAgIC8qIElmIEVycm9yIGlzIHRvIGJlIGNvbnNpZGVyZWQgYXMgYmxvY2tpbmcgOgorICAgICAgICAgIC0gUmVjZWl2ZXIgVGltZW91dCBlcnJvciBpbiBSZWNlcHRpb24KKyAgICAgICAgICAtIE92ZXJydW4gZXJyb3IgaW4gUmVjZXB0aW9uCisgICAgICAgICAgLSBhbnkgZXJyb3Igb2NjdXJzIGluIERNQSBtb2RlIHJlY2VwdGlvbgorICAgICAgKi8KICAgICAgIGVycm9yY29kZSA9IGh1YXJ0LT5FcnJvckNvZGU7CiAgICAgICBpZiAoKEhBTF9JU19CSVRfU0VUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfRE1BUikpIHx8Ci0gICAgICAgICAgKChlcnJvcmNvZGUgJiBIQUxfVUFSVF9FUlJPUl9PUkUpICE9IDBVKSkKKyAgICAgICAgICAoKGVycm9yY29kZSAmIChIQUxfVUFSVF9FUlJPUl9SVE8gfCBIQUxfVUFSVF9FUlJPUl9PUkUpKSAhPSAwVSkpCiAgICAgICB7CiAgICAgICAgIC8qIEJsb2NraW5nIGVycm9yIDogdHJhbnNmZXIgaXMgYWJvcnRlZAogICAgICAgICAgICBTZXQgdGhlIFVBUlQgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcywKQEAgLTIyNDksNiArMjI0NSwyNiBAQAogICAgIHJldHVybjsKIAogICB9IC8qIEVuZCBpZiBzb21lIGVycm9yIG9jY3VycyAqLworI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisKKyAgLyogVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1dVRikgIT0gMFUpICYmICgoY3IzaXRzICYgVVNBUlRfQ1IzX1dVRklFKSAhPSAwVSkpCisgIHsKKyAgICBfX0hBTF9VQVJUX0NMRUFSX0ZMQUcoaHVhcnQsIFVBUlRfQ0xFQVJfV1VGKTsKKworICAgIC8qIFVBUlQgUnggc3RhdGUgaXMgbm90IHJlc2V0IGFzIGEgcmVjZXB0aW9uIHByb2Nlc3MgbWlnaHQgYmUgb25nb2luZy4KKyAgICAgICBJZiBVQVJUIGhhbmRsZSBzdGF0ZSBmaWVsZHMgbmVlZCB0byBiZSByZXNldCB0byBSRUFEWSwgdGhpcyBjb3VsZCBiZSBkb25lIGluIFdha2V1cCBjYWxsYmFjayAqLworCisjaWYgKFVTRV9IQUxfVUFSVF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKKyAgICAvKiBDYWxsIHJlZ2lzdGVyZWQgV2FrZXVwIENhbGxiYWNrICovCisgICAgaHVhcnQtPldha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbHNlCisgICAgLyogQ2FsbCBsZWdhY3kgd2VhayBXYWtldXAgQ2FsbGJhY2sgKi8KKyAgICBIQUxfVUFSVEV4X1dha2V1cENhbGxiYWNrKGh1YXJ0KTsKKyNlbmRpZiAvKiBVU0VfSEFMX1VBUlRfUkVHSVNURVJfQ0FMTEJBQ0tTICovCisgICAgcmV0dXJuOworICB9CisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KIAogICAvKiBVQVJUIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgaWYgKCgoaXNyZmxhZ3MgJiBVU0FSVF9JU1JfVFhFKSAhPSAwVSkKQEAgLTIzOTAsNiArMjQwNiwyMyBAQAogICAgKi8KIH0KIAorI2lmIGRlZmluZWQoVVNBUlRfQ1IxX1VFU00pCisvKioKKyAgKiBAYnJpZWYgVUFSVCB3YWtldXAgZnJvbSBTdG9wIG1vZGUgY2FsbGJhY2suCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgTm9uZQorICAqLworX193ZWFrIHZvaWQgSEFMX1VBUlRFeF9XYWtldXBDYWxsYmFjayhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCisgIFVOVVNFRChodWFydCk7CisKKyAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAorICAgICAgICAgICAgdGhlIEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuCisgICAqLworfQorCisjZW5kaWYgLyogVVNBUlRfQ1IxX1VFU00gKi8KIC8qKgogICAqIEB9CiAgICovCkBAIC0yNDAzLDYgKzI0MzYsOSBAQAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCiAgICAgVGhpcyBzdWJzZWN0aW9uIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBjb250cm9sIHRoZSBVQVJULgorICAgICAoKykgSEFMX1VBUlRfUmVjZWl2ZXJUaW1lb3V0X0NvbmZpZygpIEFQSSBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSByZWNlaXZlciB0aW1lb3V0IHZhbHVlIG9uIHRoZSBmbHkKKyAgICAgKCspIEhBTF9VQVJUX0VuYWJsZVJlY2VpdmVyVGltZW91dCgpIEFQSSBlbmFibGVzIHRoZSByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUKKyAgICAgKCspIEhBTF9VQVJUX0Rpc2FibGVSZWNlaXZlclRpbWVvdXQoKSBBUEkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZQogICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKCkgQVBJIGVuYWJsZXMgbXV0ZSBtb2RlCiAgICAgICgrKSBIQUxfTXVsdGlQcm9jZXNzb3JfRGlzYWJsZU11dGVNb2RlKCkgQVBJIGRpc2FibGVzIG11dGUgbW9kZQogICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yX0VudGVyTXV0ZU1vZGUoKSBBUEkgZW50ZXJzIG11dGUgbW9kZQpAQCAtMjQxNyw2ICsyNDUzLDgyIEBACiAgICovCiAKIC8qKgorICAqIEBicmllZiAgVXBkYXRlIG9uIHRoZSBmbHkgdGhlIHJlY2VpdmVyIHRpbWVvdXQgdmFsdWUgaW4gUlRPUiByZWdpc3Rlci4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHBhcmFtICBUaW1lb3V0VmFsdWUgcmVjZWl2ZXIgdGltZW91dCB2YWx1ZSBpbiBudW1iZXIgb2YgYmF1ZCBibG9ja3MuIFRoZSB0aW1lb3V0CisgICogICAgICAgICAgICAgICAgICAgICB2YWx1ZSBtdXN0IGJlIGxlc3Mgb3IgZXF1YWwgdG8gMHgwRkZGRkZGRkYuCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIEhBTF9VQVJUX1JlY2VpdmVyVGltZW91dF9Db25maWcoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgVGltZW91dFZhbHVlKQoreworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9SRUNFSVZFUl9USU1FT1VUX1ZBTFVFKFRpbWVvdXRWYWx1ZSkpOworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+UlRPUiwgVVNBUlRfUlRPUl9SVE8sIFRpbWVvdXRWYWx1ZSk7Cit9CisKKy8qKgorICAqIEBicmllZiAgRW5hYmxlIHRoZSBVQVJUIHJlY2VpdmVyIHRpbWVvdXQgZmVhdHVyZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFBvaW50ZXIgdG8gYSBVQVJUX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKKyAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVCBtb2R1bGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVF9FbmFibGVSZWNlaXZlclRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgaWYgKGh1YXJ0LT5nU3RhdGUgPT0gSEFMX1VBUlRfU1RBVEVfUkVBRFkpCisgIHsKKyAgICAvKiBQcm9jZXNzIExvY2tlZCAqLworICAgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CisKKyAgICAvKiBTZXQgdGhlIFVTQVJUIFJUT0VOIGJpdCAqLworICAgIFNFVF9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgorICAqIEBicmllZiAgRGlzYWJsZSB0aGUgVUFSVCByZWNlaXZlciB0aW1lb3V0IGZlYXR1cmUuCisgICogQHBhcmFtICBodWFydCBQb2ludGVyIHRvIGEgVUFSVF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgICogICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVBUlQgbW9kdWxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRfRGlzYWJsZVJlY2VpdmVyVGltZW91dChVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICBpZiAoaHVhcnQtPmdTdGF0ZSA9PSBIQUxfVUFSVF9TVEFURV9SRUFEWSkKKyAgeworICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgICAgX19IQUxfTE9DSyhodWFydCk7CisKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfQlVTWTsKKworICAgIC8qIENsZWFyIHRoZSBVU0FSVCBSVE9FTiBiaXQgKi8KKyAgICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjIsIFVTQVJUX0NSMl9SVE9FTik7CisKKyAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisKKyAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICAgIHJldHVybiBIQUxfT0s7CisgIH0KKyAgZWxzZQorICB7CisgICAgcmV0dXJuIEhBTF9CVVNZOworICB9Cit9CisKKy8qKgogICAqIEBicmllZiAgRW5hYmxlIFVBUlQgaW4gbXV0ZSBtb2RlIChkb2VzIG5vdCBtZWFuIFVBUlQgZW50ZXJzIG11dGUgbW9kZTsKICAgKiAgICAgICAgIHRvIGVudGVyIG11dGUgbW9kZSwgSEFMX011bHRpUHJvY2Vzc29yX0VudGVyTXV0ZU1vZGUoKSBBUEkgbXVzdCBiZSBjYWxsZWQpLgogICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCkBAIC0yNDI0LDcgKzI1MzYsNiBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX011bHRpUHJvY2Vzc29yX0VuYWJsZU11dGVNb2RlKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCiB7Ci0gIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOwpAQCAtMjQ0NSw3ICsyNTU2LDYgQEAKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9NdWx0aVByb2Nlc3Nvcl9EaXNhYmxlTXV0ZU1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKIHsKLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgX19IQUxfTE9DSyhodWFydCk7CiAKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CkBAIC0yNDc2LDcgKzI1ODYsNiBAQAogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0hhbGZEdXBsZXhfRW5hYmxlVHJhbnNtaXR0ZXIoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKIHsKLSAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgX19IQUxfTE9DSyhodWFydCk7CiAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOwogCkBAIC0yNDg4LDcgKzI1OTcsNiBAQAogCiAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKIAotICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgIF9fSEFMX1VOTE9DSyhodWFydCk7CiAKICAgcmV0dXJuIEhBTF9PSzsKQEAgLTI1MDEsNyArMjYwOSw2IEBACiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfSGFsZkR1cGxleF9FbmFibGVSZWNlaXZlcihVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQogewotICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICBfX0hBTF9MT0NLKGh1YXJ0KTsKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX0JVU1k7CiAKQEAgLTI1MTMsNyArMjYyMCw2IEBACiAKICAgaHVhcnQtPmdTdGF0ZSA9IEhBTF9VQVJUX1NUQVRFX1JFQURZOwogCi0gIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAogICByZXR1cm4gSEFMX09LOwpAQCAtMjUzMCw3ICsyNjM2LDYgQEAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1VBUlRfTElOX0lOU1RBTkNFKGh1YXJ0LT5JbnN0YW5jZSkpOwogCi0gIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgIF9fSEFMX0xPQ0soaHVhcnQpOwogCiAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOwpAQCAtMjU0MCw3ICsyNjQ1LDYgQEAKIAogICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAKLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgIHJldHVybiBIQUxfT0s7CkBAIC0yNTUxLDggKzI2NTUsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFVBUlRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwNCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICBVQVJUIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICBVQVJUIFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCisgICoKIEB2ZXJiYXRpbQogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucyAjIyMjIwpAQCAtMjU3NCw3ICsyNjc4LDggQEAKICAgKi8KIEhBTF9VQVJUX1N0YXRlVHlwZURlZiBIQUxfVUFSVF9HZXRTdGF0ZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQogewotICB1aW50MzJfdCB0ZW1wMSwgdGVtcDI7CisgIHVpbnQzMl90IHRlbXAxOworICB1aW50MzJfdCB0ZW1wMjsKICAgdGVtcDEgPSBodWFydC0+Z1N0YXRlOwogICB0ZW1wMiA9IGh1YXJ0LT5SeFN0YXRlOwogCkBAIC0yNTg2LDcgKzI2OTEsNyBAQAogICAqIEBwYXJhbSAgaHVhcnQgUG9pbnRlciB0byBhIFVBUlRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICAqICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVUFSVC4KICAgKiBAcmV0dmFsIFVBUlQgRXJyb3IgQ29kZQotKi8KKyAgKi8KIHVpbnQzMl90IEhBTF9VQVJUX0dldEVycm9yKFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQpCiB7CiAgIHJldHVybiBodWFydC0+RXJyb3JDb2RlOwpAQCAtMjYyMCw2ICsyNzI1LDkgQEAKICAgaHVhcnQtPkFib3J0Q3BsdENhbGxiYWNrICAgICAgICAgPSBIQUxfVUFSVF9BYm9ydENwbHRDYWxsYmFjazsgICAgICAgICAvKiBMZWdhY3kgd2VhayBBYm9ydENwbHRDYWxsYmFjayAgICAgICAgICovCiAgIGh1YXJ0LT5BYm9ydFRyYW5zbWl0Q3BsdENhbGxiYWNrID0gSEFMX1VBUlRfQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgQWJvcnRUcmFuc21pdENwbHRDYWxsYmFjayAqLwogICBodWFydC0+QWJvcnRSZWNlaXZlQ3BsdENhbGxiYWNrICA9IEhBTF9VQVJUX0Fib3J0UmVjZWl2ZUNwbHRDYWxsYmFjazsgIC8qIExlZ2FjeSB3ZWFrIEFib3J0UmVjZWl2ZUNwbHRDYWxsYmFjayAgKi8KKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorICBodWFydC0+V2FrZXVwQ2FsbGJhY2sgICAgICAgICAgICA9IEhBTF9VQVJURXhfV2FrZXVwQ2FsbGJhY2s7ICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIFdha2V1cENhbGxiYWNrICAgICAgICAgICAgKi8KKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogCiB9CiAjZW5kaWYgLyogVVNFX0hBTF9VQVJUX1JFR0lTVEVSX0NBTExCQUNLUyAqLwpAQCAtMjYzNiw2ICsyNzQ0LDcgQEAKICAgVUFSVF9DbG9ja1NvdXJjZVR5cGVEZWYgY2xvY2tzb3VyY2U7CiAgIHVpbnQzMl90IHVzYXJ0ZGl2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMFU7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHJldCAgICAgICAgICAgICAgID0gSEFMX09LOworICB1aW50MzJfdCBwY2xrOwogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19VQVJUX0JBVURSQVRFKGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CkBAIC0yNjgzLDIxICsyNzkyLDIzIEBACiAgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKICAgICB7CiAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6Ci0gICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMUZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgcGNsayA9IEhBTF9SQ0NfR2V0UENMSzFGcmVxKCk7CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgocGNsaywgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzI6Ci0gICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgcGNsayA9IEhBTF9SQ0NfR2V0UENMSzJGcmVxKCk7CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzgocGNsaywgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfSFNJOgogICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhTSV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfU1lTQ0xLOgotICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkc4KHBjbGssIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0xTRToKICAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HOChMU0VfVkFMVUUsIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX1VOREVGSU5FRDoKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldCA9IEhBTF9FUlJPUjsKICAgICAgICAgYnJlYWs7CkBAIC0yNzIwLDIxICsyODMxLDIzIEBACiAgICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKICAgICB7CiAgICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6Ci0gICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0UENMSzFGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihwY2xrLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9QQ0xLMjoKLSAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgICAgcGNsayA9IEhBTF9SQ0NfR2V0UENMSzJGcmVxKCk7CisgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KHBjbGssIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBVQVJUX0NMT0NLU09VUkNFX0hTSToKICAgICAgICAgdXNhcnRkaXYgPSAodWludDE2X3QpKFVBUlRfRElWX1NBTVBMSU5HMTYoSFNJX1ZBTFVFLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9TWVNDTEs6Ci0gICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KEhBTF9SQ0NfR2V0U3lzQ2xvY2tGcmVxKCksIGh1YXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgICB1c2FydGRpdiA9ICh1aW50MTZfdCkoVUFSVF9ESVZfU0FNUExJTkcxNihwY2xrLCBodWFydC0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVUFSVF9DTE9DS1NPVVJDRV9MU0U6CiAgICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQxNl90KShVQVJUX0RJVl9TQU1QTElORzE2KExTRV9WQUxVRSwgaHVhcnQtPkluaXQuQmF1ZFJhdGUpKTsKICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVBUlRfQ0xPQ0tTT1VSQ0VfVU5ERUZJTkVEOgogICAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0ID0gSEFMX0VSUk9SOwogICAgICAgICBicmVhazsKQEAgLTI4NTgsMTIgKzI5NzEsMjQgQEAKICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICB9CiAgIH0KKyNpZiBkZWZpbmVkKFVTQVJUX0lTUl9SRUFDSykKKworICAvKiBDaGVjayBpZiB0aGUgUmVjZWl2ZXIgaXMgZW5hYmxlZCAqLworICBpZiAoKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxICYgVVNBUlRfQ1IxX1JFKSA9PSBVU0FSVF9DUjFfUkUpCisgIHsKKyAgICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgICAgaWYgKFVBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodWFydCwgVVNBUlRfSVNSX1JFQUNLLCBSRVNFVCwgdGlja3N0YXJ0LCBIQUxfVUFSVF9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spCisgICAgeworICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLworICAgICAgcmV0dXJuIEhBTF9USU1FT1VUOworICAgIH0KKyAgfQorI2VuZGlmCiAKICAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLwogICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAKLSAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgIHJldHVybiBIQUxfT0s7CkBAIC0yODc4LDcgKzMwMDMsOCBAQAogICAqIEBwYXJhbSBUaW1lb3V0ICAgVGltZW91dCBkdXJhdGlvbgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgVUFSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVBUlRfSGFuZGxlVHlwZURlZiAqaHVhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQogewogICAvKiBXYWl0IHVudGlsIGZsYWcgaXMgc2V0ICovCiAgIHdoaWxlICgoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQpAQCAtMjg5NSwxMSArMzAyMSwzMiBAQAogICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAgICAgICAgIGh1YXJ0LT5SeFN0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CiAKLSAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOwogCiAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICAgIH0KKworICAgICAgaWYgKFJFQURfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IxLCBVU0FSVF9DUjFfUkUpICE9IDBVKQorICAgICAgeworICAgICAgICBpZiAoX19IQUxfVUFSVF9HRVRfRkxBRyhodWFydCwgVUFSVF9GTEFHX1JUT0YpID09IFNFVCkKKyAgICAgICAgeworICAgICAgICAgIC8qIENsZWFyIFJlY2VpdmVyIFRpbWVvdXQgZmxhZyovCisgICAgICAgICAgX19IQUxfVUFSVF9DTEVBUl9GTEFHKGh1YXJ0LCBVQVJUX0NMRUFSX1JUT0YpOworICAgICAgICAgIAorICAgICAgICAgIC8qIERpc2FibGUgVFhFLCBSWE5FLCBQRSBhbmQgRVJSIChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpIGludGVycnVwdHMgZm9yIHRoZSBpbnRlcnJ1cHQgcHJvY2VzcyAqLworICAgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgKFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfUEVJRSB8IFVTQVJUX0NSMV9UWEVJRSkpOworICAgICAgICAgIENMRUFSX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMywgVVNBUlRfQ1IzX0VJRSk7CisKKyAgICAgICAgICBodWFydC0+Z1N0YXRlID0gSEFMX1VBUlRfU1RBVEVfUkVBRFk7CisgICAgICAgICAgaHVhcnQtPlJ4U3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgICAgICAgICBodWFydC0+RXJyb3JDb2RlID0gSEFMX1VBUlRfRVJST1JfUlRPOworICAgICAgICAgIAorICAgICAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgICAgICAgICBfX0hBTF9VTkxPQ0soaHVhcnQpOworICAgICAgICAgIAorICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KICAgfQogICByZXR1cm4gSEFMX09LOwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfdWFydF9leC5jIGIvU3JjL3N0bTMyZjd4eF9oYWxfdWFydF9leC5jCmluZGV4IDI1NGZlMjUuLmNkYzUzNWMgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfaGFsX3VhcnRfZXguYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF91YXJ0X2V4LmMKQEAgLTU3LDYgKzU3LDkgQEAKIC8qKiBAZGVmZ3JvdXAgVUFSVEV4X1ByaXZhdGVfRnVuY3Rpb25zIFVBUlRFeCBQcml2YXRlIEZ1bmN0aW9ucwogICAqIEB7CiAgICovCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKK3N0YXRpYyB2b2lkIFVBUlRFeF9XYWtldXBfQWRkcmVzc0NvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKTsKKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogLyoqCiAgICogQH0KICAgKi8KQEAgLTE0NCw3ICsxNDcsOCBAQAogICAqICAgICAgIG92ZXJzYW1wbGluZyByYXRlKS4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLUhBTF9TdGF0dXNUeXBlRGVmIEhBTF9SUzQ4NUV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgUG9sYXJpdHksIHVpbnQzMl90IEFzc2VydGlvblRpbWUsIHVpbnQzMl90IERlYXNzZXJ0aW9uVGltZSkKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9SUzQ4NUV4X0luaXQoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCwgdWludDMyX3QgUG9sYXJpdHksIHVpbnQzMl90IEFzc2VydGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERlYXNzZXJ0aW9uVGltZSkKIHsKICAgdWludDMyX3QgdGVtcDsKIApAQCAtMjI0LDQyICsyMjgsNzQgQEAKICAgKiBAfQogICAqLwogCi0vKiogQGRlZmdyb3VwIFVBUlRFeF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKLSAgKiAgQGJyaWVmIEV4dGVuZGVkIGZ1bmN0aW9ucwotICAqCi1AdmVyYmF0aW0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgV2FrZXVwIGFuZCBGSUZPIG1vZGUgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMuCi0KLUBlbmR2ZXJiYXRpbQotICAqIEB7Ci0gICovCi0KLQotLyoqCi0gICogQH0KLSAgKi8KIAogLyoqIEBkZWZncm91cCBVQVJURXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zCiAgICogQGJyaWVmICAgIEV4dGVuZGVkIFBlcmlwaGVyYWwgQ29udHJvbCBmdW5jdGlvbnMKLSAqCisgICoKIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIFsuLl0gVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgICAoKykgSEFMX1VBUlRFeF9FbmFibGVDbG9ja1N0b3BNb2RlKCkgQVBJIGVuYWJsZXMgdGhlIFVBUlQgY2xvY2sgKEhTSSBvciBMU0Ugb25seSkgZHVyaW5nIHN0b3AgbW9kZQorICAgICAoKykgSEFMX1VBUlRFeF9EaXNhYmxlQ2xvY2tTdG9wTW9kZSgpIEFQSSBkaXNhYmxlcyB0aGUgYWJvdmUgZnVuY3Rpb25hbGl0eQogICAgICAoKykgSEFMX011bHRpUHJvY2Vzc29yRXhfQWRkcmVzc0xlbmd0aF9TZXQoKSBBUEkgb3B0aW9uYWxseSBzZXRzIHRoZSBVQVJUIG5vZGUgYWRkcmVzcwogICAgICAgICAgZGV0ZWN0aW9uIGxlbmd0aCB0byBtb3JlIHRoYW4gNCBiaXRzIGZvciBtdWx0aXByb2Nlc3NvciBhZGRyZXNzIG1hcmsgd2FrZSB1cC4KKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorICAgICAoKykgSEFMX1VBUlRFeF9TdG9wTW9kZVdha2VVcFNvdXJjZUNvbmZpZygpIEFQSSBkZWZpbmVzIHRoZSB3YWtlLXVwIGZyb20gc3RvcCBtb2RlCisgICAgICAgICB0cmlnZ2VyOiBhZGRyZXNzIG1hdGNoLCBTdGFydCBCaXQgZGV0ZWN0aW9uIG9yIFJYTkUgYml0IHN0YXR1cy4KKyAgICAgKCspIEhBTF9VQVJURXhfRW5hYmxlU3RvcE1vZGUoKSBBUEkgZW5hYmxlcyB0aGUgVUFSVCB0byB3YWtlIHVwIHRoZSBNQ1UgZnJvbSBzdG9wIG1vZGUKKyAgICAgKCspIEhBTF9VQVJURXhfRGlzYWJsZVN0b3BNb2RlKCkgQVBJIGRpc2FibGVzIHRoZSBhYm92ZSBmdW5jdGlvbmFsaXR5CisjZW5kaWYKIAogQGVuZHZlcmJhdGltCiAgICogQHsKICAgKi8KIAorI2lmIGRlZmluZWQoVVNBUlRfQ1IzX1VDRVNNKQorLyoqCisgICogQGJyaWVmICBLZWVwIFVBUlQgQ2xvY2sgZW5hYmxlZCB3aGVuIGluIFN0b3AgTW9kZS4KKyAgKiBAbm90ZSAgIFdoZW4gdGhlIFVTQVJUIGNsb2NrIHNvdXJjZSBpcyBjb25maWd1cmVkIHRvIGJlIExTRSBvciBIU0ksIGl0IGlzIHBvc3NpYmxlIHRvIGtlZXAgZW5hYmxlZAorICAqICAgICAgICAgdGhpcyBjbG9jayBkdXJpbmcgU1RPUCBtb2RlIGJ5IHNldHRpbmcgdGhlIFVDRVNNIGJpdCBpbiBVU0FSVF9DUjMgY29udHJvbCByZWdpc3Rlci4KKyAgKiBAbm90ZSAgIFdoZW4gTFBVQVJUIGlzIHVzZWQgdG8gd2FrZXVwIGZyb20gc3RvcCB3aXRoIExTRSBpcyBzZWxlY3RlZCBhcyBMUFVBUlQgY2xvY2sgc291cmNlLAorICAqICAgICAgICAgYW5kIGRlc2lyZWQgYmF1ZCByYXRlIGlzIDk2MDAgYmF1ZCwgdGhlIGJpdCBVQ0VTTSBiaXQgaW4gTFBVQVJUX0NSMyBjb250cm9sIHJlZ2lzdGVyIG11c3QgYmUgc2V0LgorICAqIEBwYXJhbSAgaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0VuYWJsZUNsb2NrU3RvcE1vZGUoVUFSVF9IYW5kbGVUeXBlRGVmICpodWFydCkKK3sKKyAgLyogUHJvY2VzcyBMb2NrZWQgKi8KKyAgX19IQUxfTE9DSyhodWFydCk7CiAKKyAgLyogU2V0IFVDRVNNIGJpdCAqLworICBTRVRfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVUNFU00pOwogCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKIAorICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgVUFSVCBDbG9jayB3aGVuIGluIFN0b3AgTW9kZS4KKyAgKiBAcGFyYW0gIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9EaXNhYmxlQ2xvY2tTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAvKiBDbGVhciBVQ0VTTSBiaXQgKi8KKyAgQ0xFQVJfQklUKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfVUNFU00pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisjZW5kaWYgLyogVVNBUlRfQ1IzX1VDRVNNICovCiAvKioKICAgKiBAYnJpZWYgQnkgZGVmYXVsdCBpbiBtdWx0aXByb2Nlc3NvciBtb2RlLCB3aGVuIHRoZSB3YWtlIHVwIG1ldGhvZCBpcyBzZXQKICAgKiAgICAgICAgdG8gYWRkcmVzcyBtYXJrLCB0aGUgVUFSVCBoYW5kbGVzIG9ubHkgNC1iaXQgbG9uZyBhZGRyZXNzZXMgZGV0ZWN0aW9uOwpAQCAtMjk5LDggKzMzNSwxMDggQEAKICAgcmV0dXJuIChVQVJUX0NoZWNrSWRsZVN0YXRlKGh1YXJ0KSk7CiB9CiAKKyNpZiBkZWZpbmVkKFVTQVJUX0NSMV9VRVNNKQorLyoqCisgICogQGJyaWVmIFNldCBXYWtldXAgZnJvbSBTdG9wIG1vZGUgaW50ZXJydXB0IGZsYWcgc2VsZWN0aW9uLgorICAqIEBub3RlIEl0IGlzIHRoZSBhcHBsaWNhdGlvbiByZXNwb25zaWJpbGl0eSB0byBlbmFibGUgdGhlIGludGVycnVwdCB1c2VkIGFzCisgICogICAgICAgdXNhcnRfd2t1cCBpbnRlcnJ1cHQgc291cmNlIGJlZm9yZSBlbnRlcmluZyBsb3ctcG93ZXIgbW9kZS4KKyAgKiBAcGFyYW0gaHVhcnQgICAgICAgICAgIFVBUlQgaGFuZGxlLgorICAqIEBwYXJhbSBXYWtlVXBTZWxlY3Rpb24gQWRkcmVzcyBtYXRjaCwgU3RhcnQgQml0IGRldGVjdGlvbiBvciBSWE5FL1JYRk5FIGJpdCBzdGF0dXMuCisgICogICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgKiAgICAgICAgICBAYXJnIEByZWYgVUFSVF9XQUtFVVBfT05fQUREUkVTUworICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1dBS0VVUF9PTl9TVEFSVEJJVAorICAqICAgICAgICAgIEBhcmcgQHJlZiBVQVJUX1dBS0VVUF9PTl9SRUFEREFUQV9OT05FTVBUWQorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9TdG9wTW9kZVdha2VVcFNvdXJjZUNvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKQoreworICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CisgIHVpbnQzMl90IHRpY2tzdGFydDsKIAorICAvKiBjaGVjayB0aGUgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBVQVJUIGluc3RhbmNlICovCisgIGFzc2VydF9wYXJhbShJU19VQVJUX1dBS0VVUF9GUk9NU1RPUF9JTlNUQU5DRShodWFydC0+SW5zdGFuY2UpKTsKKyAgLyogY2hlY2sgdGhlIHdha2UtdXAgc2VsZWN0aW9uIHBhcmFtZXRlciAqLworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9XQUtFVVBfU0VMRUNUSU9OKFdha2VVcFNlbGVjdGlvbi5XYWtlVXBFdmVudCkpOwogCisgIC8qIFByb2Nlc3MgTG9ja2VkICovCisgIF9fSEFMX0xPQ0soaHVhcnQpOworCisgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9CVVNZOworCisgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KKyAgX19IQUxfVUFSVF9ESVNBQkxFKGh1YXJ0KTsKKworICAvKiBTZXQgdGhlIHdha2UtdXAgc2VsZWN0aW9uIHNjaGVtZSAqLworICBNT0RJRllfUkVHKGh1YXJ0LT5JbnN0YW5jZS0+Q1IzLCBVU0FSVF9DUjNfV1VTLCBXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQpOworCisgIGlmIChXYWtlVXBTZWxlY3Rpb24uV2FrZVVwRXZlbnQgPT0gVUFSVF9XQUtFVVBfT05fQUREUkVTUykKKyAgeworICAgIFVBUlRFeF9XYWtldXBfQWRkcmVzc0NvbmZpZyhodWFydCwgV2FrZVVwU2VsZWN0aW9uKTsKKyAgfQorCisgIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLworICBfX0hBTF9VQVJUX0VOQUJMRShodWFydCk7CisKKyAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KKyAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKKworICAvKiBXYWl0IHVudGlsIFJFQUNLIGZsYWcgaXMgc2V0ICovCisgIGlmIChVQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoaHVhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgSEFMX1VBUlRfVElNRU9VVF9WQUxVRSkgIT0gSEFMX09LKQorICB7CisgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CisgIH0KKyAgZWxzZQorICB7CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgVUFSVCBTdGF0ZSAqLworICAgIGh1YXJ0LT5nU3RhdGUgPSBIQUxfVUFSVF9TVEFURV9SRUFEWTsKKyAgfQorCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAgKiBAYnJpZWYgRW5hYmxlIFVBUlQgU3RvcCBNb2RlLgorICAqIEBub3RlIFRoZSBVQVJUIGlzIGFibGUgdG8gd2FrZSB1cCB0aGUgTUNVIGZyb20gU3RvcCAxIG1vZGUgYXMgbG9uZyBhcyBVQVJUIGNsb2NrIGlzIEhTSSBvciBMU0UuCisgICogQHBhcmFtIGh1YXJ0IFVBUlQgaGFuZGxlLgorICAqIEByZXR2YWwgSEFMIHN0YXR1cworICAqLworSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VBUlRFeF9FbmFibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAvKiBTZXQgVUVTTSBiaXQgKi8KKyAgU0VUX0JJVChodWFydC0+SW5zdGFuY2UtPkNSMSwgVVNBUlRfQ1IxX1VFU00pOworCisgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KKyAgX19IQUxfVU5MT0NLKGh1YXJ0KTsKKworICByZXR1cm4gSEFMX09LOworfQorCisvKioKKyAgKiBAYnJpZWYgRGlzYWJsZSBVQVJUIFN0b3AgTW9kZS4KKyAgKiBAcGFyYW0gaHVhcnQgVUFSVCBoYW5kbGUuCisgICogQHJldHZhbCBIQUwgc3RhdHVzCisgICovCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVUFSVEV4X0Rpc2FibGVTdG9wTW9kZShVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0KQoreworICAvKiBQcm9jZXNzIExvY2tlZCAqLworICBfX0hBTF9MT0NLKGh1YXJ0KTsKKworICAvKiBDbGVhciBVRVNNIGJpdCAqLworICBDTEVBUl9CSVQoaHVhcnQtPkluc3RhbmNlLT5DUjEsIFVTQVJUX0NSMV9VRVNNKTsKKworICAvKiBQcm9jZXNzIFVubG9ja2VkICovCisgIF9fSEFMX1VOTE9DSyhodWFydCk7CisKKyAgcmV0dXJuIEhBTF9PSzsKK30KKworI2VuZGlmIC8qIFVTQVJUX0NSMV9VRVNNICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMzEyLDYgKzQ0OCwyNSBAQAogLyoqIEBhZGR0b2dyb3VwIFVBUlRFeF9Qcml2YXRlX0Z1bmN0aW9ucwogICAqIEB7CiAgICovCisjaWYgZGVmaW5lZChVU0FSVF9DUjFfVUVTTSkKKworLyoqCisgICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFVBUlQgd2FrZS11cCBmcm9tIHN0b3AgbW9kZSBwYXJhbWV0ZXJzIHdoZW4gdHJpZ2dlcmVkIGJ5IGFkZHJlc3MgZGV0ZWN0aW9uLgorICAqIEBwYXJhbSBodWFydCAgICAgICAgICAgVUFSVCBoYW5kbGUuCisgICogQHBhcmFtIFdha2VVcFNlbGVjdGlvbiBVQVJUIHdha2UgdXAgZnJvbSBzdG9wIG1vZGUgcGFyYW1ldGVycy4KKyAgKiBAcmV0dmFsIE5vbmUKKyAgKi8KK3N0YXRpYyB2b2lkIFVBUlRFeF9XYWtldXBfQWRkcmVzc0NvbmZpZyhVQVJUX0hhbmRsZVR5cGVEZWYgKmh1YXJ0LCBVQVJUX1dha2VVcFR5cGVEZWYgV2FrZVVwU2VsZWN0aW9uKQoreworICBhc3NlcnRfcGFyYW0oSVNfVUFSVF9BRERSRVNTTEVOR1RIX0RFVEVDVChXYWtlVXBTZWxlY3Rpb24uQWRkcmVzc0xlbmd0aCkpOworCisgIC8qIFNldCB0aGUgVVNBUlQgYWRkcmVzcyBsZW5ndGggKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERE03LCBXYWtlVXBTZWxlY3Rpb24uQWRkcmVzc0xlbmd0aCk7CisKKyAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8KKyAgTU9ESUZZX1JFRyhodWFydC0+SW5zdGFuY2UtPkNSMiwgVVNBUlRfQ1IyX0FERCwgKCh1aW50MzJfdClXYWtlVXBTZWxlY3Rpb24uQWRkcmVzcyA8PCBVQVJUX0NSMl9BRERSRVNTX0xTQl9QT1MpKTsKK30KKyNlbmRpZiAvKiBVU0FSVF9DUjFfVUVTTSAqLwogCiAvKioKICAgKiBAfQpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9oYWxfdXNhcnQuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3VzYXJ0LmMKaW5kZXggYTg5NjlkYS4uOTJmMjdhYiAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9oYWxfdXNhcnQuYworKysgYi9TcmMvc3RtMzJmN3h4X2hhbF91c2FydC5jCkBAIC0xODEsNyArMTgxLDggQEAKIHN0YXRpYyB2b2lkIFVTQVJUX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7CiBzdGF0aWMgdm9pZCBVU0FSVF9ETUFUeEFib3J0Q2FsbGJhY2soRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwogc3RhdGljIHZvaWQgVVNBUlRfRE1BUnhBYm9ydENhbGxiYWNrKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKLXN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9XYWl0T25GbGFnVW50aWxUaW1lb3V0KFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDMyX3QgRmxhZywgRmxhZ1N0YXR1cyBTdGF0dXMsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7CitzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQzMl90IEZsYWcsIEZsYWdTdGF0dXMgU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9TZXRDb25maWcoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KTsKIHN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBVU0FSVF9DaGVja0lkbGVTdGF0ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwogc3RhdGljIHZvaWQgVVNBUlRfVHhJU1JfOEJJVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpOwpAQCAtMzAzLDE0ICszMDQsMTUgQEAKIAogICAvKiBJbiBTeW5jaHJvbm91cyBtb2RlLCB0aGUgZm9sbG93aW5nIGJpdHMgbXVzdCBiZSBrZXB0IGNsZWFyZWQ6CiAgIC0gTElORU4gYml0IGluIHRoZSBVU0FSVF9DUjIgcmVnaXN0ZXIKLSAgLSBIRFNFTCwgU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuKi8KKyAgLSBIRFNFTCwgU0NFTiBhbmQgSVJFTiBiaXRzIGluIHRoZSBVU0FSVF9DUjMgcmVnaXN0ZXIuCisgICovCiAgIGh1c2FydC0+SW5zdGFuY2UtPkNSMiAmPSB+VVNBUlRfQ1IyX0xJTkVOOwogICBodXNhcnQtPkluc3RhbmNlLT5DUjMgJj0gfihVU0FSVF9DUjNfU0NFTiB8IFVTQVJUX0NSM19IRFNFTCB8IFVTQVJUX0NSM19JUkVOKTsKIAogICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgX19IQUxfVVNBUlRfRU5BQkxFKGh1c2FydCk7CiAKLSAgLyogVEVBQ0sgdG8gY2hlY2sgYmVmb3JlIG1vdmluZyBodXNhcnQtPlN0YXRlIHRvIFJlYWR5ICovCisgIC8qIFRFQUNLIGFuZC9vciBSRUFDSyB0byBjaGVjayBiZWZvcmUgbW92aW5nIGh1c2FydC0+U3RhdGUgdG8gUmVhZHkgKi8KICAgcmV0dXJuIChVU0FSVF9DaGVja0lkbGVTdGF0ZShodXNhcnQpKTsKIH0KIApAQCAtNDA2LDcgKzQwOCw4IEBACiAgICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICsgICovCi1IQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfUmVnaXN0ZXJDYWxsYmFjayhVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIEhBTF9VU0FSVF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKK0hBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWdpc3RlckNhbGxiYWNrKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgSEFMX1VTQVJUX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVVNBUlRfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogCkBAIC03MDEsOSArNzA0LDEyIEBACiAKIC8qKgogICAqIEBicmllZiAgU2ltcGxleCBzZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIHRoZSBzZW50IGRhdGEgaXMgaGFuZGxlZCBhcyBhIHNldCBvZiB1MTYuIEluIHRoaXMgY2FzZSwgU2l6ZSBtdXN0IGluZGljYXRlIHRoZSBudW1iZXIKKyAgKiAgICAgICAgIG9mIHUxNiBwcm92aWRlZCB0aHJvdWdoIHBUeERhdGEuCiAgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgotICAqIEBwYXJhbSAgcFR4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50LgorICAqIEBwYXJhbSAgcFR4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIGVsZW1lbnRzICh1OCBvciB1MTYpIHRvIGJlIHNlbnQuCiAgICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24uCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCkBAIC03OTQsMTAgKzgwMCwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLgotICAqIEBub3RlIFRvIHJlY2VpdmUgc3luY2hyb25vdXMgZGF0YSwgZHVtbXkgZGF0YSBhcmUgc2ltdWx0YW5lb3VzbHkgdHJhbnNtaXR0ZWQuCisgICogQG5vdGUgICBUbyByZWNlaXZlIHN5bmNocm9ub3VzIGRhdGEsIGR1bW15IGRhdGEgYXJlIHNpbXVsdGFuZW91c2x5IHRyYW5zbWl0dGVkLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBSeERhdGEuCiAgICogQHBhcmFtIGh1c2FydCBVU0FSVCBoYW5kbGUuCi0gICogQHBhcmFtIHBSeERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gcFJ4RGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtIFNpemUgQW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgcmVjZWl2ZWQuCiAgICogQHBhcmFtIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbi4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTg5NiwxNCArOTA1LDE4IEBACiAKIC8qKgogICAqIEBicmllZiBGdWxsLUR1cGxleCBTZW5kIGFuZCBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIHRoZSBzZW50IGRhdGEgYW5kIHRoZSByZWNlaXZlZCBkYXRhIGFyZSBoYW5kbGVkIGFzIHNldHMgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcFR4RGF0YSBhbmQgdGhyb3VnaCBwUnhEYXRhLgogICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gUlggZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgogICAqIEBwYXJhbSAgVGltZW91dCBUaW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCitIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfVHJhbnNtaXRSZWNlaXZlKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDhfdCAqcFJ4RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKIHsKICAgdWludDhfdCAgKnByeGRhdGE4Yml0czsKICAgdWludDE2X3QgKnByeGRhdGExNmJpdHM7CkBAIC0xMDQxLDkgKzEwNTQsMTIgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgc2VudCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgcHJvdmlkZWQgdGhyb3VnaCBwVHhEYXRhLgogICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFR4RGF0YSwgdWludDE2X3QgU2l6ZSkKQEAgLTExMDAsMTAgKzExMTYsMTMgQEAKIAogLyoqCiAgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCi0gICogQG5vdGUgIFRvIHJlY2VpdmUgc3luY2hyb25vdXMgZGF0YSwgZHVtbXkgZGF0YSBhcmUgc2ltdWx0YW5lb3VzbHkgdHJhbnNtaXR0ZWQuCisgICogQG5vdGUgICBUbyByZWNlaXZlIHN5bmNocm9ub3VzIGRhdGEsIGR1bW15IGRhdGEgYXJlIHNpbXVsdGFuZW91c2x5IHRyYW5zbWl0dGVkLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBSeERhdGEuCiAgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgotICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0lUKFVTQVJUX0hhbmRsZVR5cGVEZWYgKmh1c2FydCwgdWludDhfdCAqcFJ4RGF0YSwgdWludDE2X3QgU2l6ZSkKQEAgLTExNjgsMTMgKzExODcsMTcgQEAKIAogLyoqCiAgICogQGJyaWVmIEZ1bGwtRHVwbGV4IFNlbmQgYW5kIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuCisgICogQG5vdGUgICBXaGVuIFVBUlQgcGFyaXR5IGlzIG5vdCBlbmFibGVkIChQQ0UgPSAwKSwgYW5kIFdvcmQgTGVuZ3RoIGlzIGNvbmZpZ3VyZWQgdG8gOSBiaXRzIChNMS1NMCA9IDAxKSwKKyAgKiAgICAgICAgIHRoZSBzZW50IGRhdGEgYW5kIHRoZSByZWNlaXZlZCBkYXRhIGFyZSBoYW5kbGVkIGFzIHNldHMgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgYXZhaWxhYmxlIHRocm91Z2ggcFR4RGF0YSBhbmQgdGhyb3VnaCBwUnhEYXRhLgogICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBUWCBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgorICAqIEBwYXJhbSAgcFR4RGF0YSBwb2ludGVyIHRvIFRYIGRhdGEgYnVmZmVyICh1OCBvciB1MTYgZGF0YSBlbGVtZW50cykuCisgICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gUlggZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgZWxlbWVudHMgKHU4IG9yIHUxNikgdG8gYmUgc2VudCAoc2FtZSBhbW91bnQgdG8gYmUgcmVjZWl2ZWQpLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsICB1aW50MTZfdCBTaXplKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQ4X3QgKnBSeERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFNpemUpCiB7CiAKICAgaWYgKGh1c2FydC0+U3RhdGUgPT0gSEFMX1VTQVJUX1NUQVRFX1JFQURZKQpAQCAtMTIzNSw5ICsxMjU4LDEyIEBACiAKIC8qKgogICAqIEBicmllZiBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIERNQSBtb2RlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgc2VudCBkYXRhIGlzIGhhbmRsZWQgYXMgYSBzZXQgb2YgdTE2LiBJbiB0aGlzIGNhc2UsIFNpemUgbXVzdCBpbmRpY2F0ZSB0aGUgbnVtYmVyCisgICogICAgICAgICBvZiB1MTYgcHJvdmlkZWQgdGhyb3VnaCBwVHhEYXRhLgogICAqIEBwYXJhbSAgaHVzYXJ0IFVTQVJUIGhhbmRsZS4KLSAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KLSAgKiBAcGFyYW0gIFNpemUgYW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudC4KKyAgKiBAcGFyYW0gIHBUeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSBzZW50LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0X0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBUeERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xMzE2LDEwICsxMzQyLDEzIEBACiAgICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gRE1BIG1vZGUuCiAgICogQG5vdGUgICBXaGVuIHRoZSBVU0FSVCBwYXJpdHkgaXMgZW5hYmxlZCAoUENFID0gMSksIHRoZSByZWNlaXZlZCBkYXRhIGNvbnRhaW4KICAgKiAgICAgICAgIHRoZSBwYXJpdHkgYml0IChNU0IgcG9zaXRpb24pLgotICAqIEBub3RlIFRoZSBVU0FSVCBETUEgdHJhbnNtaXQgY2hhbm5lbCBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsb2NrIGZvciB0aGUgc2xhdmUuCisgICogQG5vdGUgICBUaGUgVVNBUlQgRE1BIHRyYW5zbWl0IGNoYW5uZWwgbXVzdCBiZSBjb25maWd1cmVkIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjbG9jayBmb3IgdGhlIHNsYXZlLgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgcmVjZWl2ZWQgZGF0YSBpcyBoYW5kbGVkIGFzIGEgc2V0IG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBSeERhdGEuCiAgICogQHBhcmFtICBodXNhcnQgVVNBUlQgaGFuZGxlLgotICAqIEBwYXJhbSAgcFJ4RGF0YSBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgotICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZC4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9SZWNlaXZlX0RNQShVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQsIHVpbnQ4X3QgKnBSeERhdGEsIHVpbnQxNl90IFNpemUpCkBAIC0xNDI4LDEzICsxNDU3LDE3IEBACiAvKioKICAgKiBAYnJpZWYgRnVsbC1EdXBsZXggVHJhbnNtaXQgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZS4KICAgKiBAbm90ZSAgIFdoZW4gdGhlIFVTQVJUIHBhcml0eSBpcyBlbmFibGVkIChQQ0UgPSAxKSB0aGUgZGF0YSByZWNlaXZlZCBjb250YWluIHRoZSBwYXJpdHkgYml0LgorICAqIEBub3RlICAgV2hlbiBVQVJUIHBhcml0eSBpcyBub3QgZW5hYmxlZCAoUENFID0gMCksIGFuZCBXb3JkIExlbmd0aCBpcyBjb25maWd1cmVkIHRvIDkgYml0cyAoTTEtTTAgPSAwMSksCisgICogICAgICAgICB0aGUgc2VudCBkYXRhIGFuZCB0aGUgcmVjZWl2ZWQgZGF0YSBhcmUgaGFuZGxlZCBhcyBzZXRzIG9mIHUxNi4gSW4gdGhpcyBjYXNlLCBTaXplIG11c3QgaW5kaWNhdGUgdGhlIG51bWJlcgorICAqICAgICAgICAgb2YgdTE2IGF2YWlsYWJsZSB0aHJvdWdoIHBUeERhdGEgYW5kIHRocm91Z2ggcFJ4RGF0YS4KICAgKiBAcGFyYW0gIGh1c2FydCBVU0FSVCBoYW5kbGUuCi0gICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gVFggZGF0YSBidWZmZXIuCi0gICogQHBhcmFtICBwUnhEYXRhIHBvaW50ZXIgdG8gUlggZGF0YSBidWZmZXIuCi0gICogQHBhcmFtICBTaXplIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkL3NlbnQuCisgICogQHBhcmFtICBwVHhEYXRhIHBvaW50ZXIgdG8gVFggZGF0YSBidWZmZXIgKHU4IG9yIHUxNiBkYXRhIGVsZW1lbnRzKS4KKyAgKiBAcGFyYW0gIHBSeERhdGEgcG9pbnRlciB0byBSWCBkYXRhIGJ1ZmZlciAodTggb3IgdTE2IGRhdGEgZWxlbWVudHMpLgorICAqIEBwYXJhbSAgU2l6ZSBhbW91bnQgb2YgZGF0YSBlbGVtZW50cyAodTggb3IgdTE2KSB0byBiZSByZWNlaXZlZC9zZW50LgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLCB1aW50MTZfdCBTaXplKQorSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1VTQVJUX1RyYW5zbWl0UmVjZWl2ZV9ETUEoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50OF90ICpwVHhEYXRhLCB1aW50OF90ICpwUnhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU2l6ZSkKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzOwogICB1aW50MzJfdCAqdG1wOwpAQCAtMTcwMCw3ICsxNzMzLDcgQEAKICAgKiAgICAgICAgICAgLSBTZXQgaGFuZGxlIFN0YXRlIHRvIFJFQURZCiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBibG9ja2luZyBtb2RlIDogd2hlbiBleGl0aW5nIGZ1bmN0aW9uLCBBYm9ydCBpcyBjb25zaWRlcmVkIGFzIGNvbXBsZXRlZC4KICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKLSovCisgICovCiBIQUxfU3RhdHVzVHlwZURlZiBIQUxfVVNBUlRfQWJvcnQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0KQogewogICBDTEVBUl9CSVQoaHVzYXJ0LT5JbnN0YW5jZS0+Q1IxLCAoVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9QRUlFIHwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RDSUUpKTsKQEAgLTE3ODksNyArMTgyMiw3IEBACiAgICogQG5vdGUgICBUaGlzIHByb2NlZHVyZSBpcyBleGVjdXRlZCBpbiBJbnRlcnJ1cHQgbW9kZSwgbWVhbmluZyB0aGF0IGFib3J0IHByb2NlZHVyZSBjb3VsZCBiZQogICAqICAgICAgICAgY29uc2lkZXJlZCBhcyBjb21wbGV0ZWQgb25seSB3aGVuIHVzZXIgYWJvcnQgY29tcGxldGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgKG5vdCB3aGVuIGV4aXRpbmcgZnVuY3Rpb24pLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwotKi8KKyAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIEhBTF9VU0FSVF9BYm9ydF9JVChVU0FSVF9IYW5kbGVUeXBlRGVmICpodXNhcnQpCiB7CiAgIHVpbnQzMl90IGFib3J0Y3BsdCA9IDFVOwpAQCAtMTkyNCw3ICsxOTU3LDcgQEAKICAgdWludDMyX3QgZXJyb3Jjb2RlOwogCiAgIC8qIElmIG5vIGVycm9yIG9jY3VycyAqLwotICBlcnJvcmZsYWdzID0gKGlzcmZsYWdzICYgKHVpbnQzMl90KShVU0FSVF9JU1JfUEUgfCBVU0FSVF9JU1JfRkUgfCBVU0FSVF9JU1JfT1JFIHwgVVNBUlRfSVNSX05FKSk7CisgIGVycm9yZmxhZ3MgPSAoaXNyZmxhZ3MgJiAodWludDMyX3QpKFVTQVJUX0lTUl9QRSB8IFVTQVJUX0lTUl9GRSB8IFVTQVJUX0lTUl9PUkUgfCBVU0FSVF9JU1JfTkUgfCBVU0FSVF9JU1JfUlRPRikpOwogICBpZiAoZXJyb3JmbGFncyA9PSAwVSkKICAgewogICAgIC8qIFVTQVJUIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE5NzgsNiArMjAxMSwxNCBAQAogICAgICAgaHVzYXJ0LT5FcnJvckNvZGUgfD0gSEFMX1VTQVJUX0VSUk9SX09SRTsKICAgICB9CiAKKyAgICAvKiBVU0FSVCBSZWNlaXZlciBUaW1lb3V0IGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKGlzcmZsYWdzICYgVVNBUlRfSVNSX1JUT0YpICE9IDBVKSAmJiAoKGNyMWl0cyAmIFVTQVJUX0NSMV9SVE9JRSkgIT0gMFUpKQorICAgIHsKKyAgICAgIF9fSEFMX1VTQVJUX0NMRUFSX0lUKGh1c2FydCwgVVNBUlRfQ0xFQVJfUlRPRik7CisKKyAgICAgIGh1c2FydC0+RXJyb3JDb2RlIHw9IEhBTF9VU0FSVF9FUlJPUl9SVE87CisgICAgfQorCiAKICAgICAvKiBDYWxsIFVTQVJUIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkIGJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICBpZiAoaHVzYXJ0LT5FcnJvckNvZGUgIT0gSEFMX1VTQVJUX0VSUk9SX05PTkUpCkBAIC0yMjA2LDggKzIyNDcsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFVTQVJUX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgVVNBUlQgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICBVU0FSVCBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvciBmdW5jdGlvbnMKKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBTdGF0ZSBhbmQgRXJyb3IgZnVuY3Rpb25zICMjIyMjCkBAIC0yMjUzLDggKzIyOTQsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zIFVTQVJUIFByaXZhdGUgRnVuY3Rpb25zCi0gKiBAewotICovCisgICogQHsKKyAgKi8KIAogLyoqCiAgICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBjYWxsYmFja3MgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCkBAIC0yNTkxLDcgKzI2MzIsOCBAQAogICAqIEBwYXJhbSAgVGltZW91dCB0aW1lb3V0IGR1cmF0aW9uLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwotc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQorc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFVTQVJUX1dhaXRPbkZsYWdVbnRpbFRpbWVvdXQoVVNBUlRfSGFuZGxlVHlwZURlZiAqaHVzYXJ0LCB1aW50MzJfdCBGbGFnLCBGbGFnU3RhdHVzIFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkKIHsKICAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLwogICB3aGlsZSAoKF9fSEFMX1VTQVJUX0dFVF9GTEFHKGh1c2FydCwgRmxhZykgPyBTRVQgOiBSRVNFVCkgPT0gU3RhdHVzKQpAQCAtMjYyNSw2ICsyNjY3LDcgQEAKICAgSEFMX1N0YXR1c1R5cGVEZWYgcmV0ICAgICAgICAgICAgICAgID0gSEFMX09LOwogICB1aW50MTZfdCBicnJ0ZW1wOwogICB1aW50MzJfdCB1c2FydGRpdiAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworICB1aW50MzJfdCBwY2xrOwogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgIGFzc2VydF9wYXJhbShJU19VU0FSVF9QT0xBUklUWShodXNhcnQtPkluaXQuQ0xLUG9sYXJpdHkpKTsKQEAgLTI2NjYsMTYgKzI3MDksMTkgQEAKICAgc3dpdGNoIChjbG9ja3NvdXJjZSkKICAgewogICAgIGNhc2UgVVNBUlRfQ0xPQ0tTT1VSQ0VfUENMSzE6Ci0gICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFBDTEsxRnJlcSgpLCBodXNhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFBDTEsxRnJlcSgpOworICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgocGNsaywgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX1BDTEsyOgotICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgoSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CisgICAgICBwY2xrID0gSEFMX1JDQ19HZXRQQ0xLMkZyZXEoKTsKKyAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KHBjbGssIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9IU0k6CiAgICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIU0lfVkFMVUUsIGh1c2FydC0+SW5pdC5CYXVkUmF0ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBVU0FSVF9DTE9DS1NPVVJDRV9TWVNDTEs6Ci0gICAgICB1c2FydGRpdiA9ICh1aW50MzJfdCkoVVNBUlRfRElWX1NBTVBMSU5HOChIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpLCBodXNhcnQtPkluaXQuQmF1ZFJhdGUpKTsKKyAgICAgIHBjbGsgPSBIQUxfUkNDX0dldFN5c0Nsb2NrRnJlcSgpOworICAgICAgdXNhcnRkaXYgPSAodWludDMyX3QpKFVTQVJUX0RJVl9TQU1QTElORzgocGNsaywgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFVTQVJUX0NMT0NLU09VUkNFX0xTRToKICAgICAgIHVzYXJ0ZGl2ID0gKHVpbnQzMl90KShVU0FSVF9ESVZfU0FNUExJTkc4KExTRV9WQUxVRSwgaHVzYXJ0LT5Jbml0LkJhdWRSYXRlKSk7CkBAIC0yNzMwLDYgKzI3NzYsMTggQEAKICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKICAgICB9CiAgIH0KKyNpZiBkZWZpbmVkKFVTQVJUX0lTUl9SRUFDSykKKyAgLyogQ2hlY2sgaWYgdGhlIFJlY2VpdmVyIGlzIGVuYWJsZWQgKi8KKyAgaWYgKChodXNhcnQtPkluc3RhbmNlLT5DUjEgJiBVU0FSVF9DUjFfUkUpID09IFVTQVJUX0NSMV9SRSkKKyAgeworICAgIC8qIFdhaXQgdW50aWwgUkVBQ0sgZmxhZyBpcyBzZXQgKi8KKyAgICBpZiAoVVNBUlRfV2FpdE9uRmxhZ1VudGlsVGltZW91dChodXNhcnQsIFVTQVJUX0lTUl9SRUFDSywgUkVTRVQsIHRpY2tzdGFydCwgVVNBUlRfVEVBQ0tfUkVBQ0tfVElNRU9VVCkgIT0gSEFMX09LKQorICAgIHsKKyAgICAgIC8qIFRpbWVvdXQgb2NjdXJyZWQgKi8KKyAgICAgIHJldHVybiBIQUxfVElNRU9VVDsKKyAgICB9CisgIH0KKyNlbmRpZgogCiAgIC8qIEluaXRpYWxpemUgdGhlIFVTQVJUIHN0YXRlKi8KICAgaHVzYXJ0LT5TdGF0ZSA9IEhBTF9VU0FSVF9TVEFURV9SRUFEWTsKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfaGFsX3d3ZGcuYyBiL1NyYy9zdG0zMmY3eHhfaGFsX3d3ZGcuYwppbmRleCA1MDY3YWY0Li44MmFmNWUyIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2hhbF93d2RnLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9oYWxfd3dkZy5jCkBAIC0zMiwxNyArMzIsMTkgQEAKICAgICAgICAgKCsrKSBtaW4gdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gV2luZG93KSAvIFdXREcgY2xvY2sKICAgICAgICAgKCsrKSBtYXggdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gMHg0MCkgLyBXV0RHIGNsb2NrCiAgICAgKCspIFR5cGljYWwgdmFsdWVzOgotICAgICAgICAoKyspIENvdW50ZXIgbWluIChUWzU7MF0gPSAweDAwKSBANTZNSHogKFBDTEsxKSB3aXRoIHplcm8gcHJlc2NhbGVyOgotICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogfjczLjE0tXMKLSAgICAgICAgKCsrKSBDb3VudGVyIG1heCAoVFs1OzBdID0gMHgzRikgQDU2TUh6IChQQ0xLMSkgd2l0aCBwcmVzY2FsZXIgZGl2aWRpbmcgYnkgMTI4OgotICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogfjU5OS4xOG1zCisgICAgICAgICgrKykgQ291bnRlciBtaW4gKFRbNTswXSA9IDB4MDApIEA1NE1IeiAoUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CisgICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDc1Ljg1tXMKKyAgICAgICAgKCsrKSBDb3VudGVyIG1heCAoVFs1OzBdID0gMHgzRikgQDU0TUh6IChQQ0xLMSkgd2l0aCBwcmVzY2FsZXIgZGl2aWRpbmcgYnkgODoKKyAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IGFwcHJveGltYXRlbHkgMzguODNtcwogCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgWy4uXQorCiAgICAgKioqIENvbW1vbiBkcml2ZXIgdXNhZ2UgKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgWy4uXQogICAgICgrKSBFbmFibGUgV1dERyBBUEIxIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUoKS4KICAgICAoKykgU2V0IHRoZSBXV0RHIHByZXNjYWxlciwgcmVmcmVzaCB3aW5kb3cgYW5kIGNvdW50ZXIgdmFsdWUKICAgICAgICAgdXNpbmcgSEFMX1dXREdfSW5pdCgpIGZ1bmN0aW9uLgpAQCAtNTksOSArNjEsMTAgQEAKICAgICAgICAgSEFMX1dXREdfUmVmcmVzaCgpIGZ1bmN0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgd2hlbgogICAgICAgICB0aGUgY291bnRlciBpcyBsb3dlciB0aGFuIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZSBhbHJlYWR5IHByb2dyYW1tZWQuCiAKLSAgWy4uXQogICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBbLi5dCiAgICAgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxIGFsbG93cwogICAgIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4gVXNlIEZ1bmN0aW9ucwogICAgIEByZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KQEAgLTgwLDEzICs4MywxNSBAQAogICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yICBFYXJseSBXYWtlVXAgSW50ZXJydXB0LgogICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KIAorICAgIFsuLl0KICAgICBXaGVuIGNhbGxpbmcgQHJlZiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uLCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczogCisgICAgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOgogICAgIEByZWYgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjaygpIGFuZCBIQUxfV1dER19Nc3BJbml0KCkgb25seSBpZiB0aGV5IGhhdmUKICAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KIAorICAgIFsuLl0KICAgICBXaGVuIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCi0gICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgCisgICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgICBhbmQgd2VhayAoc3VyY2hhcmdlZCkgY2FsbGJhY2tzIGFyZSB1c2VkLgogCiAgICAgKioqIFdXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKQEAgLTEzOCw4ICsxNDMsOCBAQAogICAqLwogCiAvKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKLSAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgotICoKKyAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KKyAgKgogQHZlcmJhdGltCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwpAQCAtMTc4LDEyICsxODMsMTIgQEAKIAogI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgIC8qIFJlc2V0IENhbGxiYWNrIHBvaW50ZXJzICovCi0gIGlmKGh3d2RnLT5Fd2lDYWxsYmFjayA9PSBOVUxMKQorICBpZiAoaHd3ZGctPkV3aUNhbGxiYWNrID09IE5VTEwpCiAgIHsKICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogICB9CiAKLSAgaWYoaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQorICBpZiAoaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogICB7CiAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CiAgIH0KQEAgLTI0MiwxMyArMjQ3LDEzIEBACiB7CiAgIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKIAotICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKKyAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQogICB7CiAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwogICB9CiAgIGVsc2UKICAgewotICAgIHN3aXRjaChDYWxsYmFja0lEKQorICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICB7CiAgICAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKICAgICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gcENhbGxiYWNrOwpAQCAtMjcwLDcgKzI3NSw3IEBACiAKIC8qKgogICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFdXREcgQ2FsbGJhY2sKLSAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjayAKKyAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICAqIEBwYXJhbSAgaHd3ZGcgV1dERyBoYW5kbGUKICAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CkBAIC0yODIsNyArMjg3LDcgQEAKIHsKICAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogCi0gIHN3aXRjaChDYWxsYmFja0lEKQorICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgIHsKICAgICBjYXNlIEhBTF9XV0RHX0VXSV9DQl9JRDoKICAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CkBAIC0zMDYsOCArMzExLDggQEAKICAgKi8KIAogLyoqIEBkZWZncm91cCBXV0RHX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwotICogIEBicmllZiAgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCi0gKgorICAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucworICAqCiBAdmVyYmF0aW0KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9sbF9ncGlvLmMgYi9TcmMvc3RtMzJmN3h4X2xsX2dwaW8uYwppbmRleCBiYTU1ODAwLi44NmY5OTk2IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2xsX2dwaW8uYworKysgYi9TcmMvc3RtMzJmN3h4X2xsX2dwaW8uYwpAQCAtMjIwLDkgKzIyMCw2IEBACiAKICAgICBpZiAoY3VycmVudHBpbikKICAgICB7Ci0gICAgICAvKiBQaW4gTW9kZSBjb25maWd1cmF0aW9uICovCi0gICAgICBMTF9HUElPX1NldFBpbk1vZGUoR1BJT3gsIGN1cnJlbnRwaW4sIEdQSU9fSW5pdFN0cnVjdC0+TW9kZSk7Ci0KICAgICAgIGlmICgoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9PVVRQVVQpIHx8IChHUElPX0luaXRTdHJ1Y3QtPk1vZGUgPT0gTExfR1BJT19NT0RFX0FMVEVSTkFURSkpCiAgICAgICB7CiAgICAgICAgIC8qIENoZWNrIFNwZWVkIG1vZGUgcGFyYW1ldGVycyAqLwpAQCAtMjMwLDYgKzIyNywxMiBAQAogCiAgICAgICAgIC8qIFNwZWVkIG1vZGUgY29uZmlndXJhdGlvbiAqLwogICAgICAgICBMTF9HUElPX1NldFBpblNwZWVkKEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPlNwZWVkKTsKKworICAgICAgICAvKiBDaGVjayBPdXRwdXQgbW9kZSBwYXJhbWV0ZXJzICovCisgICAgICAgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX09VVFBVVF9UWVBFKEdQSU9fSW5pdFN0cnVjdC0+T3V0cHV0VHlwZSkpOworCisgICAgICAgIC8qIE91dHB1dCBtb2RlIGNvbmZpZ3VyYXRpb24qLworICAgICAgICBMTF9HUElPX1NldFBpbk91dHB1dFR5cGUoR1BJT3gsIEdQSU9fSW5pdFN0cnVjdC0+UGluLCBHUElPX0luaXRTdHJ1Y3QtPk91dHB1dFR5cGUpOwogICAgICAgfQogCiAgICAgICAvKiBQdWxsLXVwIFB1bGwgZG93biByZXNpc3RvciBjb25maWd1cmF0aW9uKi8KQEAgLTI1MCwxOSArMjUzLDExIEBACiAgICAgICAgICAgTExfR1BJT19TZXRBRlBpbl84XzE1KEdQSU94LCBjdXJyZW50cGluLCBHUElPX0luaXRTdHJ1Y3QtPkFsdGVybmF0ZSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIC8qIFBpbiBNb2RlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgIExMX0dQSU9fU2V0UGluTW9kZShHUElPeCwgY3VycmVudHBpbiwgR1BJT19Jbml0U3RydWN0LT5Nb2RlKTsKICAgICB9CiAgICAgcGlucG9zKys7CiAgIH0KLQotICBpZiAoKEdQSU9fSW5pdFN0cnVjdC0+TW9kZSA9PSBMTF9HUElPX01PREVfT1VUUFVUKSB8fCAoR1BJT19Jbml0U3RydWN0LT5Nb2RlID09IExMX0dQSU9fTU9ERV9BTFRFUk5BVEUpKQotICB7Ci0gICAgLyogQ2hlY2sgT3V0cHV0IG1vZGUgcGFyYW1ldGVycyAqLwotICAgIGFzc2VydF9wYXJhbShJU19MTF9HUElPX09VVFBVVF9UWVBFKEdQSU9fSW5pdFN0cnVjdC0+T3V0cHV0VHlwZSkpOwotCi0gICAgLyogT3V0cHV0IG1vZGUgY29uZmlndXJhdGlvbiovCi0gICAgTExfR1BJT19TZXRQaW5PdXRwdXRUeXBlKEdQSU94LCBHUElPX0luaXRTdHJ1Y3QtPlBpbiwgR1BJT19Jbml0U3RydWN0LT5PdXRwdXRUeXBlKTsKLQotICB9CiAgIHJldHVybiAoU1VDQ0VTUyk7CiB9CiAKZGlmZiAtLWdpdCBhL1NyYy9zdG0zMmY3eHhfbGxfbHB0aW0uYyBiL1NyYy9zdG0zMmY3eHhfbGxfbHB0aW0uYwppbmRleCBjNDA3NmUwLi42M2M4YTU1IDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2xsX2xwdGltLmMKKysrIGIvU3JjL3N0bTMyZjd4eF9sbF9scHRpbS5jCkBAIC0yMSwxOCArMjEsMjAgQEAKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2xsX2xwdGltLmgiCiAjaW5jbHVkZSAic3RtMzJmN3h4X2xsX2J1cy5oIgorI2luY2x1ZGUgInN0bTMyZjd4eF9sbF9yY2MuaCIKKwogCiAjaWZkZWYgIFVTRV9GVUxMX0FTU0VSVAotICAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCisjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCiAjZWxzZQotICAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCisjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCiAjZW5kaWYKIAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9MTF9Ecml2ZXIKICAgKiBAewogICAqLwogCi0jaWYgZGVmaW5lZCAoTFBUSU0xKSB8fCBkZWZpbmVkIChMUFRJTTIpCisjaWYgZGVmaW5lZCAoTFBUSU0xKQogCiAvKiogQGFkZHRvZ3JvdXAgTFBUSU1fTEwKICAgKiBAewpAQCAtNDYsMjggKzQ4LDM1IEBACiAgICogQHsKICAgKi8KICNkZWZpbmUgSVNfTExfTFBUSU1fQ0xPQ0tfU09VUkNFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fQ0xLX1NPVVJDRV9FWFRFUk5BTCkpCiAKICNkZWZpbmUgSVNfTExfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWMSkgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIpICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVY0KSAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOCkgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMikgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQpICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjIpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVY0KSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWOCkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjE2KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX1BSRVNDQUxFUl9ESVYzMikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9MUFRJTV9QUkVTQ0FMRVJfRElWNjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fUFJFU0NBTEVSX0RJVjEyOCkpCiAKICNkZWZpbmUgSVNfTExfTFBUSU1fV0FWRUZPUk0oX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9QV00pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9XQVZFRk9STV9TRVRPTkNFKSkKIAogI2RlZmluZSBJU19MTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9SRUdVTEFSKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfTFBUSU1fT1VUUFVUX1BPTEFSSVRZX0lOVkVSU0UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX0xQVElNX09VVFBVVF9QT0xBUklUWV9JTlZFUlNFKSkKIC8qKgogICAqIEB9CiAgICovCiAKIAogLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiogQGRlZmdyb3VwIExQVElNX1ByaXZhdGVfRnVuY3Rpb25zIExQVElNIFByaXZhdGUgRnVuY3Rpb25zCisgICogQHsKKyAgKi8KKy8qKgorICAqIEB9CisgICovCiAvKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIExQVElNX0xMX0V4cG9ydGVkX0Z1bmN0aW9ucwogICAqIEB7CkBAIC04NCwzMCArOTMsMjMgQEAKICAgKiAgICAgICAgICAtIFNVQ0NFU1M6IExQVElNeCByZWdpc3RlcnMgYXJlIGRlLWluaXRpYWxpemVkCiAgICogICAgICAgICAgLSBFUlJPUjogaW52YWxpZCBMUFRJTXggaW5zdGFuY2UKICAgKi8KLUVycm9yU3RhdHVzIExMX0xQVElNX0RlSW5pdChMUFRJTV9UeXBlRGVmKiBMUFRJTXgpCitFcnJvclN0YXR1cyBMTF9MUFRJTV9EZUluaXQoTFBUSU1fVHlwZURlZiAqTFBUSU14KQogewogICBFcnJvclN0YXR1cyByZXN1bHQgPSBTVUNDRVNTOwogCiAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCi0gIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsgCi0gCisgIGFzc2VydF9wYXJhbShJU19MUFRJTV9JTlNUQU5DRShMUFRJTXgpKTsKKwogICBpZiAoTFBUSU14ID09IExQVElNMSkKICAgewogICAgIExMX0FQQjFfR1JQMV9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKTsKLSAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKTsgIAotICB9IAotI2lmIGRlZmluZWQoTFBUSU0yKQotICBlbHNlIGlmIChMUFRJTXggPT0gTFBUSU0yKQotICB7IAotICAgIExMX0FQQjFfR1JQMl9Gb3JjZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKTsKLSAgICBMTF9BUEIxX0dSUDJfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMl9QRVJJUEhfTFBUSU0yKTsKKyAgICBMTF9BUEIxX0dSUDFfUmVsZWFzZVJlc2V0KExMX0FQQjFfR1JQMV9QRVJJUEhfTFBUSU0xKTsKICAgfQotI2VuZGlmCiAgIGVsc2UKICAgewogICAgIHJlc3VsdCA9IEVSUk9SOwogICB9Ci0gIAorCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTExNyw3ICsxMTksNyBAQAogICAqIEBwYXJhbSAgTFBUSU1fSW5pdFN0cnVjdCBwb2ludGVyIHRvIGEgQHJlZiBMTF9MUFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUKICAgKiBAcmV0dmFsIE5vbmUKICAgKi8KLXZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiogTFBUSU1fSW5pdFN0cnVjdCkKK3ZvaWQgTExfTFBUSU1fU3RydWN0SW5pdChMTF9MUFRJTV9Jbml0VHlwZURlZiAqTFBUSU1fSW5pdFN0cnVjdCkKIHsKICAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KICAgTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UgPSBMTF9MUFRJTV9DTEtfU09VUkNFX0lOVEVSTkFMOwpAQCAtMTM2LDQyICsxMzgsMTQ0IEBACiAgICogICAgICAgICAgLSBTVUNDRVNTOiBMUFRJTXggaW5zdGFuY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKICAgKiAgICAgICAgICAtIEVSUk9SOiBMUFRJTXggaW5zdGFuY2UgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQKICAgKi8KLUVycm9yU3RhdHVzIExMX0xQVElNX0luaXQoTFBUSU1fVHlwZURlZiAqIExQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYqIExQVElNX0luaXRTdHJ1Y3QpCitFcnJvclN0YXR1cyBMTF9MUFRJTV9Jbml0KExQVElNX1R5cGVEZWYgKkxQVElNeCwgTExfTFBUSU1fSW5pdFR5cGVEZWYgKkxQVElNX0luaXRTdHJ1Y3QpCiB7CiAgIEVycm9yU3RhdHVzIHJlc3VsdCA9IFNVQ0NFU1M7Ci0gIAotICAvKiBUaGUgTFBUSU14X0NGR1IgcmVnaXN0ZXIgbXVzdCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGlzIGRpc2FibGVkIAorICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLworICBhc3NlcnRfcGFyYW0oSVNfTFBUSU1fSU5TVEFOQ0UoTFBUSU14KSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFRJTV9DTE9DS19TT1VSQ0UoTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX0NMT0NLX1BSRVNDQUxFUihMUFRJTV9Jbml0U3RydWN0LT5QcmVzY2FsZXIpKTsKKyAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX1dBVkVGT1JNKExQVElNX0luaXRTdHJ1Y3QtPldhdmVmb3JtKSk7CisgIGFzc2VydF9wYXJhbShJU19MTF9MUFRJTV9PVVRQVVRfUE9MQVJJVFkoTFBUSU1fSW5pdFN0cnVjdC0+UG9sYXJpdHkpKTsKKworICAvKiBUaGUgTFBUSU14X0NGR1IgcmVnaXN0ZXIgbXVzdCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIExQVElNIGlzIGRpc2FibGVkCiAgICAgIChFTkFCTEUgYml0IGlzIHJlc2V0IHRvIDApLgogICAqLwotICBpZiAoTExfTFBUSU1fSXNFbmFibGVkKExQVElNeCkpCisgIGlmIChMTF9MUFRJTV9Jc0VuYWJsZWQoTFBUSU14KSA9PSAxVUwpCiAgIHsKICAgICByZXN1bHQgPSBFUlJPUjsKICAgfQogICBlbHNlCiAgIHsKLSAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KLSAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKExQVElNeCkpOyAKLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX0NMT0NLX1NPVVJDRShMUFRJTV9Jbml0U3RydWN0LT5DbG9ja1NvdXJjZSkpOwotICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fQ0xPQ0tfUFJFU0NBTEVSKExQVElNX0luaXRTdHJ1Y3QtPlByZXNjYWxlcikpOwotICBhc3NlcnRfcGFyYW0oSVNfTExfTFBUSU1fV0FWRUZPUk0oTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0pKTsKLSAgYXNzZXJ0X3BhcmFtKElTX0xMX0xQVElNX09VVFBVVF9QT0xBUklUWShMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSkpOwotICAKLSAgLyogU2V0IENLU0VMIGJpdGZpZWxkIGFjY29yZGluZyB0byBDbG9ja1NvdXJjZSB2YWx1ZSAqLwotICAvKiBTZXQgUFJFU0MgYml0ZmllbGQgYWNjb3JkaW5nIHRvIFByZXNjYWxlciB2YWx1ZSAqLwotICAvKiBTZXQgV0FWRSBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gV2F2ZWZvcm0gdmFsdWUgKi8KLSAgLyogU2V0IFdBVkVQT0wgYml0ZmllbGQgYWNjb3JkaW5nIHRvIFBvbGFyaXR5IHZhbHVlICovCi0gIE1PRElGWV9SRUcoTFBUSU14LT5DRkdSLCAKLSAgICAgICAgICAgICAoTFBUSU1fQ0ZHUl9DS1NFTCB8IExQVElNX0NGR1JfUFJFU0MgfCBMUFRJTV9DRkdSX1dBVkV8IExQVElNX0NGR1JfV0FWUE9MKSwgCi0gICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tTb3VyY2UgfCBcCi0gICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyIHwgXAotICAgICAgICAgICAgIExQVElNX0luaXRTdHJ1Y3QtPldhdmVmb3JtIHwgXAotICAgICAgICAgICAgIExQVElNX0luaXRTdHJ1Y3QtPlBvbGFyaXR5KTsKKyAgICAvKiBTZXQgQ0tTRUwgYml0ZmllbGQgYWNjb3JkaW5nIHRvIENsb2NrU291cmNlIHZhbHVlICovCisgICAgLyogU2V0IFBSRVNDIGJpdGZpZWxkIGFjY29yZGluZyB0byBQcmVzY2FsZXIgdmFsdWUgKi8KKyAgICAvKiBTZXQgV0FWRSBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gV2F2ZWZvcm0gdmFsdWUgKi8KKyAgICAvKiBTZXQgV0FWRVBPTCBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gUG9sYXJpdHkgdmFsdWUgKi8KKyAgICBNT0RJRllfUkVHKExQVElNeC0+Q0ZHUiwKKyAgICAgICAgICAgICAgIChMUFRJTV9DRkdSX0NLU0VMIHwgTFBUSU1fQ0ZHUl9QUkVTQyB8IExQVElNX0NGR1JfV0FWRSB8IExQVElNX0NGR1JfV0FWUE9MKSwKKyAgICAgICAgICAgICAgIExQVElNX0luaXRTdHJ1Y3QtPkNsb2NrU291cmNlIHwgXAorICAgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+UHJlc2NhbGVyIHwgXAorICAgICAgICAgICAgICAgTFBUSU1fSW5pdFN0cnVjdC0+V2F2ZWZvcm0gfCBcCisgICAgICAgICAgICAgICBMUFRJTV9Jbml0U3RydWN0LT5Qb2xhcml0eSk7CiAgIH0KIAogICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioKKyAgKiBAYnJpZWYgIERpc2FibGUgdGhlIExQVElNIGluc3RhbmNlCisgICogQHJtdG9sbCBDUiAgICAgICAgICAgRU5BQkxFICAgICAgICBMTF9MUFRJTV9EaXNhYmxlCisgICogQHBhcmFtICBMUFRJTXggTG93LVBvd2VyIFRpbWVyIGluc3RhbmNlCisgICogQG5vdGUgICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHJlcXVpcmVkIHRvIHNvbHZlIExQVElNIGRpc2FibGUgSFcgbGltaXRhdGlvbi4KKyAgKiAgICAgICAgIFBsZWFzZSBjaGVjayBFcnJhdGEgU2hlZXQgRVMwMzM1IGZvciBtb3JlIGRldGFpbHMgdW5kZXIgIk1DVSBtYXkgcmVtYWluCisgICogICAgICAgICBzdHVjayBpbiBMUFRJTSBpbnRlcnJ1cHQgd2hlbiBlbnRlcmluZyBTdG9wIG1vZGUiIHNlY3Rpb24uCisgICogQHJldHZhbCBOb25lCisgICovCit2b2lkIExMX0xQVElNX0Rpc2FibGUoTFBUSU1fVHlwZURlZiAqTFBUSU14KQoreworICBMTF9SQ0NfQ2xvY2tzVHlwZURlZiByY2NfY2xvY2s7CisgIHVpbnQzMl90IHRtcGNsa3NvdXJjZSA9IDA7CisgIHVpbnQzMl90IHRtcElFUjsKKyAgdWludDMyX3QgdG1wQ0ZHUjsKKyAgdWludDMyX3QgdG1wQ01QOworICB1aW50MzJfdCB0bXBBUlI7CisKKyAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KKyAgYXNzZXJ0X3BhcmFtKElTX0xQVElNX0lOU1RBTkNFKExQVElNeCkpOworCisgIF9fZGlzYWJsZV9pcnEoKTsKKworICAvKioqKioqKioqKiBTYXZlIExQVElNIENvbmZpZyAqKioqKioqKiovCisgIC8qIFNhdmUgTFBUSU0gc291cmNlIGNsb2NrICovCisgIHN3aXRjaCAoKHVpbnQzMl90KUxQVElNeCkKKyAgeworICAgIGNhc2UgTFBUSU0xX0JBU0U6CisgICAgICB0bXBjbGtzb3VyY2UgPSBMTF9SQ0NfR2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICAvKiBTYXZlIExQVElNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisgIHRtcElFUiA9IExQVElNeC0+SUVSOworICB0bXBDRkdSID0gTFBUSU14LT5DRkdSOworICB0bXBDTVAgPSBMUFRJTXgtPkNNUDsKKyAgdG1wQVJSID0gTFBUSU14LT5BUlI7CisKKyAgLyoqKioqKioqKioqKiogUmVzZXQgTFBUSU0gKioqKioqKioqKioqLworICAodm9pZClMTF9MUFRJTV9EZUluaXQoTFBUSU14KTsKKworICAvKioqKioqKioqIFJlc3RvcmUgTFBUSU0gQ29uZmlnICoqKioqKiovCisgIExMX1JDQ19HZXRTeXN0ZW1DbG9ja3NGcmVxKCZyY2NfY2xvY2spOworCisgIGlmICgodG1wQ01QICE9IDBVTCkgfHwgKHRtcEFSUiAhPSAwVUwpKQorICB7CisgICAgLyogRm9yY2UgTFBUSU0gc291cmNlIGtlcm5lbCBjbG9jayBmcm9tIEFQQiAqLworICAgIHN3aXRjaCAoKHVpbnQzMl90KUxQVElNeCkKKyAgICB7CisgICAgICBjYXNlIExQVElNMV9CQVNFOgorICAgICAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZShMTF9SQ0NfTFBUSU0xX0NMS1NPVVJDRV9QQ0xLMSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRtcENNUCAhPSAwVUwpCisgICAgeworICAgICAgLyogUmVzdG9yZSBDTVAgYW5kIEFSUiByZWdpc3RlcnMgKExQVElNIHNob3VsZCBiZSBlbmFibGVkIGZpcnN0KSAqLworICAgICAgTFBUSU14LT5DUiB8PSBMUFRJTV9DUl9FTkFCTEU7CisgICAgICBMUFRJTXgtPkNNUCA9IHRtcENNUDsKKworICAgICAgLyogUG9sbGluZyBvbiBDTVAgd3JpdGUgb2sgc3RhdHVzIGFmdGVyIGFib3ZlIHJlc3RvcmUgb3BlcmF0aW9uICovCisgICAgICBkbworICAgICAgeworICAgICAgICByY2NfY2xvY2suU1lTQ0xLX0ZyZXF1ZW5jeS0tOyAvKiBVc2VkIGZvciB0aW1lb3V0ICovCisgICAgICB9CisgICAgICB3aGlsZSAoKChMTF9MUFRJTV9Jc0FjdGl2ZUZsYWdfQ01QT0soTFBUSU14KSAhPSAxVUwpKSAmJiAoKHJjY19jbG9jay5TWVNDTEtfRnJlcXVlbmN5KSA+IDBVTCkpOworCisgICAgICBMTF9MUFRJTV9DbGVhckZsYWdfQ01QT0soTFBUSU14KTsKKyAgICB9CisKKyAgICBpZiAodG1wQVJSICE9IDBVTCkKKyAgICB7CisgICAgICBMUFRJTXgtPkNSIHw9IExQVElNX0NSX0VOQUJMRTsKKyAgICAgIExQVElNeC0+QVJSID0gdG1wQVJSOworCisgICAgICBMTF9SQ0NfR2V0U3lzdGVtQ2xvY2tzRnJlcSgmcmNjX2Nsb2NrKTsKKyAgICAgIC8qIFBvbGxpbmcgb24gQVJSIHdyaXRlIG9rIHN0YXR1cyBhZnRlciBhYm92ZSByZXN0b3JlIG9wZXJhdGlvbiAqLworICAgICAgZG8KKyAgICAgIHsKKyAgICAgICAgcmNjX2Nsb2NrLlNZU0NMS19GcmVxdWVuY3ktLTsgLyogVXNlZCBmb3IgdGltZW91dCAqLworICAgICAgfQorICAgICAgd2hpbGUgKCgoTExfTFBUSU1fSXNBY3RpdmVGbGFnX0FSUk9LKExQVElNeCkgIT0gMVVMKSkgJiYgKChyY2NfY2xvY2suU1lTQ0xLX0ZyZXF1ZW5jeSkgPiAwVUwpKTsKKworICAgICAgTExfTFBUSU1fQ2xlYXJGbGFnX0FSUk9LKExQVElNeCk7CisgICAgfQorCisKKyAgICAvKiBSZXN0b3JlIExQVElNIHNvdXJjZSBrZXJuZWwgY2xvY2sgKi8KKyAgICBMTF9SQ0NfU2V0TFBUSU1DbG9ja1NvdXJjZSh0bXBjbGtzb3VyY2UpOworICB9CisKKyAgLyogUmVzdG9yZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAoTFBUSU0gc2hvdWxkIGJlIGRpc2FibGVkIGZpcnN0KSAqLworICBMUFRJTXgtPkNSICY9IH4oTFBUSU1fQ1JfRU5BQkxFKTsKKyAgTFBUSU14LT5JRVIgPSB0bXBJRVI7CisgIExQVElNeC0+Q0ZHUiA9IHRtcENGR1I7CisKKyAgX19lbmFibGVfaXJxKCk7Cit9CisKKy8qKgogICAqIEB9CiAgICovCiAKQEAgLTE4MywxMiArMjg3LDEyIEBACiAgICogQH0KICAgKi8KIAotI2VuZGlmIC8qIGRlZmluZWQgKExQVElNMSkgfHwgZGVmaW5lZCAoTFBUSU0yKSAqLworI2VuZGlmIC8qIExQVElNMSAqLwogCiAvKioKICAgKiBAfQogICAqLwotICAKKwogI2VuZGlmIC8qIFVTRV9GVUxMX0xMX0RSSVZFUiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9sbF9yY2MuYyBiL1NyYy9zdG0zMmY3eHhfbGxfcmNjLmMKaW5kZXggOWMwM2Q1Ni4uMDgzNjU5YiAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9sbF9yY2MuYworKysgYi9TcmMvc3RtMzJmN3h4X2xsX3JjYy5jCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgKi8KIEVycm9yU3RhdHVzIExMX1JDQ19EZUluaXQodm9pZCkKIHsKLSAgdWludDMyX3QgdmxfbWFzayA9IDB4RkZGRkZGRkZVOworICBfX0lPIHVpbnQzMl90IHZsX21hc2s7CiAKICAgLyogU2V0IEhTSU9OIGJpdCAqLwogICBMTF9SQ0NfSFNJX0VuYWJsZSgpOwpAQCAtMTc1LDEwICsxNzUsMTMgQEAKICAgLyogUmVzZXQgQ0ZHUiByZWdpc3RlciAqLwogICBMTF9SQ0NfV3JpdGVSZWcoQ0ZHUiwgMHgwMDAwMDAwMFUpOwogCisgIC8qIFJlYWQgQ1IgcmVnaXN0ZXIgKi8KKyAgdmxfbWFzayA9IExMX1JDQ19SZWFkUmVnKENSKTsKKyAgCiAgIC8qIFJlc2V0IEhTRU9OLCBIU0VCWVAsIFBMTE9OLCBDU1NPTiwgUExMSTJTT04gYW5kIFBMTFNBSU9OIGJpdHMgKi8KICAgQ0xFQVJfQklUKHZsX21hc2ssIChSQ0NfQ1JfSFNFT04gfCBSQ0NfQ1JfSFNFQllQIHwgUkNDX0NSX1BMTE9OIHwgUkNDX0NSX0NTU09OIHwgUkNDX0NSX1BMTFNBSU9OIHwgUkNDX0NSX1BMTEkyU09OKSk7CiAKLSAgLyogV3JpdGUgbmV3IG1hc2sgaW4gQ1IgcmVnaXN0ZXIgKi8KKyAgLyogV3JpdGUgbmV3IHZhbHVlIGluIENSIHJlZ2lzdGVyICovCiAgIExMX1JDQ19Xcml0ZVJlZyhDUiwgdmxfbWFzayk7CiAKICAgLyogU2V0IEhTSVRSSU0gYml0cyB0byB0aGUgcmVzZXQgdmFsdWUqLwpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9sbF9zZG1tYy5jIGIvU3JjL3N0bTMyZjd4eF9sbF9zZG1tYy5jCmluZGV4IGNjYjgwNTcuLjNjZDViMWYgMTAwNjQ0Ci0tLSBhL1NyYy9zdG0zMmY3eHhfbGxfc2RtbWMuYworKysgYi9TcmMvc3RtMzJmN3h4X2xsX3NkbW1jLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFNETU1DIHBlcmlwaGVyYWwgZmVhdHVyZXMgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAKLSAgICBbLi5dIFRoZSBTRC9TRE1NQyBNTUMgY2FyZCBob3N0IGludGVyZmFjZSAoU0RNTUMpIHByb3ZpZGVzIGFuIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBBUEIyCisgICAgWy4uXSBUaGUgU0QvU0RNTUMgTU1DIGNhcmQgaG9zdCBpbnRlcmZhY2UgKFNETU1DKSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgQUhCCiAgICAgICAgICBwZXJpcGhlcmFsIGJ1cyBhbmQgTXVsdGlNZWRpYSBjYXJkcyAoTU1DcyksIFNEIG1lbW9yeSBjYXJkcywgU0RNTUMgY2FyZHMgYW5kIENFLUFUQQogICAgICAgICAgZGV2aWNlcy4KICAgICAKQEAgLTI5LDggKzI5LDcgQEAKICAgICAgICAgICgrKSBGdWxsIHN1cHBvcnQgb2YgdGhlIENFLUFUQSBmZWF0dXJlcyAoZnVsbCBjb21wbGlhbmNlIHdpdGggQ0UtQVRBIGRpZ2l0YWwgcHJvdG9jb2wKICAgICAgICAgICAgICBSZXYxLjEpCiAgICAgICAgICAoKykgRGF0YSB0cmFuc2ZlciB1cCB0byA0OCBNSHogZm9yIHRoZSA4IGJpdCBtb2RlCi0gICAgICAgICAoKykgRGF0YSBhbmQgY29tbWFuZCBvdXRwdXQgZW5hYmxlIHNpZ25hbHMgdG8gY29udHJvbCBleHRlcm5hbCBiaWRpcmVjdGlvbmFsIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgIAorICAgICAgICAgKCspIERhdGEgYW5kIGNvbW1hbmQgb3V0cHV0IGVuYWJsZSBzaWduYWxzIHRvIGNvbnRyb2wgZXh0ZXJuYWwgYmlkaXJlY3Rpb25hbCBkcml2ZXJzCiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NCw4ICs0Myw4IEBACiAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIGV4dGVybmFsIGRldmljZS4KICAgIAogICAgIFsuLl0KLSAgICAgICgrKSBUaGUgU0RNTUMgY2xvY2sgKFNETU1DQ0xLID0gNDggTUh6KSBpcyBjb21pbmcgZnJvbSBhIHNwZWNpZmljIG91dHB1dCBvZiBQTEwgCi0gICAgICAgICAgKFBMTDQ4Q0xLKS4gQmVmb3JlIHN0YXJ0IHdvcmtpbmcgd2l0aCBTRE1NQyBwZXJpcGhlcmFsIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAgKCspIFRoZSBTRE1NQyBjbG9jayAoU0RNTUNDTEsgPSA0OCBNSHopIGlzIGNvbWluZyBmcm9tIGEgc3BlY2lmaWMgb3V0cHV0IChNU0ksIFBMTFVTQjFDTEssCisgICAgICAgICAgUExMVVNCMkNMSykuIEJlZm9yZSBzdGFydCB3b3JraW5nIHdpdGggU0RNTUMgcGVyaXBoZXJhbCBtYWtlIHN1cmUgdGhhdCB0aGUKICAgICAgICAgICBQTEwgaXMgd2VsbCBjb25maWd1cmVkLgogICAgICAgICAgIFRoZSBTRE1NQyBwZXJpcGhlcmFsIHVzZXMgdHdvIGNsb2NrIHNpZ25hbHM6CiAgICAgICAgICAgKCsrKSBTRE1NQyBhZGFwdGVyIGNsb2NrIChTRE1NQ0NMSyA9IDQ4IE1IeikKQEAgLTU3LDEzICs1NiwxMyBAQAogICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHBlcmlwaGVyYWwgY2xvY2sgdXNpbmcgUkNDIHBlcmlwaGVyYWwgbWFjcm9zIHJlbGF0ZWQgdG8gU0RNTUMKICAgICAgICAgICBwZXJpcGhlcmFsLgogCi0gICAgICAoKykgRW5hYmxlIHRoZSBQb3dlciBPTiBTdGF0ZSB1c2luZyB0aGUgU0RNTUNfUG93ZXJTdGF0ZV9PTihTRE1NQ3gpIAotICAgICAgICAgIGZ1bmN0aW9uIGFuZCBkaXNhYmxlIGl0IHVzaW5nIHRoZSBmdW5jdGlvbiBTRE1NQ19Qb3dlclN0YXRlX09GRihTRE1NQ3gpLgorICAgICAgKCspIEVuYWJsZSB0aGUgUG93ZXIgT04gU3RhdGUgdXNpbmcgdGhlIFNETU1DX1Bvd2VyU3RhdGVfT04oKSAKKyAgICAgICAgICBmdW5jdGlvbiBhbmQgZGlzYWJsZSBpdCB1c2luZyB0aGUgZnVuY3Rpb24gU0RNTUNfUG93ZXJTdGF0ZV9PRkYoKS4KICAgICAgICAgICAgICAgICAKICAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgY2xvY2sgdXNpbmcgdGhlIF9fU0RNTUNfRU5BQkxFKCkvX19TRE1NQ19ESVNBQkxFKCkgbWFjcm9zLgogICAKLSAgICAgICgrKSBFbmFibGUvRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzIHVzaW5nIHRoZSBtYWNyb3MgX19TRE1NQ19FTkFCTEVfSVQoaFNETU1DLCBJVCkgCi0gICAgICAgICAgYW5kIF9fU0RNTUNfRElTQUJMRV9JVChoU0RNTUMsIElUKSBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IG1vZGUuIAorICAgICAgKCspIEVuYWJsZS9EaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGludGVycnVwdHMgdXNpbmcgdGhlIG1hY3JvcyBfX1NETU1DX0VOQUJMRV9JVCgpIAorICAgICAgICAgIGFuZCBfX1NETU1DX0RJU0FCTEVfSVQoKSBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IG1vZGUuIAogICAKICAgICAgICgrKSBXaGVuIHVzaW5nIHRoZSBETUEgbW9kZSAKICAgICAgICAgICAoKyspIENvbmZpZ3VyZSB0aGUgRE1BIGluIHRoZSBNU1AgbGF5ZXIgb2YgdGhlIGV4dGVybmFsIGRldmljZQpAQCAtNzIsNyArNzEsNyBAQAogICAgICAgICAgICAgICAgX19TRE1NQ19ETUFfRElTQUJMRSgpLgogICAKICAgICAgICgrKSBUbyBjb250cm9sIHRoZSBDUFNNIChDb21tYW5kIFBhdGggU3RhdGUgTWFjaGluZSkgYW5kIHNlbmQgCi0gICAgICAgICAgY29tbWFuZHMgdG8gdGhlIGNhcmQgdXNlIHRoZSBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gpLCAKKyAgICAgICAgICBjb21tYW5kcyB0byB0aGUgY2FyZCB1c2UgdGhlIFNETU1DX1NlbmRDb21tYW5kKCksIAogICAgICAgICAgIFNETU1DX0dldENvbW1hbmRSZXNwb25zZSgpIGFuZCBTRE1NQ19HZXRSZXNwb25zZSgpIGZ1bmN0aW9ucy4gRmlyc3QsIHVzZXIgaGFzCiAgICAgICAgICAgdG8gZmlsbCB0aGUgY29tbWFuZCBzdHJ1Y3R1cmUgKHBvaW50ZXIgdG8gU0RNTUNfQ21kSW5pdFR5cGVEZWYpIGFjY29yZGluZyAKICAgICAgICAgICB0byB0aGUgc2VsZWN0ZWQgY29tbWFuZCB0byBiZSBzZW50LgpAQCAtMTM1LDcgKzEzNCw3IEBACiAgICAgKioqIENvbW1hbmQgbWFuYWdlbWVudCBvcGVyYXRpb25zICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBbLi5dCi0gICAgICgjKSBUaGUgY29tbWFuZHMgdXNlZCBmb3IgUmVhZC9Xcml0ZS8vRXJhc2Ugb3BlcmF0aW9ucyBhcmUgbWFuYWdlZCBpbiAKKyAgICAgKCMpIFRoZSBjb21tYW5kcyB1c2VkIGZvciBSZWFkL1dyaXRlL0VyYXNlIG9wZXJhdGlvbnMgYXJlIG1hbmFnZWQgaW4gCiAgICAgICAgICBzZXBhcmF0ZSBmdW5jdGlvbnMuIAogICAgICAgICAgRWFjaCBmdW5jdGlvbiBhbGxvd3MgdG8gc2VuZCB0aGUgbmVlZGVkIGNvbW1hbmQgd2l0aCB0aGUgcmVsYXRlZCBhcmd1bWVudCwKICAgICAgICAgIHRoZW4gY2hlY2sgdGhlIHJlc3BvbnNlLgpAQCAtMTUxLDcgKzE1MCw3IEBACiAgICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQorICAqICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAgKgogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKi8gCkBAIC0xNTksNiArMTU4LDggQEAKIC8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAic3RtMzJmN3h4X2hhbC5oIgogCisjaWYgZGVmaW5lZChTRE1NQzEpCisKIC8qKiBAYWRkdG9ncm91cCBTVE0zMkY3eHhfSEFMX0RyaXZlcgogICAqIEB7CiAgICovCkBAIC0xNjgsNyArMTY5LDcgQEAKICAgKiBAewogICAqLwogCi0jaWYgZGVmaW5lZCAoSEFMX1NEX01PRFVMRV9FTkFCTEVEKSB8fCBkZWZpbmVkKEhBTF9NTUNfTU9EVUxFX0VOQUJMRUQpCisjaWYgZGVmaW5lZChIQUxfU0RfTU9EVUxFX0VOQUJMRUQpIHx8IGRlZmluZWQoSEFMX01NQ19NT0RVTEVfRU5BQkxFRCkKIAogLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMDQsOCArMjA1LDggQEAKIC8qKgogICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFNETU1DIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBTRE1NQ19Jbml0VHlwZURlZiBhbmQgY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UKLSAgKiBAcGFyYW0gIEluaXQgU0RNTUMgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlICAgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQorICAqIEBwYXJhbSAgSW5pdDogU0RNTUMgaW5pdGlhbGl6YXRpb24gc3RydWN0dXJlICAgCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiBIQUxfU3RhdHVzVHlwZURlZiBTRE1NQ19Jbml0KFNETU1DX1R5cGVEZWYgKlNETU1DeCwgU0RNTUNfSW5pdFR5cGVEZWYgSW5pdCkKQEAgLTI1OCw3ICsyNTksNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFJlYWQgZGF0YSAod29yZCkgZnJvbSBSeCBGSUZPIGluIGJsb2NraW5nIG1vZGUgKHBvbGxpbmcpIAotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX1JlYWRGSUZPKFNETU1DX1R5cGVEZWYgKlNETU1DeCkKQEAgLTI2OSw4ICsyNzAsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFdyaXRlIGRhdGEgKHdvcmQpIHRvIFR4IEZJRk8gaW4gYmxvY2tpbmcgbW9kZSAocG9sbGluZykgCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCi0gICogQHBhcmFtICBwV3JpdGVEYXRhIHBvaW50ZXIgdG8gZGF0YSB0byB3cml0ZQorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UKKyAgKiBAcGFyYW0gIHBXcml0ZURhdGE6IHBvaW50ZXIgdG8gZGF0YSB0byB3cml0ZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgU0RNTUNfV3JpdGVGSUZPKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgKnBXcml0ZURhdGEpCkBAIC0zMDIsMjAgKzMwMywyNCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldCBTRE1NQyBQb3dlciBzdGF0ZSB0byBPTi4gCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogSEFMX1N0YXR1c1R5cGVEZWYgU0RNTUNfUG93ZXJTdGF0ZV9PTihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7ICAKICAgLyogU2V0IHBvd2VyIHN0YXRlIHRvIE9OICovIAogICBTRE1NQ3gtPlBPV0VSID0gU0RNTUNfUE9XRVJfUFdSQ1RSTDsKKworICAvKiAxbXM6IHJlcXVpcmVkIHBvd2VyIHVwIHdhaXRpbmcgdGltZSBiZWZvcmUgc3RhcnRpbmcgdGhlIFNEIGluaXRpYWxpemF0aW9uCisgIHNlcXVlbmNlICovCisgIEhBTF9EZWxheSgyKTsKICAgCi0gIHJldHVybiBIQUxfT0s7IAorICByZXR1cm4gSEFMX09LOwogfQogCiAvKioKICAgKiBAYnJpZWYgIFNldCBTRE1NQyBQb3dlciBzdGF0ZSB0byBPRkYuIAotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIEhBTF9TdGF0dXNUeXBlRGVmIFNETU1DX1Bvd2VyU3RhdGVfT0ZGKFNETU1DX1R5cGVEZWYgKlNETU1DeCkKQEAgLTMyOCw3ICszMzMsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIEdldCBTRE1NQyBQb3dlciBzdGF0ZS4gCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQogICAqIEByZXR2YWwgUG93ZXIgc3RhdHVzIG9mIHRoZSBjb250cm9sbGVyLiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgCiAgICogICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgogICAqICAgICAgICAgICAgLSAweDAwOiBQb3dlciBPRkYKQEAgLTM0Myw4ICszNDgsOCBAQAogLyoqCiAgICogQGJyaWVmICBDb25maWd1cmUgdGhlIFNETU1DIGNvbW1hbmQgcGF0aCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluCiAgICogICAgICAgICBTRE1NQ19DbWRJbml0VHlwZURlZiBzdHJ1Y3R1cmUgYW5kIHNlbmQgdGhlIGNvbW1hbmQgCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCi0gICogQHBhcmFtICBDb21tYW5kIHBvaW50ZXIgdG8gYSBTRE1NQ19DbWRJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCisgICogQHBhcmFtICBDb21tYW5kOiBwb2ludGVyIHRvIGEgU0RNTUNfQ21kSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgCiAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNETU1DIGNvbW1hbmQKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KQEAgLTM3NSw3ICszODAsNyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFJldHVybiB0aGUgY29tbWFuZCBpbmRleCBvZiBsYXN0IGNvbW1hbmQgZm9yIHdoaWNoIHJlc3BvbnNlIHJlY2VpdmVkCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQogICAqIEByZXR2YWwgQ29tbWFuZCBpbmRleCBvZiB0aGUgbGFzdCBjb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkCiAgICovCiB1aW50OF90IFNETU1DX0dldENvbW1hbmRSZXNwb25zZShTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCkBAIC0zODYsOCArMzkxLDggQEAKIAogLyoqCiAgICogQGJyaWVmICBSZXR1cm4gdGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIGNhcmQgZm9yIHRoZSBsYXN0IGNvbW1hbmQKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgICAgCi0gICogQHBhcmFtICBSZXNwb25zZSBTcGVjaWZpZXMgdGhlIFNETU1DIHJlc3BvbnNlIHJlZ2lzdGVyLiAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgIAorICAqIEBwYXJhbSAgUmVzcG9uc2U6IFNwZWNpZmllcyB0aGUgU0RNTUMgcmVzcG9uc2UgcmVnaXN0ZXIuIAogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX1JFU1AxOiBSZXNwb25zZSBSZWdpc3RlciAxCiAgICogICAgICAgICAgICBAYXJnIFNETU1DX1JFU1AyOiBSZXNwb25zZSBSZWdpc3RlciAyCkBAIC0zOTcsMTMgKzQwMiwxMyBAQAogICAqLwogdWludDMyX3QgU0RNTUNfR2V0UmVzcG9uc2UoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBSZXNwb25zZSkKIHsKLSAgX19JTyB1aW50MzJfdCB0bXAgPSAwOworICB1aW50MzJfdCB0bXA7CiAKICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgYXNzZXJ0X3BhcmFtKElTX1NETU1DX1JFU1AoUmVzcG9uc2UpKTsKICAgCiAgIC8qIEdldCB0aGUgcmVzcG9uc2UgKi8KLSAgdG1wID0gKHVpbnQzMl90KSYoU0RNTUN4LT5SRVNQMSkgKyBSZXNwb25zZTsKKyAgdG1wID0gKHVpbnQzMl90KSgmKFNETU1DeC0+UkVTUDEpKSArIFJlc3BvbnNlOwogICAKICAgcmV0dXJuICgqKF9fSU8gdWludDMyX3QgKikgdG1wKTsKIH0gIApAQCAtNDExLDggKzQxNiw4IEBACiAvKioKICAgKiBAYnJpZWYgIENvbmZpZ3VyZSB0aGUgU0RNTUMgZGF0YSBwYXRoIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIAogICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgU0RNTUNfRGF0YUluaXRUeXBlRGVmLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgCi0gICogQHBhcmFtICBEYXRhICBwb2ludGVyIHRvIGEgU0RNTUNfRGF0YUluaXRUeXBlRGVmIHN0cnVjdHVyZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAKKyAgKiBAcGFyYW0gIERhdGEgOiBwb2ludGVyIHRvIGEgU0RNTUNfRGF0YUluaXRUeXBlRGVmIHN0cnVjdHVyZSAKICAgKiAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBTRE1NQyBkYXRhLgogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwpAQCAtNDQ4LDcgKzQ1Myw3IEBACiAKIC8qKgogICAqIEBicmllZiAgUmV0dXJucyBudW1iZXIgb2YgcmVtYWluaW5nIGRhdGEgYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQuCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZQogICAqIEByZXR2YWwgTnVtYmVyIG9mIHJlbWFpbmluZyBkYXRhIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkCiAgICovCiB1aW50MzJfdCBTRE1NQ19HZXREYXRhQ291bnRlcihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCkBAIC00NTgsNyArNDYzLDcgQEAKIAogLyoqCiAgICogQGJyaWVmICBHZXQgdGhlIEZJRk8gZGF0YQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgRGF0YSByZWNlaXZlZAogICAqLwogdWludDMyX3QgU0RNTUNfR2V0RklGT0NvdW50KFNETU1DX1R5cGVEZWYgKlNETU1DeCkKQEAgLTQ2OCw4ICs0NzMsOCBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNldHMgb25lIG9mIHRoZSB0d28gb3B0aW9ucyBvZiBpbnNlcnRpbmcgcmVhZCB3YWl0IGludGVydmFsLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAgIAotICAqIEBwYXJhbSAgU0RNTUNfUmVhZFdhaXRNb2RlIFNETU1DIFJlYWQgV2FpdCBvcGVyYXRpb24gbW9kZS4KKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlICAgCisgICogQHBhcmFtICBTRE1NQ19SZWFkV2FpdE1vZGU6IFNETU1DIFJlYWQgV2FpdCBvcGVyYXRpb24gbW9kZS4KICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6CiAgICogICAgICAgICAgICBAYXJnIFNETU1DX1JFQURfV0FJVF9NT0RFX0NMSzogUmVhZCBXYWl0IGNvbnRyb2wgYnkgc3RvcHBpbmcgU0RNTUNDTEsKICAgKiAgICAgICAgICAgIEBhcmcgU0RNTUNfUkVBRF9XQUlUX01PREVfREFUQTI6IFJlYWQgV2FpdCBjb250cm9sIHVzaW5nIFNETU1DX0RBVEEyCkBAIC01MDcsMTMgKzUxMiwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIERhdGEgQmxvY2sgTGVuZ2h0IGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kQmxvY2tMZW5ndGgoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBCbG9ja1NpemUpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovIAogICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAodWludDMyX3QpQmxvY2tTaXplOwpAQCAtNTIxLDcgKzUyNiw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NFVF9CTE9DS0xFTiwgU0RNTUNfQ01EVElNRU9VVCk7CkBAIC01MzEsMTMgKzUzNiwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIFJlYWQgU2luZ2xlIEJsb2NrIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kUmVhZFNpbmdsZUJsb2NrKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgUmVhZEFkZCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCiAgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClSZWFkQWRkOwpAQCAtNTQ1LDcgKzU1MCw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1JFQURfU0lOR0xFX0JMT0NLLCBTRE1NQ19DTURUSU1FT1VUKTsKQEAgLTU1NSwxMyArNTYwLDEzIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgUmVhZCBNdWx0aSBCbG9jayBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFJlYWRNdWx0aUJsb2NrKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgUmVhZEFkZCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCiAgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClSZWFkQWRkOwpAQCAtNTY5LDcgKzU3NCw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1JFQURfTVVMVF9CTE9DSywgU0RNTUNfQ01EVElNRU9VVCk7CkBAIC01NzksMTMgKzU4NCwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIFdyaXRlIFNpbmdsZSBCbG9jayBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFdyaXRlU2luZ2xlQmxvY2soU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBXcml0ZUFkZCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCiAgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClXcml0ZUFkZDsKQEAgLTU5Myw3ICs1OTgsNyBAQAogICBzZG1tY19jbWRpbml0LlJlc3BvbnNlICAgICAgICAgPSBTRE1NQ19SRVNQT05TRV9TSE9SVDsKICAgc2RtbWNfY21kaW5pdC5XYWl0Rm9ySW50ZXJydXB0ID0gU0RNTUNfV0FJVF9OTzsKICAgc2RtbWNfY21kaW5pdC5DUFNNICAgICAgICAgICAgID0gU0RNTUNfQ1BTTV9FTkFCTEU7Ci0gIFNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOworICAodm9pZClTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKICAgCiAgIC8qIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19HZXRDbWRSZXNwMShTRE1NQ3gsIFNETU1DX0NNRF9XUklURV9TSU5HTEVfQkxPQ0ssIFNETU1DX0NNRFRJTUVPVVQpOwpAQCAtNjAzLDEzICs2MDgsMTMgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBXcml0ZSBNdWx0aSBCbG9jayBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFdyaXRlTXVsdGlCbG9jayhTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IFdyaXRlQWRkKQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAogICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKICAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gKHVpbnQzMl90KVdyaXRlQWRkOwpAQCAtNjE3LDcgKzYyMiw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1dSSVRFX01VTFRfQkxPQ0ssIFNETU1DX0NNRFRJTUVPVVQpOwpAQCAtNjI3LDEzICs2MzIsMTMgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBTdGFydCBBZGRyZXNzIEVyYXNlIGNvbW1hbmQgZm9yIFNEIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFNERXJhc2VTdGFydEFkZChTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IFN0YXJ0QWRkKQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAogICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKICAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gKHVpbnQzMl90KVN0YXJ0QWRkOwpAQCAtNjQxLDcgKzY0Niw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9TVEFSVCwgU0RNTUNfQ01EVElNRU9VVCk7CkBAIC02NTEsMTMgKzY1NiwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIEVuZCBBZGRyZXNzIEVyYXNlIGNvbW1hbmQgZm9yIFNEIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFNERXJhc2VFbmRBZGQoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBFbmRBZGQpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovIAogICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAodWludDMyX3QpRW5kQWRkOwpAQCAtNjY1LDcgKzY3MCw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NEX0VSQVNFX0dSUF9FTkQsIFNETU1DX0NNRFRJTUVPVVQpOwpAQCAtNjc1LDEzICs2ODAsMTMgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBTdGFydCBBZGRyZXNzIEVyYXNlIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kRXJhc2VTdGFydEFkZChTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IFN0YXJ0QWRkKQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAogICAvKiBTZXQgQmxvY2sgU2l6ZSBmb3IgQ2FyZCAqLyAKICAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gKHVpbnQzMl90KVN0YXJ0QWRkOwpAQCAtNjg5LDcgKzY5NCw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX0VSQVNFX0dSUF9TVEFSVCwgU0RNTUNfQ01EVElNRU9VVCk7CkBAIC02OTksMTMgKzcwNCwxMyBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIEVuZCBBZGRyZXNzIEVyYXNlIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kRXJhc2VFbmRBZGQoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBFbmRBZGQpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNldCBCbG9jayBTaXplIGZvciBDYXJkICovIAogICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAodWludDMyX3QpRW5kQWRkOwpAQCAtNzEzLDcgKzcxOCw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX0VSQVNFX0dSUF9FTkQsIFNETU1DX0NNRFRJTUVPVVQpOwpAQCAtNzIzLDIxICs3MjgsMjEgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBFcmFzZSBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UKLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZEVyYXNlKFNETU1DX1R5cGVEZWYgKlNETU1DeCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2V0IEJsb2NrIFNpemUgZm9yIENhcmQgKi8gCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDA7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDBVOwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfRVJBU0U7CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX0VSQVNFLCBTRE1NQ19NQVhFUkFTRVRJTUVPVVQpOwpAQCAtNzQ3LDM4ICs3NTIsMzggQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBTdG9wIFRyYW5zZmVyIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZS4KLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFN0b3BUcmFuc2ZlcihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNlbmQgQ01EMTIgU1RPUF9UUkFOU01JU1NJT04gICovCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDA7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDBVOwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfU1RPUF9UUkFOU01JU1NJT047CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KLSAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NUT1BfVFJBTlNNSVNTSU9OLCAxMDAwMDAwMDAvKlNETU1DX0NNRFRJTUVPVVQqLyk7CisgIGVycm9yc3RhdGUgPSBTRE1NQ19HZXRDbWRSZXNwMShTRE1NQ3gsIFNETU1DX0NNRF9TVE9QX1RSQU5TTUlTU0lPTiwgU0RNTUNfU1RPUFRSQU5TRkVSVElNRU9VVCk7CiAKICAgcmV0dXJuIGVycm9yc3RhdGU7CiB9CiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgU2VsZWN0IERlc2VsZWN0IGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZS4KLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCi0gICogQHBhcmFtICBhZGRyIEFkZHJlc3Mgb2YgdGhlIGNhcmQgdG8gYmUgc2VsZWN0ZWQgIAorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBhZGRyOiBBZGRyZXNzIG9mIHRoZSBjYXJkIHRvIGJlIHNlbGVjdGVkICAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFNlbERlc2VsKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDY0X3QgQWRkcikKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2VuZCBDTUQ3IFNETU1DX1NFTF9ERVNFTF9DQVJEICovCiAgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClBZGRyOwpAQCAtNzg2LDcgKzc5MSw3IEBACiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NFTF9ERVNFTF9DQVJELCBTRE1NQ19DTURUSU1FT1VUKTsKQEAgLTc5NiwyMCArODAxLDIwIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgR28gSWRsZSBTdGF0ZSBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UuCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiB1aW50MzJfdCBTRE1NQ19DbWRHb0lkbGVTdGF0ZShTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDA7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDBVOwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfR09fSURMRV9TVEFURTsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfTk87CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kRXJyb3IoU0RNTUN4KTsKQEAgLTgxOSwxMyArODI0LDEzIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgT3BlcmF0aW5nIENvbmRpdGlvbiBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UuCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiB1aW50MzJfdCBTRE1NQ19DbWRPcGVyQ29uZChTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNlbmQgQ01EOCB0byB2ZXJpZnkgU0QgY2FyZCBpbnRlcmZhY2Ugb3BlcmF0aW5nIGNvbmRpdGlvbiAqLwogICAvKiBBcmd1bWVudDogLSBbMzE6MTJdOiBSZXNlcnZlZCAoc2hhbGwgYmUgc2V0IHRvICcwJykKQEAgLTgzNyw3ICs4NDIsNyBAQAogICBzZG1tY19jbWRpbml0LlJlc3BvbnNlICAgICAgICAgPSBTRE1NQ19SRVNQT05TRV9TSE9SVDsKICAgc2RtbWNfY21kaW5pdC5XYWl0Rm9ySW50ZXJydXB0ID0gU0RNTUNfV0FJVF9OTzsKICAgc2RtbWNfY21kaW5pdC5DUFNNICAgICAgICAgICAgID0gU0RNTUNfQ1BTTV9FTkFCTEU7Ci0gIFNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOworICAodm9pZClTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKICAgCiAgIC8qIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19HZXRDbWRSZXNwNyhTRE1NQ3gpOwpAQCAtODQ5LDIwICs4NTQsMjEgQEAKICAgKiBAYnJpZWYgIFNlbmQgdGhlIEFwcGxpY2F0aW9uIGNvbW1hbmQgdG8gdmVyaWZ5IHRoYXQgdGhhdCB0aGUgbmV4dCBjb21tYW5kIAogICAqICAgICAgICAgaXMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgY29tLW1hbmQgcmF0aGVyIHRoYW4gYSBzdGFuZGFyZCBjb21tYW5kCiAgICogICAgICAgICBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgQXJndW1lbnQ6IENvbW1hbmQgQXJndW1lbnQgCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiB1aW50MzJfdCBTRE1NQ19DbWRBcHBDb21tYW5kKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgQXJndW1lbnQpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClBcmd1bWVudDsKICAgc2RtbWNfY21kaW5pdC5DbWRJbmRleCAgICAgICAgID0gU0RNTUNfQ01EX0FQUF9DTUQ7CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgLyogSWYgdGhlcmUgaXMgYSBIQUxfRVJST1IsIGl0IGlzIGEgTU1DIGNhcmQsIGVsc2UKQEAgLTg3NiwyMCArODgyLDIxIEBACiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIGNvbW1hbmQgYXNraW5nIHRoZSBhY2Nlc3NlZCBjYXJkIHRvIHNlbmQgaXRzIG9wZXJhdGluZyAKICAgKiAgICAgICAgIGNvbmRpdGlvbiByZWdpc3RlciAoT0NSKQotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgQXJndW1lbnQ6IENvbW1hbmQgQXJndW1lbnQKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KLXVpbnQzMl90IFNETU1DX0NtZEFwcE9wZXJDb21tYW5kKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgU2RUeXBlKQordWludDMyX3QgU0RNTUNfQ21kQXBwT3BlckNvbW1hbmQoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBBcmd1bWVudCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKLSAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gU0RNTUNfVk9MVEFHRV9XSU5ET1dfU0QgfCBTZFR5cGU7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IFNETU1DX1ZPTFRBR0VfV0lORE9XX1NEIHwgQXJndW1lbnQ7CiAgIHNkbW1jX2NtZGluaXQuQ21kSW5kZXggICAgICAgICA9IFNETU1DX0NNRF9TRF9BUFBfT1BfQ09ORDsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfU0hPUlQ7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDMoU0RNTUN4KTsKQEAgLTg5OSwyMCArOTA2LDIxIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgQnVzIFdpZHRoIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZS4KLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIEJ1c1dpZHRoOiBCdXNXaWR0aAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kQnVzV2lkdGgoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBCdXNXaWR0aCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gKHVpbnQzMl90KUJ1c1dpZHRoOwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfQVBQX1NEX1NFVF9CVVNXSURUSDsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfU0hPUlQ7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDEoU0RNTUN4LCBTRE1NQ19DTURfQVBQX1NEX1NFVF9CVVNXSURUSCwgU0RNTUNfQ01EVElNRU9VVCk7CkBAIC05MjIsMjEgKzkzMCwyMSBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIFNlbmQgU0NSIGNvbW1hbmQgYW5kIGNoZWNrIHRoZSByZXNwb25zZS4KLSAgKiBAcGFyYW0gIFNETU1DeCBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFNlbmRTQ1IoU0RNTUNfVHlwZURlZiAqU0RNTUN4KQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAogICAvKiBTZW5kIENNRDUxIFNEX0FQUF9TRU5EX1NDUiAqLwotICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAwOworICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAwVTsKICAgc2RtbWNfY21kaW5pdC5DbWRJbmRleCAgICAgICAgID0gU0RNTUNfQ01EX1NEX0FQUF9TRU5EX1NDUjsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfU0hPUlQ7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDEoU0RNTUN4LCBTRE1NQ19DTURfU0RfQVBQX1NFTkRfU0NSLCBTRE1NQ19DTURUSU1FT1VUKTsKQEAgLTk0NiwyMSArOTU0LDIxIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgU2VuZCBDSUQgY29tbWFuZCBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kU2VuZENJRChTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNlbmQgQ01EMiBBTExfU0VORF9DSUQgKi8KLSAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gMDsKKyAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gMFU7CiAgIHNkbW1jX2NtZGluaXQuQ21kSW5kZXggICAgICAgICA9IFNETU1DX0NNRF9BTExfU0VORF9DSUQ7CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX0xPTkc7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDIoU0RNTUN4KTsKQEAgLTk3MCwyMSArOTc4LDIyIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgU2VuZCBDU0QgY29tbWFuZCBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgQXJndW1lbnQ6IENvbW1hbmQgQXJndW1lbnQKICAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAgKi8KIHVpbnQzMl90IFNETU1DX0NtZFNlbmRDU0QoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50MzJfdCBBcmd1bWVudCkKIHsKICAgU0RNTUNfQ21kSW5pdFR5cGVEZWYgIHNkbW1jX2NtZGluaXQ7Ci0gIHVpbnQzMl90IGVycm9yc3RhdGUgPSBTRE1NQ19FUlJPUl9OT05FOworICB1aW50MzJfdCBlcnJvcnN0YXRlOwogICAKICAgLyogU2VuZCBDTUQ5IFNFTkRfQ1NEICovCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9ICh1aW50MzJfdClBcmd1bWVudDsKKyAgc2RtbWNfY21kaW5pdC5Bcmd1bWVudCAgICAgICAgID0gQXJndW1lbnQ7CiAgIHNkbW1jX2NtZGluaXQuQ21kSW5kZXggICAgICAgICA9IFNETU1DX0NNRF9TRU5EX0NTRDsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfTE9ORzsKICAgc2RtbWNfY21kaW5pdC5XYWl0Rm9ySW50ZXJydXB0ID0gU0RNTUNfV0FJVF9OTzsKICAgc2RtbWNfY21kaW5pdC5DUFNNICAgICAgICAgICAgID0gU0RNTUNfQ1BTTV9FTkFCTEU7Ci0gIFNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOworICAodm9pZClTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKICAgCiAgIC8qIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19HZXRDbWRSZXNwMihTRE1NQ3gpOwpAQCAtOTk0LDIxICsxMDAzLDIyIEBACiAKIC8qKgogICAqIEBicmllZiAgU2VuZCB0aGUgU2VuZCBDU0QgY29tbWFuZCBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgcFJDQTogQ2FyZCBSQ0EgIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kU2V0UmVsQWRkKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDE2X3QgKnBSQ0EpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCiAgIC8qIFNlbmQgQ01EMyBTRF9DTURfU0VUX1JFTF9BRERSICovCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDA7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IDBVOwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfU0VUX1JFTF9BRERSOwogICBzZG1tY19jbWRpbml0LlJlc3BvbnNlICAgICAgICAgPSBTRE1NQ19SRVNQT05TRV9TSE9SVDsKICAgc2RtbWNfY21kaW5pdC5XYWl0Rm9ySW50ZXJydXB0ID0gU0RNTUNfV0FJVF9OTzsKICAgc2RtbWNfY21kaW5pdC5DUFNNICAgICAgICAgICAgID0gU0RNTUNfQ1BTTV9FTkFCTEU7Ci0gIFNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOworICAodm9pZClTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKICAgCiAgIC8qIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zICovCiAgIGVycm9yc3RhdGUgPSBTRE1NQ19HZXRDbWRSZXNwNihTRE1NQ3gsIFNETU1DX0NNRF9TRVRfUkVMX0FERFIsIHBSQ0EpOwpAQCAtMTAxOCwyMCArMTAyOCwyMSBAQAogCiAvKioKICAgKiBAYnJpZWYgIFNlbmQgdGhlIFN0YXR1cyBjb21tYW5kIGFuZCBjaGVjayB0aGUgcmVzcG9uc2UuCi0gICogQHBhcmFtICBTRE1NQ3ggUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbSAgU0RNTUN4OiBQb2ludGVyIHRvIFNETU1DIHJlZ2lzdGVyIGJhc2UgCisgICogQHBhcmFtICBBcmd1bWVudDogQ29tbWFuZCBBcmd1bWVudAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kU2VuZFN0YXR1cyhTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IEFyZ3VtZW50KQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAotICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAodWludDMyX3QpQXJndW1lbnQ7CisgIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IEFyZ3VtZW50OwogICBzZG1tY19jbWRpbml0LkNtZEluZGV4ICAgICAgICAgPSBTRE1NQ19DTURfU0VORF9TVEFUVVM7CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NFTkRfU1RBVFVTLCBTRE1NQ19DTURUSU1FT1VUKTsKQEAgLTEwNDEsMjAgKzEwNTIsMjAgQEAKIAogLyoqCiAgICogQGJyaWVmICBTZW5kIHRoZSBTdGF0dXMgcmVnaXN0ZXIgY29tbWFuZCBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgU0RNTUN4IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kU3RhdHVzUmVnaXN0ZXIoU0RNTUNfVHlwZURlZiAqU0RNTUN4KQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAotICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAwOworICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSAwVTsKICAgc2RtbWNfY21kaW5pdC5DbWRJbmRleCAgICAgICAgID0gU0RNTUNfQ01EX1NEX0FQUF9TVEFUVVM7CiAgIHNkbW1jX2NtZGluaXQuUmVzcG9uc2UgICAgICAgICA9IFNETU1DX1JFU1BPTlNFX1NIT1JUOwogICBzZG1tY19jbWRpbml0LldhaXRGb3JJbnRlcnJ1cHQgPSBTRE1NQ19XQUlUX05POwogICBzZG1tY19jbWRpbml0LkNQU00gICAgICAgICAgICAgPSBTRE1NQ19DUFNNX0VOQUJMRTsKLSAgU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CisgICh2b2lkKVNETU1DX1NlbmRDb21tYW5kKFNETU1DeCwgJnNkbW1jX2NtZGluaXQpOwogICAKICAgLyogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMgKi8KICAgZXJyb3JzdGF0ZSA9IFNETU1DX0dldENtZFJlc3AxKFNETU1DeCwgU0RNTUNfQ01EX1NEX0FQUF9TVEFUVVMsIFNETU1DX0NNRFRJTUVPVVQpOwpAQCAtMTA2NSwyMSArMTA3NiwyMSBAQAogLyoqCiAgICogQGJyaWVmICBTZW5kcyBob3N0IGNhcGFjaXR5IHN1cHBvcnQgaW5mb3JtYXRpb24gYW5kIGFjdGl2YXRlcyB0aGUgY2FyZCdzIAogICAqICAgICAgICAgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4gU2VuZCBTRE1NQ19DTURfU0VORF9PUF9DT05EIGNvbW1hbmQKLSAgKiBAcGFyYW0gIFNESU94IFBvaW50ZXIgdG8gU0RJTyByZWdpc3RlciBiYXNlIAotICAqIEBwYXJhbWUgQXJndW1lbnQgQXJndW1lbnQgdXNlZCBmb3IgdGhlIGNvbW1hbmQKKyAgKiBAcGFyYW0gIFNETU1DeDogUG9pbnRlciB0byBTRE1NQyByZWdpc3RlciBiYXNlIAorICAqIEBwYXJhbWUgQXJndW1lbnQ6IEFyZ3VtZW50IHVzZWQgZm9yIHRoZSBjb21tYW5kCiAgICogQHJldHZhbCBIQUwgc3RhdHVzCiAgICovCiB1aW50MzJfdCBTRE1NQ19DbWRPcENvbmRpdGlvbihTRE1NQ19UeXBlRGVmICpTRE1NQ3gsIHVpbnQzMl90IEFyZ3VtZW50KQogewogICBTRE1NQ19DbWRJbml0VHlwZURlZiAgc2RtbWNfY21kaW5pdDsKLSAgdWludDMyX3QgZXJyb3JzdGF0ZSA9IFNETU1DX0VSUk9SX05PTkU7CisgIHVpbnQzMl90IGVycm9yc3RhdGU7CiAgIAogICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSBBcmd1bWVudDsKICAgc2RtbWNfY21kaW5pdC5DbWRJbmRleCAgICAgICAgID0gU0RNTUNfQ01EX1NFTkRfT1BfQ09ORDsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfU0hPUlQ7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDMoU0RNTUN4KTsKQEAgLTEwODksMjEgKzExMDAsMjMgQEAKIAogLyoqCiAgICogQGJyaWVmICBDaGVja3Mgc3dpdGNoYWJsZSBmdW5jdGlvbiBhbmQgc3dpdGNoIGNhcmQgZnVuY3Rpb24uIFNETU1DX0NNRF9IU19TV0lUQ0ggY29tYW5kCi0gICogQHBhcmFtICBTRElPeCBQb2ludGVyIHRvIFNESU8gcmVnaXN0ZXIgYmFzZSAKLSAgKiBAcGFyYW1lIEFyZ3VtZW50IEFyZ3VtZW50IHVzZWQgZm9yIHRoZSBjb21tYW5kCisgICogQHBhcmFtICBTRE1NQ3g6IFBvaW50ZXIgdG8gU0RNTUMgcmVnaXN0ZXIgYmFzZSAKKyAgKiBAcGFyYW1lIEFyZ3VtZW50OiBBcmd1bWVudCB1c2VkIGZvciB0aGUgY29tbWFuZAogICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICAqLwogdWludDMyX3QgU0RNTUNfQ21kU3dpdGNoKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDMyX3QgQXJndW1lbnQpCiB7CiAgIFNETU1DX0NtZEluaXRUeXBlRGVmICBzZG1tY19jbWRpbml0OwotICB1aW50MzJfdCBlcnJvcnN0YXRlID0gU0RNTUNfRVJST1JfTk9ORTsKKyAgdWludDMyX3QgZXJyb3JzdGF0ZTsKICAgCi0gIHNkbW1jX2NtZGluaXQuQXJndW1lbnQgICAgICAgICA9IEFyZ3VtZW50OworICAvKiBTZW5kIENNRDYgdG8gYWN0aXZhdGUgU0RSNTAgTW9kZSBhbmQgUG93ZXIgTGltaXQgMS40NFcgKi8KKyAgLyogQ01EIFJlc3BvbnNlOiBSMSAqLworICBzZG1tY19jbWRpbml0LkFyZ3VtZW50ICAgICAgICAgPSBBcmd1bWVudDsgLyogU0RNTUNfU0RSMjVfU1dJVENIX1BBVFRFUk4gKi8KICAgc2RtbWNfY21kaW5pdC5DbWRJbmRleCAgICAgICAgID0gU0RNTUNfQ01EX0hTX1NXSVRDSDsKICAgc2RtbWNfY21kaW5pdC5SZXNwb25zZSAgICAgICAgID0gU0RNTUNfUkVTUE9OU0VfU0hPUlQ7CiAgIHNkbW1jX2NtZGluaXQuV2FpdEZvckludGVycnVwdCA9IFNETU1DX1dBSVRfTk87CiAgIHNkbW1jX2NtZGluaXQuQ1BTTSAgICAgICAgICAgICA9IFNETU1DX0NQU01fRU5BQkxFOwotICBTRE1NQ19TZW5kQ29tbWFuZChTRE1NQ3gsICZzZG1tY19jbWRpbml0KTsKKyAgKHZvaWQpU0RNTUNfU2VuZENvbW1hbmQoU0RNTUN4LCAmc2RtbWNfY21kaW5pdCk7CiAgIAogICAvKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucyAqLwogICBlcnJvcnN0YXRlID0gU0RNTUNfR2V0Q21kUmVzcDEoU0RNTUN4LCBTRE1NQ19DTURfSFNfU1dJVENILCBTRE1NQ19DTURUSU1FT1VUKTsKQEAgLTExMjIsMTggKzExMzUsMTggQEAKICAgICAKIC8qKgogICAqIEBicmllZiAgQ2hlY2tzIGZvciBlcnJvciBjb25kaXRpb25zIGZvciBDTUQwLgotICAqIEBwYXJhbSAgaHNkIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgaHNkOiBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIFNEIENhcmQgZXJyb3Igc3RhdGUKICAgKi8KIHN0YXRpYyB1aW50MzJfdCBTRE1NQ19HZXRDbWRFcnJvcihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CiAgIC8qIDggaXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbnMgY3ljbGVzIGZvciB0aGUgYmVsb3cgbG9vcCBzdGF0ZW1lbnQuCiAgIFRoZSBTRE1NQ19DTURUSU1FT1VUIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwotICByZWdpc3RlciB1aW50MzJfdCBjb3VudCA9IFNETU1DX0NNRFRJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOCAvMTAwMCk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gU0RNTUNfQ01EVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4VSAvMTAwMFUpOwogICAKICAgZG8KICAgewotICAgIGlmIChjb3VudC0tID09IDApCisgICAgaWYgKGNvdW50LS0gPT0gMFUpCiAgICAgewogICAgICAgcmV0dXJuIFNETU1DX0VSUk9SX1RJTUVPVVQ7CiAgICAgfQpAQCAtMTE0MSwzNCArMTE1NCwzNiBAQAogICB9d2hpbGUoIV9fU0RNTUNfR0VUX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NNRFNFTlQpKTsKICAgCiAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19DTURfRkxBR1MpOwogICAKICAgcmV0dXJuIFNETU1DX0VSUk9SX05PTkU7CiB9CiAKIC8qKgogICAqIEBicmllZiAgQ2hlY2tzIGZvciBlcnJvciBjb25kaXRpb25zIGZvciBSMSByZXNwb25zZS4KLSAgKiBAcGFyYW0gIGhzZCBTRCBoYW5kbGUKLSAgKiBAcGFyYW0gIFNEX0NNRCBUaGUgc2VudCBjb21tYW5kIGluZGV4ICAKKyAgKiBAcGFyYW0gIGhzZDogU0QgaGFuZGxlCisgICogQHBhcmFtICBTRF9DTUQ6IFRoZSBzZW50IGNvbW1hbmQgaW5kZXggIAogICAqIEByZXR2YWwgU0QgQ2FyZCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IFNETU1DX0dldENtZFJlc3AxKFNETU1DX1R5cGVEZWYgKlNETU1DeCwgdWludDhfdCBTRF9DTUQsIHVpbnQzMl90IFRpbWVvdXQpCiB7CiAgIHVpbnQzMl90IHJlc3BvbnNlX3IxOworICB1aW50MzJfdCBzdGFfcmVnOwogICAKICAgLyogOCBpcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGluc3RydWN0aW9ucyBjeWNsZXMgZm9yIHRoZSBiZWxvdyBsb29wIHN0YXRlbWVudC4KICAgVGhlIFRpbWVvdXQgaXMgZXhwcmVzc2VkIGluIG1zICovCi0gIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gVGltZW91dCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4IC8xMDAwKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgY291bnQgPSBUaW1lb3V0ICogKFN5c3RlbUNvcmVDbG9jayAvIDhVIC8xMDAwVSk7CiAgIAogICBkbwogICB7Ci0gICAgaWYgKGNvdW50LS0gPT0gMCkKKyAgICBpZiAoY291bnQtLSA9PSAwVSkKICAgICB7CiAgICAgICByZXR1cm4gU0RNTUNfRVJST1JfVElNRU9VVDsKICAgICB9CisgICAgc3RhX3JlZyA9IFNETU1DeC0+U1RBOworICB9d2hpbGUoKChzdGFfcmVnICYgKFNETU1DX0ZMQUdfQ0NSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NNRFJFTkQgfCBTRE1NQ19GTEFHX0NUSU1FT1VUKSkgPT0gMFUpIHx8CisgICAgICAgICAoKHN0YV9yZWcgJiBTRE1NQ19GTEFHX0NNREFDVCkgIT0gMFUgKSk7CiAgICAgCi0gIH13aGlsZSghX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ0NSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NNRFJFTkQgfCBTRE1NQ19GTEFHX0NUSU1FT1VUKSk7Ci0gIAogICBpZihfX1NETU1DX0dFVF9GTEFHKFNETU1DeCwgU0RNTUNfRkxBR19DVElNRU9VVCkpCiAgIHsKICAgICBfX1NETU1DX0NMRUFSX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NUSU1FT1VUKTsKQEAgLTExODEsNiArMTE5NiwxMyBAQAogICAgIAogICAgIHJldHVybiBTRE1NQ19FUlJPUl9DTURfQ1JDX0ZBSUw7CiAgIH0KKyAgZWxzZQorICB7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICB9CisgIAorICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLworICBfX1NETU1DX0NMRUFSX0ZMQUcoU0RNTUN4LCBTRE1NQ19TVEFUSUNfQ01EX0ZMQUdTKTsKICAgCiAgIC8qIENoZWNrIHJlc3BvbnNlIHJlY2VpdmVkIGlzIG9mIGRlc2lyZWQgY29tbWFuZCAqLwogICBpZihTRE1NQ19HZXRDb21tYW5kUmVzcG9uc2UoU0RNTUN4KSAhPSBTRF9DTUQpCkBAIC0xMTg4LDkgKzEyMTAsNiBAQAogICAgIHJldHVybiBTRE1NQ19FUlJPUl9DTURfQ1JDX0ZBSUw7CiAgIH0KICAgCi0gIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19GTEFHUyk7Ci0gIAogICAvKiBXZSBoYXZlIHJlY2VpdmVkIHJlc3BvbnNlLCByZXRyaWV2ZSBpdCBmb3IgYW5hbHlzaXMgICovCiAgIHJlc3BvbnNlX3IxID0gU0RNTUNfR2V0UmVzcG9uc2UoU0RNTUN4LCBTRE1NQ19SRVNQMSk7CiAgIApAQCAtMTI3OCwyMyArMTI5NywyNSBAQAogCiAvKioKICAgKiBAYnJpZWYgIENoZWNrcyBmb3IgZXJyb3IgY29uZGl0aW9ucyBmb3IgUjIgKENJRCBvciBDU0QpIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgaHNkIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgaHNkOiBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIFNEIENhcmQgZXJyb3Igc3RhdGUKICAgKi8KIHN0YXRpYyB1aW50MzJfdCBTRE1NQ19HZXRDbWRSZXNwMihTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CisgIHVpbnQzMl90IHN0YV9yZWc7CiAgIC8qIDggaXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbnMgY3ljbGVzIGZvciB0aGUgYmVsb3cgbG9vcCBzdGF0ZW1lbnQuCiAgIFRoZSBTRE1NQ19DTURUSU1FT1VUIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwotICByZWdpc3RlciB1aW50MzJfdCBjb3VudCA9IFNETU1DX0NNRFRJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOCAvMTAwMCk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gU0RNTUNfQ01EVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4VSAvMTAwMFUpOwogICAKICAgZG8KICAgewotICAgIGlmIChjb3VudC0tID09IDApCisgICAgaWYgKGNvdW50LS0gPT0gMFUpCiAgICAgewogICAgICAgcmV0dXJuIFNETU1DX0VSUk9SX1RJTUVPVVQ7CiAgICAgfQotICAgIAotICB9d2hpbGUoIV9fU0RNTUNfR0VUX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpOworICAgIHN0YV9yZWcgPSBTRE1NQ3gtPlNUQTsKKyAgfXdoaWxlKCgoc3RhX3JlZyAmIChTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpID09IDBVKSB8fAorICAgICAgICAgKChzdGFfcmVnICYgU0RNTUNfRkxBR19DTURBQ1QpICE9IDBVICkpOwogICAgIAogICBpZiAoX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ1RJTUVPVVQpKQogICB7CkBAIC0xMzEyLDcgKzEzMzMsNyBAQAogICB7CiAgICAgLyogTm8gZXJyb3IgZmxhZyBzZXQgKi8KICAgICAvKiBDbGVhciBhbGwgdGhlIHN0YXRpYyBmbGFncyAqLwotICAgIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgICAgX19TRE1NQ19DTEVBUl9GTEFHKFNETU1DeCwgU0RNTUNfU1RBVElDX0NNRF9GTEFHUyk7CiAgIH0KIAogICByZXR1cm4gU0RNTUNfRVJST1JfTk9ORTsKQEAgLTEzMjAsMjQgKzEzNDEsMjYgQEAKIAogLyoqCiAgICogQGJyaWVmICBDaGVja3MgZm9yIGVycm9yIGNvbmRpdGlvbnMgZm9yIFIzIChPQ1IpIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgaHNkIFNEIGhhbmRsZQorICAqIEBwYXJhbSAgaHNkOiBTRCBoYW5kbGUKICAgKiBAcmV0dmFsIFNEIENhcmQgZXJyb3Igc3RhdGUKICAgKi8KIHN0YXRpYyB1aW50MzJfdCBTRE1NQ19HZXRDbWRSZXNwMyhTRE1NQ19UeXBlRGVmICpTRE1NQ3gpCiB7CisgIHVpbnQzMl90IHN0YV9yZWc7CiAgIC8qIDggaXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbnMgY3ljbGVzIGZvciB0aGUgYmVsb3cgbG9vcCBzdGF0ZW1lbnQuCiAgIFRoZSBTRE1NQ19DTURUSU1FT1VUIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwotICByZWdpc3RlciB1aW50MzJfdCBjb3VudCA9IFNETU1DX0NNRFRJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOCAvMTAwMCk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gU0RNTUNfQ01EVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4VSAvMTAwMFUpOwogICAKICAgZG8KICAgewotICAgIGlmIChjb3VudC0tID09IDApCisgICAgaWYgKGNvdW50LS0gPT0gMFUpCiAgICAgewogICAgICAgcmV0dXJuIFNETU1DX0VSUk9SX1RJTUVPVVQ7CiAgICAgfQorICAgIHN0YV9yZWcgPSBTRE1NQ3gtPlNUQTsKKyAgfXdoaWxlKCgoc3RhX3JlZyAmIChTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpID09IDBVKSB8fAorICAgICAgICAgKChzdGFfcmVnICYgU0RNTUNfRkxBR19DTURBQ1QpICE9IDBVICkpOwogICAgIAotICB9d2hpbGUoIV9fU0RNTUNfR0VUX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpOwotICAKICAgaWYoX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ1RJTUVPVVQpKQogICB7CiAgICAgX19TRE1NQ19DTEVBUl9GTEFHKFNETU1DeCwgU0RNTUNfRkxBR19DVElNRU9VVCk7CkBAIC0xMzQ1LDEwICsxMzY4LDkgQEAKICAgICByZXR1cm4gU0RNTUNfRVJST1JfQ01EX1JTUF9USU1FT1VUOwogICB9CiAgIGVsc2UKLSAKICAgeyAgCiAgICAgLyogQ2xlYXIgYWxsIHRoZSBzdGF0aWMgZmxhZ3MgKi8KLSAgICBfX1NETU1DX0NMRUFSX0ZMQUcoU0RNTUN4LCBTRE1NQ19TVEFUSUNfRkxBR1MpOworICAgIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19DTURfRkxBR1MpOwogICB9CiAgIAogICByZXR1cm4gU0RNTUNfRVJST1JfTk9ORTsKQEAgLTEzNTYsMjkgKzEzNzgsMzEgQEAKIAogLyoqCiAgICogQGJyaWVmICBDaGVja3MgZm9yIGVycm9yIGNvbmRpdGlvbnMgZm9yIFI2IChSQ0EpIHJlc3BvbnNlLgotICAqIEBwYXJhbSAgaHNkIFNEIGhhbmRsZQotICAqIEBwYXJhbSAgU0RfQ01EIFRoZSBzZW50IGNvbW1hbmQgaW5kZXgKLSAgKiBAcGFyYW0gIHBSQ0EgUG9pbnRlciB0byB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFNEIGNhcmQgcmVsYXRpdmUgCisgICogQHBhcmFtICBoc2Q6IFNEIGhhbmRsZQorICAqIEBwYXJhbSAgU0RfQ01EOiBUaGUgc2VudCBjb21tYW5kIGluZGV4CisgICogQHBhcmFtICBwUkNBOiBQb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgU0QgY2FyZCByZWxhdGl2ZSAKICAgKiAgICAgICAgIGFkZHJlc3MgUkNBICAgCiAgICogQHJldHZhbCBTRCBDYXJkIGVycm9yIHN0YXRlCiAgICovCiBzdGF0aWMgdWludDMyX3QgU0RNTUNfR2V0Q21kUmVzcDYoU0RNTUNfVHlwZURlZiAqU0RNTUN4LCB1aW50OF90IFNEX0NNRCwgdWludDE2X3QgKnBSQ0EpCiB7CiAgIHVpbnQzMl90IHJlc3BvbnNlX3IxOworICB1aW50MzJfdCBzdGFfcmVnOwogCiAgIC8qIDggaXMgdGhlIG51bWJlciBvZiByZXF1aXJlZCBpbnN0cnVjdGlvbnMgY3ljbGVzIGZvciB0aGUgYmVsb3cgbG9vcCBzdGF0ZW1lbnQuCiAgIFRoZSBTRE1NQ19DTURUSU1FT1VUIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwotICByZWdpc3RlciB1aW50MzJfdCBjb3VudCA9IFNETU1DX0NNRFRJTUVPVVQgKiAoU3lzdGVtQ29yZUNsb2NrIC8gOCAvMTAwMCk7CisgIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gU0RNTUNfQ01EVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4VSAvMTAwMFUpOwogICAKICAgZG8KICAgewotICAgIGlmIChjb3VudC0tID09IDApCisgICAgaWYgKGNvdW50LS0gPT0gMFUpCiAgICAgewogICAgICAgcmV0dXJuIFNETU1DX0VSUk9SX1RJTUVPVVQ7CiAgICAgfQorICAgIHN0YV9yZWcgPSBTRE1NQ3gtPlNUQTsKKyAgfXdoaWxlKCgoc3RhX3JlZyAmIChTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpID09IDBVKSB8fAorICAgICAgICAgKChzdGFfcmVnICYgU0RNTUNfRkxBR19DTURBQ1QpICE9IDBVICkpOwogICAgIAotICB9d2hpbGUoIV9fU0RNTUNfR0VUX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NDUkNGQUlMIHwgU0RNTUNfRkxBR19DTURSRU5EIHwgU0RNTUNfRkxBR19DVElNRU9VVCkpOwotICAKICAgaWYoX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ1RJTUVPVVQpKQogICB7CiAgICAgX19TRE1NQ19DTEVBUl9GTEFHKFNETU1DeCwgU0RNTUNfRkxBR19DVElNRU9VVCk7CkBAIC0xMzkxLDYgKzE0MTUsMTAgQEAKICAgICAKICAgICByZXR1cm4gU0RNTUNfRVJST1JfQ01EX0NSQ19GQUlMOwogICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQogICAKICAgLyogQ2hlY2sgcmVzcG9uc2UgcmVjZWl2ZWQgaXMgb2YgZGVzaXJlZCBjb21tYW5kICovCiAgIGlmKFNETU1DX0dldENvbW1hbmRSZXNwb25zZShTRE1NQ3gpICE9IFNEX0NNRCkKQEAgLTEzOTksNyArMTQyNyw3IEBACiAgIH0KICAgCiAgIC8qIENsZWFyIGFsbCB0aGUgc3RhdGljIGZsYWdzICovCi0gIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19GTEFHUyk7CisgIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX1NUQVRJQ19DTURfRkxBR1MpOwogICAKICAgLyogV2UgaGF2ZSByZWNlaXZlZCByZXNwb25zZSwgcmV0cmlldmUgaXQuICAqLwogICByZXNwb25zZV9yMSA9IFNETU1DX0dldFJlc3BvbnNlKFNETU1DeCwgU0RNTUNfUkVTUDEpOwpAQCAtMTQyNiwzMSArMTQ1NCw0NCBAQAogCiAvKioKICAgKiBAYnJpZWYgIENoZWNrcyBmb3IgZXJyb3IgY29uZGl0aW9ucyBmb3IgUjcgcmVzcG9uc2UuCi0gICogQHBhcmFtICBoc2QgU0QgaGFuZGxlCisgICogQHBhcmFtICBoc2Q6IFNEIGhhbmRsZQogICAqIEByZXR2YWwgU0QgQ2FyZCBlcnJvciBzdGF0ZQogICAqLwogc3RhdGljIHVpbnQzMl90IFNETU1DX0dldENtZFJlc3A3KFNETU1DX1R5cGVEZWYgKlNETU1DeCkKIHsKKyAgdWludDMyX3Qgc3RhX3JlZzsKICAgLyogOCBpcyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGluc3RydWN0aW9ucyBjeWNsZXMgZm9yIHRoZSBiZWxvdyBsb29wIHN0YXRlbWVudC4KICAgVGhlIFNETU1DX0NNRFRJTUVPVVQgaXMgZXhwcmVzc2VkIGluIG1zICovCi0gIHJlZ2lzdGVyIHVpbnQzMl90IGNvdW50ID0gU0RNTUNfQ01EVElNRU9VVCAqIChTeXN0ZW1Db3JlQ2xvY2sgLyA4IC8xMDAwKTsKKyAgcmVnaXN0ZXIgdWludDMyX3QgY291bnQgPSBTRE1NQ19DTURUSU1FT1VUICogKFN5c3RlbUNvcmVDbG9jayAvIDhVIC8xMDAwVSk7CiAgIAogICBkbwogICB7Ci0gICAgaWYgKGNvdW50LS0gPT0gMCkKKyAgICBpZiAoY291bnQtLSA9PSAwVSkKICAgICB7CiAgICAgICByZXR1cm4gU0RNTUNfRVJST1JfVElNRU9VVDsKICAgICB9CisgICAgc3RhX3JlZyA9IFNETU1DeC0+U1RBOworICB9d2hpbGUoKChzdGFfcmVnICYgKFNETU1DX0ZMQUdfQ0NSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NNRFJFTkQgfCBTRE1NQ19GTEFHX0NUSU1FT1VUKSkgPT0gMFUpIHx8CisgICAgICAgICAoKHN0YV9yZWcgJiBTRE1NQ19GTEFHX0NNREFDVCkgIT0gMFUgKSk7CiAgICAgCi0gIH13aGlsZSghX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ0NSQ0ZBSUwgfCBTRE1NQ19GTEFHX0NNRFJFTkQgfCBTRE1NQ19GTEFHX0NUSU1FT1VUKSk7Ci0KICAgaWYoX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ1RJTUVPVVQpKQogICB7CiAgICAgLyogQ2FyZCBpcyBTRCBWMi4wIGNvbXBsaWFudCAqLwotICAgIF9fU0RNTUNfQ0xFQVJfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ01EUkVORCk7CisgICAgX19TRE1NQ19DTEVBUl9GTEFHKFNETU1DeCwgU0RNTUNfRkxBR19DVElNRU9VVCk7CiAgICAgCiAgICAgcmV0dXJuIFNETU1DX0VSUk9SX0NNRF9SU1BfVElNRU9VVDsKICAgfQorICBlbHNlIGlmKF9fU0RNTUNfR0VUX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NDUkNGQUlMKSkKKyAgeworICAgIC8qIENhcmQgaXMgU0QgVjIuMCBjb21wbGlhbnQgKi8KKyAgICBfX1NETU1DX0NMRUFSX0ZMQUcoU0RNTUN4LCBTRE1NQ19GTEFHX0NDUkNGQUlMKTsKKyAgICAKKyAgICByZXR1cm4gU0RNTUNfRVJST1JfQ01EX0NSQ19GQUlMOworICB9CisgIGVsc2UKKyAgeworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgfQogICAKICAgaWYoX19TRE1NQ19HRVRfRkxBRyhTRE1NQ3gsIFNETU1DX0ZMQUdfQ01EUkVORCkpCiAgIHsKQEAgLTE0NjYsMTEgKzE1MDcsNyBAQAogICAqIEB9CiAgICovCiAKLS8qKgotICAqIEB9Ci0gICovCi0KLSNlbmRpZiAvKiAoSEFMX1NEX01PRFVMRV9FTkFCTEVEKSAqLworI2VuZGlmIC8qIEhBTF9TRF9NT0RVTEVfRU5BQkxFRCB8fCBIQUxfTU1DX01PRFVMRV9FTkFCTEVEICovCiAvKioKICAgKiBAfQogICAqLwpAQCAtMTQ3OSw0ICsxNTE2LDYgQEAKICAgKiBAfQogICAqLwogCisjZW5kaWYgLyogU0RNTUMxICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2xsX3RpbS5jIGIvU3JjL3N0bTMyZjd4eF9sbF90aW0uYwppbmRleCA4YmQ2MjJhLi5kM2E5OTJkIDEwMDY0NAotLS0gYS9TcmMvc3RtMzJmN3h4X2xsX3RpbS5jCisrKyBiL1NyYy9zdG0zMmY3eHhfbGxfdGltLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJzdG0zMl9hc3NlcnQuaCIKICNlbHNlCiAjZGVmaW5lIGFzc2VydF9wYXJhbShleHByKSAoKHZvaWQpMFUpCi0jZW5kaWYKKyNlbmRpZiAvKiBVU0VfRlVMTF9BU1NFUlQgKi8KIAogLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjd4eF9MTF9Ecml2ZXIKICAgKiBAewpAQCAtNDYsMTM1ICs0NiwxMzUgQEAKICAgKiBAewogICAqLwogI2RlZmluZSBJU19MTF9USU1fQ09VTlRFUk1PREUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9VUCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9ET1dOKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfRE9XTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9DT1VOVEVSTU9ERV9DRU5URVJfVVBfRE9XTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0RPV04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ09VTlRFUk1PREVfQ0VOVEVSX1VQKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9ET1dOKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NPVU5URVJNT0RFX0NFTlRFUl9VUF9ET1dOKSkKIAogI2RlZmluZSBJU19MTF9USU1fQ0xPQ0tESVZJU0lPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWMikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0NMT0NLRElWSVNJT05fRElWNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVY0KSkKIAogI2RlZmluZSBJU19MTF9USU1fT0NNT0RFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZST1pFTikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FDVElWRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0lOQUNUSVZFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfVE9HR0xFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0lOQUNUSVZFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfRk9SQ0VEX0FDVElWRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1BXTTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00yKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUkVUUklHX09QTTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9SRVRSSUdfT1BNMikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0NPTUJJTkVEX1BXTTEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00yKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQVNTWU1FVFJJQ19QV00yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1RPR0dMRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9JTkFDVElWRSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0ZPUkNFRF9BQ1RJVkUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX1JFVFJJR19PUE0xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfUkVUUklHX09QTTIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DTU9ERV9DT01CSU5FRF9QV00xKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ01PREVfQ09NQklORURfUFdNMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NNT0RFX0FTU1lNRVRSSUNfUFdNMikpCiAKICNkZWZpbmUgSVNfTExfVElNX09DU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0RJU0FCTEUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ1NUQVRFX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NTVEFURV9FTkFCTEUpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9PQ1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NQT0xBUklUWV9ISUdIKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NQT0xBUklUWV9MT1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DUE9MQVJJVFlfTE9XKSkKIAogI2RlZmluZSBJU19MTF9USU1fT0NJRExFU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9PQ0lETEVTVEFURV9MT1cpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT0NJRExFU1RBVEVfSElHSCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09DSURMRVNUQVRFX0hJR0gpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9BQ1RJVkVJTlBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0FDVElWRUlOUFVUX0RJUkVDVFRJKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FDVElWRUlOUFVUX0lORElSRUNUVEkpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfVFJDKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQUNUSVZFSU5QVVRfSU5ESVJFQ1RUSSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9BQ1RJVkVJTlBVVF9UUkMpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9JQ1BTQyhfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWMikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVY0KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ1BTQ19ESVYyKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDUFNDX0RJVjQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNQU0NfRElWOCkpCiAKICNkZWZpbmUgSVNfTExfVElNX0lDX0ZJTFRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX04yKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9OOCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYyX042KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjgpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWNF9ONikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X044KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjhfTjYpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWOF9OOCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9ONikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxNl9OOCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9ONikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYzMl9OOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjFfTjIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMV9ONCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVYxX044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWMl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY0X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjRfTjgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX0ZJTFRFUl9GRElWOF9ONikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfRklMVEVSX0ZESVY4X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjE2X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19GSUxURVJfRkRJVjMyX044KSkKIAogI2RlZmluZSBJU19MTF9USU1fSUNfUE9MQVJJVFkoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9SSVNJTkcpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfRkFMTElORykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9JQ19QT0xBUklUWV9CT1RIRURHRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fSUNfUE9MQVJJVFlfQk9USEVER0UpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9FTkNPREVSTU9ERShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YMl9USTIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fRU5DT0RFUk1PREVfWDRfVEkxMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0VOQ09ERVJNT0RFX1gyX1RJMikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9FTkNPREVSTU9ERV9YNF9USTEyKSkKIAogI2RlZmluZSBJU19MTF9USU1fSUNfUE9MQVJJVFlfRU5DT0RFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX1JJU0lORykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0lDX1BPTEFSSVRZX0ZBTExJTkcpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9PU1NSX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTUl9ESVNBQkxFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9PU1NSX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTUl9FTkFCTEUpKQogCiAjZGVmaW5lIElTX0xMX1RJTV9PU1NJX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTSV9ESVNBQkxFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fT1NTSV9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX09TU0lfRU5BQkxFKSkKIAogI2RlZmluZSBJU19MTF9USU1fTE9DS19MRVZFTChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF9PRkYpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfMSkgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMXzIpICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF8zKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9MT0NLTEVWRUxfMSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fTE9DS0xFVkVMXzIpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0xPQ0tMRVZFTF8zKSkKIAogI2RlZmluZSBJU19MTF9USU1fQlJFQUtfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19ESVNBQkxFKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0VOQUJMRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX0VOQUJMRSkpCiAKICNkZWZpbmUgSVNfTExfVElNX0JSRUFLX1BPTEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfUE9MQVJJVFlfTE9XKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLX1BPTEFSSVRZX0hJR0gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19QT0xBUklUWV9ISUdIKSkKIAogI2RlZmluZSBJU19MTF9USU1fQlJFQUtfRklMVEVSKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxKSAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX04yKSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX040KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxX044KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX042KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYyX044KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X042KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY0X044KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X042KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVY4X044KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9ONikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYxNl9OOCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9ONikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUtfRklMVEVSX0ZESVYzMl9OOCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjIpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjQpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjFfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjJfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjRfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjhfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjE2X044KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX042KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBS19GSUxURVJfRkRJVjMyX044KSkKIAogI2RlZmluZSBJU19MTF9USU1fQlJFQUsyX1NUQVRFKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0RJU0FCTEUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0VOQUJMRSkpCiAKICNkZWZpbmUgSVNfTExfVElNX0JSRUFLMl9QT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9MT1cpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdIKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9QT0xBUklUWV9ISUdIKSkKIAogI2RlZmluZSBJU19MTF9USU1fQlJFQUsyX0ZJTFRFUihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjEpICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX04yKSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjQpICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9OOCkgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYyX042KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjgpICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWNF9ONikgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X044KSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjhfTjYpICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9OOCkgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X042KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjgpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9ONSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX042KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjFfTjIpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMV9ONCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxX044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjJfTjYpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMl9OOCkgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY0X042KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjRfTjgpICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWOF9ONikgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVY4X044KSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjE2X041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMTZfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYxNl9OOCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0JSRUFLMl9GSUxURVJfRkRJVjMyX041KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9USU1fQlJFQUsyX0ZJTFRFUl9GRElWMzJfTjYpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1RJTV9CUkVBSzJfRklMVEVSX0ZESVYzMl9OOCkpCiAKICNkZWZpbmUgSVNfTExfVElNX0FVVE9NQVRJQ19PVVRQVVRfU1RBVEUoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1RJTV9BVVRPTUFUSUNPVVRQVVRfRElTQUJMRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVElNX0FVVE9NQVRJQ09VVFBVVF9FTkFCTEUpKQogLyoqCiAgICogQH0KICAgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogICBUSU1fSW5pdFN0cnVjdC0+Q291bnRlck1vZGUgICAgICAgPSBMTF9USU1fQ09VTlRFUk1PREVfVVA7CiAgIFRJTV9Jbml0U3RydWN0LT5BdXRvcmVsb2FkICAgICAgICA9IDB4RkZGRkZGRkZVOwogICBUSU1fSW5pdFN0cnVjdC0+Q2xvY2tEaXZpc2lvbiAgICAgPSBMTF9USU1fQ0xPQ0tESVZJU0lPTl9ESVYxOwotICBUSU1fSW5pdFN0cnVjdC0+UmVwZXRpdGlvbkNvdW50ZXIgPSAodWludDhfdCkweDAwOworICBUSU1fSW5pdFN0cnVjdC0+UmVwZXRpdGlvbkNvdW50ZXIgPSAweDAwMDAwMDAwVTsKIH0KIAogLyoqCkBAIC03MjgsOSArNzI4LDkgQEAKICAgKiAgYW5kIERUR1s3OjBdIGNhbiBiZSB3cml0ZS1sb2NrZWQgZGVwZW5kaW5nIG9uIHRoZSBMT0NLIGNvbmZpZ3VyYXRpb24sIGl0CiAgICogIGNhbiBiZSBuZWNlc3NhcnkgdG8gY29uZmlndXJlIGFsbCBvZiB0aGVtIGR1cmluZyB0aGUgZmlyc3Qgd3JpdGUgYWNjZXNzIHRvCiAgICogIHRoZSBUSU14X0JEVFIgcmVnaXN0ZXIuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQlJFQUtfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgYnJlYWsgaW5wdXQuCi0gICogQG5vdGUgTWFjcm8gQHJlZiBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKKyAgKiBAbm90ZSBNYWNybyBJU19USU1fQktJTjJfSU5TVEFOQ0UoVElNeCkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBvciBub3QKICAgKiAgICAgICBhIHRpbWVyIGluc3RhbmNlIHByb3ZpZGVzIGEgc2Vjb25kIGJyZWFrIGlucHV0LgogICAqIEBwYXJhbSAgVElNeCBUaW1lciBJbnN0YW5jZQogICAqIEBwYXJhbSAgVElNX0JEVFJJbml0U3RydWN0IHBvaW50ZXIgdG8gYSBAcmVmIExMX1RJTV9CRFRSX0luaXRUeXBlRGVmIHN0cnVjdHVyZSAoQnJlYWsgYW5kIERlYWQgVGltZSBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlKQpAQCAtNzk1LDcgKzc5NSw3IEBACiAgICovCiAKIC8qKiBAYWRkdG9ncm91cCBUSU1fTExfUHJpdmF0ZV9GdW5jdGlvbnMgVElNIFByaXZhdGUgRnVuY3Rpb25zCi0gKiAgQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKKyAgKiAgQGJyaWVmICAgUHJpdmF0ZSBmdW5jdGlvbnMKICAgKiBAewogICAqLwogLyoqCmRpZmYgLS1naXQgYS9TcmMvc3RtMzJmN3h4X2xsX3VzYXJ0LmMgYi9TcmMvc3RtMzJmN3h4X2xsX3VzYXJ0LmMKaW5kZXggMDI4YzcwNC4uZDdmMzY3NSAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9sbF91c2FydC5jCisrKyBiL1NyYy9zdG0zMmY3eHhfbGxfdXNhcnQuYwpAQCAtMjIsMTEgKzIyLDExIEBACiAjaW5jbHVkZSAic3RtMzJmN3h4X2xsX3VzYXJ0LmgiCiAjaW5jbHVkZSAic3RtMzJmN3h4X2xsX3JjYy5oIgogI2luY2x1ZGUgInN0bTMyZjd4eF9sbF9idXMuaCIKLSNpZmRlZiAgVVNFX0ZVTExfQVNTRVJUCisjaWZkZWYgVVNFX0ZVTExfQVNTRVJUCiAjaW5jbHVkZSAic3RtMzJfYXNzZXJ0LmgiCiAjZWxzZQogI2RlZmluZSBhc3NlcnRfcGFyYW0oZXhwcikgKCh2b2lkKTBVKQotI2VuZGlmCisjZW5kaWYgLyogVVNFX0ZVTExfQVNTRVJUICovCiAKIC8qKiBAYWRkdG9ncm91cCBTVE0zMkY3eHhfTExfRHJpdmVyCiAgICogQHsKQEAgLTQxLDE0ICs0MSw2IEBACiAvKiBQcml2YXRlIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiogQGFkZHRvZ3JvdXAgVVNBUlRfTExfUHJpdmF0ZV9Db25zdGFudHMKLSAgKiBAewotICAqLwotCi0vKioKLSAgKiBAfQotICAqLwotCiAvKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoqIEBhZGR0b2dyb3VwIFVTQVJUX0xMX1ByaXZhdGVfTWFjcm9zCiAgICogQHsKQEAgLTY1LDQyICs1Nyw0MiBAQAogI2RlZmluZSBJU19MTF9VU0FSVF9CUlJfTUFYKF9fVkFMVUVfXykgKChfX1ZBTFVFX18pIDw9IDB4MDAwMEZGRkZVKQogCiAjZGVmaW5lIElTX0xMX1VTQVJUX0RJUkVDVElPTihfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfRElSRUNUSU9OX05PTkUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9ESVJFQ1RJT05fUlgpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9ESVJFQ1RJT05fVFgpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9ESVJFQ1RJT05fVFhfUlgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9SWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9UWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RJUkVDVElPTl9UWF9SWCkpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfUEFSSVRZKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfTk9ORSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BBUklUWV9FVkVOKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX09ERCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEFSSVRZX0VWRU4pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QQVJJVFlfT0REKSkKIAogI2RlZmluZSBJU19MTF9VU0FSVF9EQVRBV0lEVEgoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF83QikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF84QikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0RBVEFXSURUSF85QikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfREFUQVdJRFRIXzhCKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfREFUQVdJRFRIXzlCKSkKIAogI2RlZmluZSBJU19MTF9VU0FSVF9PVkVSU0FNUExJTkcoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX09WRVJTQU1QTElOR18xNikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX09WRVJTQU1QTElOR184KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9PVkVSU0FNUExJTkdfOCkpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfTEFTVEJJVENMS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX05PX09VVFBVVCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9MQVNUQ0xLUFVMU0VfT1VUUFVUKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfTEFTVENMS1BVTFNFX09VVFBVVCkpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQSEFTRShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEhBU0VfMUVER0UpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUEhBU0VfMkVER0UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QSEFTRV8yRURHRSkpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfQ0xPQ0tQT0xBUklUWShfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfUE9MQVJJVFlfTE9XKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1BPTEFSSVRZX0hJR0gpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9QT0xBUklUWV9ISUdIKSkKIAogI2RlZmluZSBJU19MTF9VU0FSVF9DTE9DS09VVFBVVChfX1ZBTFVFX18pICgoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfQ0xPQ0tfRElTQUJMRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfQ0xPQ0tfRU5BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0NMT0NLX0VOQUJMRSkpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfU1RPUEJJVFMoX19WQUxVRV9fKSAoKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzBfNSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMV81KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9TVE9QQklUU18yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX1NUT1BCSVRTXzFfNSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfU1RPUEJJVFNfMikpCiAKICNkZWZpbmUgSVNfTExfVVNBUlRfSFdDT05UUk9MKF9fVkFMVUVfXykgKCgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfTk9ORSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFMpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChfX1ZBTFVFX18pID09IExMX1VTQVJUX0hXQ09OVFJPTF9SVFMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoX19WQUxVRV9fKSA9PSBMTF9VU0FSVF9IV0NPTlRST0xfQ1RTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKF9fVkFMVUVfXykgPT0gTExfVVNBUlRfSFdDT05UUk9MX1JUU19DVFMpKQogCiAvKioKICAgKiBAfQpkaWZmIC0tZ2l0IGEvU3JjL3N0bTMyZjd4eF9sbF91c2IuYyBiL1NyYy9zdG0zMmY3eHhfbGxfdXNiLmMKaW5kZXggYjY2NTlhZS4uY2I1OWJhZCAxMDA2NDQKLS0tIGEvU3JjL3N0bTMyZjd4eF9sbF91c2IuYworKysgYi9TcmMvc3RtMzJmN3h4X2xsX3VzYi5jCkBAIC05NCw2ICs5NCwxMSBAQAogICAgIC8qIEluaXQgVGhlIFVMUEkgSW50ZXJmYWNlICovCiAgICAgVVNCeC0+R1VTQkNGRyAmPSB+KFVTQl9PVEdfR1VTQkNGR19UU0RQUyB8IFVTQl9PVEdfR1VTQkNGR19VTFBJRlNMUyB8IFVTQl9PVEdfR1VTQkNGR19QSFlTRUwpOwogCisjaWYgZGVmaW5lZChTVE0zMkY3MjJ4eCkgfHwgZGVmaW5lZChTVE0zMkY3MjN4eCkgfHwgZGVmaW5lZChTVE0zMkY3MzB4eCkgfHwgZGVmaW5lZChTVE0zMkY3MzJ4eCkgfHwgZGVmaW5lZChTVE0zMkY3MzN4eCkKKyAgICAvKiBTZWxlY3QgVUxQSSBJbnRlcmZhY2UgKi8KKyAgICBVU0J4LT5HVVNCQ0ZHIHw9IFVTQl9PVEdfR1VTQkNGR19VTFBJX1VUTUlfU0VMOworI2VuZGlmIC8qIGRlZmluZWQoU1RNMzJGNzIyeHgpIHx8IGRlZmluZWQoU1RNMzJGNzIzeHgpIHx8IGRlZmluZWQoU1RNMzJGNzMweHgpIHx8IGRlZmluZWQoU1RNMzJGNzMyeHgpIHx8IGRlZmluZWQoU1RNMzJGNzMzeHgpICovCisKICAgICAvKiBTZWxlY3QgdmJ1cyBzb3VyY2UgKi8KICAgICBVU0J4LT5HVVNCQ0ZHICY9IH4oVVNCX09UR19HVVNCQ0ZHX1VMUElFVkJVU0QgfCBVU0JfT1RHX0dVU0JDRkdfVUxQSUVWQlVTSSk7CiAgICAgaWYgKGNmZy51c2VfZXh0ZXJuYWxfdmJ1cyA9PSAxVSkKQEAgLTExNSw3ICsxMjAsNyBAQAogICAgIFVTQngtPkdVU0JDRkcgJj0gfihVU0JfT1RHX0dVU0JDRkdfVUxQSUVWQlVTRCB8IFVTQl9PVEdfR1VTQkNGR19VTFBJRVZCVVNJKTsKIAogICAgIC8qIFNlbGVjdCBVVE1JIEludGVyYWNlICovCi0gICAgVVNCeC0+R1VTQkNGRyAmPSB+IFVTQl9PVEdfR1VTQkNGR19VTFBJX1VUTUlfU0VMOworICAgIFVTQngtPkdVU0JDRkcgJj0gflVTQl9PVEdfR1VTQkNGR19VTFBJX1VUTUlfU0VMOwogICAgIFVTQngtPkdDQ0ZHIHw9IFVTQl9PVEdfR0NDRkdfUEhZSFNFTjsKIAogICAgIC8qIEVuYWJsZXMgY29udHJvbCBvZiBhIEhpZ2ggU3BlZWQgVVNCIFBIWSAqLwpAQCAtMTY5LDcgKzE3NCw3IEBACiAgIHVzZWQgYnkgYXBwbGljYXRpb24uIEluIHRoZSBsb3cgQUhCIGZyZXF1ZW5jeSByYW5nZSBpdCBpcyB1c2VkIHRvIHN0cmV0Y2ggZW5vdWdoIHRoZSBVU0IgcmVzcG9uc2UKICAgdGltZSB0byBJTiB0b2tlbnMsIHRoZSBVU0IgdHVybmFyb3VuZCB0aW1lLCBzbyB0byBjb21wZW5zYXRlIGZvciB0aGUgbG9uZ2VyIEFIQiByZWFkIGFjY2VzcwogICBsYXRlbmN5IHRvIHRoZSBEYXRhIEZJRk8gKi8KLSAgaWYgKHNwZWVkID09IFVTQl9PVEdfU1BFRURfRlVMTCkKKyAgaWYgKHNwZWVkID09IFVTQkRfRlNfU1BFRUQpCiAgIHsKICAgICBpZiAoKGhjbGsgPj0gMTQyMDAwMDBVKSAmJiAoaGNsayA8IDE1MDAwMDAwVSkpCiAgICAgewpAQCAtMjIyLDcgKzIyNyw3IEBACiAgICAgICBVc2JUcmQgPSAweDZVOwogICAgIH0KICAgfQotICBlbHNlIGlmIChzcGVlZCA9PSBVU0JfT1RHX1NQRUVEX0hJR0gpCisgIGVsc2UgaWYgKHNwZWVkID09IFVTQkRfSFNfU1BFRUQpCiAgIHsKICAgICBVc2JUcmQgPSBVU0JEX0hTX1RSRFRfVkFMVUU7CiAgIH0KQEAgLTMxNCw2ICszMTksOCBAQAogICAvKiBWQlVTIFNlbnNpbmcgc2V0dXAgKi8KICAgaWYgKGNmZy52YnVzX3NlbnNpbmdfZW5hYmxlID09IDBVKQogICB7CisgICAgVVNCeF9ERVZJQ0UtPkRDVEwgfD0gVVNCX09UR19EQ1RMX1NESVM7CisKICAgICAvKiBEZWFjdGl2YXRlIFZCVVMgU2Vuc2luZyBCICovCiAgICAgVVNCeC0+R0NDRkcgJj0gflVTQl9PVEdfR0NDRkdfVkJERU47CiAKQEAgLTMzNSwzMyArMzQyLDMzIEBACiAKICAgaWYgKGNmZy5waHlfaXRmYWNlID09IFVTQl9PVEdfVUxQSV9QSFkpCiAgIHsKLSAgICBpZiAoY2ZnLnNwZWVkID09IFVTQl9PVEdfU1BFRURfSElHSCkKKyAgICBpZiAoY2ZnLnNwZWVkID09IFVTQkRfSFNfU1BFRUQpCiAgICAgewotICAgICAgLyogU2V0IEhpZ2ggc3BlZWQgcGh5ICovCisgICAgICAvKiBTZXQgQ29yZSBzcGVlZCB0byBIaWdoIHNwZWVkIG1vZGUgKi8KICAgICAgICh2b2lkKVVTQl9TZXREZXZTcGVlZChVU0J4LCBVU0JfT1RHX1NQRUVEX0hJR0gpOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgLyogc2V0IEhpZ2ggc3BlZWQgcGh5IGluIEZ1bGwgc3BlZWQgbW9kZSAqLworICAgICAgLyogU2V0IENvcmUgc3BlZWQgdG8gRnVsbCBzcGVlZCBtb2RlICovCiAgICAgICAodm9pZClVU0JfU2V0RGV2U3BlZWQoVVNCeCwgVVNCX09UR19TUEVFRF9ISUdIX0lOX0ZVTEwpOwogICAgIH0KICAgfQogICBlbHNlIGlmIChjZmcucGh5X2l0ZmFjZSA9PSBVU0JfT1RHX0hTX0VNQkVEREVEX1BIWSkKICAgewotICAgIGlmIChjZmcuc3BlZWQgPT0gVVNCX09UR19TUEVFRF9ISUdIKQorICAgIGlmIChjZmcuc3BlZWQgPT0gVVNCRF9IU19TUEVFRCkKICAgICB7Ci0gICAgICAvKiBTZXQgSGlnaCBzcGVlZCBwaHkgKi8KKyAgICAgIC8qIFNldCBDb3JlIHNwZWVkIHRvIEhpZ2ggc3BlZWQgbW9kZSAqLwogICAgICAgKHZvaWQpVVNCX1NldERldlNwZWVkKFVTQngsIFVTQl9PVEdfU1BFRURfSElHSCk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAvKiBzZXQgSGlnaCBzcGVlZCBwaHkgaW4gRnVsbCBzcGVlZCBtb2RlICovCisgICAgICAvKiBTZXQgQ29yZSBzcGVlZCB0byBGdWxsIHNwZWVkIG1vZGUgKi8KICAgICAgICh2b2lkKVVTQl9TZXREZXZTcGVlZChVU0J4LCBVU0JfT1RHX1NQRUVEX0hJR0hfSU5fRlVMTCk7CiAgICAgfQogICB9CiAgIGVsc2UKICAgewotICAgIC8qIFNldCBGdWxsIHNwZWVkIHBoeSAqLworICAgIC8qIFNldCBDb3JlIHNwZWVkIHRvIEZ1bGwgc3BlZWQgbW9kZSAqLwogICAgICh2b2lkKVVTQl9TZXREZXZTcGVlZChVU0J4LCBVU0JfT1RHX1NQRUVEX0ZVTEwpOwogICB9CiAKQEAgLTQyNywxNyArNDM0LDYgQEAKIAogICBVU0J4X0RFVklDRS0+RElFUE1TSyAmPSB+KFVTQl9PVEdfRElFUE1TS19UWEZVUk0pOwogCi0gIGlmIChjZmcuZG1hX2VuYWJsZSA9PSAxVSkKLSAgewotICAgIC8qU2V0IHRocmVzaG9sZCBwYXJhbWV0ZXJzICovCi0gICAgVVNCeF9ERVZJQ0UtPkRUSFJDVEwgPSBVU0JfT1RHX0RUSFJDVExfVFhUSFJMRU5fNiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0RUSFJDVExfUlhUSFJMRU5fNjsKLQotICAgIFVTQnhfREVWSUNFLT5EVEhSQ1RMIHw9IFVTQl9PVEdfRFRIUkNUTF9SWFRIUkVOIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfT1RHX0RUSFJDVExfSVNPVEhSRU4gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9PVEdfRFRIUkNUTF9OT05JU09USFJFTjsKLSAgfQotCiAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMuICovCiAgIFVTQngtPkdJTlRNU0sgPSAwVTsKIApAQCAtNTQyLDggKzUzOCw4IEBACiAgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKICAgKiBAcmV0dmFsIHNwZWVkICBkZXZpY2Ugc3BlZWQKICAgKiAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZXNlIHZhbHVlczoKLSAgKiAgICAgICAgICAgIEBhcmcgVVNCX09UR19TUEVFRF9ISUdIOiBIaWdoIHNwZWVkIG1vZGUKLSAgKiAgICAgICAgICAgIEBhcmcgVVNCX09UR19TUEVFRF9GVUxMOiBGdWxsIHNwZWVkIG1vZGUKKyAgKiAgICAgICAgICAgIEBhcmcgUENEX1NQRUVEX0hJR0g6IEhpZ2ggc3BlZWQgbW9kZQorICAqICAgICAgICAgICAgQGFyZyBQQ0RfU1BFRURfRlVMTDogRnVsbCBzcGVlZCBtb2RlCiAgICovCiB1aW50OF90IFVTQl9HZXREZXZTcGVlZChVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngpCiB7CkBAIC01NTMsMTYgKzU0OSwxNiBAQAogCiAgIGlmIChEZXZFbnVtU3BlZWQgPT0gRFNUU19FTlVNU1BEX0hTX1BIWV8zME1IWl9PUl82ME1IWikKICAgewotICAgIHNwZWVkID0gVVNCX09UR19TUEVFRF9ISUdIOworICAgIHNwZWVkID0gVVNCRF9IU19TUEVFRDsKICAgfQogICBlbHNlIGlmICgoRGV2RW51bVNwZWVkID09IERTVFNfRU5VTVNQRF9GU19QSFlfMzBNSFpfT1JfNjBNSFopIHx8CiAgICAgICAgICAgIChEZXZFbnVtU3BlZWQgPT0gRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWikpCiAgIHsKLSAgICBzcGVlZCA9IFVTQl9PVEdfU1BFRURfRlVMTDsKKyAgICBzcGVlZCA9IFVTQkRfRlNfU1BFRUQ7CiAgIH0KICAgZWxzZQogICB7Ci0gICAgc3BlZWQgPSAwVTsKKyAgICBzcGVlZCA9IDB4RlU7CiAgIH0KIAogICByZXR1cm4gc3BlZWQ7CkBAIC02NTksNiArNjU1LDEyIEBACiAgIC8qIFJlYWQgREVQQ1RMbiByZWdpc3RlciAqLwogICBpZiAoZXAtPmlzX2luID09IDFVKQogICB7CisgICAgaWYgKChVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICYgVVNCX09UR19ESUVQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RJRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCB8PSBVU0JfT1RHX0RJRVBDVExfU05BSzsKKyAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX0VQRElTOworICAgIH0KKwogICAgIFVTQnhfREVWSUNFLT5ERUFDSE1TSyAmPSB+KFVTQl9PVEdfREFJTlRNU0tfSUVQTSAmICh1aW50MzJfdCkoMVVMIDw8IChlcC0+bnVtICYgRVBfQUREUl9NU0spKSk7CiAgICAgVVNCeF9ERVZJQ0UtPkRBSU5UTVNLICY9IH4oVVNCX09UR19EQUlOVE1TS19JRVBNICYgKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpKTsKICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICY9IH4oVVNCX09UR19ESUVQQ1RMX1VTQkFFUCB8CkBAIC02NjksNiArNjcxLDEyIEBACiAgIH0KICAgZWxzZQogICB7CisgICAgaWYgKChVU0J4X09VVEVQKGVwbnVtKS0+RE9FUENUTCAmIFVTQl9PVEdfRE9FUENUTF9FUEVOQSkgPT0gVVNCX09UR19ET0VQQ1RMX0VQRU5BKQorICAgIHsKKyAgICAgIFVTQnhfT1VURVAoZXBudW0pLT5ET0VQQ1RMIHw9IFVTQl9PVEdfRE9FUENUTF9TTkFLOworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgfD0gVVNCX09UR19ET0VQQ1RMX0VQRElTOworICAgIH0KKwogICAgIFVTQnhfREVWSUNFLT5ERUFDSE1TSyAmPSB+KFVTQl9PVEdfREFJTlRNU0tfT0VQTSAmICgodWludDMyX3QpKDFVTCA8PCAoZXAtPm51bSAmIEVQX0FERFJfTVNLKSkgPDwgMTYpKTsKICAgICBVU0J4X0RFVklDRS0+REFJTlRNU0sgJj0gfihVU0JfT1RHX0RBSU5UTVNLX09FUE0gJiAoKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpIDw8IDE2KSk7CiAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgJj0gfihVU0JfT1RHX0RPRVBDVExfVVNCQUVQIHwKQEAgLTY5NCwxMSArNzAyLDIzIEBACiAgIC8qIFJlYWQgREVQQ1RMbiByZWdpc3RlciAqLwogICBpZiAoZXAtPmlzX2luID09IDFVKQogICB7CisgICAgaWYgKChVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICYgVVNCX09UR19ESUVQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RJRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCAgfD0gVVNCX09UR19ESUVQQ1RMX1NOQUs7CisgICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMICB8PSBVU0JfT1RHX0RJRVBDVExfRVBESVM7CisgICAgfQorCiAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCAmPSB+IFVTQl9PVEdfRElFUENUTF9VU0JBRVA7CiAgICAgVVNCeF9ERVZJQ0UtPkRBSU5UTVNLICY9IH4oVVNCX09UR19EQUlOVE1TS19JRVBNICYgKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpKTsKICAgfQogICBlbHNlCiAgIHsKKyAgICBpZiAoKFVTQnhfT1VURVAoZXBudW0pLT5ET0VQQ1RMICYgVVNCX09UR19ET0VQQ1RMX0VQRU5BKSA9PSBVU0JfT1RHX0RPRVBDVExfRVBFTkEpCisgICAgeworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgIHw9IFVTQl9PVEdfRE9FUENUTF9TTkFLOworICAgICAgVVNCeF9PVVRFUChlcG51bSktPkRPRVBDVEwgIHw9IFVTQl9PVEdfRE9FUENUTF9FUERJUzsKKyAgICB9CisKICAgICBVU0J4X09VVEVQKGVwbnVtKS0+RE9FUENUTCAmPSB+VVNCX09UR19ET0VQQ1RMX1VTQkFFUDsKICAgICBVU0J4X0RFVklDRS0+REFJTlRNU0sgJj0gfihVU0JfT1RHX0RBSU5UTVNLX09FUE0gJiAoKHVpbnQzMl90KSgxVUwgPDwgKGVwLT5udW0gJiBFUF9BRERSX01TSykpIDw8IDE2KSk7CiAgIH0KQEAgLTc1Nyw5ICs3NzcsMjcgQEAKICAgICAgIHsKICAgICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUERNQSA9ICh1aW50MzJfdCkoZXAtPmRtYV9hZGRyKTsKICAgICAgIH0KKworICAgICAgaWYgKGVwLT50eXBlID09IEVQX1RZUEVfSVNPQykKKyAgICAgIHsKKyAgICAgICAgaWYgKChVU0J4X0RFVklDRS0+RFNUUyAmICgxVSA8PCA4KSkgPT0gMFUpCisgICAgICAgIHsKKyAgICAgICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMIHw9IFVTQl9PVEdfRElFUENUTF9TT0RERlJNOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX1NEMFBJRF9TRVZORlJNOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qIEVQIGVuYWJsZSwgSU4gZGF0YSBpbiBGSUZPICovCisgICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMIHw9IChVU0JfT1RHX0RJRVBDVExfQ05BSyB8IFVTQl9PVEdfRElFUENUTF9FUEVOQSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CisgICAgICAvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCB8PSAoVVNCX09UR19ESUVQQ1RMX0NOQUsgfCBVU0JfT1RHX0RJRVBDVExfRVBFTkEpOworCiAgICAgICBpZiAoZXAtPnR5cGUgIT0gRVBfVFlQRV9JU09DKQogICAgICAgewogICAgICAgICAvKiBFbmFibGUgdGhlIFR4IEZJRk8gRW1wdHkgSW50ZXJydXB0IGZvciB0aGlzIEVQICovCkBAIC03NjgsMjcgKzgwNiwyMCBAQAogICAgICAgICAgIFVTQnhfREVWSUNFLT5ESUVQRU1QTVNLIHw9IDFVTCA8PCAoZXAtPm51bSAmIEVQX0FERFJfTVNLKTsKICAgICAgICAgfQogICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0lTT0MpCi0gICAgewotICAgICAgaWYgKChVU0J4X0RFVklDRS0+RFNUUyAmICgxVSA8PCA4KSkgPT0gMFUpCi0gICAgICB7Ci0gICAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX1NPRERGUk07Ci0gICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX1NEMFBJRF9TRVZORlJNOworICAgICAgICBpZiAoKFVTQnhfREVWSUNFLT5EU1RTICYgKDFVIDw8IDgpKSA9PSAwVSkKKyAgICAgICAgeworICAgICAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gVVNCX09UR19ESUVQQ1RMX1NPRERGUk07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCB8PSBVU0JfT1RHX0RJRVBDVExfU0QwUElEX1NFVk5GUk07CisgICAgICAgIH0KKworICAgICAgICAodm9pZClVU0JfV3JpdGVQYWNrZXQoVVNCeCwgZXAtPnhmZXJfYnVmZiwgZXAtPm51bSwgKHVpbnQxNl90KWVwLT54ZmVyX2xlbiwgZG1hKTsKICAgICAgIH0KICAgICB9Ci0KLSAgICAvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLwotICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gKFVTQl9PVEdfRElFUENUTF9DTkFLIHwgVVNCX09UR19ESUVQQ1RMX0VQRU5BKTsKLQotICAgIGlmIChlcC0+dHlwZSA9PSBFUF9UWVBFX0lTT0MpCi0gICAgewotICAgICAgKHZvaWQpVVNCX1dyaXRlUGFja2V0KFVTQngsIGVwLT54ZmVyX2J1ZmYsIGVwLT5udW0sICh1aW50MTZfdCllcC0+eGZlcl9sZW4sIGRtYSk7Ci0gICAgfQogICB9CiAgIGVsc2UgLyogT1VUIGVuZHBvaW50ICovCiAgIHsKQEAgLTg4NiwxOCArOTE3LDIxIEBACiAgICAgICB7CiAgICAgICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBETUEgPSAodWludDMyX3QpKGVwLT5kbWFfYWRkcik7CiAgICAgICB9CisKKyAgICAgIC8qIEVQIGVuYWJsZSwgSU4gZGF0YSBpbiBGSUZPICovCisgICAgICBVU0J4X0lORVAoZXBudW0pLT5ESUVQQ1RMIHw9IChVU0JfT1RHX0RJRVBDVExfQ05BSyB8IFVTQl9PVEdfRElFUENUTF9FUEVOQSk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CisgICAgICAvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLworICAgICAgVVNCeF9JTkVQKGVwbnVtKS0+RElFUENUTCB8PSAoVVNCX09UR19ESUVQQ1RMX0NOQUsgfCBVU0JfT1RHX0RJRVBDVExfRVBFTkEpOworCiAgICAgICAvKiBFbmFibGUgdGhlIFR4IEZJRk8gRW1wdHkgSW50ZXJydXB0IGZvciB0aGlzIEVQICovCiAgICAgICBpZiAoZXAtPnhmZXJfbGVuID4gMFUpCiAgICAgICB7CiAgICAgICAgIFVTQnhfREVWSUNFLT5ESUVQRU1QTVNLIHw9IDFVTCA8PCAoZXAtPm51bSAmIEVQX0FERFJfTVNLKTsKICAgICAgIH0KICAgICB9Ci0KLSAgICAvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLwotICAgIFVTQnhfSU5FUChlcG51bSktPkRJRVBDVEwgfD0gKFVTQl9PVEdfRElFUENUTF9DTkFLIHwgVVNCX09UR19ESUVQQ1RMX0VQRU5BKTsKICAgfQogICBlbHNlIC8qIE9VVCBlbmRwb2ludCAqLwogICB7CkBAIC05NTUsNyArOTg5LDcgQEAKICAgICBjb3VudDMyYiA9ICgodWludDMyX3QpbGVuICsgM1UpIC8gNFU7CiAgICAgZm9yIChpID0gMFU7IGkgPCBjb3VudDMyYjsgaSsrKQogICAgIHsKLSAgICAgIFVTQnhfREZJRk8oKHVpbnQzMl90KWNoX2VwX251bSkgPSAqKChfX3BhY2tlZCB1aW50MzJfdCAqKXBTcmMpOworICAgICAgVVNCeF9ERklGTygodWludDMyX3QpY2hfZXBfbnVtKSA9IF9fVU5BTElHTkVEX1VJTlQzMl9SRUFEKHBTcmMpOwogICAgICAgcFNyYysrOwogICAgIH0KICAgfQpAQCAtOTY0LDE1ICs5OTgsMTAgQEAKIH0KIAogLyoqCi0gICogQGJyaWVmICBVU0JfUmVhZFBhY2tldCA6IHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgVHggRklGTyBhc3NvY2lhdGVkCi0gICogICAgICAgICB3aXRoIHRoZSBFUC9jaGFubmVsCisgICogQGJyaWVmICBVU0JfUmVhZFBhY2tldCA6IHJlYWQgYSBwYWNrZXQgZnJvbSB0aGUgUlggRklGTwogICAqIEBwYXJhbSAgVVNCeCAgU2VsZWN0ZWQgZGV2aWNlCiAgICogQHBhcmFtICBkZXN0ICBzb3VyY2UgcG9pbnRlcgogICAqIEBwYXJhbSAgbGVuICBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICAqIEBwYXJhbSAgZG1hIFVTQiBkbWEgZW5hYmxlZCBvciBkaXNhYmxlZAotICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlc2UgdmFsdWVzOgotICAqICAgICAgICAgICAwIDogRE1BIGZlYXR1cmUgbm90IHVzZWQKLSAgKiAgICAgICAgICAgMSA6IERNQSBmZWF0dXJlIHVzZWQKICAgKiBAcmV0dmFsIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyCiAgICovCiB2b2lkICpVU0JfUmVhZFBhY2tldChVU0JfT1RHX0dsb2JhbFR5cGVEZWYgKlVTQngsIHVpbnQ4X3QgKmRlc3QsIHVpbnQxNl90IGxlbikKQEAgLTk4NCw3ICsxMDEzLDcgQEAKIAogICBmb3IgKGkgPSAwVTsgaSA8IGNvdW50MzJiOyBpKyspCiAgIHsKLSAgICAqKF9fcGFja2VkIHVpbnQzMl90ICopcERlc3QgPSBVU0J4X0RGSUZPKDBVKTsKKyAgICBfX1VOQUxJR05FRF9VSU5UMzJfV1JJVEUocERlc3QsIFVTQnhfREZJRk8oMFUpKTsKICAgICBwRGVzdCsrOwogICB9CiAKQEAgLTEyNTYsMTMgKzEyODUsOSBAQAogewogICB1aW50MzJfdCBVU0J4X0JBU0UgPSAodWludDMyX3QpVVNCeDsKIAotICAvKiBTZXQgdGhlIE1QUyBvZiB0aGUgSU4gRVAgYmFzZWQgb24gdGhlIGVudW1lcmF0aW9uIHNwZWVkICovCisgIC8qIFNldCB0aGUgTVBTIG9mIHRoZSBJTiBFUDAgdG8gNjQgYnl0ZXMgKi8KICAgVVNCeF9JTkVQKDBVKS0+RElFUENUTCAmPSB+VVNCX09UR19ESUVQQ1RMX01QU0laOwogCi0gIGlmICgoVVNCeF9ERVZJQ0UtPkRTVFMgJiBVU0JfT1RHX0RTVFNfRU5VTVNQRCkgPT0gRFNUU19FTlVNU1BEX0xTX1BIWV82TUhaKQotICB7Ci0gICAgVVNCeF9JTkVQKDBVKS0+RElFUENUTCB8PSAzVTsKLSAgfQogICBVU0J4X0RFVklDRS0+RENUTCB8PSBVU0JfT1RHX0RDVExfQ0dJTkFLOwogCiAgIHJldHVybiBIQUxfT0s7CkBAIC0xNDI5LDcgKzE0NTQsNyBAQAogCiAgIGlmICgoVVNCeC0+Q0lEICYgKDB4MVUgPDwgOCkpICE9IDBVKQogICB7Ci0gICAgaWYgKGNmZy5zcGVlZCA9PSBVU0JfT1RHX1NQRUVEX0ZVTEwpCisgICAgaWYgKGNmZy5zcGVlZCA9PSBVU0JIX0ZTTFNfU1BFRUQpCiAgICAgewogICAgICAgLyogRm9yY2UgRGV2aWNlIEVudW1lcmF0aW9uIHRvIEZTL0xTIG1vZGUgb25seSAqLwogICAgICAgVVNCeF9IT1NULT5IQ0ZHIHw9IFVTQl9PVEdfSENGR19GU0xTUzsKQEAgLTE1OTAsOSArMTYxNSw5IEBACiAgICogQHBhcmFtICBVU0J4ICBTZWxlY3RlZCBkZXZpY2UKICAgKiBAcmV0dmFsIHNwZWVkIDogSG9zdCBzcGVlZAogICAqICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlc2UgdmFsdWVzOgotICAqICAgICAgICAgICAgQGFyZyBVU0JfT1RHX1NQRUVEX0hJR0g6IEhpZ2ggc3BlZWQgbW9kZQotICAqICAgICAgICAgICAgQGFyZyBVU0JfT1RHX1NQRUVEX0ZVTEw6IEZ1bGwgc3BlZWQgbW9kZQotICAqICAgICAgICAgICAgQGFyZyBVU0JfT1RHX1NQRUVEX0xPVzogTG93IHNwZWVkIG1vZGUKKyAgKiAgICAgICAgICAgIEBhcmcgSENEX1NQRUVEX0hJR0g6IEhpZ2ggc3BlZWQgbW9kZQorICAqICAgICAgICAgICAgQGFyZyBIQ0RfU1BFRURfRlVMTDogRnVsbCBzcGVlZCBtb2RlCisgICogICAgICAgICAgICBAYXJnIEhDRF9TUEVFRF9MT1c6IExvdyBzcGVlZCBtb2RlCiAgICovCiB1aW50MzJfdCBVU0JfR2V0SG9zdFNwZWVkKFVTQl9PVEdfR2xvYmFsVHlwZURlZiAqVVNCeCkKIHsKQEAgLTE3NzAsNyArMTc5NSw3IEBACiAgIHVpbnQxNl90IG51bV9wYWNrZXRzOwogICB1aW50MTZfdCBtYXhfaGNfcGt0X2NvdW50ID0gMjU2VTsKIAotICBpZiAoKChVU0J4LT5DSUQgJiAoMHgxVSA8PCA4KSkgIT0gMFUpICYmIChoYy0+c3BlZWQgPT0gVVNCX09UR19TUEVFRF9ISUdIKSkKKyAgaWYgKCgoVVNCeC0+Q0lEICYgKDB4MVUgPDwgOCkpICE9IDBVKSAmJiAoaGMtPnNwZWVkID09IFVTQkhfSFNfU1BFRUQpKQogICB7CiAgICAgaWYgKChkbWEgPT0gMFUpICYmIChoYy0+ZG9fcGluZyA9PSAxVSkpCiAgICAgewpAQCAtMTk5OCw3ICsyMDIzLDYgQEAKICAgdWludDMyX3QgdmFsdWU7CiAgIHVpbnQzMl90IGk7CiAKLQogICAodm9pZClVU0JfRGlzYWJsZUdsb2JhbEludChVU0J4KTsKIAogICAvKiBGbHVzaCBGSUZPICovCkBAIC0yMDM3LDYgKzIwNjEsNyBAQAogICAvKiBDbGVhciBhbnkgcGVuZGluZyBIb3N0IGludGVycnVwdHMgKi8KICAgVVNCeF9IT1NULT5IQUlOVCA9IDB4RkZGRkZGRkZVOwogICBVU0J4LT5HSU5UU1RTID0gMHhGRkZGRkZGRlU7CisKICAgKHZvaWQpVVNCX0VuYWJsZUdsb2JhbEludChVU0J4KTsKIAogICByZXR1cm4gSEFMX09LOwo=