ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCAyOWYwOTNhLi42MDU2YmY3IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC03NSw2ICs3NSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgUEVSU0lTVEVOVF9BQ1RJVklUWSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUEVSU0lTVEVOVF9BQ1RJVklUWSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBST0NFU1NfT1VUR09JTkdfQ0FMTFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlBST0NFU1NfT1VUR09JTkdfQ0FMTFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NBTEVOREFSIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9DQUxMX0xPRyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfQ09OVEFDVFMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfQ09OVEFDVFMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfRlJBTUVfQlVGRkVSID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0ZSQU1FX0JVRkZFUiI7CkBAIC0xMjEsNiArMTIyLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgV0FLRV9MT0NLID0gImFuZHJvaWQucGVybWlzc2lvbi5XQUtFX0xPQ0siOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9BUE5fU0VUVElOR1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0FQTl9TRVRUSU5HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTEVOREFSID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxFTkRBUiI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NBTExfTE9HID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0NPTlRBQ1RTID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DT05UQUNUUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9HU0VSVklDRVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0dTRVJWSUNFUyI7CkBAIC0yNjQ4Nyw2ICsyNjQ4OSw3IEBACiAgICAgY3RvciBwdWJsaWMgRnJhbWVMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIGJvb2xlYW4gZ2V0Q29uc2lkZXJHb25lQ2hpbGRyZW5XaGVuTWVhc3VyaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldEZvcmVncm91bmQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRGb3JlZ3JvdW5kR3Jhdml0eSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRNZWFzdXJlQWxsQ2hpbGRyZW4oKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiwgaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKQEAgLTI2NzE1LDYgKzI2NzE4LDcgQEAKICAgICBjdG9yIHB1YmxpYyBMaW5lYXJMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIExpbmVhckxheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRCYXNlbGluZUFsaWduZWRDaGlsZEluZGV4KCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGdldERpdmlkZXJEcmF3YWJsZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldERpdmlkZXJQYWRkaW5nKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb24oKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRTaG93RGl2aWRlcnMoKTsKQEAgLTI3MTM5LDYgKzI3MTQzLDcgQEAKICAgICBjdG9yIHB1YmxpYyBSZWxhdGl2ZUxheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CiAgICAgY3RvciBwdWJsaWMgUmVsYXRpdmVMYXlvdXQoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIFJlbGF0aXZlTGF5b3V0KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEdyYXZpdHkoKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiwgaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0R3Jhdml0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRIb3Jpem9udGFsR3Jhdml0eShpbnQpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IGYyNjc0N2IuLmU0MWI2NjYgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTE0LDkgKzE0LDkgQEAKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgICAgIGV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKLSAgICAgICAgZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2ltYWdlcyBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAorCWV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtNDAsNyArNDAsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtNjQsNyArNjQsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtODksNyArODksNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApAQCAtMTEzLDcgKzExMyw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCkBAIC0xMzcsNyArMTM3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKQEAgLTE2Miw3ICsxNjIsNyBAQAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQppbmRleCAyNzc1YzdiLi5hYTkyZWZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQpAQCAtNDM3LDYgKzQzNywxMyBAQAogICAgICAqIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjYW1lcmEsIG9yIGFjcm9zcyBtdWx0aXBsZSBydW5zIG9mIHRoZSBzYW1lCiAgICAgICogcHJvZ3JhbS4KICAgICAgKgorICAgICAqIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIHByZXZpZXcgZGF0YSB0byBjcmVhdGUgdmlkZW8gb3Igc3RpbGwgaW1hZ2VzLAorICAgICAqIHN0cm9uZ2x5IGNvbnNpZGVyIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmR9IHRvCisgICAgICogcHJvcGVybHkgaW5kaWNhdGUgaW1hZ2UgY2FwdHVyZSBvciByZWNvcmRpbmcgc3RhcnQvc3RvcCB0byB0aGUgdXNlci48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZAorICAgICAqIEBzZWUgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3CiAgICAgICogQHBhcmFtIHN1cmZhY2VUZXh0dXJlIHRoZSB7QGxpbmsgU3VyZmFjZVRleHR1cmV9IHRvIHdoaWNoIHRoZSBwcmV2aWV3CiAgICAgICogICAgIGltYWdlcyBhcmUgdG8gYmUgc2VudCBvciBudWxsIHRvIHJlbW92ZSB0aGUgY3VycmVudCBwcmV2aWV3IHN1cmZhY2UKICAgICAgKiAgICAgdGV4dHVyZQpAQCAtNTEyLDEzICs1MTksMTkgQEAKICAgICBwdWJsaWMgbmF0aXZlIGZpbmFsIGJvb2xlYW4gcHJldmlld0VuYWJsZWQoKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbGxzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgcHJldmlldyBmcmFtZSBpbiBhZGRpdGlvbgorICAgICAqIDxwPkluc3RhbGxzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgcHJldmlldyBmcmFtZSBpbiBhZGRpdGlvbgogICAgICAqIHRvIGRpc3BsYXlpbmcgdGhlbSBvbiB0aGUgc2NyZWVuLiAgVGhlIGNhbGxiYWNrIHdpbGwgYmUgcmVwZWF0ZWRseSBjYWxsZWQKICAgICAgKiBmb3IgYXMgbG9uZyBhcyBwcmV2aWV3IGlzIGFjdGl2ZS4gIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUsCi0gICAgICogZXZlbiB3aGlsZSBwcmV2aWV3IGlzIGxpdmUuICBBbnkgb3RoZXIgcHJldmlldyBjYWxsYmFja3MgYXJlIG92ZXJyaWRkZW4uCisgICAgICogZXZlbiB3aGlsZSBwcmV2aWV3IGlzIGxpdmUuICBBbnkgb3RoZXIgcHJldmlldyBjYWxsYmFja3MgYXJlCisgICAgICogb3ZlcnJpZGRlbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB5b3UgYXJlIHVzaW5nIHRoZSBwcmV2aWV3IGRhdGEgdG8gY3JlYXRlIHZpZGVvIG9yIHN0aWxsIGltYWdlcywKKyAgICAgKiBzdHJvbmdseSBjb25zaWRlciB1c2luZyB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kfSB0bworICAgICAqIHByb3Blcmx5IGluZGljYXRlIGltYWdlIGNhcHR1cmUgb3IgcmVjb3JkaW5nIHN0YXJ0L3N0b3AgdG8gdGhlIHVzZXIuPC9wPgogICAgICAqCiAgICAgICogQHBhcmFtIGNiIGEgY2FsbGJhY2sgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgYSBjb3B5IG9mIGVhY2ggcHJldmlldyBmcmFtZSwKICAgICAgKiAgICAgb3IgbnVsbCB0byBzdG9wIHJlY2VpdmluZyBjYWxsYmFja3MuCisgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmQKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcmV2aWV3Q2FsbGJhY2soUHJldmlld0NhbGxiYWNrIGNiKSB7CiAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2sgPSBjYjsKQEAgLTUzMCwxMyArNTQzLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5zdGFsbHMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGZvciB0aGUgbmV4dCBwcmV2aWV3IGZyYW1lIGluIGFkZGl0aW9uCi0gICAgICogdG8gZGlzcGxheWluZyBpdCBvbiB0aGUgc2NyZWVuLiAgQWZ0ZXIgb25lIGludm9jYXRpb24sIHRoZSBjYWxsYmFjayBpcwotICAgICAqIGNsZWFyZWQuIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYW55IHRpbWUsIGV2ZW4gd2hlbiBwcmV2aWV3IGlzIGxpdmUuCi0gICAgICogQW55IG90aGVyIHByZXZpZXcgY2FsbGJhY2tzIGFyZSBvdmVycmlkZGVuLgorICAgICAqIDxwPkluc3RhbGxzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgdGhlIG5leHQgcHJldmlldyBmcmFtZSBpbgorICAgICAqIGFkZGl0aW9uIHRvIGRpc3BsYXlpbmcgaXQgb24gdGhlIHNjcmVlbi4gIEFmdGVyIG9uZSBpbnZvY2F0aW9uLCB0aGUKKyAgICAgKiBjYWxsYmFjayBpcyBjbGVhcmVkLiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGFueSB0aW1lLCBldmVuIHdoZW4KKyAgICAgKiBwcmV2aWV3IGlzIGxpdmUuICBBbnkgb3RoZXIgcHJldmlldyBjYWxsYmFja3MgYXJlIG92ZXJyaWRkZW4uPC9wPgorICAgICAqCisgICAgICogPHA+SWYgeW91IGFyZSB1c2luZyB0aGUgcHJldmlldyBkYXRhIHRvIGNyZWF0ZSB2aWRlbyBvciBzdGlsbCBpbWFnZXMsCisgICAgICogc3Ryb25nbHkgY29uc2lkZXIgdXNpbmcge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZH0gdG8KKyAgICAgKiBwcm9wZXJseSBpbmRpY2F0ZSBpbWFnZSBjYXB0dXJlIG9yIHJlY29yZGluZyBzdGFydC9zdG9wIHRvIHRoZSB1c2VyLjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBjYiBhIGNhbGxiYWNrIG9iamVjdCB0aGF0IHJlY2VpdmVzIGEgY29weSBvZiB0aGUgbmV4dCBwcmV2aWV3IGZyYW1lLAogICAgICAqICAgICBvciBudWxsIHRvIHN0b3AgcmVjZWl2aW5nIGNhbGxiYWNrcy4KKyAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE9uZVNob3RQcmV2aWV3Q2FsbGJhY2soUHJldmlld0NhbGxiYWNrIGNiKSB7CiAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2sgPSBjYjsKQEAgLTU0OCwyNCArNTY2LDMwIEBACiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBzZXRIYXNQcmV2aWV3Q2FsbGJhY2soYm9vbGVhbiBpbnN0YWxsZWQsIGJvb2xlYW4gbWFudWFsQnVmZmVyKTsKIAogICAgIC8qKgotICAgICAqIEluc3RhbGxzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBmb3IgZXZlcnkgcHJldmlldyBmcmFtZSwgdXNpbmcgYnVmZmVycwotICAgICAqIHN1cHBsaWVkIHdpdGgge0BsaW5rICNhZGRDYWxsYmFja0J1ZmZlcihieXRlW10pfSwgaW4gYWRkaXRpb24gdG8KKyAgICAgKiA8cD5JbnN0YWxscyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgZm9yIGV2ZXJ5IHByZXZpZXcgZnJhbWUsIHVzaW5nCisgICAgICogYnVmZmVycyBzdXBwbGllZCB3aXRoIHtAbGluayAjYWRkQ2FsbGJhY2tCdWZmZXIoYnl0ZVtdKX0sIGluIGFkZGl0aW9uIHRvCiAgICAgICogZGlzcGxheWluZyB0aGVtIG9uIHRoZSBzY3JlZW4uICBUaGUgY2FsbGJhY2sgd2lsbCBiZSByZXBlYXRlZGx5IGNhbGxlZAotICAgICAqIGZvciBhcyBsb25nIGFzIHByZXZpZXcgaXMgYWN0aXZlIGFuZCBidWZmZXJzIGFyZSBhdmFpbGFibGUuCi0gICAgICogQW55IG90aGVyIHByZXZpZXcgY2FsbGJhY2tzIGFyZSBvdmVycmlkZGVuLgorICAgICAqIGZvciBhcyBsb25nIGFzIHByZXZpZXcgaXMgYWN0aXZlIGFuZCBidWZmZXJzIGFyZSBhdmFpbGFibGUuICBBbnkgb3RoZXIKKyAgICAgKiBwcmV2aWV3IGNhbGxiYWNrcyBhcmUgb3ZlcnJpZGRlbi48L3A+CiAgICAgICoKICAgICAgKiA8cD5UaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBpbXByb3ZlIHByZXZpZXcgZWZmaWNpZW5jeSBhbmQgZnJhbWUKICAgICAgKiByYXRlIGJ5IGFsbG93aW5nIHByZXZpZXcgZnJhbWUgbWVtb3J5IHJldXNlLiAgWW91IG11c3QgY2FsbAogICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2tCdWZmZXIoYnl0ZVtdKX0gYXQgc29tZSBwb2ludCAtLSBiZWZvcmUgb3IgYWZ0ZXIKLSAgICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kIC0tIG9yIG5vIGNhbGxiYWNrcyB3aWxsIHJlY2VpdmVkLgorICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2QgLS0gb3Igbm8gY2FsbGJhY2tzIHdpbGwgcmVjZWl2ZWQuPC9wPgogICAgICAqCi0gICAgICogVGhlIGJ1ZmZlciBxdWV1ZSB3aWxsIGJlIGNsZWFyZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBudWxsCisgICAgICogPHA+VGhlIGJ1ZmZlciBxdWV1ZSB3aWxsIGJlIGNsZWFyZWQgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBudWxsCiAgICAgICogY2FsbGJhY2ssIHtAbGluayAjc2V0UHJldmlld0NhbGxiYWNrKENhbWVyYS5QcmV2aWV3Q2FsbGJhY2spfSBpcyBjYWxsZWQsCi0gICAgICogb3Ige0BsaW5rICNzZXRPbmVTaG90UHJldmlld0NhbGxiYWNrKENhbWVyYS5QcmV2aWV3Q2FsbGJhY2spfSBpcyBjYWxsZWQuCisgICAgICogb3Ige0BsaW5rICNzZXRPbmVTaG90UHJldmlld0NhbGxiYWNrKENhbWVyYS5QcmV2aWV3Q2FsbGJhY2spfSBpcworICAgICAqIGNhbGxlZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB5b3UgYXJlIHVzaW5nIHRoZSBwcmV2aWV3IGRhdGEgdG8gY3JlYXRlIHZpZGVvIG9yIHN0aWxsIGltYWdlcywKKyAgICAgKiBzdHJvbmdseSBjb25zaWRlciB1c2luZyB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYUFjdGlvblNvdW5kfSB0bworICAgICAqIHByb3Blcmx5IGluZGljYXRlIGltYWdlIGNhcHR1cmUgb3IgcmVjb3JkaW5nIHN0YXJ0L3N0b3AgdG8gdGhlIHVzZXIuPC9wPgogICAgICAqCiAgICAgICogQHBhcmFtIGNiIGEgY2FsbGJhY2sgb2JqZWN0IHRoYXQgcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lLAogICAgICAqICAgICBvciBudWxsIHRvIHN0b3AgcmVjZWl2aW5nIGNhbGxiYWNrcyBhbmQgY2xlYXIgdGhlIGJ1ZmZlciBxdWV1ZS4KICAgICAgKiBAc2VlICNhZGRDYWxsYmFja0J1ZmZlcihieXRlW10pCisgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmQKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQcmV2aWV3Q2FsbGJhY2tXaXRoQnVmZmVyKFByZXZpZXdDYWxsYmFjayBjYikgewogICAgICAgICBtUHJldmlld0NhbGxiYWNrID0gY2I7CkBAIC04MzQsMTAgKzg1OCwxNSBAQAogICAgICAqIHRoZSBmb2N1cyBwb3NpdGlvbi4gQXBwbGljYXRpb25zIG11c3QgY2FsbCBjYW5jZWxBdXRvRm9jdXMgdG8gcmVzZXQgdGhlCiAgICAgICogZm9jdXMuPC9wPgogICAgICAqCisgICAgICogPHA+SWYgYXV0b2ZvY3VzIGlzIHN1Y2Nlc3NmdWwsIGNvbnNpZGVyIHVzaW5nCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZH0gdG8gcHJvcGVybHkgcGxheSBiYWNrIGFuIGF1dG9mb2N1cworICAgICAqIHN1Y2Nlc3Mgc291bmQgdG8gdGhlIHVzZXIuPC9wPgorICAgICAqCiAgICAgICogQHBhcmFtIGNiIHRoZSBjYWxsYmFjayB0byBydW4KICAgICAgKiBAc2VlICNjYW5jZWxBdXRvRm9jdXMoKQogICAgICAqIEBzZWUgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGFyYW1ldGVycyNzZXRBdXRvRXhwb3N1cmVMb2NrKGJvb2xlYW4pCiAgICAgICogQHNlZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI3NldEF1dG9XaGl0ZUJhbGFuY2VMb2NrKGJvb2xlYW4pCisgICAgICogQHNlZSBhbmRyb2lkLm1lZGlhLk1lZGlhQWN0aW9uU291bmQKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBhdXRvRm9jdXMoQXV0b0ZvY3VzQ2FsbGJhY2sgY2IpCiAgICAgewpAQCAtMTkwNywxMiArMTkzNiwxMiBAQAogICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJz0nKSAhPSAtMSB8fCBrZXkuaW5kZXhPZignOycpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiS2V5IFwiIiArIGtleSArICJcIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoPSBvciA7KSIpOworICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCc9JykgIT0gLTEgfHwga2V5LmluZGV4T2YoJzsnKSAhPSAtMSB8fCBrZXkuaW5kZXhPZigwKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIktleSBcIiIgKyBrZXkgKyAiXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIgKD0gb3IgOyBvciBcXDApIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJz0nKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc7JykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJWYWx1ZSBcIiIgKyB2YWx1ZSArICJcIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoPSBvciA7KSIpOworICAgICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJz0nKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc7JykgIT0gLTEgfHwgdmFsdWUuaW5kZXhPZigwKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlZhbHVlIFwiIiArIHZhbHVlICsgIlwiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyICg9IG9yIDsgb3IgXFwwKSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvTGF5b3V0LmphdmEKaW5kZXggNTE2Y2UyYS4uMmRjZWE4MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9MYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L0xheW91dC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotIC8qCisvKgogICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTM2Myw0MCArMzYzLDY3IEBACiAgICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgbGF5b3V0IG9yIGxpbmUuICBYWFg6IFNob3VsZCB0aGV5PwogICAgICAgICAvLyBUaGV5IGFyZSBldmFsdWF0ZWQgYXQgZWFjaCBsaW5lLgogICAgICAgICBpZiAobVNwYW5uZWRUZXh0KSB7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNMaW5lQm90dG9tID0gZ2V0TGluZVRvcChmaXJzdExpbmUpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdExpbmUpOwotICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBzcGFucyA9IE5PX1BBUkFfU1BBTlM7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgcGFpbnQgPSBtUGFpbnQ7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgYnVmID0gbVRleHQ7Ci0gICAgICAgICAgICBpbnQgc3BhbkVuZCA9IDA7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtV2lkdGg7Ci0gICAgICAgICAgICBTcGFubmVkIHNwID0gKFNwYW5uZWQpIGJ1ZjsKLSAgICAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gYnVmLmxlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TGluZTsgaSA8PSBsYXN0TGluZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcHJldmlvdXNMaW5lRW5kOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBnZXRMaW5lU3RhcnQoaSArIDEpOwotICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGVuZDsKKyAgICAgICAgICAgIGlmIChsaW5lQmFja2dyb3VuZFNwYW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsaW5lQmFja2dyb3VuZFNwYW5zID0gbmV3IFNwYW5TZXQ8TGluZUJhY2tncm91bmRTcGFuPihMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaW50IGx0b3AgPSBwcmV2aW91c0xpbmVCb3R0b207Ci0gICAgICAgICAgICAgICAgaW50IGxib3R0b20gPSBnZXRMaW5lVG9wKGkgKyAxKTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0xpbmVCb3R0b20gPSBsYm90dG9tOwotICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CisgICAgICAgICAgICBTcGFubmVkIGJ1ZmZlciA9IChTcGFubmVkKSBtVGV4dDsKKyAgICAgICAgICAgIGludCB0ZXh0TGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOworICAgICAgICAgICAgbGluZUJhY2tncm91bmRTcGFucy5pbml0KGJ1ZmZlciwgMCwgdGV4dExlbmd0aCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gc3BhbkVuZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzaG91bGQgYmUgaW5mcmVxdWVudCwgc28gd2UnbGwgdXNlIHRoaXMgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgotICAgICAgICAgICAgICAgICAgICBzcGFuRW5kID0gc3AubmV4dFNwYW5UcmFuc2l0aW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBMaW5lQmFja2dyb3VuZFNwYW4uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgTGluZUJhY2tncm91bmRTcGFucyBvbiBhIGxpbmUgY29udHJpYnV0ZSB0byBpdHMgYmFja2dyb3VuZC4KLSAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBnZXRQYXJhZ3JhcGhTcGFucyhzcCwgc3RhcnQsIGVuZCwgTGluZUJhY2tncm91bmRTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZUJhY2tncm91bmRTcGFucy5udW1iZXJPZlNwYW5zID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwcmV2aW91c0xpbmVCb3R0b20gPSBnZXRMaW5lVG9wKGZpcnN0TGluZSk7CisgICAgICAgICAgICAgICAgaW50IHByZXZpb3VzTGluZUVuZCA9IGdldExpbmVTdGFydChmaXJzdExpbmUpOworICAgICAgICAgICAgICAgIFBhcmFncmFwaFN0eWxlW10gc3BhbnMgPSBOT19QQVJBX1NQQU5TOworICAgICAgICAgICAgICAgIGludCBzcGFuc0xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgVGV4dFBhaW50IHBhaW50ID0gbVBhaW50OworICAgICAgICAgICAgICAgIGludCBzcGFuRW5kID0gMDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBtV2lkdGg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0TGluZTsgaSA8PSBsYXN0TGluZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHByZXZpb3VzTGluZUVuZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IGdldExpbmVTdGFydChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUVuZCA9IGVuZDsKIAotICAgICAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgc3BhbnMubGVuZ3RoOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTGluZUJhY2tncm91bmRTcGFuIGJhY2sgPSAoTGluZUJhY2tncm91bmRTcGFuKSBzcGFuc1tuXTsKLSAgICAgICAgICAgICAgICAgICAgYmFjay5kcmF3QmFja2dyb3VuZChjYW52YXMsIHBhaW50LCAwLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdG9wLCBsYmFzZWxpbmUsIGxib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBzdGFydCwgZW5kLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGx0b3AgPSBwcmV2aW91c0xpbmVCb3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCBsYm90dG9tID0gZ2V0TGluZVRvcChpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzTGluZUJvdHRvbSA9IGxib3R0b207CisgICAgICAgICAgICAgICAgICAgIGludCBsYmFzZWxpbmUgPSBsYm90dG9tIC0gZ2V0TGluZURlc2NlbnQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHNwYW5FbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBpbmZyZXF1ZW50LCBzbyB3ZSdsbCB1c2UgdGhpcyBzbyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFzIG9mdGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgc3BhbkVuZCA9IGxpbmVCYWNrZ3JvdW5kU3BhbnMuZ2V0TmV4dFRyYW5zaXRpb24oc3RhcnQsIHRleHRMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIExpbmVCYWNrZ3JvdW5kU3BhbnMgb24gYSBsaW5lIGNvbnRyaWJ1dGUgdG8gaXRzIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgICAgICAgICBzcGFuc0xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGlvbiBvZiB0aGUgbG9naWMgb2YgZ2V0UGFyYWdyYXBoU3BhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSBlbmQgfHwgc3RhcnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVxdWl2YWxlbnQgdG8gYSBnZXRTcGFucyhzdGFydCwgZW5kKSwgYnV0IGZpbGxpbmcgdGhlICdzcGFucycgbG9jYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBpbnN0ZWFkIHRvIHJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGluZUJhY2tncm91bmRTcGFucy5udW1iZXJPZlNwYW5zOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXF1YWwgdGVzdCBpcyB2YWxpZCBzaW5jZSBib3RoIGludGVydmFscyBhcmUgbm90IGVtcHR5IGJ5IGNvbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZUJhY2tncm91bmRTcGFucy5zcGFuU3RhcnRzW2pdID49IGVuZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCYWNrZ3JvdW5kU3BhbnMuc3BhbkVuZHNbal0gPD0gc3RhcnQpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbnNMZW5ndGggPT0gc3BhbnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3BhbnMgYXJyYXkgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gQXJyYXlVdGlscy5pZGVhbE9iamVjdEFycmF5U2l6ZSgyICogc3BhbnNMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYWdyYXBoU3R5bGVbXSBuZXdTcGFucyA9IG5ldyBQYXJhZ3JhcGhTdHlsZVtuZXdTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3BhbnMsIDAsIG5ld1NwYW5zLCAwLCBzcGFuc0xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFucyA9IG5ld1NwYW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5zW3NwYW5zTGVuZ3RoKytdID0gbGluZUJhY2tncm91bmRTcGFucy5zcGFuc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHNwYW5zTGVuZ3RoOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmVCYWNrZ3JvdW5kU3BhbiBsaW5lQmFja2dyb3VuZFNwYW4gPSAoTGluZUJhY2tncm91bmRTcGFuKSBzcGFuc1tuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVCYWNrZ3JvdW5kU3Bhbi5kcmF3QmFja2dyb3VuZChjYW52YXMsIHBhaW50LCAwLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRvcCwgbGJhc2VsaW5lLCBsYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHN0YXJ0LCBlbmQsIGkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgbGluZUJhY2tncm91bmRTcGFucy5yZWN5Y2xlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYSBoaWdobGlnaHQgZXZlbiB3aXRob3V0IHNwYW5zIGlmIHdlIGFyZSBkcmF3aW5nCkBAIC0xODMwLDYgKzE4NTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlY3Qgc1RlbXBSZWN0ID0gbmV3IFJlY3QoKTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNwYW5uZWRUZXh0OwogICAgIHByaXZhdGUgVGV4dERpcmVjdGlvbkhldXJpc3RpYyBtVGV4dERpcjsKKyAgICBwcml2YXRlIFNwYW5TZXQ8TGluZUJhY2tncm91bmRTcGFuPiBsaW5lQmFja2dyb3VuZFNwYW5zOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSX0xFRlRfVE9fUklHSFQgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUl9SSUdIVF9UT19MRUZUID0gLTE7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5TZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvU3BhblNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTYwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1NwYW5TZXQuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC50ZXh0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CisKKy8qKgorICogQSBjYWNoZWQgc2V0IG9mIHNwYW5zLiBDYWNoZXMgdGhlIHJlc3VsdCBvZiB7QGxpbmsgU3Bhbm5lZCNnZXRTcGFucyhpbnQsIGludCwgQ2xhc3MpfSBhbmQgdGhlbgorICogcHJvdmlkZXMgZmFzdGVyIGFjY2VzcyB0byB7QGxpbmsgU3Bhbm5lZCNuZXh0U3BhblRyYW5zaXRpb24oaW50LCBpbnQsIENsYXNzKX0uCisgKgorICogRmllbGRzIGFyZSBsZWZ0IHB1YmxpYyBmb3IgYSBjb252ZW5pZW50IGRpcmVjdCBhY2Nlc3MuCisgKgorICogTm90ZSB0aGF0IGVtcHR5IHNwYW5zIGFyZSBpZ25vcmVkIGJ5IHRoaXMgY2xhc3MuCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgU3BhblNldDxFPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRT4gY2xhc3NUeXBlOworCisgICAgaW50IG51bWJlck9mU3BhbnM7CisgICAgRVtdIHNwYW5zOworICAgIGludFtdIHNwYW5TdGFydHM7CisgICAgaW50W10gc3BhbkVuZHM7CisgICAgaW50W10gc3BhbkZsYWdzOworCisgICAgU3BhblNldChDbGFzczw/IGV4dGVuZHMgRT4gdHlwZSkgeworICAgICAgICBjbGFzc1R5cGUgPSB0eXBlOworICAgICAgICBudW1iZXJPZlNwYW5zID0gMDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCBpbml0KFNwYW5uZWQgc3Bhbm5lZCwgaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZmluYWwgRVtdIGFsbFNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsIGNsYXNzVHlwZSk7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBhbGxTcGFucy5sZW5ndGg7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDAgJiYgKHNwYW5zID09IG51bGwgfHwgc3BhbnMubGVuZ3RoIDwgbGVuZ3RoKSkgeworICAgICAgICAgICAgLy8gVGhlc2UgYXJyYXlzIG1heSBlbmQgdXAgYmVpbmcgdG9vIGxhcmdlIGJlY2F1c2Ugb2YgdGhlIGRpc2NhcmRlZCBlbXB0eSBzcGFucworICAgICAgICAgICAgc3BhbnMgPSAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShjbGFzc1R5cGUsIGxlbmd0aCk7CisgICAgICAgICAgICBzcGFuU3RhcnRzID0gbmV3IGludFtsZW5ndGhdOworICAgICAgICAgICAgc3BhbkVuZHMgPSBuZXcgaW50W2xlbmd0aF07CisgICAgICAgICAgICBzcGFuRmxhZ3MgPSBuZXcgaW50W2xlbmd0aF07CisgICAgICAgIH0KKworICAgICAgICBudW1iZXJPZlNwYW5zID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgRSBzcGFuID0gYWxsU3BhbnNbaV07CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFubmVkLmdldFNwYW5TdGFydChzcGFuKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRW5kID0gc3Bhbm5lZC5nZXRTcGFuRW5kKHNwYW4pOworICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSBjb250aW51ZTsKKworICAgICAgICAgICAgZmluYWwgaW50IHNwYW5GbGFnID0gc3Bhbm5lZC5nZXRTcGFuRmxhZ3Moc3Bhbik7CisKKyAgICAgICAgICAgIHNwYW5zW251bWJlck9mU3BhbnNdID0gc3BhbjsKKyAgICAgICAgICAgIHNwYW5TdGFydHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuU3RhcnQ7CisgICAgICAgICAgICBzcGFuRW5kc1tudW1iZXJPZlNwYW5zXSA9IHNwYW5FbmQ7CisgICAgICAgICAgICBzcGFuRmxhZ3NbbnVtYmVyT2ZTcGFuc10gPSBzcGFuRmxhZzsKKworICAgICAgICAgICAgbnVtYmVyT2ZTcGFucysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBzcGFucyBpbnRlcnNlY3RpbmcgdGhlIGdpdmVuIGludGVydmFsLgorICAgICAqIEBwYXJhbSBlbmQgbXVzdCBiZSBzdHJpY3RseSBncmVhdGVyIHRoYW4gc3RhcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTcGFuc0ludGVyc2VjdGluZyhpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlNwYW5zOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGVxdWFsIHRlc3QgaXMgdmFsaWQgc2luY2UgYm90aCBpbnRlcnZhbHMgYXJlIG5vdCBlbXB0eSBieSBjb25zdHJ1Y3Rpb24KKyAgICAgICAgICAgIGlmIChzcGFuU3RhcnRzW2ldID49IGVuZCB8fCBzcGFuRW5kc1tpXSA8PSBzdGFydCkgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltaWxhciB0byB7QGxpbmsgU3Bhbm5lZCNuZXh0U3BhblRyYW5zaXRpb24oaW50LCBpbnQsIENsYXNzKX0KKyAgICAgKi8KKyAgICBpbnQgZ2V0TmV4dFRyYW5zaXRpb24oaW50IHN0YXJ0LCBpbnQgbGltaXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlNwYW5zOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFuU3RhcnRzW2ldOworICAgICAgICAgICAgZmluYWwgaW50IHNwYW5FbmQgPSBzcGFuRW5kc1tpXTsKKyAgICAgICAgICAgIGlmIChzcGFuU3RhcnQgPiBzdGFydCAmJiBzcGFuU3RhcnQgPCBsaW1pdCkgbGltaXQgPSBzcGFuU3RhcnQ7CisgICAgICAgICAgICBpZiAoc3BhbkVuZCA+IHN0YXJ0ICYmIHNwYW5FbmQgPCBsaW1pdCkgbGltaXQgPSBzcGFuRW5kOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIHRoZSBzcGFucyB0byBhdm9pZCBtZW1vcnkgbGVha3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgLy8gVGhlIHNwYW5zIGFycmF5IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm90IG51bGwgd2hlbiBudW1iZXJPZlNwYW5zIGlzID4gMAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgeworICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsOyAvLyBwcmV2ZW50IGEgbGVhazogbm8gcmVmZXJlbmNlIGtlcHQgd2hlbiBUZXh0TGluZSBpcyByZWN5Y2xlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9UZXh0TGluZS5qYXZhCmluZGV4IDFlOGEyZjcuLjBkMjgzNWEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3RleHQvVGV4dExpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L1RleHRMaW5lLmphdmEKQEAgLTMwLDggKzMwLDYgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuQXJyYXlVdGlsczsKIAotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCiAvKioKICAqIFJlcHJlc2VudHMgYSBsaW5lIG9mIHN0eWxlZCB0ZXh0LCBmb3IgbWVhc3VyaW5nIGluIHZpc3VhbCBvcmRlciBhbmQKICAqIGZvciByZW5kZXJpbmcuCkBAIC04NjAsNzggKzg1OCw2IEBACiAgICAgICAgIHJldHVybiBydW5Jc1J0bCA/IC1yZXQgOiByZXQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BhblNldDxFPiB7Ci0gICAgICAgIGludCBudW1iZXJPZlNwYW5zOwotICAgICAgICBFW10gc3BhbnM7Ci0gICAgICAgIGludFtdIHNwYW5TdGFydHM7Ci0gICAgICAgIGludFtdIHNwYW5FbmRzOwotICAgICAgICBpbnRbXSBzcGFuRmxhZ3M7Ci0gICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFPiBjbGFzc1R5cGU7Ci0KLSAgICAgICAgU3BhblNldChDbGFzczw/IGV4dGVuZHMgRT4gdHlwZSkgewotICAgICAgICAgICAgY2xhc3NUeXBlID0gdHlwZTsKLSAgICAgICAgICAgIG51bWJlck9mU3BhbnMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoU3Bhbm5lZCBzcGFubmVkLCBpbnQgc3RhcnQsIGludCBsaW1pdCkgewotICAgICAgICAgICAgZmluYWwgRVtdIGFsbFNwYW5zID0gc3Bhbm5lZC5nZXRTcGFucyhzdGFydCwgbGltaXQsIGNsYXNzVHlwZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYWxsU3BhbnMubGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCAmJiAoc3BhbnMgPT0gbnVsbCB8fCBzcGFucy5sZW5ndGggPCBsZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJyYXlzIG1heSBlbmQgdXAgYmVpbmcgdG9vIGxhcmdlIGJlY2F1c2Ugb2YgZW1wdHkgc3BhbnMKLSAgICAgICAgICAgICAgICBzcGFucyA9IChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGNsYXNzVHlwZSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcGFuU3RhcnRzID0gbmV3IGludFtsZW5ndGhdOwotICAgICAgICAgICAgICAgIHNwYW5FbmRzID0gbmV3IGludFtsZW5ndGhdOwotICAgICAgICAgICAgICAgIHNwYW5GbGFncyA9IG5ldyBpbnRbbGVuZ3RoXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbnVtYmVyT2ZTcGFucyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRSBzcGFuID0gYWxsU3BhbnNbaV07Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhblN0YXJ0ID0gc3Bhbm5lZC5nZXRTcGFuU3RhcnQoc3Bhbik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNwYW5FbmQgPSBzcGFubmVkLmdldFNwYW5FbmQoc3Bhbik7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA9PSBzcGFuRW5kKSBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRmxhZyA9IHNwYW5uZWQuZ2V0U3BhbkZsYWdzKHNwYW4pOwotCi0gICAgICAgICAgICAgICAgc3BhbnNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuOwotICAgICAgICAgICAgICAgIHNwYW5TdGFydHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuU3RhcnQ7Ci0gICAgICAgICAgICAgICAgc3BhbkVuZHNbbnVtYmVyT2ZTcGFuc10gPSBzcGFuRW5kOwotICAgICAgICAgICAgICAgIHNwYW5GbGFnc1tudW1iZXJPZlNwYW5zXSA9IHNwYW5GbGFnOwotCi0gICAgICAgICAgICAgICAgbnVtYmVyT2ZTcGFucysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzU3BhbnNJbnRlcnNlY3RpbmcoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRlc3QgaXMgdmFsaWQgc2luY2UgYm90aCBpbnRlcnZhbHMgYXJlIG5vdCBlbXB0eSBieSBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICBpZiAoc3BhblN0YXJ0c1tpXSA+PSBlbmQgfHwgc3BhbkVuZHNbaV0gPD0gc3RhcnQpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldE5leHRUcmFuc2l0aW9uKGludCBzdGFydCwgaW50IGxpbWl0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mU3BhbnM7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuU3RhcnQgPSBzcGFuU3RhcnRzW2ldOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzcGFuRW5kID0gc3BhbkVuZHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHNwYW5TdGFydCA+IHN0YXJ0ICYmIHNwYW5TdGFydCA8IGxpbWl0KSBsaW1pdCA9IHNwYW5TdGFydDsKLSAgICAgICAgICAgICAgICBpZiAoc3BhbkVuZCA+IHN0YXJ0ICYmIHNwYW5FbmQgPCBsaW1pdCkgbGltaXQgPSBzcGFuRW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxpbWl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzcGFucyBhcnJheSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBudWxsIHdoZW4gbnVtYmVyT2ZTcGFucyBpcyA+IDAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZTcGFuczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsOyAvLyBwcmV2ZW50IGEgbGVhazogbm8gcmVmZXJlbmNlIGtlcHQgd2hlbiBUZXh0TGluZSBpcyByZWN5Y2xlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgYSB1bmlkaXJlY3Rpb25hbCBydW4uICBUaGUgcnVuIG11c3Qgbm90CiAgICAgICogY29udGFpbiB0YWJzIG9yIGVtb2ppIGJ1dCBjYW4gY29udGFpbiBzdHlsZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCmluZGV4IGJmNDhmZjIuLjFlZGNmZjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhCkBAIC0xMDQ1NiwxMCArMTA0NTYsMTAgQEAKICAgICAgICAgICAgIGlmIChtSGFyZHdhcmVMYXllciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUhhcmR3YXJlTGF5ZXIgPSBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5jcmVhdGVIYXJkd2FyZUxheWVyKAogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgaXNPcGFxdWUoKSk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUhhcmR3YXJlTGF5ZXIuZ2V0V2lkdGgoKSAhPSB3aWR0aCB8fCBtSGFyZHdhcmVMYXllci5nZXRIZWlnaHQoKSAhPSBoZWlnaHQpIHsKICAgICAgICAgICAgICAgICBtSGFyZHdhcmVMYXllci5yZXNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldEVtcHR5KCk7CisgICAgICAgICAgICAgICAgbUxvY2FsRGlydHlSZWN0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gVGhlIGxheWVyIGlzIG5vdCB2YWxpZCBpZiB0aGUgdW5kZXJseWluZyBHUFUgcmVzb3VyY2VzIGNhbm5vdCBiZSBhbGxvY2F0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xhc3NpYy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKaW5kZXggODEyZDg5YS4uMDljZTFlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKQEAgLTU0OCw5ICs1NDgsMTMgQEAKICAgICAgICAgICAgIGlmICghaW5pdERhdGEubUlzU3BlbGxDaGVja0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBpbnB1dFR5cGUgfD0gSW5wdXRUeXBlLlRZUEVfVEVYVF9GTEFHX05PX1NVR0dFU1RJT05TOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFdlYlRleHRWaWV3LlRFWFRfQVJFQSAhPSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICYmIGluaXREYXRhLm1Jc1RleHRGaWVsZE5leHQpIHsKLSAgICAgICAgICAgICAgICBpbWVPcHRpb25zIHw9IEVkaXRvckluZm8uSU1FX0ZMQUdfTkFWSUdBVEVfTkVYVDsKKyAgICAgICAgICAgIGlmIChXZWJUZXh0Vmlldy5URVhUX0FSRUEgIT0gdHlwZSkgeworICAgICAgICAgICAgICAgIGlmIChpbml0RGF0YS5tSXNUZXh0RmllbGROZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGltZU9wdGlvbnMgfD0gRWRpdG9ySW5mby5JTUVfRkxBR19OQVZJR0FURV9ORVhUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5pdERhdGEubUlzVGV4dEZpZWxkUHJldikgeworICAgICAgICAgICAgICAgICAgICBpbWVPcHRpb25zIHw9IEVkaXRvckluZm8uSU1FX0ZMQUdfTkFWSUdBVEVfUFJFVklPVVM7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBXZWJUZXh0Vmlldy5OT1JNQUxfVEVYVF9GSUVMRDoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKaW5kZXggOGRlZjc0Yi4uNzdkMjY0MSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDb3JlLmphdmEKQEAgLTk1NCwxNCArOTU0LDE1IEBACiAgICAgICAgIHB1YmxpYyBUZXh0RmllbGRJbml0RGF0YShpbnQgZmllbGRQb2ludGVyLAogICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSwgYm9vbGVhbiBpc1NwZWxsQ2hlY2tFbmFibGVkLAogICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b0NvbXBsZXRlLCBib29sZWFuIGlzVGV4dEZpZWxkTmV4dCwKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsLCBpbnQgbWF4TGVuZ3RoLAotICAgICAgICAgICAgICAgIFJlY3Qgbm9kZUJvdW5kcywgaW50IG5vZGVMYXllcklkKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RleHRGaWVsZFByZXYsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWwsCisgICAgICAgICAgICAgICAgaW50IG1heExlbmd0aCwgUmVjdCBub2RlQm91bmRzLCBpbnQgbm9kZUxheWVySWQpIHsKICAgICAgICAgICAgIG1GaWVsZFBvaW50ZXIgPSBmaWVsZFBvaW50ZXI7CiAgICAgICAgICAgICBtVGV4dCA9IHRleHQ7CiAgICAgICAgICAgICBtVHlwZSA9IHR5cGU7CiAgICAgICAgICAgICBtSXNBdXRvQ29tcGxldGVFbmFibGVkID0gYXV0b0NvbXBsZXRlOwogICAgICAgICAgICAgbUlzU3BlbGxDaGVja0VuYWJsZWQgPSBpc1NwZWxsQ2hlY2tFbmFibGVkOwogICAgICAgICAgICAgbUlzVGV4dEZpZWxkTmV4dCA9IGlzVGV4dEZpZWxkTmV4dDsKKyAgICAgICAgICAgIG1Jc1RleHRGaWVsZFByZXYgPSBpc1RleHRGaWVsZFByZXY7CiAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CiAgICAgICAgICAgICBtTGFiZWwgPSBsYWJlbDsKICAgICAgICAgICAgIG1NYXhMZW5ndGggPSBtYXhMZW5ndGg7CkBAIC05NzMsNiArOTc0LDcgQEAKICAgICAgICAgaW50IG1UeXBlOwogICAgICAgICBib29sZWFuIG1Jc1NwZWxsQ2hlY2tFbmFibGVkOwogICAgICAgICBib29sZWFuIG1Jc1RleHRGaWVsZE5leHQ7CisgICAgICAgIGJvb2xlYW4gbUlzVGV4dEZpZWxkUHJldjsKICAgICAgICAgYm9vbGVhbiBtSXNBdXRvQ29tcGxldGVFbmFibGVkOwogICAgICAgICBTdHJpbmcgbU5hbWU7CiAgICAgICAgIFN0cmluZyBtTGFiZWw7CkBAIC0yNzk4LDcgKzI4MDAsNyBAQAogICAgIC8vIGNhbGxlZCBieSBKTkkKICAgICBwcml2YXRlIHZvaWQgaW5pdEVkaXRGaWVsZChpbnQgcG9pbnRlciwgU3RyaW5nIHRleHQsIGludCBpbnB1dFR5cGUsCiAgICAgICAgICAgICBib29sZWFuIGlzU3BlbGxDaGVja0VuYWJsZWQsIGJvb2xlYW4gaXNBdXRvQ29tcGxldGVFbmFibGVkLAotICAgICAgICAgICAgYm9vbGVhbiBuZXh0RmllbGRJc1RleHQsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBuZXh0RmllbGRJc1RleHQsIGJvb2xlYW4gcHJldkZpZWxkSXNUZXh0LCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgIFN0cmluZyBsYWJlbCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc2VsZWN0aW9uUHRyLCBpbnQgbWF4TGVuZ3RoLAogICAgICAgICAgICAgUmVjdCBub2RlUmVjdCwgaW50IG5vZGVMYXllcikgewogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgewpAQCAtMjgwNiw3ICsyODA4LDggQEAKICAgICAgICAgfQogICAgICAgICBUZXh0RmllbGRJbml0RGF0YSBpbml0RGF0YSA9IG5ldyBUZXh0RmllbGRJbml0RGF0YShwb2ludGVyLAogICAgICAgICAgICAgICAgIHRleHQsIGlucHV0VHlwZSwgaXNTcGVsbENoZWNrRW5hYmxlZCwgaXNBdXRvQ29tcGxldGVFbmFibGVkLAotICAgICAgICAgICAgICAgIG5leHRGaWVsZElzVGV4dCwgbmFtZSwgbGFiZWwsIG1heExlbmd0aCwgbm9kZVJlY3QsIG5vZGVMYXllcik7CisgICAgICAgICAgICAgICAgbmV4dEZpZWxkSXNUZXh0LCBwcmV2RmllbGRJc1RleHQsIG5hbWUsIGxhYmVsLCBtYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgbm9kZVJlY3QsIG5vZGVMYXllcik7CiAgICAgICAgIE1lc3NhZ2Uub2J0YWluKG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlciwKICAgICAgICAgICAgICAgICBXZWJWaWV3Q2xhc3NpYy5JTklUX0VESVRfRklFTEQsIGluaXREYXRhKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgTWVzc2FnZS5vYnRhaW4obVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCBkYTk4ODg0Li5kMDE5ZDhjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMTIyLDEwICsxMjIsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBEZXNjcmliZXMgaG93IHRoZSBmb3JlZ3JvdW5kIGlzIHBvc2l0aW9uZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZvcmVncm91bmQgZ3Jhdml0eS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEZvcmVncm91bmRHcmF2aXR5KGludCkKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X2ZvcmVncm91bmRHcmF2aXR5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRGb3JlZ3JvdW5kR3Jhdml0eSgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JlZ3JvdW5kR3Jhdml0eTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEZXNjcmliZXMgaG93IHRoZSBmb3JlZ3JvdW5kIGlzIHBvc2l0aW9uZWQuIERlZmF1bHRzIHRvIFNUQVJUIGFuZCBUT1AuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZm9yZWdyb3VuZEdyYXZpdHkgU2VlIHtAbGluayBhbmRyb2lkLnZpZXcuR3Jhdml0eX0KICAgICAgKgorICAgICAqIEBzZWUgI2dldEZvcmVncm91bmRHcmF2aXR5KCkKKyAgICAgKgogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0ZyYW1lTGF5b3V0X2ZvcmVncm91bmRHcmF2aXR5CiAgICAgICovCiAgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKaW5kZXggYTFiZWE0My4uNWVkMDA1ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQpAQCAtMjM1LDkgKzIzNSwyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRpdmlkZXIgRHJhd2FibGUgdGhhdCB3aWxsIGRpdmlkZSBlYWNoIGl0ZW0uCisgICAgICoKKyAgICAgKiBAc2VlICNzZXREaXZpZGVyRHJhd2FibGUoRHJhd2FibGUpCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNMaW5lYXJMYXlvdXRfZGl2aWRlcgorICAgICAqLworICAgIHB1YmxpYyBEcmF3YWJsZSBnZXREaXZpZGVyRHJhd2FibGUoKSB7CisgICAgICAgIHJldHVybiBtRGl2aWRlcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgYSBkcmF3YWJsZSB0byBiZSB1c2VkIGFzIGEgZGl2aWRlciBiZXR3ZWVuIGl0ZW1zLgorICAgICAqCiAgICAgICogQHBhcmFtIGRpdmlkZXIgRHJhd2FibGUgdGhhdCB3aWxsIGRpdmlkZSBlYWNoIGl0ZW0uCisgICAgICoKICAgICAgKiBAc2VlICNzZXRTaG93RGl2aWRlcnMoaW50KQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X2RpdmlkZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREaXZpZGVyRHJhd2FibGUoRHJhd2FibGUgZGl2aWRlcikgewogICAgICAgICBpZiAoZGl2aWRlciA9PSBtRGl2aWRlcikgewpAQCAtMzk4LDYgKzQxMyw4IEBACiAgICAgICogCiAgICAgICogQHJldHVybiBUcnVlIHRvIG1lYXN1cmUgY2hpbGRyZW4gd2l0aCBhIHdlaWdodCB1c2luZyB0aGUgbWluaW11bQogICAgICAqICAgICAgICAgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNNZWFzdXJlV2l0aExhcmdlc3RDaGlsZEVuYWJsZWQoKSB7CiAgICAgICAgIHJldHVybiBtVXNlTGFyZ2VzdENoaWxkOwpAQCAtNDEyLDYgKzQyOSw4IEBACiAgICAgICogCiAgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSB0byBtZWFzdXJlIGNoaWxkcmVuIHdpdGggYSB3ZWlnaHQgdXNpbmcgdGhlCiAgICAgICogICAgICAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjaGlsZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjTGluZWFyTGF5b3V0X21lYXN1cmVXaXRoTGFyZ2VzdENoaWxkCiAgICAgICovCiAgICAgQGFuZHJvaWQudmlldy5SZW1vdGFibGVWaWV3TWV0aG9kCiAgICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbGF0aXZlTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YQppbmRleCBlNGI4ZjM0Li4yOWNmMDAwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YQpAQCAtMjE5LDYgKzIxOSwyMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGNoaWxkIHZpZXdzIGFyZSBwb3NpdGlvbmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ3Jhdml0eS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEdyYXZpdHkoaW50KQorICAgICAqIEBzZWUgYW5kcm9pZC52aWV3LkdyYXZpdHkKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1JlbGF0aXZlTGF5b3V0X2dyYXZpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEdyYXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtR3Jhdml0eTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEZXNjcmliZXMgaG93IHRoZSBjaGlsZCB2aWV3cyBhcmUgcG9zaXRpb25lZC4gRGVmYXVsdHMgdG8KICAgICAgKiA8Y29kZT5HcmF2aXR5LkxFRlQgfCBHcmF2aXR5LlRPUDwvY29kZT4uCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJsZUxheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlTGF5b3V0LmphdmEKaW5kZXggYjg3MGNlZS4uNjMzMWI2ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlTGF5b3V0LmphdmEKQEAgLTIzMiw2ICsyMzIsOCBAQAogICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIGFsbCBjb2x1bW5zIGFyZSBzaHJpbmthYmxlIG9yIG5vdC48L3A+CiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGNvbHVtbnMgYXJlIHNocmlua2FibGUsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGFibGVMYXlvdXRfc2hyaW5rQ29sdW1ucwogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2hyaW5rQWxsQ29sdW1ucygpIHsKICAgICAgICAgcmV0dXJuIG1TaHJpbmtBbGxDb2x1bW5zOwpAQCAtMjUyLDYgKzI1NCw4IEBACiAgICAgICogPHA+SW5kaWNhdGVzIHdoZXRoZXIgYWxsIGNvbHVtbnMgYXJlIHN0cmV0Y2hhYmxlIG9yIG5vdC48L3A+CiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGNvbHVtbnMgYXJlIHN0cmV0Y2hhYmxlLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RhYmxlTGF5b3V0X3N0cmV0Y2hDb2x1bW5zCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdHJldGNoQWxsQ29sdW1ucygpIHsKICAgICAgICAgcmV0dXJuIG1TdHJldGNoQWxsQ29sdW1uczsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmNwcAppbmRleCAwODgwNjJhLi42NTVhODM0IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuY3BwCkBAIC0xNjIsMTIgKzE2MiwxMiBAQAogaW50MzJfdCBBSW5wdXRRdWV1ZTo6Z2V0RXZlbnQoQUlucHV0RXZlbnQqKiBvdXRFdmVudCkgewogICAgICpvdXRFdmVudCA9IE5VTEw7CiAKLSAgICBib29sIGZpbmlzaE5vdyA9IGZhbHNlOwotCiAgICAgY2hhciBieXRlcmVhZDsKICAgICBzc2l6ZV90IG5SZWFkID0gcmVhZChtRGlzcGF0Y2hLZXlSZWFkLCAmYnl0ZXJlYWQsIDEpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIGlmIChuUmVhZCA9PSAxKSB7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgaWYgKG1EaXNwYXRjaGluZ0tleXMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgS2V5RXZlbnQqIGtldmVudCA9IG1EaXNwYXRjaGluZ0tleXNbMF07CiAgICAgICAgICAgICAqb3V0RXZlbnQgPSBrZXZlbnQ7CkBAIC0xNzgsNiArMTc4LDggQEAKICAgICAgICAgICAgIGluZmxpZ2h0LmZpbmlzaFNlcSA9IDA7CiAgICAgICAgICAgICBtSW5GbGlnaHRFdmVudHMucHVzaChpbmZsaWdodCk7CiAgICAgICAgIH0KKworICAgICAgICBib29sIGZpbmlzaE5vdyA9IGZhbHNlOwogICAgICAgICBpZiAobUZpbmlzaFByZURpc3BhdGNoZXMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgZmluaXNoX3ByZV9kaXNwYXRjaCBmaW5pc2gobUZpbmlzaFByZURpc3BhdGNoZXNbMF0pOwogICAgICAgICAgICAgbUZpbmlzaFByZURpc3BhdGNoZXMucmVtb3ZlQXQoMCk7CkBAIC0xOTMsNyArMTk1LDYgQEAKICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RXZlbnQgY291bGRuJ3QgZmluZCBpbmZsaWdodCBmb3Igc2VxICVkIiwgZmluaXNoLnNlcSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICAgICAgaWYgKGZpbmlzaE5vdykgewogICAgICAgICAgICAgZmluaXNoRXZlbnQoKm91dEV2ZW50LCB0cnVlLCBmYWxzZSk7CkBAIC0yMDYsNyArMjA3LDggQEAKIAogICAgIHVpbnQzMl90IGNvbnN1bWVyU2VxOwogICAgIElucHV0RXZlbnQqIG15RXZlbnQgPSBOVUxMOwotICAgIHN0YXR1c190IHJlcyA9IG1Db25zdW1lci5jb25zdW1lKHRoaXMsIHRydWUgLypjb25zdW1lQmF0Y2hlcyovLCAmY29uc3VtZXJTZXEsICZteUV2ZW50KTsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXIuY29uc3VtZSgmbVBvb2xlZElucHV0RXZlbnRGYWN0b3J5LCB0cnVlIC8qY29uc3VtZUJhdGNoZXMqLywKKyAgICAgICAgICAgICZjb25zdW1lclNlcSwgJm15RXZlbnQpOwogICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKICAgICAgICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpXT1VMRF9CTE9DSykgewogICAgICAgICAgICAgQUxPR1coImNoYW5uZWwgJyVzJyB+IEZhaWxlZCB0byBjb25zdW1lIGlucHV0IGV2ZW50LiAgc3RhdHVzPSVkIiwKQEAgLTIxNSw2ICsyMTcsMTAgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIGlmIChtQ29uc3VtZXIuaGFzRGVmZXJyZWRFdmVudCgpKSB7CisgICAgICAgIHdha2V1cERpc3BhdGNoTG9ja2VkKCk7CisgICAgfQorCiAgICAgaW5fZmxpZ2h0X2V2ZW50IGluZmxpZ2h0OwogICAgIGluZmxpZ2h0LmV2ZW50ID0gbXlFdmVudDsKICAgICBpbmZsaWdodC5zZXEgPSAtMTsKQEAgLTI1NSw3ICsyNjEsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbUxvY2subG9jaygpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICBjb25zdCBzaXplX3QgTiA9IG1JbkZsaWdodEV2ZW50cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewogICAgICAgICBjb25zdCBpbl9mbGlnaHRfZXZlbnQmIGluZmxpZ2h0KG1JbkZsaWdodEV2ZW50c1tpXSk7CkBAIC0yNjcsMTExICsyNzQsODIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3VtZXIuZ2V0Q2hhbm5lbCgpLT5nZXROYW1lKCkuc3RyaW5nKCksIHJlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PElucHV0RXZlbnQqPihldmVudCktPmdldFR5cGUoKSA9PSBBSU5QVVRfRVZFTlRfVFlQRV9LRVkpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxLZXlFdmVudHMucHVzaChzdGF0aWNfY2FzdDxLZXlFdmVudCo+KGV2ZW50KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1BdmFpbE1vdGlvbkV2ZW50cy5wdXNoKHN0YXRpY19jYXN0PE1vdGlvbkV2ZW50Kj4oZXZlbnQpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeS5yZWN5Y2xlKHN0YXRpY19jYXN0PElucHV0RXZlbnQqPihldmVudCkpOwogICAgICAgICAgICAgbUluRmxpZ2h0RXZlbnRzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgCisKICAgICBBTE9HVygiZmluaXNoRXZlbnQgY2FsbGVkIGZvciB1bmtub3duIGV2ZW50OiAlcCIsIGV2ZW50KTsKIH0KIAogdm9pZCBBSW5wdXRRdWV1ZTo6ZGlzcGF0Y2hFdmVudChhbmRyb2lkOjpLZXlFdmVudCogZXZlbnQpIHsKLSAgICBtTG9jay5sb2NrKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIExPR19UUkFDRSgiZGlzcGF0Y2hFdmVudDogZGlzcGF0Y2hpbmc9JWQgd3JpdGU9JWRcbiIsIG1EaXNwYXRjaGluZ0tleXMuc2l6ZSgpLAogICAgICAgICAgICAgbURpc3BhdGNoS2V5V3JpdGUpOwogICAgIG1EaXNwYXRjaGluZ0tleXMuYWRkKGV2ZW50KTsKLSAgICB3YWtldXBEaXNwYXRjaCgpOwotICAgIG1Mb2NrLnVubG9jaygpOworICAgIHdha2V1cERpc3BhdGNoTG9ja2VkKCk7CiB9CiAKIHZvaWQgQUlucHV0UXVldWU6OmZpbmlzaFByZURpc3BhdGNoKGludCBzZXEsIGJvb2wgaGFuZGxlZCkgewotICAgIG1Mb2NrLmxvY2soKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgTE9HX1RSQUNFKCJmaW5pc2hQcmVEaXNwYXRjaDogc2VxPSVkIGhhbmRsZWQ9JWRcbiIsIHNlcSwgaGFuZGxlZCA/IDEgOiAwKTsKICAgICBmaW5pc2hfcHJlX2Rpc3BhdGNoIGZpbmlzaDsKICAgICBmaW5pc2guc2VxID0gc2VxOwogICAgIGZpbmlzaC5oYW5kbGVkID0gaGFuZGxlZDsKICAgICBtRmluaXNoUHJlRGlzcGF0Y2hlcy5hZGQoZmluaXNoKTsKLSAgICB3YWtldXBEaXNwYXRjaCgpOwotICAgIG1Mb2NrLnVubG9jaygpOworICAgIHdha2V1cERpc3BhdGNoTG9ja2VkKCk7CiB9CiAKIEtleUV2ZW50KiBBSW5wdXRRdWV1ZTo6Y29uc3VtZVVuaGFuZGxlZEV2ZW50KCkgewotICAgIEtleUV2ZW50KiBldmVudCA9IE5VTEw7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIG1Mb2NrLmxvY2soKTsKKyAgICBLZXlFdmVudCogZXZlbnQgPSBOVUxMOwogICAgIGlmIChtVW5oYW5kbGVkS2V5cy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGV2ZW50ID0gbVVuaGFuZGxlZEtleXNbMF07CiAgICAgICAgIG1VbmhhbmRsZWRLZXlzLnJlbW92ZUF0KDApOwogICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKIAogICAgIExPR19UUkFDRSgiY29uc3VtZVVuaGFuZGxlZEV2ZW50OiBLZXlFdmVudD0lcCIsIGV2ZW50KTsKLQogICAgIHJldHVybiBldmVudDsKIH0KIAogS2V5RXZlbnQqIEFJbnB1dFF1ZXVlOjpjb25zdW1lUHJlRGlzcGF0Y2hpbmdFdmVudChpbnQqIG91dFNlcSkgewotICAgIEtleUV2ZW50KiBldmVudCA9IE5VTEw7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIG1Mb2NrLmxvY2soKTsKKyAgICBLZXlFdmVudCogZXZlbnQgPSBOVUxMOwogICAgIGlmIChtUHJlRGlzcGF0Y2hpbmdLZXlzLnNpemUoKSA+IDApIHsKICAgICAgICAgY29uc3QgaW5fZmxpZ2h0X2V2ZW50JiBpbmZsaWdodChtUHJlRGlzcGF0Y2hpbmdLZXlzWzBdKTsKICAgICAgICAgZXZlbnQgPSBzdGF0aWNfY2FzdDxLZXlFdmVudCo+KGluZmxpZ2h0LmV2ZW50KTsKICAgICAgICAgKm91dFNlcSA9IGluZmxpZ2h0LnNlcTsKICAgICAgICAgbVByZURpc3BhdGNoaW5nS2V5cy5yZW1vdmVBdCgwKTsKICAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICBMT0dfVFJBQ0UoImNvbnN1bWVQcmVEaXNwYXRjaGluZ0V2ZW50OiBLZXlFdmVudD0lcCIsIGV2ZW50KTsKLQogICAgIHJldHVybiBldmVudDsKIH0KIAogS2V5RXZlbnQqIEFJbnB1dFF1ZXVlOjpjcmVhdGVLZXlFdmVudCgpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgS2V5RXZlbnQqIGV2ZW50OwotICAgIGlmIChtQXZhaWxLZXlFdmVudHMuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgZXZlbnQgPSBuZXcgS2V5RXZlbnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBldmVudCA9IG1BdmFpbEtleUV2ZW50cy50b3AoKTsKLSAgICAgICAgbUF2YWlsS2V5RXZlbnRzLnBvcCgpOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gZXZlbnQ7Ci19CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotTW90aW9uRXZlbnQqIEFJbnB1dFF1ZXVlOjpjcmVhdGVNb3Rpb25FdmVudCgpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgTW90aW9uRXZlbnQqIGV2ZW50OwotICAgIGlmIChtQXZhaWxNb3Rpb25FdmVudHMuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgZXZlbnQgPSBuZXcgTW90aW9uRXZlbnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBldmVudCA9IG1BdmFpbE1vdGlvbkV2ZW50cy50b3AoKTsKLSAgICAgICAgbUF2YWlsTW90aW9uRXZlbnRzLnBvcCgpOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gZXZlbnQ7CisgICAgcmV0dXJuIG1Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeS5jcmVhdGVLZXlFdmVudCgpOwogfQogCiB2b2lkIEFJbnB1dFF1ZXVlOjpkb1VuaGFuZGxlZEtleShLZXlFdmVudCoga2V5RXZlbnQpIHsKLSAgICBtTG9jay5sb2NrKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIExPR19UUkFDRSgiVW5oYW5kbGVkIGtleTogcGVuZGluZz0lZCB3cml0ZT0lZFxuIiwgbVVuaGFuZGxlZEtleXMuc2l6ZSgpLCBtV29ya1dyaXRlKTsKICAgICBpZiAobVVuaGFuZGxlZEtleXMuc2l6ZSgpIDw9IDAgJiYgbVdvcmtXcml0ZSA+PSAwKSB7CiAgICAgICAgIHdyaXRlX3dvcmsobVdvcmtXcml0ZSwgQ01EX0RFRl9LRVkpOwogICAgIH0KICAgICBtVW5oYW5kbGVkS2V5cy5hZGQoa2V5RXZlbnQpOwotICAgIG1Mb2NrLnVubG9jaygpOwogfQogCiBib29sIEFJbnB1dFF1ZXVlOjpwcmVEaXNwYXRjaEtleShLZXlFdmVudCoga2V5RXZlbnQpIHsKLSAgICBtTG9jay5sb2NrKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgIExPR19UUkFDRSgicHJlRGlzcGF0Y2gga2V5OiBwZW5kaW5nPSVkIHdyaXRlPSVkXG4iLCBtUHJlRGlzcGF0Y2hpbmdLZXlzLnNpemUoKSwgbVdvcmtXcml0ZSk7CiAgICAgY29uc3Qgc2l6ZV90IE4gPSBtSW5GbGlnaHRFdmVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKQEAgLTM4MCw3ICszNTgsNiBAQAogICAgICAgICAgICAgaWYgKGluZmxpZ2h0LnNlcSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBoYXMgYWxyZWFkeSBiZWVuIHByZS1kaXNwYXRjaGVkIQogICAgICAgICAgICAgICAgIExPR19UUkFDRSgiRXZlbnQgYWxyZWFkeSBwcmUtZGlzcGF0Y2hlZCEiKTsKLSAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU2VxKys7CkBAIC0zOTEsNyArMzY4LDYgQEAKICAgICAgICAgICAgICAgICB3cml0ZV93b3JrKG1Xb3JrV3JpdGUsIENNRF9ERUZfS0VZKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QcmVEaXNwYXRjaGluZ0tleXMuYWRkKGluZmxpZ2h0KTsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC00MDAsNyArMzc2LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQUlucHV0UXVldWU6Ondha2V1cERpc3BhdGNoKCkgewordm9pZCBBSW5wdXRRdWV1ZTo6d2FrZXVwRGlzcGF0Y2hMb2NrZWQoKSB7CiByZXN0YXJ0OgogICAgIGNoYXIgZHVtbXkgPSAwOwogICAgIGludCByZXMgPSB3cml0ZShtRGlzcGF0Y2hLZXlXcml0ZSwgJmR1bW15LCBzaXplb2YoZHVtbXkpKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfaGFyZHdhcmVfQ2FtZXJhLmNwcAppbmRleCA1OTkyMTFlLi4wYzY2Yjg2IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX2hhcmR3YXJlX0NhbWVyYS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9oYXJkd2FyZV9DYW1lcmEuY3BwCkBAIC01NDUsMTIgKzU0NSwyMiBAQAogICAgIHNwPENhbWVyYT4gY2FtZXJhID0gZ2V0X25hdGl2ZV9jYW1lcmEoZW52LCB0aGl6LCBOVUxMKTsKICAgICBpZiAoY2FtZXJhID09IDApIHJldHVybjsKIAotICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZSA9IE5VTEw7CisgICAgc3A8QnVmZmVyUXVldWU+IGJ1ZmZlclF1ZXVlID0gTlVMTDsKICAgICBpZiAoalN1cmZhY2VUZXh0dXJlICE9IE5VTEwpIHsKLSAgICAgICAgc3VyZmFjZVRleHR1cmUgPSByZWludGVycHJldF9jYXN0PFN1cmZhY2VUZXh0dXJlKj4oZW52LT5HZXRJbnRGaWVsZCgKKyAgICAgICAgc3A8U3VyZmFjZVRleHR1cmU+IHN1cmZhY2VUZXh0dXJlID0gcmVpbnRlcnByZXRfY2FzdDxTdXJmYWNlVGV4dHVyZSo+KGVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgalN1cmZhY2VUZXh0dXJlLCBmaWVsZHMuc3VyZmFjZVRleHR1cmUpKTsKKyAgICAgICAgaWYgKHN1cmZhY2VUZXh0dXJlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZmZlclF1ZXVlID0gc3VyZmFjZVRleHR1cmUtPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgIlN1cmZhY2VUZXh0dXJlIGFscmVhZHkgcmVsZWFzZWQgaW4gc2V0UHJldmlld1RleHR1cmUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgfQotICAgIGlmIChjYW1lcmEtPnNldFByZXZpZXdUZXh0dXJlKHN1cmZhY2VUZXh0dXJlKSAhPSBOT19FUlJPUikgeworCisgICAgaWYgKGNhbWVyYS0+c2V0UHJldmlld1RleHR1cmUoYnVmZmVyUXVldWUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvaW8vSU9FeGNlcHRpb24iLAogICAgICAgICAgICAgICAgICJzZXRQcmV2aWV3VGV4dHVyZSBmYWlsZWQiKTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmQuY3BwCmluZGV4IGIzNGRiY2UuLjc5ODRiOWMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmQuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAjZGVmaW5lIEFVRElPUkVDT1JEX0VSUk9SX1NFVFVQX05BVElWRUlOSVRGQUlMRUQgICAgLTIwCiAKIGppbnQgYW5kcm9pZF9tZWRpYV90cmFuc2xhdGVSZWNvcmRlckVycm9yQ29kZShpbnQgY29kZSkgewotICAgIHN3aXRjaChjb2RlKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgY2FzZSBOT19FUlJPUjoKICAgICAgICAgcmV0dXJuIEFVRElPUkVDT1JEX1NVQ0NFU1M7CiAgICAgY2FzZSBCQURfVkFMVUU6CkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgIHJldHVybiBBVURJT1JFQ09SRF9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gQVVESU9SRUNPUkRfRVJST1I7Ci0gICAgfSAgIAorICAgIH0KIH0KIAogCkBAIC05MCwxNCArOTAsMTQgQEAKICAgICBpZiAoZXZlbnQgPT0gQXVkaW9SZWNvcmQ6OkVWRU5UX01PUkVfREFUQSkgewogICAgICAgICAvLyBzZXQgc2l6ZSB0byAwIHRvIHNpZ25hbCB3ZSdyZSBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHJlYWQgbW9yZSBkYXRhCiAgICAgICAgIEF1ZGlvUmVjb3JkOjpCdWZmZXIqIHBCdWZmID0gKEF1ZGlvUmVjb3JkOjpCdWZmZXIqKWluZm87Ci0gICAgICAgIHBCdWZmLT5zaXplID0gMDsgIAotICAgIAorICAgICAgICBwQnVmZi0+c2l6ZSA9IDA7CisKICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IEF1ZGlvUmVjb3JkOjpFVkVOVF9NQVJLRVIpIHsKICAgICAgICAgYXVkaW9yZWNvcmRfY2FsbGJhY2tfY29va2llICpjYWxsYmFja0luZm8gPSAoYXVkaW9yZWNvcmRfY2FsbGJhY2tfY29va2llICopdXNlcjsKICAgICAgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CiAgICAgICAgIGlmICh1c2VyICYmIGVudikgewogICAgICAgICAgICAgZW52LT5DYWxsU3RhdGljVm9pZE1ldGhvZCgKLSAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8tPmF1ZGlvUmVjb3JkX2NsYXNzLCAKKyAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8tPmF1ZGlvUmVjb3JkX2NsYXNzLAogICAgICAgICAgICAgICAgIGphdmFBdWRpb1JlY29yZEZpZWxkcy5wb3N0TmF0aXZlRXZlbnRJbkphdmEsCiAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT5hdWRpb1JlY29yZF9yZWYsIGV2ZW50LCAwLDAsIE5VTEwpOwogICAgICAgICAgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewpAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwogICAgICAgICBpZiAodXNlciAmJiBlbnYpIHsKICAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT5hdWRpb1JlY29yZF9jbGFzcywgCisgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT5hdWRpb1JlY29yZF9jbGFzcywKICAgICAgICAgICAgICAgICBqYXZhQXVkaW9SZWNvcmRGaWVsZHMucG9zdE5hdGl2ZUV2ZW50SW5KYXZhLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby0+YXVkaW9SZWNvcmRfcmVmLCBldmVudCwgMCwwLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBwb3Bjb3VudChjaGFubmVscyk7CiAKICAgICAvLyBjb21wYXJlIHRoZSBmb3JtYXQgYWdhaW5zdCB0aGUgSmF2YSBjb25zdGFudHMKLSAgICBpZiAoKGF1ZGlvRm9ybWF0ICE9IGphdmFBdWRpb1JlY29yZEZpZWxkcy5QQ00xNikgCisgICAgaWYgKChhdWRpb0Zvcm1hdCAhPSBqYXZhQXVkaW9SZWNvcmRGaWVsZHMuUENNMTYpCiAgICAgICAgICYmIChhdWRpb0Zvcm1hdCAhPSBqYXZhQXVkaW9SZWNvcmRGaWVsZHMuUENNOCkpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNyZWF0aW5nIEF1ZGlvUmVjb3JkOiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQuIik7CiAgICAgICAgIHJldHVybiBBVURJT1JFQ09SRF9FUlJPUl9TRVRVUF9JTlZBTElERk9STUFUOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgfQogICAgIGludCBmcmFtZVNpemUgPSBuYkNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGU7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBidWZmU2l6ZUluQnl0ZXMgLyBmcmFtZVNpemU7Ci0gICAgCisKICAgICBpZiAodWludDMyX3Qoc291cmNlKSA+PSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvciBjcmVhdGluZyBBdWRpb1JlY29yZDogdW5rbm93biBzb3VyY2UuIik7CiAgICAgICAgIHJldHVybiBBVURJT1JFQ09SRF9FUlJPUl9TRVRVUF9JTlZBTElEU09VUkNFOwpAQCAtMTgxLDExICsxODEsMTEgQEAKIAogICAgIC8vIGNyZWF0ZSBhbiB1bmluaXRpYWxpemVkIEF1ZGlvUmVjb3JkIG9iamVjdAogICAgIGxwUmVjb3JkZXIgPSBuZXcgQXVkaW9SZWNvcmQoKTsKLSAgICAgICAgaWYobHBSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChscFJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNyZWF0aW5nIEF1ZGlvUmVjb3JkIGluc3RhbmNlLiIpOwogICAgICAgICByZXR1cm4gQVVESU9SRUNPUkRfRVJST1JfU0VUVVBfTkFUSVZFSU5JVEZBSUxFRDsKICAgICB9Ci0gICAgCisKICAgICAvLyBjcmVhdGUgdGhlIGNhbGxiYWNrIGluZm9ybWF0aW9uOgogICAgIC8vIHRoaXMgZGF0YSB3aWxsIGJlIHBhc3NlZCB3aXRoIGV2ZXJ5IEF1ZGlvUmVjb3JkIGNhbGxiYWNrCiAgICAgamNsYXNzIGNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyh0aGl6KTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgIGxwQ2FsbGJhY2tEYXRhLT5hdWRpb1JlY29yZF9jbGFzcyA9IChqY2xhc3MpZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOwogICAgIC8vIHdlIHVzZSBhIHdlYWsgcmVmZXJlbmNlIHNvIHRoZSBBdWRpb1JlY29yZCBvYmplY3QgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgogICAgIGxwQ2FsbGJhY2tEYXRhLT5hdWRpb1JlY29yZF9yZWYgPSBlbnYtPk5ld0dsb2JhbFJlZih3ZWFrX3RoaXMpOwotICAgIAorCiAgICAgbHBSZWNvcmRlci0+c2V0KChhdWRpb19zb3VyY2VfdCkgc291cmNlLAogICAgICAgICBzYW1wbGVSYXRlSW5IZXJ0eiwKICAgICAgICAgZm9ybWF0LCAgICAgICAgLy8gd29yZCBsZW5ndGgsIFBDTQpAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICAgIHRydWUsICAgICAgICAgIC8vIHRocmVhZENhbkNhbGxKYXZhKQogICAgICAgICBzZXNzaW9uSWQpOwogCi0gICAgaWYobHBSZWNvcmRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAobHBSZWNvcmRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNyZWF0aW5nIEF1ZGlvUmVjb3JkIGluc3RhbmNlOiBpbml0aWFsaXphdGlvbiBjaGVjayBmYWlsZWQuIik7CiAgICAgICAgIGdvdG8gbmF0aXZlX2luaXRfZmFpbHVyZTsKICAgICB9CkBAIC0yMjUsMTYgKzIyNSwxNiBAQAogICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoalNlc3Npb24sIG5TZXNzaW9uLCAwKTsKICAgICBuU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICAvLyBzYXZlIG91ciBuZXdseSBjcmVhdGVkIEMrKyBBdWRpb1JlY29yZCBpbiB0aGUgIm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqIiBmaWVsZCAKKyAgICAvLyBzYXZlIG91ciBuZXdseSBjcmVhdGVkIEMrKyBBdWRpb1JlY29yZCBpbiB0aGUgIm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqIiBmaWVsZAogICAgIC8vIG9mIHRoZSBKYXZhIG9iamVjdAogICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqLCAoaW50KWxwUmVjb3JkZXIpOwotICAgIAorCiAgICAgLy8gc2F2ZSBvdXIgbmV3bHkgY3JlYXRlZCBjYWxsYmFjayBpbmZvcm1hdGlvbiBpbiB0aGUgIm5hdGl2ZUNhbGxiYWNrQ29va2llIiBmaWVsZAogICAgIC8vIG9mIHRoZSBKYXZhIG9iamVjdCAoaW4gbU5hdGl2ZUNhbGxiYWNrQ29va2llKSBzbyB3ZSBjYW4gZnJlZSB0aGUgbWVtb3J5IGluIGZpbmFsaXplKCkKICAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVDYWxsYmFja0Nvb2tpZSwgKGludClscENhbGxiYWNrRGF0YSk7Ci0gICAgCisKICAgICByZXR1cm4gQVVESU9SRUNPUkRfU1VDQ0VTUzsKLSAgICAKKwogICAgIC8vIGZhaWx1cmU6CiBuYXRpdmVfaW5pdF9mYWlsdXJlOgogICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKGxwQ2FsbGJhY2tEYXRhLT5hdWRpb1JlY29yZF9jbGFzcyk7CkBAIC0yNDYsNyArMjQ2LDcgQEAKIAogICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqLCAwKTsKICAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVDYWxsYmFja0Nvb2tpZSwgMCk7Ci0gICAgCisKICAgICByZXR1cm4gQVVESU9SRUNPUkRfRVJST1JfU0VUVVBfTkFUSVZFSU5JVEZBSUxFRDsKIH0KIApAQCAtMjU2LDEzICsyNTYsMTMgQEAKIHN0YXRpYyBpbnQKIGFuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmRfc3RhcnQoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKIHsKLSAgICBBdWRpb1JlY29yZCAqbHBSZWNvcmRlciA9IAorICAgIEF1ZGlvUmVjb3JkICpscFJlY29yZGVyID0KICAgICAgICAgICAgIChBdWRpb1JlY29yZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqKTsKICAgICBpZiAobHBSZWNvcmRlciA9PSBOVUxMICkgewogICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgTlVMTCk7CiAgICAgICAgIHJldHVybiBBVURJT1JFQ09SRF9FUlJPUjsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gYW5kcm9pZF9tZWRpYV90cmFuc2xhdGVSZWNvcmRlckVycm9yQ29kZShscFJlY29yZGVyLT5zdGFydCgpKTsKIH0KIApAQCAtMjcxLDcgKzI3MSw3IEBACiBzdGF0aWMgdm9pZAogYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZF9zdG9wKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCiB7Ci0gICAgQXVkaW9SZWNvcmQgKmxwUmVjb3JkZXIgPSAKKyAgICBBdWRpb1JlY29yZCAqbHBSZWNvcmRlciA9CiAgICAgICAgICAgICAoQXVkaW9SZWNvcmQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaik7CiAgICAgaWYgKGxwUmVjb3JkZXIgPT0gTlVMTCApIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIE5VTEwpOwpAQCAtMjg4LDcgKzI4OCw3IEBACiAKICAgICAvLyBzZXJpYWxpemUgYWNjZXNzLiBVZ2x5LCBidXQgZnVuY3Rpb25hbC4KICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmc0xvY2spOwotICAgIEF1ZGlvUmVjb3JkICpscFJlY29yZGVyID0gCisgICAgQXVkaW9SZWNvcmQgKmxwUmVjb3JkZXIgPQogICAgICAgICAgICAgKEF1ZGlvUmVjb3JkICopZW52LT5HZXRJbnRGaWVsZCh0aGl6LCBqYXZhQXVkaW9SZWNvcmRGaWVsZHMubmF0aXZlUmVjb3JkZXJJbkphdmFPYmopOwogICAgIGF1ZGlvcmVjb3JkX2NhbGxiYWNrX2Nvb2tpZSAqbHBDb29raWUgPSAoYXVkaW9yZWNvcmRfY2FsbGJhY2tfY29va2llICopZW52LT5HZXRJbnRGaWVsZCgKICAgICAgICAgdGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZUNhbGxiYWNrQ29va2llKTsKQEAgLTMwNCw3ICszMDQsNyBAQAogICAgICAgICBscFJlY29yZGVyLT5zdG9wKCk7CiAgICAgICAgIGRlbGV0ZSBscFJlY29yZGVyOwogICAgIH0KLSAgICAKKwogICAgIC8vIGRlbGV0ZSB0aGUgY2FsbGJhY2sgaW5mb3JtYXRpb24KICAgICBpZiAobHBDb29raWUpIHsKICAgICAgICAgQUxPR1YoImRlbGV0aW5nIGxwQ29va2llOiAleFxuIiwgKGludClscENvb2tpZSk7CkBAIC0zMjksNyArMzI5LDcgQEAKICAgICBBdWRpb1JlY29yZCAqbHBSZWNvcmRlciA9IE5VTEw7CiAKICAgICAvLyBnZXQgdGhlIGF1ZGlvIHJlY29yZGVyIGZyb20gd2hpY2ggd2UnbGwgcmVhZCBuZXcgYXVkaW8gc2FtcGxlcwotICAgIGxwUmVjb3JkZXIgPSAKKyAgICBscFJlY29yZGVyID0KICAgICAgICAgICAgIChBdWRpb1JlY29yZCAqKWVudi0+R2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqKTsKICAgICBpZiAobHBSZWNvcmRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgQXVkaW9SZWNvcmQgb2JqZWN0LCBjYW4ndCByZWNvcmQiKTsKQEAgLTM1NSw4ICszNTUsOCBAQAogCiAgICAgLy8gcmVhZCB0aGUgbmV3IGF1ZGlvIGRhdGEgZnJvbSB0aGUgbmF0aXZlIEF1ZGlvUmVjb3JkIG9iamVjdAogICAgIHNzaXplX3QgcmVjb3JkZXJCdWZmU2l6ZSA9IGxwUmVjb3JkZXItPmZyYW1lQ291bnQoKSpscFJlY29yZGVyLT5mcmFtZVNpemUoKTsKLSAgICBzc2l6ZV90IHJlYWRTaXplID0gbHBSZWNvcmRlci0+cmVhZChyZWNvcmRCdWZmICsgb2Zmc2V0SW5CeXRlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUluQnl0ZXMgPiAoamludClyZWNvcmRlckJ1ZmZTaXplID8gCisgICAgc3NpemVfdCByZWFkU2l6ZSA9IGxwUmVjb3JkZXItPnJlYWQocmVjb3JkQnVmZiArIG9mZnNldEluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUluQnl0ZXMgPiAoamludClyZWNvcmRlckJ1ZmZTaXplID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpcmVjb3JkZXJCdWZmU2l6ZSA6IHNpemVJbkJ5dGVzICk7CiAgICAgZW52LT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamF2YUF1ZGlvRGF0YSwgcmVjb3JkQnVmZiwgMCk7CiAKQEAgLTM4MSw0MSArMzgxLDQxIEBACiAgICAgLy9BTE9HVigiRW50ZXJpbmcgYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZF9yZWFkSW5CdWZmZXIiKTsKIAogICAgIC8vIGdldCB0aGUgYXVkaW8gcmVjb3JkZXIgZnJvbSB3aGljaCB3ZSdsbCByZWFkIG5ldyBhdWRpbyBzYW1wbGVzCi0gICAgbHBSZWNvcmRlciA9IAorICAgIGxwUmVjb3JkZXIgPQogICAgICAgICAoQXVkaW9SZWNvcmQgKillbnYtPkdldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaik7Ci0gICAgaWYobHBSZWNvcmRlcj09TlVMTCkKKyAgICBpZiAobHBSZWNvcmRlcj09TlVMTCkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICAvLyBkaXJlY3QgYnVmZmVyIGFuZCBkaXJlY3QgYWNjZXNzIHN1cHBvcnRlZD8KICAgICBsb25nIGNhcGFjaXR5ID0gZW52LT5HZXREaXJlY3RCdWZmZXJDYXBhY2l0eShqQnVmZmVyKTsKLSAgICBpZihjYXBhY2l0eSA9PSAtMSkgeworICAgIGlmIChjYXBhY2l0eSA9PSAtMSkgewogICAgICAgICAvLyBidWZmZXIgZGlyZWN0IGFjY2VzcyBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIEFMT0dFKCJCdWZmZXIgZGlyZWN0IGFjY2VzcyBpcyBub3Qgc3VwcG9ydGVkLCBjYW4ndCByZWNvcmQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIC8vQUxPR1YoImNhcGFjaXR5ID0gJWxkIiwgY2FwYWNpdHkpOwogICAgIGpieXRlKiBuYXRpdmVGcm9tSmF2YUJ1ZiA9IChqYnl0ZSopIGVudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhqQnVmZmVyKTsKLSAgICBpZihuYXRpdmVGcm9tSmF2YUJ1Zj09TlVMTCkgeworICAgIGlmIChuYXRpdmVGcm9tSmF2YUJ1Zj09TlVMTCkgewogICAgICAgICBBTE9HRSgiQnVmZmVyIGRpcmVjdCBhY2Nlc3MgaXMgbm90IHN1cHBvcnRlZCwgY2FuJ3QgcmVjb3JkIik7CiAgICAgICAgIHJldHVybiAwOwotICAgIH0gCisgICAgfQogCiAgICAgLy8gcmVhZCBuZXcgZGF0YSBmcm9tIHRoZSByZWNvcmRlcgotICAgIHJldHVybiAoamludCkgbHBSZWNvcmRlci0+cmVhZChuYXRpdmVGcm9tSmF2YUJ1ZiwgCisgICAgcmV0dXJuIChqaW50KSBscFJlY29yZGVyLT5yZWFkKG5hdGl2ZUZyb21KYXZhQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA8IHNpemVJbkJ5dGVzID8gY2FwYWNpdHkgOiBzaXplSW5CeXRlcyk7CiB9CiAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3RhdGljIGppbnQgYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZF9zZXRfbWFya2VyX3BvcyhKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeiwgCitzdGF0aWMgamludCBhbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkX3NldF9tYXJrZXJfcG9zKEpOSUVudiAqZW52LCAgam9iamVjdCB0aGl6LAogICAgICAgICBqaW50IG1hcmtlclBvcykgewotICAgICAgICAgICAgCisKICAgICBBdWRpb1JlY29yZCAqbHBSZWNvcmRlciA9IChBdWRpb1JlY29yZCAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgdGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqKTsKLSAgICAgICAgICAgICAgICAKKwogICAgIGlmIChscFJlY29yZGVyKSB7Ci0gICAgICAgIHJldHVybiAKLSAgICAgICAgICAgIGFuZHJvaWRfbWVkaWFfdHJhbnNsYXRlUmVjb3JkZXJFcnJvckNvZGUoIGxwUmVjb3JkZXItPnNldE1hcmtlclBvc2l0aW9uKG1hcmtlclBvcykgKTsgICAKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhbmRyb2lkX21lZGlhX3RyYW5zbGF0ZVJlY29yZGVyRXJyb3JDb2RlKCBscFJlY29yZGVyLT5zZXRNYXJrZXJQb3NpdGlvbihtYXJrZXJQb3MpICk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIEF1ZGlvUmVjb3JkIHBvaW50ZXIgZm9yIHNldE1hcmtlclBvc2l0aW9uKCkiKTsKQEAgLTQyNiwxMSArNDI2LDExIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmRfZ2V0X21hcmtlcl9wb3MoSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXopIHsKLSAgICAKKwogICAgIEF1ZGlvUmVjb3JkICpscFJlY29yZGVyID0gKEF1ZGlvUmVjb3JkICopZW52LT5HZXRJbnRGaWVsZCgKICAgICAgICAgICAgICAgICB0aGl6LCBqYXZhQXVkaW9SZWNvcmRGaWVsZHMubmF0aXZlUmVjb3JkZXJJbkphdmFPYmopOwogICAgIHVpbnQzMl90IG1hcmtlclBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgCisKICAgICBpZiAobHBSZWNvcmRlcikgewogICAgICAgICBscFJlY29yZGVyLT5nZXRNYXJrZXJQb3NpdGlvbigmbWFya2VyUG9zKTsKICAgICAgICAgcmV0dXJuIChqaW50KW1hcmtlclBvczsKQEAgLTQ0NSwyOCArNDQ1LDI4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgamludCBhbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkX3NldF9wb3NfdXBkYXRlX3BlcmlvZChKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeiwKICAgICAgICAgamludCBwZXJpb2QpIHsKLSAgICAgICAgICAgIAorCiAgICAgQXVkaW9SZWNvcmQgKmxwUmVjb3JkZXIgPSAoQXVkaW9SZWNvcmQgKillbnYtPkdldEludEZpZWxkKAogICAgICAgICAgICAgICAgIHRoaXosIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaik7Ci0gICAgICAgICAgICAgICAgCisKICAgICBpZiAobHBSZWNvcmRlcikgewotICAgICAgICByZXR1cm4gCi0gICAgICAgICAgICBhbmRyb2lkX21lZGlhX3RyYW5zbGF0ZVJlY29yZGVyRXJyb3JDb2RlKCBscFJlY29yZGVyLT5zZXRQb3NpdGlvblVwZGF0ZVBlcmlvZChwZXJpb2QpICk7ICAgCisgICAgICAgIHJldHVybgorICAgICAgICAgICAgYW5kcm9pZF9tZWRpYV90cmFuc2xhdGVSZWNvcmRlckVycm9yQ29kZSggbHBSZWNvcmRlci0+c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QocGVyaW9kKSApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAogICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBBdWRpb1JlY29yZCBwb2ludGVyIGZvciBzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCgpIik7CiAgICAgICAgIHJldHVybiBBVURJT1JFQ09SRF9FUlJPUjsKLSAgICB9ICAgICAgICAgICAgCisgICAgfQogfQogCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmRfZ2V0X3Bvc191cGRhdGVfcGVyaW9kKEpOSUVudiAqZW52LCAgam9iamVjdCB0aGl6KSB7Ci0gICAgCisKICAgICBBdWRpb1JlY29yZCAqbHBSZWNvcmRlciA9IChBdWRpb1JlY29yZCAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgdGhpeiwgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZVJlY29yZGVySW5KYXZhT2JqKTsKICAgICB1aW50MzJfdCBwZXJpb2QgPSAwOwotICAgICAgICAgICAgICAgIAorCiAgICAgaWYgKGxwUmVjb3JkZXIpIHsKICAgICAgICAgbHBSZWNvcmRlci0+Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoJnBlcmlvZCk7CiAgICAgICAgIHJldHVybiAoamludClwZXJpb2Q7CkBAIC01MTQsNyArNTE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9BdWRpb1JlY29yZF9zZXR1cH0sCiAgICAgeyJuYXRpdmVfZmluYWxpemUiLCAgICAgICIoKVYiLCAgICAodm9pZCAqKWFuZHJvaWRfbWVkaWFfQXVkaW9SZWNvcmRfZmluYWxpemV9LAogICAgIHsibmF0aXZlX3JlbGVhc2UiLCAgICAgICAiKClWIiwgICAgKHZvaWQgKilhbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkX3JlbGVhc2V9LAotICAgIHsibmF0aXZlX3JlYWRfaW5fYnl0ZV9hcnJheSIsIAorICAgIHsibmF0aXZlX3JlYWRfaW5fYnl0ZV9hcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoW0JJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkX3JlYWRJbkJ5dGVBcnJheX0sCiAgICAgeyJuYXRpdmVfcmVhZF9pbl9zaG9ydF9hcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoW1NJSSlJIiwgKHZvaWQgKilhbmRyb2lkX21lZGlhX0F1ZGlvUmVjb3JkX3JlYWRJblNob3J0QXJyYXl9LApAQCAtNTQxLDcgKzU0MSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotZXh0ZXJuIGJvb2wgYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhKTklFbnYqIHBFbnYsIAorZXh0ZXJuIGJvb2wgYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhKTklFbnYqIHBFbnYsCiAgICAgICAgICAgICAgICAgamNsYXNzIHRoZUNsYXNzLCBjb25zdCBjaGFyKiBjbGFzc05hbWUsIGNvbnN0IGNoYXIqIGNvbnN0TmFtZSwgaW50KiBjb25zdFZhbCk7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU1MCw3ICs1NTAsNyBAQAogICAgIGphdmFBdWRpb1JlY29yZEZpZWxkcy5wb3N0TmF0aXZlRXZlbnRJbkphdmEgPSBOVUxMOwogICAgIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaiA9IE5VTEw7CiAgICAgamF2YUF1ZGlvUmVjb3JkRmllbGRzLm5hdGl2ZUNhbGxiYWNrQ29va2llID0gTlVMTDsKLSAgICAKKwogCiAgICAgLy8gR2V0IHRoZSBBdWRpb1JlY29yZCBjbGFzcwogICAgIGpjbGFzcyBhdWRpb1JlY29yZENsYXNzID0gZW52LT5GaW5kQ2xhc3Moa0NsYXNzUGF0aE5hbWUpOwpAQCAtNTY5LDcgKzU2OSw3IEBACiAKICAgICAvLyBHZXQgdGhlIHZhcmlhYmxlcwogICAgIC8vICAgIG1OYXRpdmVSZWNvcmRlckluSmF2YU9iagotICAgIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaiA9IAorICAgIGphdmFBdWRpb1JlY29yZEZpZWxkcy5uYXRpdmVSZWNvcmRlckluSmF2YU9iaiA9CiAgICAgICAgIGVudi0+R2V0RmllbGRJRChhdWRpb1JlY29yZENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgSkFWQV9OQVRJVkVSRUNPUkRFUklOSkFWQU9CSl9GSUVMRF9OQU1FLCAiSSIpOwogICAgIGlmIChqYXZhQXVkaW9SZWNvcmRGaWVsZHMubmF0aXZlUmVjb3JkZXJJbkphdmFPYmogPT0gTlVMTCkgewpAQCAtNTkyLDEzICs1OTIsMTMgQEAKICAgICAgICAgQUxPR0UoIkNhbid0IGZpbmQgJXMiLCBKQVZBX0FVRElPRk9STUFUX0NMQVNTX05BTUUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmICggIWFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoZW52LCBhdWRpb0Zvcm1hdENsYXNzLCAKLSAgICAgICAgICAgICAgICBKQVZBX0FVRElPRk9STUFUX0NMQVNTX05BTUUsIAorICAgIGlmICggIWFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoZW52LCBhdWRpb0Zvcm1hdENsYXNzLAorICAgICAgICAgICAgICAgIEpBVkFfQVVESU9GT1JNQVRfQ0xBU1NfTkFNRSwKICAgICAgICAgICAgICAgICBKQVZBX0NPTlNUX1BDTTE2X05BTUUsICYoamF2YUF1ZGlvUmVjb3JkRmllbGRzLlBDTTE2KSkKLSAgICAgICAgICAgfHwgIWFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoZW52LCBhdWRpb0Zvcm1hdENsYXNzLCAKLSAgICAgICAgICAgICAgICBKQVZBX0FVRElPRk9STUFUX0NMQVNTX05BTUUsIAorICAgICAgICAgICB8fCAhYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhlbnYsIGF1ZGlvRm9ybWF0Q2xhc3MsCisgICAgICAgICAgICAgICAgSkFWQV9BVURJT0ZPUk1BVF9DTEFTU19OQU1FLAogICAgICAgICAgICAgICAgIEpBVkFfQ09OU1RfUENNOF9OQU1FLCAmKGphdmFBdWRpb1JlY29yZEZpZWxkcy5QQ004KSkgKSB7Ci0gICAgICAgIC8vIGVycm9yIGxvZyBwZXJmb3JtZWQgaW4gZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoKSAKKyAgICAgICAgLy8gZXJyb3IgbG9nIHBlcmZvcm1lZCBpbiBnZXRJbnRDb25zdGFudEZyb21DbGFzcygpCiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0uY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKaW5kZXggZWU1ZWI3ZS4uYmZmNTk5NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAKQEAgLTI2OCw3ICsyNjgsNyBAQAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfbWVkaWFfQXVkaW9TeXN0ZW0oSk5JRW52ICplbnYpCiB7CiAgICAgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbV9lcnJvcl9jYWxsYmFjayk7Ci0gICAgCisKICAgICByZXR1cm4gQW5kcm9pZFJ1bnRpbWU6OnJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsCiAgICAgICAgICAgICAgICAga0NsYXNzUGF0aE5hbWUsIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfQXVkaW9UcmFjay5jcHAKaW5kZXggNTdmNWQzZC4uZDRlZDA2YyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2suY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogCiBqaW50IGFuZHJvaWRfbWVkaWFfdHJhbnNsYXRlRXJyb3JDb2RlKGludCBjb2RlKSB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICBjYXNlIE5PX0VSUk9SOgogICAgICAgICByZXR1cm4gQVVESU9UUkFDS19TVUNDRVNTOwogICAgIGNhc2UgQkFEX1ZBTFVFOgpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIHJldHVybiBBVURJT1RSQUNLX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBBVURJT1RSQUNLX0VSUk9SOwotICAgIH0gICAKKyAgICB9CiB9CiAKIApAQCAtMTIzLDE0ICsxMjMsMTQgQEAKICAgICBpZiAoZXZlbnQgPT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7CiAgICAgICAgIC8vIHNldCBzaXplIHRvIDAgdG8gc2lnbmFsIHdlJ3JlIG5vdCB1c2luZyB0aGUgY2FsbGJhY2sgdG8gd3JpdGUgbW9yZSBkYXRhCiAgICAgICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciogcEJ1ZmYgPSAoQXVkaW9UcmFjazo6QnVmZmVyKilpbmZvOwotICAgICAgICBwQnVmZi0+c2l6ZSA9IDA7ICAKLSAgICAKKyAgICAgICAgcEJ1ZmYtPnNpemUgPSAwOworCiAgICAgfSBlbHNlIGlmIChldmVudCA9PSBBdWRpb1RyYWNrOjpFVkVOVF9NQVJLRVIpIHsKICAgICAgICAgYXVkaW90cmFja19jYWxsYmFja19jb29raWUgKmNhbGxiYWNrSW5mbyA9IChhdWRpb3RyYWNrX2NhbGxiYWNrX2Nvb2tpZSAqKXVzZXI7CiAgICAgICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwogICAgICAgICBpZiAodXNlciAmJiBlbnYpIHsKICAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT5hdWRpb1RyYWNrX2NsYXNzLCAKKyAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8tPmF1ZGlvVHJhY2tfY2xhc3MsCiAgICAgICAgICAgICAgICAgamF2YUF1ZGlvVHJhY2tGaWVsZHMucG9zdE5hdGl2ZUV2ZW50SW5KYXZhLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby0+YXVkaW9UcmFja19yZWYsIGV2ZW50LCAwLDAsIE5VTEwpOwogICAgICAgICAgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwogICAgICAgICBpZiAodXNlciAmJiBlbnYpIHsKICAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLT5hdWRpb1RyYWNrX2NsYXNzLCAKKyAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8tPmF1ZGlvVHJhY2tfY2xhc3MsCiAgICAgICAgICAgICAgICAgamF2YUF1ZGlvVHJhY2tGaWVsZHMucG9zdE5hdGl2ZUV2ZW50SW5KYXZhLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby0+YXVkaW9UcmFja19yZWYsIGV2ZW50LCAwLDAsIE5VTEwpOwogICAgICAgICAgICAgaWYgKGVudi0+RXhjZXB0aW9uQ2hlY2soKSkgewpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgfQogCiAgICAgaW50IG5iQ2hhbm5lbHMgPSBwb3Bjb3VudChuYXRpdmVDaGFubmVsTWFzayk7Ci0gICAgCisKICAgICAvLyBjaGVjayB0aGUgc3RyZWFtIHR5cGUKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGF0U3RyZWFtVHlwZTsKICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgIC8vIGZvciB0aGUgbW9tZW50IDhiaXRQQ00gaW4gTU9ERV9TVEFUSUMgaXMgbm90IHN1cHBvcnRlZCBuYXRpdmVseSBpbiB0aGUgQXVkaW9UcmFjayBDKysgY2xhc3MKICAgICAvLyBzbyB3ZSBkZWNsYXJlIGV2ZXJ5dGhpbmcgYXMgMTZiaXRQQ00sIHRoZSA4LT4xNmJpdCBjb252ZXJzaW9uIGZvciBNT0RFX1NUQVRJQyB3aWxsIGJlIGhhbmRsZWQKICAgICAvLyBpbiBhbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2tfbmF0aXZlX3dyaXRlX2J5dGUoKQotICAgIGlmICgoYXVkaW9Gb3JtYXQgPT0gamF2YUF1ZGlvVHJhY2tGaWVsZHMuUENNOCkgCisgICAgaWYgKChhdWRpb0Zvcm1hdCA9PSBqYXZhQXVkaW9UcmFja0ZpZWxkcy5QQ004KQogICAgICAgICAmJiAobWVtb3J5TW9kZSA9PSBqYXZhQXVkaW9UcmFja0ZpZWxkcy5NT0RFX1NUQVRJQykpIHsKICAgICAgICAgQUxPR1YoImFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19uYXRpdmVfc2V0dXAoKTogcmVxdWVzdGluZyBNT0RFX1NUQVRJQyBmb3IgOGJpdCBcCiAgICAgICAgICAgICBidWZmIHNpemUgb2YgJWRieXRlcywgc3dpdGNoaW5nIHRvIDE2Yml0LCBidWZmIHNpemUgb2YgJWRieXRlcyIsCkBAIC0yMzAsOSArMjMwLDkgQEAKICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBhdWRpb0Zvcm1hdCA9PSBqYXZhQXVkaW9UcmFja0ZpZWxkcy5QQ00xNiA/CiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7CiAgICAgaW50IGZyYW1lQ291bnQgPSBidWZmU2l6ZUluQnl0ZXMgLyAobmJDaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKLSAgICAKKwogICAgIEF1ZGlvVHJhY2tKbmlTdG9yYWdlKiBscEpuaVN0b3JhZ2UgPSBuZXcgQXVkaW9UcmFja0puaVN0b3JhZ2UoKTsKLSAgICAKKwogICAgIC8vIGluaXRpYWxpemUgdGhlIGNhbGxiYWNrIGluZm9ybWF0aW9uOgogICAgIC8vIHRoaXMgZGF0YSB3aWxsIGJlIHBhc3NlZCB3aXRoIGV2ZXJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sKICAgICBqY2xhc3MgY2xhenogPSBlbnYtPkdldE9iamVjdENsYXNzKHRoaXopOwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAgICAgbHBKbmlTdG9yYWdlLT5tQ2FsbGJhY2tEYXRhLmF1ZGlvVHJhY2tfY2xhc3MgPSAoamNsYXNzKWVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKICAgICAvLyB3ZSB1c2UgYSB3ZWFrIHJlZmVyZW5jZSBzbyB0aGUgQXVkaW9UcmFjayBvYmplY3QgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgogICAgIGxwSm5pU3RvcmFnZS0+bUNhbGxiYWNrRGF0YS5hdWRpb1RyYWNrX3JlZiA9IGVudi0+TmV3R2xvYmFsUmVmKHdlYWtfdGhpcyk7Ci0gICAgCisKICAgICBscEpuaVN0b3JhZ2UtPm1TdHJlYW1UeXBlID0gYXRTdHJlYW1UeXBlOwogCiAgICAgaWYgKGpTZXNzaW9uID09IE5VTEwpIHsKQEAgLTI2OSw3ICsyNjksNyBAQAogICAgICAgICBBTE9HRSgiRXJyb3IgY3JlYXRpbmcgdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrIik7CiAgICAgICAgIGdvdG8gbmF0aXZlX3RyYWNrX2ZhaWx1cmU7CiAgICAgfQotICAgIAorCiAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbmF0aXZlIEF1ZGlvVHJhY2sgb2JqZWN0CiAgICAgaWYgKG1lbW9yeU1vZGUgPT0gamF2YUF1ZGlvVHJhY2tGaWVsZHMuTU9ERV9TVFJFQU0pIHsKIApAQCAtMjg1LDE1ICsyODUsMTUgQEAKICAgICAgICAgICAgIDAsLy8gc2hhcmVkIG1lbQogICAgICAgICAgICAgdHJ1ZSwvLyB0aHJlYWQgY2FuIGNhbGwgSmF2YQogICAgICAgICAgICAgc2Vzc2lvbklkKTsvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgICAgICAgICAKKwogICAgIH0gZWxzZSBpZiAobWVtb3J5TW9kZSA9PSBqYXZhQXVkaW9UcmFja0ZpZWxkcy5NT0RFX1NUQVRJQykgewogICAgICAgICAvLyBBdWRpb1RyYWNrIGlzIHVzaW5nIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgCisKICAgICAgICAgaWYgKCFscEpuaVN0b3JhZ2UtPmFsbG9jU2hhcmVkTWVtKGJ1ZmZTaXplSW5CeXRlcykpIHsKICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBjcmVhdGluZyBBdWRpb1RyYWNrIGluIHN0YXRpYyBtb2RlOiBlcnJvciBjcmVhdGluZyBtZW0gaGVhcCBiYXNlIik7CiAgICAgICAgICAgICBnb3RvIG5hdGl2ZV9pbml0X2ZhaWx1cmU7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgbHBUcmFjay0+c2V0KAogICAgICAgICAgICAgYXRTdHJlYW1UeXBlLC8vIHN0cmVhbSB0eXBlCiAgICAgICAgICAgICBzYW1wbGVSYXRlSW5IZXJ0eiwKQEAgLTMwMiw3ICszMDIsNyBAQAogICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgYXVkaW9DYWxsYmFjaywgJihscEpuaVN0b3JhZ2UtPm1DYWxsYmFja0RhdGEpLC8vY2FsbGJhY2ssIGNhbGxiYWNrIGRhdGEgKHVzZXIpKTsKLSAgICAgICAgICAgIDAsLy8gbm90aWZpY2F0aW9uRnJhbWVzID09IDAgc2luY2Ugbm90IHVzaW5nIEVWRU5UX01PUkVfREFUQSB0byBmZWVkIHRoZSBBdWRpb1RyYWNrIAorICAgICAgICAgICAgMCwvLyBub3RpZmljYXRpb25GcmFtZXMgPT0gMCBzaW5jZSBub3QgdXNpbmcgRVZFTlRfTU9SRV9EQVRBIHRvIGZlZWQgdGhlIEF1ZGlvVHJhY2sKICAgICAgICAgICAgIGxwSm5pU3RvcmFnZS0+bU1lbUJhc2UsLy8gc2hhcmVkIG1lbQogICAgICAgICAgICAgdHJ1ZSwvLyB0aHJlYWQgY2FuIGNhbGwgSmF2YQogICAgICAgICAgICAgc2Vzc2lvbklkKTsvLyBhdWRpbyBzZXNzaW9uIElECkBAIC0zMjMsMjEgKzMyMywyMSBAQAogICAgIGVudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoalNlc3Npb24sIG5TZXNzaW9uLCAwKTsKICAgICBuU2Vzc2lvbiA9IE5VTEw7CiAKLSAgICAvLyBzYXZlIG91ciBuZXdseSBjcmVhdGVkIEMrKyBBdWRpb1RyYWNrIGluIHRoZSAibmF0aXZlVHJhY2tJbkphdmFPYmoiIGZpZWxkIAorICAgIC8vIHNhdmUgb3VyIG5ld2x5IGNyZWF0ZWQgQysrIEF1ZGlvVHJhY2sgaW4gdGhlICJuYXRpdmVUcmFja0luSmF2YU9iaiIgZmllbGQKICAgICAvLyBvZiB0aGUgSmF2YSBvYmplY3QgKGluIG1OYXRpdmVUcmFja0luSmF2YU9iaikKICAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1RyYWNrRmllbGRzLm5hdGl2ZVRyYWNrSW5KYXZhT2JqLCAoaW50KWxwVHJhY2spOwotICAgIAorCiAgICAgLy8gc2F2ZSB0aGUgSk5JIHJlc291cmNlcyBzbyB3ZSBjYW4gZnJlZSB0aGVtIGxhdGVyCiAgICAgLy9BTE9HVigic3RvcmluZyBscEpuaVN0b3JhZ2U6ICV4XG4iLCAoaW50KWxwSm5pU3RvcmFnZSk7CiAgICAgZW52LT5TZXRJbnRGaWVsZCh0aGl6LCBqYXZhQXVkaW9UcmFja0ZpZWxkcy5qbmlEYXRhLCAoaW50KWxwSm5pU3RvcmFnZSk7CiAKICAgICByZXR1cm4gQVVESU9UUkFDS19TVUNDRVNTOwotICAgIAorCiAgICAgLy8gZmFpbHVyZXM6CiBuYXRpdmVfaW5pdF9mYWlsdXJlOgogICAgIGRlbGV0ZSBscFRyYWNrOwogICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMubmF0aXZlVHJhY2tJbkphdmFPYmosIDApOwotICAgIAorCiBuYXRpdmVfdHJhY2tfZmFpbHVyZToKICAgICBpZiAoblNlc3Npb24gIT0gTlVMTCkgewogICAgICAgICBlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGpTZXNzaW9uLCBuU2Vzc2lvbiwgMCk7CkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICBkZWxldGUgbHBKbmlTdG9yYWdlOwogICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMuam5pRGF0YSwgMCk7CiAgICAgcmV0dXJuIEFVRElPVFJBQ0tfRVJST1JfU0VUVVBfTkFUSVZFSU5JVEZBSUxFRDsKLSAgICAKKwogfQogCiAKQEAgLTQzMiw3ICs0MzIsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrX25hdGl2ZV9maW5hbGl6ZShKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeikgewogICAgIC8vQUxPR1YoImFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19uYXRpdmVfZmluYWxpemUgam9iamVjdDogJXhcbiIsIChpbnQpdGhpeik7Ci0gICAgICAgCisKICAgICAvLyBkZWxldGUgdGhlIEF1ZGlvVHJhY2sgb2JqZWN0CiAgICAgQXVkaW9UcmFjayAqbHBUcmFjayA9IChBdWRpb1RyYWNrICopZW52LT5HZXRJbnRGaWVsZCgKICAgICAgICAgdGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMubmF0aXZlVHJhY2tJbkphdmFPYmopOwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAgICAgICAgIGxwVHJhY2stPnN0b3AoKTsKICAgICAgICAgZGVsZXRlIGxwVHJhY2s7CiAgICAgfQotICAgIAorCiAgICAgLy8gZGVsZXRlIHRoZSBKTkkgZGF0YQogICAgIEF1ZGlvVHJhY2tKbmlTdG9yYWdlKiBwSm5pU3RvcmFnZSA9IChBdWRpb1RyYWNrSm5pU3RvcmFnZSAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgIHRoaXosIGphdmFBdWRpb1RyYWNrRmllbGRzLmpuaURhdGEpOwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19uYXRpdmVfcmVsZWFzZShKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeikgewotICAgICAgIAorCiAgICAgLy8gZG8gZXZlcnl0aGluZyBhIGNhbGwgdG8gZmluYWxpemUgd291bGQKICAgICBhbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2tfbmF0aXZlX2ZpbmFsaXplKGVudiwgdGhpeik7CiAgICAgLy8gKyByZXNldCB0aGUgbmF0aXZlIHJlc291cmNlcyBpbiB0aGUgSmF2YSBvYmplY3Qgc28gYW55IGF0dGVtcHQgdG8gYWNjZXNzCkBAIC00OTMsNyArNDkzLDcgQEAKICAgICAgICAgICAgIGludCBjb3VudCA9IHNpemVJbkJ5dGVzOwogICAgICAgICAgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilwVHJhY2stPnNoYXJlZEJ1ZmZlcigpLT5wb2ludGVyKCk7CiAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKnNyYyA9IChjb25zdCBpbnQ4X3QgKikoZGF0YSArIG9mZnNldEluQnl0ZXMpOwotICAgICAgICAgICAgd2hpbGUoY291bnQtLSkgeworICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKICAgICAgICAgICAgICAgICAqZHN0KysgPSAoaW50MTZfdCkoKnNyYysrXjB4ODApIDw8IDg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSB3cm90ZSAyKnNpemVJbkJ5dGVzLCB3ZSBvbmx5IHJlcG9ydCBzaXplSW5CeXRlcyBhcyB3cml0dGVuIHRvIGhpZGUKQEAgLTUxNCw3ICs1MTQsNyBAQAogICAgIEF1ZGlvVHJhY2sgKmxwVHJhY2sgPSBOVUxMOwogICAgIC8vQUxPR1YoImFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19uYXRpdmVfd3JpdGVfYnl0ZShvZmZzZXQ9JWQsIHNpemVJbkJ5dGVzPSVkKSBjYWxsZWQiLAogICAgIC8vICAgIG9mZnNldEluQnl0ZXMsIHNpemVJbkJ5dGVzKTsKLSAgICAKKwogICAgIC8vIGdldCB0aGUgYXVkaW8gdHJhY2sgdG8gbG9hZCB3aXRoIHNhbXBsZXMKICAgICBscFRyYWNrID0gKEF1ZGlvVHJhY2sgKillbnYtPkdldEludEZpZWxkKHRoaXosIGphdmFBdWRpb1RyYWNrRmllbGRzLm5hdGl2ZVRyYWNrSW5KYXZhT2JqKTsKICAgICBpZiAobHBUcmFjayA9PSBOVUxMKSB7CkBAIC01OTksNyArNTk5LDcgQEAKICAgICAgICAgICAgICAgICB0aGl6LCBqYXZhQXVkaW9UcmFja0ZpZWxkcy5uYXRpdmVUcmFja0luSmF2YU9iaik7CiAKICAgICBpZiAobHBUcmFjaykgewotICAgICAgICByZXR1cm4gKGppbnQpIGxwVHJhY2stPmdldFNhbXBsZVJhdGUoKTsgICAKKyAgICAgICAgcmV0dXJuIChqaW50KSBscFRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAiVW5hYmxlIHRvIHJldHJpZXZlIEF1ZGlvVHJhY2sgcG9pbnRlciBmb3IgZ2V0U2FtcGxlUmF0ZSgpIik7CkBAIC02MDksMTQgKzYwOSwxNCBAQAogCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19zZXRfbWFya2VyX3BvcyhKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeiwgCitzdGF0aWMgamludCBhbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2tfc2V0X21hcmtlcl9wb3MoSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXosCiAgICAgICAgIGppbnQgbWFya2VyUG9zKSB7Ci0gICAgICAgICAgICAKKwogICAgIEF1ZGlvVHJhY2sgKmxwVHJhY2sgPSAoQXVkaW9UcmFjayAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgdGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMubmF0aXZlVHJhY2tJbkphdmFPYmopOwotICAgICAgICAgICAgICAgIAorCiAgICAgaWYgKGxwVHJhY2spIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWRfbWVkaWFfdHJhbnNsYXRlRXJyb3JDb2RlKCBscFRyYWNrLT5zZXRNYXJrZXJQb3NpdGlvbihtYXJrZXJQb3MpICk7ICAgCisgICAgICAgIHJldHVybiBhbmRyb2lkX21lZGlhX3RyYW5zbGF0ZUVycm9yQ29kZSggbHBUcmFjay0+c2V0TWFya2VyUG9zaXRpb24obWFya2VyUG9zKSApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAogICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBBdWRpb1RyYWNrIHBvaW50ZXIgZm9yIHNldE1hcmtlclBvc2l0aW9uKCkiKTsKQEAgLTYyNywxMSArNjI3LDExIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19nZXRfbWFya2VyX3BvcyhKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeikgewotICAgIAorCiAgICAgQXVkaW9UcmFjayAqbHBUcmFjayA9IChBdWRpb1RyYWNrICopZW52LT5HZXRJbnRGaWVsZCgKICAgICAgICAgICAgICAgICB0aGl6LCBqYXZhQXVkaW9UcmFja0ZpZWxkcy5uYXRpdmVUcmFja0luSmF2YU9iaik7CiAgICAgdWludDMyX3QgbWFya2VyUG9zID0gMDsKLSAgICAgICAgICAgICAgICAKKwogICAgIGlmIChscFRyYWNrKSB7CiAgICAgICAgIGxwVHJhY2stPmdldE1hcmtlclBvc2l0aW9uKCZtYXJrZXJQb3MpOwogICAgICAgICByZXR1cm4gKGppbnQpbWFya2VyUG9zOwpAQCAtNjQ2LDI3ICs2NDYsMjcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19zZXRfcG9zX3VwZGF0ZV9wZXJpb2QoSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXosCiAgICAgICAgIGppbnQgcGVyaW9kKSB7Ci0gICAgICAgICAgICAKKwogICAgIEF1ZGlvVHJhY2sgKmxwVHJhY2sgPSAoQXVkaW9UcmFjayAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgdGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMubmF0aXZlVHJhY2tJbkphdmFPYmopOwotICAgICAgICAgICAgICAgIAorCiAgICAgaWYgKGxwVHJhY2spIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWRfbWVkaWFfdHJhbnNsYXRlRXJyb3JDb2RlKCBscFRyYWNrLT5zZXRQb3NpdGlvblVwZGF0ZVBlcmlvZChwZXJpb2QpICk7ICAgCisgICAgICAgIHJldHVybiBhbmRyb2lkX21lZGlhX3RyYW5zbGF0ZUVycm9yQ29kZSggbHBUcmFjay0+c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QocGVyaW9kKSApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLAogICAgICAgICAgICAgIlVuYWJsZSB0byByZXRyaWV2ZSBBdWRpb1RyYWNrIHBvaW50ZXIgZm9yIHNldFBvc2l0aW9uVXBkYXRlUGVyaW9kKCkiKTsKICAgICAgICAgcmV0dXJuIEFVRElPVFJBQ0tfRVJST1I7Ci0gICAgfSAgICAgICAgICAgIAorICAgIH0KIH0KIAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgamludCBhbmRyb2lkX21lZGlhX0F1ZGlvVHJhY2tfZ2V0X3Bvc191cGRhdGVfcGVyaW9kKEpOSUVudiAqZW52LCAgam9iamVjdCB0aGl6KSB7Ci0gICAgCisKICAgICBBdWRpb1RyYWNrICpscFRyYWNrID0gKEF1ZGlvVHJhY2sgKillbnYtPkdldEludEZpZWxkKAogICAgICAgICAgICAgICAgIHRoaXosIGphdmFBdWRpb1RyYWNrRmllbGRzLm5hdGl2ZVRyYWNrSW5KYXZhT2JqKTsKICAgICB1aW50MzJfdCBwZXJpb2QgPSAwOwotICAgICAgICAgICAgICAgIAorCiAgICAgaWYgKGxwVHJhY2spIHsKICAgICAgICAgbHBUcmFjay0+Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoJnBlcmlvZCk7CiAgICAgICAgIHJldHVybiAoamludClwZXJpb2Q7CkBAIC02NzksMTIgKzY3OSwxMiBAQAogCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19zZXRfcG9zaXRpb24oSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXosIAorc3RhdGljIGppbnQgYW5kcm9pZF9tZWRpYV9BdWRpb1RyYWNrX3NldF9wb3NpdGlvbihKTklFbnYgKmVudiwgIGpvYmplY3QgdGhpeiwKICAgICAgICAgamludCBwb3NpdGlvbikgewotICAgICAgICAgICAgCisKICAgICBBdWRpb1RyYWNrICpscFRyYWNrID0gKEF1ZGlvVHJhY2sgKillbnYtPkdldEludEZpZWxkKAogICAgICAgICAgICAgICAgIHRoaXosIGphdmFBdWRpb1RyYWNrRmllbGRzLm5hdGl2ZVRyYWNrSW5KYXZhT2JqKTsKLSAgICAgICAgICAgICAgICAKKwogICAgIGlmIChscFRyYWNrKSB7CiAgICAgICAgIHJldHVybiBhbmRyb2lkX21lZGlhX3RyYW5zbGF0ZUVycm9yQ29kZSggbHBUcmFjay0+c2V0UG9zaXRpb24ocG9zaXRpb24pICk7CiAgICAgfSBlbHNlIHsKQEAgLTY5NywxMSArNjk3LDExIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyBqaW50IGFuZHJvaWRfbWVkaWFfQXVkaW9UcmFja19nZXRfcG9zaXRpb24oSk5JRW52ICplbnYsICBqb2JqZWN0IHRoaXopIHsKLSAgICAKKwogICAgIEF1ZGlvVHJhY2sgKmxwVHJhY2sgPSAoQXVkaW9UcmFjayAqKWVudi0+R2V0SW50RmllbGQoCiAgICAgICAgICAgICAgICAgdGhpeiwgamF2YUF1ZGlvVHJhY2tGaWVsZHMubmF0aXZlVHJhY2tJbkphdmFPYmopOwogICAgIHVpbnQzMl90IHBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAKKwogICAgIGlmIChscFRyYWNrKSB7CiAgICAgICAgIGxwVHJhY2stPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CiAgICAgICAgIHJldHVybiAoamludClwb3NpdGlvbjsKQEAgLTk0NCwxMiArOTQ0LDEyIEBACiAKICAgICAvLyBHZXQgdGhlIG1lbW9yeSBtb2RlIGNvbnN0YW50cwogICAgIGlmICggIWFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoZW52LCBhdWRpb1RyYWNrQ2xhc3MsCi0gICAgICAgICAgICAgICBrQ2xhc3NQYXRoTmFtZSwgCisgICAgICAgICAgICAgICBrQ2xhc3NQYXRoTmFtZSwKICAgICAgICAgICAgICAgIEpBVkFfQ09OU1RfTU9ERV9TVEFUSUNfTkFNRSwgJihqYXZhQXVkaW9UcmFja0ZpZWxkcy5NT0RFX1NUQVRJQykpCiAgICAgICAgICB8fCAhYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhlbnYsIGF1ZGlvVHJhY2tDbGFzcywKLSAgICAgICAgICAgICAgIGtDbGFzc1BhdGhOYW1lLCAKKyAgICAgICAgICAgICAgIGtDbGFzc1BhdGhOYW1lLAogICAgICAgICAgICAgICAgSkFWQV9DT05TVF9NT0RFX1NUUkVBTV9OQU1FLCAmKGphdmFBdWRpb1RyYWNrRmllbGRzLk1PREVfU1RSRUFNKSkgKSB7Ci0gICAgICAgIC8vIGVycm9yIGxvZyBwZXJmb3JtZWQgaW4gYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcygpIAorICAgICAgICAvLyBlcnJvciBsb2cgcGVyZm9ybWVkIGluIGFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC05NjAsMTYgKzk2MCwxNiBAQAogICAgICAgICBBTE9HRSgiQ2FuJ3QgZmluZCAlcyIsIEpBVkFfQVVESU9GT1JNQVRfQ0xBU1NfTkFNRSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKCAhYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhlbnYsIGF1ZGlvRm9ybWF0Q2xhc3MsIAotICAgICAgICAgICAgICAgIEpBVkFfQVVESU9GT1JNQVRfQ0xBU1NfTkFNRSwgCisgICAgaWYgKCAhYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcyhlbnYsIGF1ZGlvRm9ybWF0Q2xhc3MsCisgICAgICAgICAgICAgICAgSkFWQV9BVURJT0ZPUk1BVF9DTEFTU19OQU1FLAogICAgICAgICAgICAgICAgIEpBVkFfQ09OU1RfUENNMTZfTkFNRSwgJihqYXZhQXVkaW9UcmFja0ZpZWxkcy5QQ00xNikpCi0gICAgICAgICAgIHx8ICFhbmRyb2lkX21lZGlhX2dldEludENvbnN0YW50RnJvbUNsYXNzKGVudiwgYXVkaW9Gb3JtYXRDbGFzcywgCi0gICAgICAgICAgICAgICAgSkFWQV9BVURJT0ZPUk1BVF9DTEFTU19OQU1FLCAKKyAgICAgICAgICAgfHwgIWFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoZW52LCBhdWRpb0Zvcm1hdENsYXNzLAorICAgICAgICAgICAgICAgIEpBVkFfQVVESU9GT1JNQVRfQ0xBU1NfTkFNRSwKICAgICAgICAgICAgICAgICBKQVZBX0NPTlNUX1BDTThfTkFNRSwgJihqYXZhQXVkaW9UcmFja0ZpZWxkcy5QQ004KSkgKSB7Ci0gICAgICAgIC8vIGVycm9yIGxvZyBwZXJmb3JtZWQgaW4gYW5kcm9pZF9tZWRpYV9nZXRJbnRDb25zdGFudEZyb21DbGFzcygpIAorICAgICAgICAvLyBlcnJvciBsb2cgcGVyZm9ybWVkIGluIGFuZHJvaWRfbWVkaWFfZ2V0SW50Q29uc3RhbnRGcm9tQ2xhc3MoKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotIAorCiAgICAgcmV0dXJuIEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCBrQ2xhc3NQYXRoTmFtZSwgZ01ldGhvZHMsIE5FTEVNKGdNZXRob2RzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfSmV0UGxheWVyLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfbWVkaWFfSmV0UGxheWVyLmNwcAppbmRleCA5ZjliZWRiLi42ZmVkYzZiIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0pldFBsYXllci5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9KZXRQbGF5ZXIuY3BwCkBAIC01Niw3ICs1Niw3IEBACiBqZXRQbGF5ZXJFdmVudENhbGxiYWNrKGludCB3aGF0LCBpbnQgYXJnMT0wLCBpbnQgYXJnMj0wLCB2b2lkKiBqYXZhVGFyZ2V0ID0gTlVMTCkKIHsKICAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBpZihlbnYpIHsKKyAgICBpZiAoZW52KSB7CiAgICAgICAgIGVudi0+Q2FsbFN0YXRpY1ZvaWRNZXRob2QoCiAgICAgICAgICAgICBqYXZhSmV0UGxheWVyRmllbGRzLmpldENsYXNzLCBqYXZhSmV0UGxheWVyRmllbGRzLnBvc3ROYXRpdmVFdmVudEluSmF2YSwKICAgICAgICAgICAgIGphdmFUYXJnZXQsCkBAIC04NCw3ICs4NCw3IEBACiAKICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IGxwSmV0LT5pbml0KCk7CiAKLSAgICBpZihyZXN1bHQ9PUVBU19TVUNDRVNTKSB7CisgICAgaWYgKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKICAgICAgICAgLy8gc2F2ZSBvdXIgbmV3bHkgY3JlYXRlZCBDKysgSmV0UGxheWVyIGluIHRoZSAibmF0aXZlUGxheWVySW5KYXZhT2JqIiBmaWVsZAogICAgICAgICAvLyBvZiB0aGUgSmF2YSBvYmplY3QgKGluIG1OYXRpdmVQbGF5ZXJJbkphdmFPYmopCiAgICAgICAgIGVudi0+U2V0SW50RmllbGQodGhpeiwgamF2YUpldFBsYXllckZpZWxkcy5uYXRpdmVQbGF5ZXJJbkphdmFPYmosIChpbnQpbHBKZXQpOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgQUxPR1YoImFuZHJvaWRfbWVkaWFfSmV0UGxheWVyX2ZpbmFsaXplKCk6IGVudGVyaW5nLiIpOwogICAgIEpldFBsYXllciAqbHBKZXQgPSAoSmV0UGxheWVyICopZW52LT5HZXRJbnRGaWVsZCgKICAgICAgICAgdGhpeiwgamF2YUpldFBsYXllckZpZWxkcy5uYXRpdmVQbGF5ZXJJbkphdmFPYmopOwotICAgIGlmKGxwSmV0ICE9IE5VTEwpIHsKKyAgICBpZiAobHBKZXQgIT0gTlVMTCkgewogICAgICAgICBscEpldC0+cmVsZWFzZSgpOwogICAgICAgICBkZWxldGUgbHBKZXQ7CiAgICAgfQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBscEpldC0+bG9hZEZyb21GaWxlKHBhdGhTdHIpOwogICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKHBhdGgsIHBhdGhTdHIpOwogCi0gICAgaWYocmVzdWx0PT1FQVNfU1VDQ0VTUykgeworICAgIGlmIChyZXN1bHQ9PUVBU19TVUNDRVNTKSB7CiAgICAgICAgIC8vQUxPR1YoImFuZHJvaWRfbWVkaWFfSmV0UGxheWVyX29wZW5GaWxlKCk6IGZpbGUgc3VjY2Vzc2Z1bGx5IG9wZW5lZCIpOwogICAgICAgICByZXR1cm4gSk5JX1RSVUU7CiAgICAgfSBlbHNlIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gbHBKZXQtPmxvYWRGcm9tRkQoam5pR2V0RkRGcm9tRmlsZURlc2NyaXB0b3IoZW52LCBmaWxlRGVzY3JpcHRvciksCiAgICAgICAgIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKWxlbmd0aCk7IC8vIGNhc3QgcGFyYW1zIHRvIHR5cGVzIHVzZWQgYnkgRUFTX0ZJTEUKIAotICAgIGlmKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICBBTE9HVigiYW5kcm9pZF9tZWRpYV9KZXRQbGF5ZXJfb3BlbkZpbGVEZXNjcigpOiBmaWxlIHN1Y2Nlc3NmdWxseSBvcGVuZWQiKTsKICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgIH0gZWxzZSB7CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICAgICAgICAgICJVbmFibGUgdG8gcmV0cmlldmUgSmV0UGxheWVyIHBvaW50ZXIgZm9yIGNsb3NlRmlsZSgpIik7CiAgICAgfQogCi0gICAgaWYoIGxwSmV0LT5jbG9zZUZpbGUoKT09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAobHBKZXQtPmNsb3NlRmlsZSgpPT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9jbG9zZUZpbGUoKTogZmlsZSBzdWNjZXNzZnVsbHkgY2xvc2VkIik7CiAgICAgICAgIHJldHVybiBKTklfVFJVRTsKICAgICB9IGVsc2UgewpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgfQogCiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBscEpldC0+cGxheSgpOwotICAgIGlmKCByZXN1bHQ9PUVBU19TVUNDRVNTKSB7CisgICAgaWYgKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKICAgICAgICAgLy9BTE9HVigiYW5kcm9pZF9tZWRpYV9KZXRQbGF5ZXJfcGxheSgpOiBwbGF5IHN1Y2Nlc3NmdWwiKTsKICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgIH0gZWxzZSB7CkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogICAgIH0KIAogICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gbHBKZXQtPnBhdXNlKCk7Ci0gICAgaWYoIHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9wYXVzZSgpOiBwYXVzZSBzdWNjZXNzZnVsIik7CiAgICAgICAgIHJldHVybiBKTklfVFJVRTsKICAgICB9IGVsc2UgewotICAgICAgICBpZihyZXN1bHQ9PUVBU19FUlJPUl9RVUVVRV9JU19FTVBUWSkgeworICAgICAgICBpZiAocmVzdWx0PT1FQVNfRVJST1JfUVVFVUVfSVNfRU1QVFkpIHsKICAgICAgICAgICAgIEFMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9wYXVzZSgpOiBwYXVzZWQgd2l0aCBhbiBlbXB0eSBxdWV1ZSIpOwogICAgICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgICAgICB9IGVsc2UKQEAgLTI3NSw3ICsyNzUsNyBAQAogCiAgICAgRUFTX1JFU1VMVCByZXN1bHQKICAgICAgICAgPSBscEpldC0+cXVldWVTZWdtZW50KHNlZ21lbnROdW0sIGxpYk51bSwgcmVwZWF0Q291bnQsIHRyYW5zcG9zZSwgbXV0ZUZsYWdzLCB1c2VySUQpOwotICAgIGlmKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9xdWV1ZVNlZ21lbnQoKTogc2VnbWVudCBzdWNjZXNzZnVsbHkgcXVldWVkIik7CiAgICAgICAgIHJldHVybiBKTklfVFJVRTsKICAgICB9IGVsc2UgewpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgRUFTX1UzMiBtdXRlTWFzaz0wOwogICAgIGludCBtYXhUcmFja3MgPSBscEpldC0+Z2V0TWF4VHJhY2tzKCk7CiAgICAgZm9yIChqaW50IHRyYWNrSW5kZXg9MDsgdHJhY2tJbmRleDxtYXhUcmFja3M7IHRyYWNrSW5kZXgrKykgewotICAgICAgICBpZihtdXRlVHJhY2tzW21heFRyYWNrcy0xLXRyYWNrSW5kZXhdPT1KTklfVFJVRSkKKyAgICAgICAgaWYgKG11dGVUcmFja3NbbWF4VHJhY2tzLTEtdHJhY2tJbmRleF09PUpOSV9UUlVFKQogICAgICAgICAgICAgbXV0ZU1hc2sgPSAobXV0ZU1hc2sgPDwgMSkgfCAweDAwMDAwMDAxOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBtdXRlTWFzayA9IG11dGVNYXNrIDw8IDE7CkBAIC0zMjEsNyArMzIxLDcgQEAKICAgICByZXN1bHQgPSBscEpldC0+cXVldWVTZWdtZW50KHNlZ21lbnROdW0sIGxpYk51bSwgcmVwZWF0Q291bnQsIHRyYW5zcG9zZSwgbXV0ZU1hc2ssIHVzZXJJRCk7CiAKICAgICBlbnYtPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhtdXRlQXJyYXksIG11dGVUcmFja3MsIDApOwotICAgIGlmKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9xdWV1ZVNlZ21lbnRNdXRlQXJyYXkoKTogc2VnbWVudCBzdWNjZXNzZnVsbHkgcXVldWVkIik7CiAgICAgICAgIHJldHVybiBKTklfVFJVRTsKICAgICB9IGVsc2UgewpAQCAtMzQ2LDcgKzM0Niw3IEBACiAKICAgICBFQVNfUkVTVUxUIHJlc3VsdDsKICAgICByZXN1bHQgPSBscEpldC0+c2V0TXV0ZUZsYWdzKG11dGVGbGFncywgYlN5bmM9PUpOSV9UUlVFID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICBpZihyZXN1bHQ9PUVBU19TVUNDRVNTKSB7CisgICAgaWYgKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKICAgICAgICAgLy9BTE9HVigiYW5kcm9pZF9tZWRpYV9KZXRQbGF5ZXJfc2V0TXV0ZUZsYWdzKCk6IG11dGUgZmxhZ3Mgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQiKTsKICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgIH0gZWxzZSB7CkBAIC0zODAsNyArMzgwLDcgQEAKICAgICBFQVNfVTMyIG11dGVNYXNrPTA7CiAgICAgaW50IG1heFRyYWNrcyA9IGxwSmV0LT5nZXRNYXhUcmFja3MoKTsKICAgICBmb3IgKGppbnQgdHJhY2tJbmRleD0wOyB0cmFja0luZGV4PG1heFRyYWNrczsgdHJhY2tJbmRleCsrKSB7Ci0gICAgICAgIGlmKG11dGVUcmFja3NbbWF4VHJhY2tzLTEtdHJhY2tJbmRleF09PUpOSV9UUlVFKQorICAgICAgICBpZiAobXV0ZVRyYWNrc1ttYXhUcmFja3MtMS10cmFja0luZGV4XT09Sk5JX1RSVUUpCiAgICAgICAgICAgICBtdXRlTWFzayA9IChtdXRlTWFzayA8PCAxKSB8IDB4MDAwMDAwMDE7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG11dGVNYXNrID0gbXV0ZU1hc2sgPDwgMTsKQEAgLTM5MCw3ICszOTAsNyBAQAogICAgIHJlc3VsdCA9IGxwSmV0LT5zZXRNdXRlRmxhZ3MobXV0ZU1hc2ssIGJTeW5jPT1KTklfVFJVRSA/IHRydWUgOiBmYWxzZSk7CiAKICAgICBlbnYtPlJlbGVhc2VCb29sZWFuQXJyYXlFbGVtZW50cyhtdXRlQXJyYXksIG11dGVUcmFja3MsIDApOwotICAgIGlmKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl9zZXRNdXRlQXJyYXkoKTogbXV0ZSBmbGFncyBzdWNjZXNzZnVsbHkgdXBkYXRlZCIpOwogICAgICAgICByZXR1cm4gSk5JX1RSVUU7CiAgICAgfSBlbHNlIHsKQEAgLTQxNiw3ICs0MTYsNyBAQAogICAgIEVBU19SRVNVTFQgcmVzdWx0OwogICAgIHJlc3VsdCA9IGxwSmV0LT5zZXRNdXRlRmxhZyh0cmFja0lkLAogICAgICAgICBtdXRlRmxhZz09Sk5JX1RSVUUgPyB0cnVlIDogZmFsc2UsIGJTeW5jPT1KTklfVFJVRSA/IHRydWUgOiBmYWxzZSk7Ci0gICAgaWYocmVzdWx0PT1FQVNfU1VDQ0VTUykgeworICAgIGlmIChyZXN1bHQ9PUVBU19TVUNDRVNTKSB7CiAgICAgICAgIC8vQUxPR1YoImFuZHJvaWRfbWVkaWFfSmV0UGxheWVyX3NldE11dGVGbGFnKCk6IG11dGUgZmxhZyBzdWNjZXNzZnVsbHkgdXBkYXRlZCBmb3IgdHJhY2sgJWQiLCB0cmFja0lkKTsKICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgIH0gZWxzZSB7CkBAIC00NDAsNyArNDQwLDcgQEAKIAogICAgIEVBU19SRVNVTFQgcmVzdWx0OwogICAgIHJlc3VsdCA9IGxwSmV0LT50cmlnZ2VyQ2xpcChjbGlwSWQpOwotICAgIGlmKHJlc3VsdD09RUFTX1NVQ0NFU1MpIHsKKyAgICBpZiAocmVzdWx0PT1FQVNfU1VDQ0VTUykgewogICAgICAgICAvL0FMT0dWKCJhbmRyb2lkX21lZGlhX0pldFBsYXllcl90cmlnZ2VyQ2xpcCgpOiB0cmlnZ2VyQ2xpcCBzdWNjZXNzZnVsIGZvciBjbGlwICVkIiwgY2xpcElkKTsKICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwogICAgIH0gZWxzZSB7CkBAIC00NjMsNyArNDYzLDcgQEAKICAgICB9CiAKICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IGxwSmV0LT5jbGVhclF1ZXVlKCk7Ci0gICAgaWYocmVzdWx0PT1FQVNfU1VDQ0VTUykgeworICAgIGlmIChyZXN1bHQ9PUVBU19TVUNDRVNTKSB7CiAgICAgICAgIC8vQUxPR1YoImFuZHJvaWRfbWVkaWFfSmV0UGxheWVyX2NsZWFyUXVldWUoKTogY2xlYXJRdWV1ZSBzdWNjZXNzZnVsIik7CiAgICAgICAgIHJldHVybiBKTklfVFJVRTsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwCmluZGV4IDMwZDRlMjAuLmNlMmNkZWUgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19TdXJmYWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5jcHAKQEAgLTI1MSw4ICsyNTEsMTYgQEAKIHN0YXRpYyB2b2lkIFN1cmZhY2VfaW5pdEZyb21TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpvYmplY3QganN0KQogewotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gc3QoU3VyZmFjZVRleHR1cmVfZ2V0U3VyZmFjZVRleHR1cmUoZW52LCBqc3QpKTsKLSAgICBzcDxTdXJmYWNlPiBzdXJmYWNlKG5ldyBTdXJmYWNlKHN0KSk7CisgICAgc3A8U3VyZmFjZVRleHR1cmU+IHN0KFN1cmZhY2VUZXh0dXJlX2dldFN1cmZhY2VUZXh0dXJlKGVudiwganN0KSk7CisKKyAgICBpZiAoc3QgPT0gTlVMTCkgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAiU3VyZmFjZVRleHR1cmUgaGFzIGFscmVhZHkgYmVlbiByZWxlYXNlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gYnEgPSBzdC0+Z2V0QnVmZmVyUXVldWUoKTsKKworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoYnEpKTsKICAgICBpZiAoc3VyZmFjZSA9PSBOVUxMKSB7CiAgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgT3V0T2ZSZXNvdXJjZXNFeGNlcHRpb24sIE5VTEwpOwogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4ZjAzZmUwLi5kMWUzNjQyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTI0OCw2ICsyNDgsMjEgQEAKICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX3dyaXRlQ29udGFjdHMiCiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfd3JpdGVDb250YWN0cyIgLz4KIAorICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBjYWxsIGxvZy4gLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxMX0xPRyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmVhZENhbGxMb2ciCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmVhZENhbGxMb2ciIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSAoYnV0IG5vdCByZWFkKSB0aGUgdXNlcidzCisgICAgICAgICBjb250YWN0cyBkYXRhLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9DQUxMX0xPRyIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfd3JpdGVDYWxsTG9nIgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3dyaXRlQ2FsbExvZyIgLz4KKwogCiAgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgdXNlcidzIHBlcnNvbmFsIHByb2ZpbGUgZGF0YS4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9QUk9GSUxFIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKaW5kZXggNDhmNDYwNi4uNDliMzFiNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJMYWF0IGRpZSBwcm9ncmFtIHRvZSBvbSBlbmlnZSBwcml2YXRlIHdvb3JkZSwgbmFtZSBlbiBmcmFzZXMgdGUgbGVlcyB3YXQgZGllIGdlYnJ1aWtlciBpbiBkaWUgZ2VicnVpa2Vyd29vcmRlYm9layBnZXN0b29yIGhldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJza3J5ZiBuYSBnZWJydWlrZXJnZWRlZmluaWVlcmRlIHdvb3JkZWJvZWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iTGFhdCBkaWUgcHJvZ3JhbSB0b2Ugb20gbnV3ZSB3b29yZGUgaW4gZGllIGdlYnJ1aWtlcndvb3JkZWJvZWsgdGUgc2tyeWYuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+InZlcmFuZGVyL3ZlZSB1aXQgVVNCLWJlcmdpbmcgc2UgaW5ob3VkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJ3eXNpZy92ZWUgdWl0IFNELWthYXJ0IHNlIGluaG91ZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJMYWF0IGRpZSBwcm9ncmFtIHRvZSBvbSBkaWUgVVNCLWdlaGV1ZSB0ZSBza3J5Zi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAppbmRleCBiMDU1NjM0Li5kMWU5MTIyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IiDhibDhjKDhiYPhiJrhi40g4Ymg4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YiK4Yur4Yqo4Yib4Ym9IOGLqOGJu+GIiOGLjeGKlSDhiJvhipXhipvhi43hiJ0g4Yuo4YyN4YiNIOGJg+GIi+GJteGNoyDhiLXhiJ7hib3hjaPhiqXhipMg4YiA4Yio4YyO4Ym9IOGIiOGIm+GKleGJoOGJpSAg4YiI4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuNIOGLreGNiOGJheGLs+GIieGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuGJoOGJsOGMoOGJg+GImiDhiaDhibDhi4jhiLDhipAg4YiY4Yud4YyI4YmgIOGJg+GIi+GJtSDhjYPhjY0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i4Ymg4Ymw4Yyg4YmD4YiaIOGImOGLneGMiOGJoCDhiYPhiIvhibUg4YuN4Yi14YylIOGKoOGLsuGItSDhiYPhiI0g4Yql4YqV4Yuy4Yy94Y2NIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i4YuoVVNCIOGIm+GKqOGIm+GJuyDhi63hi5jhibbhib3hipUg4YmA4Yut4YitL+GIsOGIreGLnSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i4YuoU0Qg4Yqr4Yit4Yu1IOGLreGLmOGJteGKleGJgOGLreGIrS/hiLDhiK3hi50iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i4YuI4YuwIFVTQiDhiJvhiIXhi7DhiKgg4Ym14YuN4Yi14Ymz4YuNIOGIiOGImOGNg+GNjSDhiIjhiJjhibDhjI3hiaDhiKrhi6vhi40g4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2hIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKaW5kZXggMTkzMTU3Yi4uODc3NTUwNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLZhNmE2LPZhdin2K0g2YTZhNiq2LfYqNmK2YIg2KjZgtix2KfYodipINij2Yog2YPZhNmF2KfYqiDZiNij2LPZhdin2KEg2YjYudio2KfYsdin2Kog2K7Yp9i12Kkg2LHYqNmF2Kcg2K7YstmG2YfYpyDYp9mE2YXYs9iq2K7Yr9mFINmB2Yog2YLYp9mF2YjYsyDYp9mE2YXYs9iq2K7Yr9mFLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItmD2KrYp9io2Kkg2KXZhNmJINin2YTZgtin2YXZiNizINin2YTZhdi52LHZkdmBINio2YjYp9iz2LfYqSDYp9mE2YXYs9iq2K7Yr9mFIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+ItmE2YTYs9mF2KfYrSDZhNmE2KrYt9io2YrZgiDYqNmD2KrYp9io2Kkg2YPZhNmF2KfYqiDYrNiv2YrYr9ipINmB2Yog2YLYp9mF2YjYsyDYp9mE2YXYs9iq2K7Yr9mFLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLYqti52K/ZitmEL9it2LDZgSDZhdit2KrZiNmK2KfYqiDZiNit2K/YqSDYqtiu2LLZitmGIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i2KrYudiv2YrZhC/Yrdiw2YEg2YXYrdiq2YjZitin2Kog2KjYt9in2YLYqSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLZhNmE2LPZhdin2K0g2YTZhNiq2LfYqNmK2YIg2KjYp9mE2YPYqtin2KjYqSDYpdmE2Ykg2YjYrdiv2Kkg2KrYrtiy2YrZhiBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKaW5kZXggYTM3ZTIzMS4uZWViZjA0ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQlNCw0LfQstCw0LvRj9C1INC/0YDRi9C60LvQsNC00LDQvdC90Y4g0YHRh9GL0YLQstCw0YbRjCDQu9GO0LHRi9GPINC/0YDRi9Cy0LDRgtC90YvRjyDRgdC70L7QstGLLCDRltC80ZHQvdGLINGWINGE0YDQsNC30YssINGP0LrRltGPINC60LDRgNGL0YHRgtCw0LvRjNC90ZbQuiDQvNC+0LbQsCDQt9Cw0YXQvtGe0LLQsNGG0Ywg0YMg0LrQsNGA0YvRgdGC0LDQu9GM0L3RltGG0LrRltC8INGB0LvQvtGe0L3RltC60YMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i0LfQsNC/0ZbRgdCw0YbRjCDRgyDQutCw0YDRi9GB0YLQsNC70YzQvdGW0YbQutGWINGB0LvQvtGe0L3RltC6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+ItCU0LDQt9Cy0LDQu9GP0LUg0L/RgNGL0LrQu9Cw0LTQsNC90L3Rj9C8INC30LDQv9GW0YHQstCw0YbRjCDQvdC+0LLRi9GPINGB0LvQvtCy0Ysg0Z4g0LrQsNGA0YvRgdGC0LDQu9GM0L3RltGG0LrRliDRgdC70L7RntC90ZbQui4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i0LfQvNGP0L3RltGG0Ywv0LLRi9C00LDQu9GW0YbRjCDQt9C80LXRgdGG0ZbQstCwIFVTQi3QvdCw0LfQsNC/0LDRiNCy0LDQu9GM0L1p0LrQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i0LfQvNGP0L3Rj9GG0Ywv0LLRi9C00LDQu9GP0YbRjCDQt9C80LXRgdGG0ZbQstCwIFNELdC60LDRgNGC0YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i0JTQsNC30LLQsNC70Y/QtSDQv9GA0YvQutC70LDQtNCw0L3Rj9C8INCy0YvQutC+0L3QstCw0YbRjCDQt9Cw0L/RltGBINCy0LAgVVNCLdC90LDQt9Cw0L/QsNGI0LLQsNC70YzQvdGW0LouIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKaW5kZXggYzI3N2VlOS4uNTgzZDIxYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjQu9C+0LbQtdC90LjQtdGC0L4g0LTQsCDRh9C10YLQtSDRh9Cw0YHRgtC90Lgg0LTRg9C80LgsINC40LzQtdC90LAg0Lgg0YTRgNCw0LfQuCwg0LrQvtC40YLQviDQv9C+0YLRgNC10LHQuNGC0LXQu9GP0YIg0LzQvtC20LUg0LTQsCDQtSDRgdGK0YXRgNCw0L3QuNC7INCyINC/0L7RgtGA0LXQsdC40YLQtdC70YHQutC40Y8g0YDQtdGH0L3QuNC6LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItC30LDQv9C40YEg0LIg0LTQtdGE0LjQvdC40YDQsNC90LjRjyDQvtGCINC/0L7RgtGA0LXQsdC40YLQtdC70Y8g0YDQtdGH0L3QuNC6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC30LDQv9C40YHQstCwINC90L7QstC4INC00YPQvNC4INCyINC/0L7RgtGA0LXQsdC40YLQtdC70YHQutC40Y8g0YDQtdGH0L3QuNC6LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLQv9GA0L7QvNGP0L3QsC/QuNC30YLRgNC40LLQsNC90LUg0L3QsCDRgdGK0LTRitGA0LbQsNC90LjQtdGC0L4g0LIgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLQv9GA0L7QvNGP0L3QsC/QuNC30YLRgNC40LLQsNC90LUg0L3QsCDRgdGK0LTRitGA0LbQsNC90LjQtdGC0L4g0L3QsCBTRCDQutCw0YDRgtCw0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjQu9C+0LbQtdC90LjQtdGC0L4g0LTQsCDQt9Cw0L/QuNGB0LLQsCDQsiBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKaW5kZXggMTg5MjI1ZS4uMzYyODhjNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtZXQgcXVlIGxcJ2FwbGljYWNpw7MgbGxlZ2VpeGkgbGVzIHBhcmF1bGVzLCBlbHMgbm9tcyBpIGxlcyBmcmFzZXMgcHJpdmF0cyBxdWUgbFwndXN1YXJpIHBvdCBoYXZlciBlbW1hZ2F0emVtYXQgYWwgc2V1IGRpY2Npb25hcmkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iZXNjcml1IGFsIGRpY2Npb25hcmkgZGVmaW5pdCBwZXIgbFwndXN1YXJpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1ldCBxdWUgbFwnYXBsaWNhY2nDsyBlc2NyaWd1aSBwYXJhdWxlcyBub3ZlcyBhbCBkaWNjaW9uYXJpIGRlIGxcJ3VzdWFyaS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyL2VzYm9ycmFyIGNvbnRpbmd1dCBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lc2JvcnJhciBjb250aW5ndXQgZGUgbGEgdGFyZ2V0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtZXQgcXVlIGxcJ2FwbGljYWNpw7MgZXNjcmlndWkgYSBsXCdlbW1hZ2F0emVtYXRnZSBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggMzg5YTY3Mi4uMmNkYTI5MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJVbW/Fvm7DrSBhcGxpa2FjaSDEjcOtc3Qgc291a3JvbcOhIHNsb3ZhLCBqbcOpbmEgYSBmcsOhemUsIGt0ZXLDoSB1xb5pdmF0ZWwgbW9obCB1bG/Fvml0IGRvIHN2w6lobyBzbG92bsOta3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iesOhcGlzIGRvIHNsb3Zuw61rdSBkZWZpbm92YW7DqWhvIHXFvml2YXRlbGVtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlVtb8W+xYh1amUgYXBsaWthY2kgemFwaXNvdmF0IG5vdsOhIHNsb3ZhIGRvIHXFvml2YXRlbHNrw6lobyBzbG92bsOta3UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IsO6cHJhdmEvbWF6w6Fuw60gb2JzYWh1IMO6bG/FvmnFoXTEmyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InptxJtuYS9zbWF6w6Fuw60gb2JzYWh1IGthcnR5IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlVtb8W+xYh1amUgYXBsaWthY2kgemFwaXNvdmF0IGRvIMO6bG/FvmnFoXTEmyBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKaW5kZXggM2NhMDUzNC4uNGY5ZjBmMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJUaWxsYWRlciwgYXQgYXBwZW4ga2FuIGzDpnNlIGFsbGUgcHJpdmF0ZSBvcmQsIG5hdm5lIG9nIHPDpnRuaW5nZXIsIHNvbSBicnVnZXJlbiBrYW4gaGF2ZSBnZW10IGkgYnJ1Z2Vyb3JkYm9nZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2tyaXZlIHRpbCBicnVnZXJvcmRib2dlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJUaWxsYWRlciwgYXQgYXBwZW4ga2FuIHNrcml2ZSBueWUgb3JkIGkgYnJ1Z2Vyb3JkYm9nZW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+InJldHRlL3NsZXR0ZSBpIFVTQi1sYWdlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4icmV0L3NsZXQgaW5kaG9sZGV0IHDDpSBTRC1rb3J0ZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iTGFkZXIgYXBwZW4gc2tyaXZlIHRpbCBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKaW5kZXggNzJhYzU1Zi4uYjA2NDI0MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJFcm3DtmdsaWNodCBkZXIgQXBwLCBhbGxlIHByaXZhdGVuIFfDtnJ0ZXIsIE5hbWVuIHVuZCBBdXNkcsO8Y2tlIHp1IGxlc2VuLCBkaWUgZWluIE51dHplciBpbiBzZWluZW0gV8O2cnRlcmJ1Y2ggZ2VzcGVpY2hlcnQgaGF0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iSW4gYmVudXR6ZXJkZWZpbmllcnRlcyBXw7ZydGVyYnVjaCBzY2hyZWliZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iRXJtw7ZnbGljaHQgZGVyIEFwcCwgZGVtIE51dHplcnfDtnJ0ZXJidWNoIG5ldWUgRWludHLDpGdlIGhpbnp1enVmw7xnZW4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iVVNCLVNwZWljaGVyaW5oYWx0IMOkbmRlcm4vbMO2c2NoZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNELUthcnRlbi1JbmhhbHQgw6RuZGVybi9sw7ZzY2hlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJFcm3DtmdsaWNodCBkZXIgQXBwLCBpbiBkZW4gVVNCLVNwZWljaGVyIHp1IHNjaHJlaWJlbiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmluZGV4IDBlNWRkMTAuLmIwNWNiZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xzr3OrM6zzr3Pic+DzrcgzrnOtM65z4nPhM65zrrPjs69IM67zq3Ovs61z4nOvSwgzr/Ovc6/zrzOrM+Ez4nOvSDOus6xzrkgz4bPgc6sz4POtc+Jzr0sIM+EzrEgzr/PgM6/zq/OsSDOvyDPh8+Bzq7Pg8+EzrfPgiDOtc69zrTOrc+HzrXPhM6xzrkgzr3OsSDOrc+HzrXOuSDOsc+Azr/OuM63zrrOtc+Nz4POtc65IM+Dz4TOvyDOu861zr7Ouc66z4wgz4fPgc6uz4PPhM63LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Is61zrPOs8+BzrHPhs6uIM+DzrUgzrvOtc6+zrnOus+MIM66zrHOuM6/z4HOuc+DzrzOrc69zr8gzrHPgM+MIM+Ezr/OvSDPh8+Bzq7Pg8+EzrciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOt869IM61z4bOsc+BzrzOv86zzq4gz4TOt869IM61zrPOs8+BzrHPhs6uIM69zq3Pic69IM67zq3Ovs61z4nOvSDPg8+Ezr8gzrvOtc6+zrnOus+MIM+Hz4HOrs+Dz4TOty4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iz4TPgc6/z4AuL860zrnOsc6zz4EuIM+AzrXPgS4gzrHPgC4gz4fPjs+BLiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Is+Ez4HOv8+Azr/PgM6/zq/Ot8+DzrcvzrTOuc6xzrPPgc6xz4bOriDPgM61z4HOuc61z4fOv868zq3Ovc+Jzr0gzrrOrM+Bz4TOsc+CIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+Is6Vz4DOuc+Ez4HOrc+AzrXOuSDPg8+EzrfOvSDOtc+GzrHPgc68zr/Os86uIM+EzrfOvSDOtc6zzrPPgc6xz4bOriDPg8+Ezr/OvSDOsc+Azr/OuM63zrrOtc+Fz4TOuc66z4wgz4fPjs+Bzr8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKaW5kZXggZTdmZjk3My4uMzgwNzhhNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkFsbG93cyB0aGUgYXBwIHRvIHJlYWQgYW55IHByaXZhdGUgd29yZHMsIG5hbWVzIGFuZCBwaHJhc2VzIHRoYXQgdGhlIHVzZXIgbWF5IGhhdmUgc3RvcmVkIGluIHRoZSB1c2VyIGRpY3Rpb25hcnkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4id3JpdGUgdG8gdXNlci1kZWZpbmVkIGRpY3Rpb25hcnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iQWxsb3dzIHRoZSBhcHAgdG8gd3JpdGUgbmV3IHdvcmRzIGludG8gdGhlIHVzZXIgZGljdGlvbmFyeS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZ5L2RlbGV0ZSBVU0Igc3RvcmFnZSBjb250ZW50cyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZ5L2RlbGV0ZSBTRCBjYXJkIGNvbnRlbnRzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkFsbG93cyB0aGUgYXBwIHRvIHdyaXRlIHRvIHRoZSBVU0Igc3RvcmFnZS4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmluZGV4IDhlMzY5NDguLmQxZGM4OWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBsZWEgY3VhbHF1aWVyIHBhbGFicmEsIG5vbWJyZSBvIGZyYXNlIGRlIGNhcsOhY3RlciBwcml2YWRvIHF1ZSBlbCB1c3VhcmlvIGhheWEgYWxtYWNlbmFkbyBlbiBzdSBkaWNjaW9uYXJpby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJhZ3JlZ2FyIGFsIGRpY2Npb25hcmlvIGRlZmluaWRvIHBvciBlbCB1c3VhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGluZ3Jlc2UgcGFsYWJyYXMgbnVldmFzIGVuIGVsIGRpY2Npb25hcmlvIGRlbCB1c3VhcmlvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJtb2RpZmljYXIgbyBlbGltaW5hciBlbCBjb250ZW5pZG8gZGVsIGFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGVsIGNvbnRlbmlkbyBkZSBsYSB0YXJqZXRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGVzY3JpYmEgZW4gZWwgYWxtYWNlbmFtaWVudG8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmluZGV4IGE0NjM4ZmEuLmMzOTYxN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gbGVhIGN1YWxxdWllciBwYWxhYnJhLCBub21icmUgbyBmcmFzZSBkZSBjYXLDoWN0ZXIgcHJpdmFkbyBxdWUgZWwgdXN1YXJpbyBoYXlhIGFsbWFjZW5hZG8gZW4gc3UgZGljY2lvbmFyaW8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iYcOxYWRpciBhbCBkaWNjaW9uYXJpbyBkZWZpbmlkbyBwb3IgZWwgdXN1YXJpbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBlc2NyaWJhIHBhbGFicmFzIG51ZXZhcyBlbiBlbCBkaWNjaW9uYXJpbyBkZSB1c3VhcmlvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJtb2RpZmljYXIvYm9ycmFyIGNvbnRlbmlkbyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Im1vZGlmaWNhci9lbGltaW5hciBjb250ZW5pZG8gZGUgbGEgdGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtaXRlIGVzY3JpYmlyIGVuIGVsIGFsbWFjZW5hbWllbnRvIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbAppbmRleCA2OTdjOGYxLi4wN2FlZjAzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlbDtWltYWxkYWIgcmFrZW5kdXNlbCBsdWdlZGEga8O1aWtpIHByaXZhYXRzZWlkIHPDtW51LCBuaW1lc2lkIGphIGZyYWFzZSwgbWlsbGUga2FzdXRhamEgdsO1aXMgc2FsdmVzdGFkYSBrYXN1dGFqYXPDtW5hc3Rpa2t1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Ikthc3V0YWphIG3DpMOkcmF0dWQgc8O1bmFzdGlra3Uga2lyanV0YW1pbmUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iVsO1aW1hbGRhYiByYWtlbmR1c2VsIGtpcmp1dGFkYSBrYXN1dGFqYXPDtW5hc3Rpa2t1IHV1c2kgc8O1bnUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQi1zZWFkbWUgc2lzdSBtdXV0bS4va3VzdHV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibXV1ZGEva3VzdHV0YSBTRC1rYWFyZGkgc2lzdSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJWw7VpbWFsZGFiIHJha2VuZHVzZWwga2lyanV0YWRhIFVTQi1tw6RsdXNlYWRtZWxlLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IGE0YTliZmYuLjk2MjAxYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i2KjZhyDYqNix2YbYp9mF2Ycg2KfYrNin2LLZhyDZhduM4oCO2K/Zh9ivINmH2LEg2q/ZiNmG2Ycg2qnZhNmF2YfYjCDZhtin2YXYjCDYudio2KfYsdiqINiu2LXZiNi124wg2LHYpyDaqdmHINqp2KfYsdio2LEg2K/YsSDZgdix2YfZhtqvINmE2LrYqiDYrtmI2K8g2LDYrtuM2LHZhyDaqdix2K/ZhyDYp9iz2Kog2KjYrtmI2KfZhtivLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ItmG2YjYtNiq2YYg2K/YsSDZgdix2YfZhtqvINmE2LrYqiDYqti52LHbjNmBINi02K/ZhyDYp9iyINiz2YjbjCDaqdin2LHYqNixIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+Itio2Ycg2KjYsdmG2KfZhdmHINin2KzYp9iy2Ycg2YXbjOKAjtiv2YfYryDYqtinINqp2YTZhdin2Kog2KzYr9uM2K8g2LHYpyDYr9ixINmB2YfYsdiz2Kog2qnYp9ix2KjYsSDYqNmG2YjbjNiz2K8uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Itin2LXZhNin2K0v2K3YsNmBINmF2K3YqtmI2KfZh9in24wg2K3Yp9mB2LjZhyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Itin2LXZhNin2K0g2qnYsdiv2YYv2K3YsNmBINmF2K3YqtmI24zYp9iqINqp2KfYsdiqIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+Itio2Ycg2KjYsdmG2KfZhdmHINin2KzYp9iy2Ycg2YXbjOKAjtiv2YfYryDYqtinINiv2LEg2K3Yp9mB2LjZhyBVU0Ig2KjZhtmI24zYs9ivLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCmluZGV4IDFiOGIxOGEuLmRmZGMzZmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iQW50YWEgc292ZWxsdWtzZW4gbHVrZWEgeWtzaXR5aXNpw6Qgc2Fub2phLCBuaW1pw6QgdGFpIGlsbWF1a3NpYSwgam9pdGEga8OkeXR0w6Rqw6Qgb24gdm9pbnV0IHRhbGxlbnRhYSBrw6R5dHTDpGrDpG4gc2FuYWtpcmphYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ia8OkeXR0w6Rqw6RuIG3DpMOkcml0dGVsZW3DpMOkbiBzYW5ha2lyamFhbiBraXJqb2l0dGFtaW5lbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJBbnRhYSBzb3ZlbGx1a3NlbiBraXJqb2l0dGFhIHV1c2lhIHNhbm9qYSBrw6R5dHTDpGrDpG4gc2FuYWtpcmphYW4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Im11b2trYWEvcG9pc3RhIFVTQi1zaXPDpGx0w7bDpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibXVva2thYS9wb2lzdGEgU0Qta29ydGluIHNpc8OkbHTDtsOkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkFudGFhIHNvdmVsbHVrc2VuIGtpcmpvaXR0YWEgVVNCLXRhbGxlbm51c3RpbGFhbi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAppbmRleCBiMTlhN2RlLi4zYWJjMWI0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBlcm1ldCDDoCBsXCdhcHBsaWNhdGlvbiBkZSBsaXJlIHRvdXMgbGVzIG1vdHMsIG5vbXMgZXQgZXhwcmVzc2lvbnMgcHJpdsOpcyBxdWUgbFwndXRpbGlzYXRldXIgYSBwdSBlbnJlZ2lzdHJlciBkYW5zIHNvbiBkaWN0aW9ubmFpcmUgcGVyc29ubmVsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImVucmVnaXN0cmVyIGRhbnMgbGUgZGljdGlvbm5haXJlIGTDqWZpbmkgcGFyIGxcJ3V0aWxpc2F0ZXVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1ldCDDoCBsXCdhcHBsaWNhdGlvbiBkXCdlbnJlZ2lzdHJlciBkZSBub3V2ZWF1eCBtb3RzIGRhbnMgbGUgZGljdGlvbm5haXJlIHBlcnNvbm5lbCBkZSBsXCd1dGlsaXNhdGV1ci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iTW9kaWZpZXIvU3VwcHJpbWVyIGNvbnRlbnUgbcOpbW9pcmUgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmllci9zdXBwcmltZXIgbGUgY29udGVudSBkZSBsYSBjYXJ0ZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtZXQgw6AgbFwnYXBwbGljYXRpb24gZGUgbW9kaWZpZXIgbGUgY29udGVudSBkZSBsYSBtw6ltb2lyZSBkZSBzdG9ja2FnZcKgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmluZGV4IGQ0YjkyMWYuLjVhY2NhOTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i4KSP4KSq4KWN4oCN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpJDgpLjgpYcg4KSo4KS/4KSc4KWAIOCktuCkrOCljeKAjeCkpuCli+Ckgiwg4KSo4KS+4KSu4KWL4KSCIOCklOCksCDgpLXgpL7gpJXgpY3gpK/gpL7gpILgpLbgpYvgpIIg4KSV4KWLIOCkquCkouCkvOCkqOClhyDgpKbgpYfgpKTgpL4g4KS54KWIIOCknOCliyDgpLjgpILgpK3gpLXgpKQ6IOCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkviDgpKbgpY3gpLXgpL7gpLDgpL4g4KSJ4KSq4KSv4KWL4KSX4KSV4KSw4KWN4KSk4KS+IOKAjeCkoeCkv+CkleCljeCktuCkqOCksOClgCDgpK7gpYfgpIIg4KS44KSC4KSX4KWN4KSw4KS54KWA4KSkIOCkleCkv+CkjyDgpJfgpI8g4KS54KWL4KSCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+IuCkieCkquCkr+Cli+Ckl+CkleCksOCljeCkpOCkvi3gpKjgpL/gpLDgpY3gpKfgpL7gpLDgpL/gpKQg4KSh4KS/4KSV4KWN4KS24KSo4KSw4KWAIOCkruClh+CkgiDgpLLgpL/gpJbgpYfgpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i4KSP4KSq4KWN4KSy4KS/4KSV4KWH4KS24KSoIOCkleCliyDgpIngpKrgpK/gpYvgpJfgpJXgpLDgpY3gpKTgpL4g4KSh4KS/4KSV4KWN4KS24KSo4KSw4KWAIOCkruClh+CkgiDgpKjgpI8g4KS24KSs4KWN4KSmIOCksuCkv+CkluCkqOClhyDgpKbgpYfgpKTgpL4g4KS54KWILiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJVU0Ig4KS44KSC4KSX4KWN4KSw4KS54KSjIOCkuOCkvuCkruCkl+CljeCksOCkv+Ckr+Cli+CkgiDgpJXgpYsg4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOClh+Ckgi/gpLngpJ/gpL7gpI/gpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIOCkleCkvuCksOCljeCkoSDgpLjgpL7gpK7gpJfgpY3gpLDgpL/gpK/gpL7gpIIg4KS44KSC4KS24KWL4KSn4KS/4KSkIOCkleCksOClh+Ckgi/gpLngpJ/gpL7gpI/gpIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i4KSP4KSq4KWN4KSy4KS/LiDgpJXgpYsgVVNCIOCkuOCkguCkl+CljeCksOCkueCkoyDgpK7gpYfgpIIg4KSy4KS/4KSW4KSo4KWHIOCkpuClh+CkpOCkviDgpLngpYguIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKaW5kZXggZmJkM2EzZC4uNjcxYmM4ZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgxI1pdGFuamUgc3ZpaCBwcml2YXRuaWggcmlqZcSNaSwgaW1lbmEgaSBpenJhemEga29qZSBqZSBrb3Jpc25payBwb2hyYW5pbyB1IGtvcmlzbmnEjWtvbSByamXEjW5pa3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4icGlzYW5qZSB1IGtvcmlzbmnEjWtpIGRlZmluaXJhbiByamXEjW5payI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgcGlzYW5qZSBub3ZpaCByaWplxI1pIHUga29yaXNuacSNa2kgcmplxI1uaWsuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Iml6bWplbmkvYnJpxaFpIHNhZHLFvmFqZSBtZW1vcmlqZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Iml6bWplbmEvYnJpc2FuamUgc2FkcsW+YWphIFNEIGthcnRpY2UiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iRG9wdcWhdGEgcGlzYW5qZSB1IFVTQiBwb2hyYW51LiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sCmluZGV4IGM2MTkwZmQuLjIwMjgwYjMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iTGVoZXTFkXbDqSB0ZXN6aSBheiBhbGthbG1hesOhcyBzesOhbcOhcmEsIGhvZ3kgb2x2YXNzYSBhIGZlbGhhc3puw6Fsw7NpIHN6w7N0w6FyYmFuIHTDoXJvbHQgc2Fqw6F0IHN6YXZha2F0LCBuZXZla2V0IMOpcyBraWZlamV6w6lzZWtldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJhIGZlbGhhc3puw6Fsw7Mgw6FsdGFsIGRlZmluacOhbHQgc3rDs3TDoXIgw61yw6FzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJMZWhldMWRdsOpIHRlc3ppIGF6IGFsa2FsbWF6w6FzIHN6w6Ftw6FyYSwgaG9neSDDumogc3phdmFrYXQgw61yam9uIGEgZmVsaGFzem7DoWzDs2kgc3rDs3TDoXJiYS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iVVNCLXTDoXIgdGFydGFsbcOhbmFrIG3Ds2Rvc8OtdMOhc2Egw6lzIHTDtnJsw6lzZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iYXogU0Qta8OhcnR5YSB0YXJ0YWxtw6FuYWsgbcOzZG9zw610w6FzYSDDqXMgdMO2cmzDqXNlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkF6IGFsa2FsbWF6w6FzIFVTQi10w6FycmEgw61yaGF0LiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmluZGV4IGQyZDRlY2UuLjA4MDdjNGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtNjMsMTAgKzYzLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJSdWFjTW1pIiBtc2dpZD0iNzgyNzg4NzQ1OTEzODMwODg4NiI+IlBlbm9sYWthbiBwYW5nZ2lsYW4geWFuZyB0aWRhayBkaWluZ2lua2FuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iQ25kTW1pIiBtc2dpZD0iMzExNjQ0NjIzNzA4MTU3NTgwOCI+IlBlbmdpcmltYW4gbm9tb3IgcGFuZ2dpbGFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iRG5kTW1pIiBtc2dpZD0iMTI2NTQ3ODkzMjQxODMzNDMzMSI+IkphbmdhbiBnYW5nZ3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9uTmV4dENhbGxPbiIgbXNnaWQ9IjQyOTQxNTQwOTE0NTc4MTkyMyI+Ik5vbW9yIHBlbmVsZXBvbiBiYXdhYW4gXCJkaWJhdGFzaVwiLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IERpYmF0YXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPbk5leHRDYWxsT2ZmIiBtc2dpZD0iMzA5MjkxODAwNjA3Nzg2NDYyNCI+Ik5vbW9yIHBlbmdndW5hIGJhd2FhbiBcImRpYmF0YXNpXCIuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogVGlkYWsgZGliYXRhc2kuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iQ0xJUkRlZmF1bHRPZmZOZXh0Q2FsbE9uIiBtc2dpZD0iNjE3OTQyNTE4Mjg1NjQxODQ2NSI+Ik5vbW9yIHBlbmVsZXBvbiBiYXdhYW4gdGlkYWsgZGliYXRhc2kuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogRGliYXRhc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9mZk5leHRDYWxsT2ZmIiBtc2dpZD0iMjU2Nzk5ODYzMzEyNDQwODU1MiI+Ik5vbW9yIHBlbmVsZXBvbiBiYXdhYW4gdGlkYWsgZGliYXRhc2kuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogVGlkYWsgZGliYXRhc2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9uTmV4dENhbGxPbiIgbXNnaWQ9IjQyOTQxNTQwOTE0NTc4MTkyMyI+Ik5vbW9yIHBlbmVsZXBvbiBkZWZhdWx0IFwiZGliYXRhc2lcIi4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBEaWJhdGFzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IkNMSVJEZWZhdWx0T25OZXh0Q2FsbE9mZiIgbXNnaWQ9IjMwOTI5MTgwMDYwNzc4NjQ2MjQiPiJOb21vciBwZW5nZ3VuYSBkZWZhdWx0IFwiZGliYXRhc2lcIi4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBUaWRhayBkaWJhdGFzaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9mZk5leHRDYWxsT24iIG1zZ2lkPSI2MTc5NDI1MTgyODU2NDE4NDY1Ij4iTm9tb3IgcGVuZWxlcG9uIGRlZmF1bHQgdGlkYWsgZGliYXRhc2kuIFBhbmdnaWxhbiBzZWxhbmp1dG55YTogRGliYXRhc2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9mZk5leHRDYWxsT2ZmIiBtc2dpZD0iMjU2Nzk5ODYzMzEyNDQwODU1MiI+Ik5vbW9yIHBlbmVsZXBvbiBkZWZhdWx0IHRpZGFrIGRpYmF0YXNpLiBQYW5nZ2lsYW4gc2VsYW5qdXRueWE6IFRpZGFrIGRpYmF0YXNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2VydmljZU5vdFByb3Zpc2lvbmVkIiBtc2dpZD0iODYxNDgzMDE4MDUwODY4NjY2NiI+IkxheWFuYW4gdGlkYWsgZGlwZXJsZW5na2FwaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJDTElSUGVybWFuZW50IiBtc2dpZD0iMzM3NzM3MTE0NTkyNjgzNTY3MSI+IkFuZGEgdGlkYWsgZGFwYXQgbWVuZ3ViYWggc2V0ZWxhbiBub21vciBwZW5lbGVwb24uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iUmVzdHJpY3RlZENoYW5nZWRUaXRsZSIgbXNnaWQ9IjU1OTIxODkzOTg5NTYxODc0OTgiPiJBa3NlcyB0ZXJiYXRhcyBiZXJ1YmFoIjwvc3RyaW5nPgpAQCAtMjIwLDcgKzIyMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldERlYnVnQXBwIiBtc2dpZD0iMzAyMjEwNzE5ODY4NjU4NDA1MiI+Im1lbmdha3RpZmthbiBkZWJ1Z2dpbmcgYXBsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0RGVidWdBcHAiIG1zZ2lkPSI0NDc0NTEyNDE2Mjk5MDEzMjU2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmdha3RpZmthbiBkZWJ1Z2dpbmcgdW50dWsgYXBsIGxhaW4uIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVuZ2d1bmFrYW4gY2FyYSBpbmkgdW50dWsgbWVudXR1cCBhcGwgbGFpbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbmZpZ3VyYXRpb24iIG1zZ2lkPSI4MjE0NDc1Nzc5NTIxMjE4Mjk1Ij4idWJhaCBzZXRlbGFuIFVJIEFuZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VDb25maWd1cmF0aW9uIiBtc2dpZD0iNDM3MjIyMzg3MzE1NDI5NjA3NiI+Ik1lbmdpemlua2FuIGFwbCBtZW5ndWJhaCBrb25maWd1cmFzaSBzYWF0IGluaSwgbWlzYWxueWEgbG9rYWwgYXRhdSB1a3VyYW4gZm9uIGtlc2VsdXJ1aGFuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZUNvbmZpZ3VyYXRpb24iIG1zZ2lkPSI0MzcyMjIzODczMTU0Mjk2MDc2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIGtvbmZpZ3VyYXNpIHNhYXQgaW5pLCBtaXNhbG55YSBsb2thbCBhdGF1IHVrdXJhbiBmb250IGtlc2VsdXJ1aGFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZW5hYmxlQ2FyTW9kZSIgbXNnaWQ9IjU2ODQ1MDQwNTgxOTI5MjEwOTgiPiJha3RpZmthbiBtb2RlIG1vYmlsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZW5hYmxlQ2FyTW9kZSIgbXNnaWQ9IjQ4NTMxODc0MjU3NTE0MTk0NjciPiJNZW5naXppbmthbiBhcGwgbWVuZ2FrdGlma2FuIG1vZGUgbW9iaWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9raWxsQmFja2dyb3VuZFByb2Nlc3NlcyIgbXNnaWQ9IjgzNzM3MTQ3NTI3OTMwNjE5NjMiPiJoZW50aWthbiBwcm9zZXMgbGF0YXIgYmVsYWthbmciPC9zdHJpbmc+CkBAIC00MzQsNyArNDM0LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldFdhbGxwYXBlciIgbXNnaWQ9IjczNzM0NDc5MjA5Nzc2MjQ3NDUiPiJNZW5naXppbmthbiBhcGwgbWVueWV0ZWwgd2FsbHBhcGVyIHNpc3RlbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldFdhbGxwYXBlckhpbnRzIiBtc2dpZD0iMzYwMDcyMTA2OTM1MzEwNjg1MSI+ImF0dXIgcGV0dW5qdWsgdWt1cmFuIHdhbGxwYXBlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldFdhbGxwYXBlckhpbnRzIiBtc2dpZD0iODIzNTc4NDM4NDIyMzczMDA5MSI+Ik1lbmdpemlua2FuIGFwbCBtZW55ZXRlbCBwZXR1bmp1ayB1a3VyYW4gd2FsbHBhcGVyIHNpc3RlbS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21hc3RlckNsZWFyIiBtc2dpZD0iMjMxNTc1MDQyMzEzOTY5NzM5NyI+InNldGVsIHVsYW5nIHNpc3RlbSBrZSBzZXRlbGFuIGJhd2FhbiBwYWJyaWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21hc3RlckNsZWFyIiBtc2dpZD0iMjMxNTc1MDQyMzEzOTY5NzM5NyI+InNldGVsIHVsYW5nIHNpc3RlbSBrZSBzZXRlbGFuIGRlZmF1bHQgcGFicmlrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbWFzdGVyQ2xlYXIiIG1zZ2lkPSIzNjY1MzgwNDkyNjMzOTEwMjI2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbnlldGVsIHVsYW5nIHNpc3RlbSBrZSBzZXRlbGFuIHBhYnJpayBzZXBlbnVobnlhLCBtZW5naGFwdXMgc2VtdWEgZGF0YSwga29uZmlndXJhc2ksIGRhbiBhcGwgeWFuZyB0ZXJwYXNhbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRUaW1lIiBtc2dpZD0iMjAyMTYxNDgyOTU5MTc3NTY0NiI+ImF0dXIgd2FrdHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRUaW1lIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxODk2MzQxNDM4MTUxMTUyODgxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIHdha3R1IHBhZGEgamFtIHRhYmxldC4iPC9zdHJpbmc+CkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBrYXRhLCBuYW1hLCBkYW4gZnJhc2EgcHJpYmFkaSBhcGEgcHVuIHlhbmcgbXVuZ2tpbiBkaXNpbXBhbiBvbGVoIHBlbmdndW5hIGRpIGthbXVzIHBlbmdndW5hLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Im1lbnVsaXMga2Uga2FtdXMgeWFuZyBkaWJ1YXQgcGVuZ2d1bmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbnVsaXMga2F0YS1rYXRhIGJhcnUga2UgZGFsYW0ga2FtdXMgcGVuZ2d1bmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+InViYWgvaGFwdXMga29udGVuIHBlbnlpbXBhbmFuIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4idWJhaC9oYXB1cyBpc2kga2FydHUgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbnVsaXMga2UgcGVueWltcGFuYW4gVVNCLiI8L3N0cmluZz4KQEAgLTY5NSwxMCArNzAzLDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Rvb19tYW55X2ZhaWxlZF9waW5fYXR0ZW1wdHNfZGlhbG9nX21lc3NhZ2UiIG1zZ2lkPSI2MjE2NjcyNzA2NTQ1Njk2OTU1Ij4iQW5kYSB0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpIHNhbGFoIG1lbmdldGlrIFBJTi4gIlxuXG4iQ29iYSBsYWdpIGRhbGFtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGRldGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjkxOTE2MTE5ODQ2MjU0NjA4MjAiPiJBbmRhIHRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkgc2FsYWggbWVuZ2dhbWJhciBwb2xhIHBlbWJ1a2Ega3VuY2kuIFNldGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gbGFnaSB1cGF5YSBnYWdhbCwgQW5kYSBha2FuIGRpbWludGEgbWVtYnVrYSBrdW5jaSB0YWJsZXQgbWVuZ2d1bmFrYW4gaW5mbyBtYXN1ayBHb29nbGUuIlxuXG4iQ29iYSBsYWdpIGRhbGFtIDx4bGlmZjpnIGlkPSJOVU1CRVJfMiI+JWQ8L3hsaWZmOmc+IGRldGlrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9nbG9naW4iIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyNTkwMjI3NTU5NzYzNzYyNzUxIj4iQW5kYSB0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpIHNhbGFoIG1lbmdnYW1iYXIgcG9sYSBwZW1idWthIGt1bmNpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGxhZ2kgdXBheWEgZ2FnYWwsIEFuZGEgYWthbiBkaW1pbnRhIG1lbWJ1a2Ega3VuY2kgcG9uc2VsIG1lbmdndW5ha2FuIGluZm8gbWFzdWsgR29vZ2xlLiJcblxuIkNvYmEgbGFnaSBkYWxhbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBkZXRpay4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfYXRfd2lwZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iNjEyODEwNjM5OTc0NTc1NTYwNCI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayB0YWJsZXQgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB1cGF5YSBnYWdhbCBsYWdpLCB0YWJsZXQgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gYmF3YWFuIHBhYnJpayBkYW4gc2VtdWEgZGF0YSBwZW5nZ3VuYSBoaWxhbmcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2F0X3dpcGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjAzNTY1MTQyMTU2ODI2NTY1Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHBvbnNlbCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IHVwYXlhIGdhZ2FsIGxhZ2ksIHBvbnNlbCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBiYXdhYW4gcGFicmlrIGRhbiBzZW11YSBkYXRhIHBlbmdndW5hIGhpbGFuZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19ub3dfd2lwaW5nIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIyODA4NzM1MTY0OTM5MzQzNjUiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgdGFibGV0IHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiBrYWxpLiBLaW5pIHRhYmxldCBha2FuIGRpc2V0ZWwgdWxhbmcga2Ugc2V0ZWxhbiBiYXdhYW4gcGFicmlrLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX25vd193aXBpbmciIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzMDI1NTA0NzIxNzY0OTIyMjQ2Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHBvbnNlbCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4ga2FsaS4gS2luaSBwb25zZWwgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gYmF3YWFuIHBhYnJpay4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfYXRfd2lwZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iNjEyODEwNjM5OTc0NTc1NTYwNCI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayB0YWJsZXQgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB1cGF5YSBnYWdhbCBsYWdpLCB0YWJsZXQgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gZGVmYXVsdCBwYWJyaWsgZGFuIHNlbXVhIGRhdGEgcGVuZ2d1bmEgaGlsYW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9hdF93aXBlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODYwMzU2NTE0MjE1NjgyNjU2NSI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayBwb25zZWwgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB1cGF5YSBnYWdhbCBsYWdpLCBwb25zZWwgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gZGVmYXVsdCBwYWJyaWsgZGFuIHNlbXVhIGRhdGEgcGVuZ2d1bmEgaGlsYW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX25vd193aXBpbmciIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjI4MDg3MzUxNjQ5MzkzNDM2NSI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayB0YWJsZXQgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IGthbGkuIEtpbmkgdGFibGV0IGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBzZXRlbGFuIGRlZmF1bHQgcGFicmlrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX25vd193aXBpbmciIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIzMDI1NTA0NzIxNzY0OTIyMjQ2Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHBvbnNlbCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4ga2FsaS4gS2luaSBwb25zZWwgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gZGVmYXVsdCBwYWJyaWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IkNvYmEgbGFnaSBkYWxhbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gZGV0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJMdXBhIHBvbGE/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9nbG9naW5fZm9yZ290X3BhdHRlcm4iIG1zZ2lkPSIyNTg4NTIxNTAxMTY2MDMyNzQ3Ij4iUGVtYnVrYSBrdW5jaSBha3VuIjwvc3RyaW5nPgpAQCAtOTA5LDggKzkxNyw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29uIiBtc2dpZD0iMTU0NDY4Mjc1NTUxNDQ5NDI5OCI+IkhJRFVQIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2FwaXRhbF9vZmYiIG1zZ2lkPSI2ODE1ODcwMzg2OTcyODA1ODMyIj4iTUFUSSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndoaWNoQXBwbGljYXRpb24iIG1zZ2lkPSI0NTMzMTg1OTQ3MDY0NzczMzg2Ij4iVGluZGFrYW4gbGVuZ2thcCBtZW5nZ3VuYWthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c1VzZSIgbXNnaWQ9IjQ1ODMwMTgzNjgwMDA2MTA0MzgiPiJHdW5ha2FuIHNlY2FyYSBiYXdhYW4gdW50dWsgdGluZGFrYW4gaW5pLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImNsZWFyRGVmYXVsdEhpbnRNc2ciIG1zZ2lkPSIzMjUyNTg0Njg5NTEyMDc3MjU3Ij4iTWVuZ2hhcHVzIGJhd2FhbiBkaSBTZXRlbGFuIHNpc3RlbSAmZ3Q7IEFwbCAmZ3Q7IFRlcnVuZHVoLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c1VzZSIgbXNnaWQ9IjQ1ODMwMTgzNjgwMDA2MTA0MzgiPiJHdW5ha2FuIHNlY2FyYSBkZWZhdWx0IHVudHVrIHRpbmRha2FuIGluaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjbGVhckRlZmF1bHRIaW50TXNnIiBtc2dpZD0iMzI1MjU4NDY4OTUxMjA3NzI1NyI+Ik1lbmdoYXB1cyBkZWZhdWx0IGRpIFNldGVsYW4gc2lzdGVtICZndDsgQXBsICZndDsgVGVydW5kdWguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2hvb3NlQWN0aXZpdHkiIG1zZ2lkPSI3NDg2ODc2MTQ3NzUxODAzMzMzIj4iUGlsaWggdGluZGFrYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjaG9vc2VVc2JBY3Rpdml0eSIgbXNnaWQ9IjY4OTQ3NDg0MTYwNzM1ODM1MDkiPiJQaWxpaCBhcGwgdW50dWsgcGVyYW5na2F0IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vQXBwbGljYXRpb25zIiBtc2dpZD0iMjk5MTgxNDI3MzkzNjUwNDY4OSI+IlRpZGFrIGFkYSBhcGwgeWFuZyBkYXBhdCBtZWxha3VrYW4gdGluZGFrYW4gaW5pLiI8L3N0cmluZz4KQEAgLTk2MSw4ICs5NjksOCBAQAogICAgIDxzdHJpbmcgbmFtZT0idm9sdW1lX2ljb25fZGVzY3JpcHRpb25faW5jYWxsIiBtc2dpZD0iODg5MDA3MzIxODE1NDU0MzM5NyI+IlZvbHVtZSBwYW5nZ2lsYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2b2x1bWVfaWNvbl9kZXNjcmlwdGlvbl9tZWRpYSIgbXNnaWQ9IjQyMTczMTE3MTk2NjUxOTQyMTUiPiJWb2x1bWUgbWVkaWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2b2x1bWVfaWNvbl9kZXNjcmlwdGlvbl9ub3RpZmljYXRpb24iIG1zZ2lkPSI3MDQ0OTg2NTQ2NDc3MjgyMjc0Ij4iVm9sdW1lIHBlbWJlcml0YWh1YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJyaW5ndG9uZV9kZWZhdWx0IiBtc2dpZD0iMzc4OTc1ODk4MDM1NzY5NjkzNiI+Ik5hZGEgZGVyaW5nIGJhd2FhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX2RlZmF1bHRfd2l0aF9hY3R1YWwiIG1zZ2lkPSI4MTI5NTYzNDgwODk1OTkwMzcyIj4iTmFkYSBkZXJpbmcgYmF3YWFuICg8eGxpZmY6ZyBpZD0iQUNUVUFMX1JJTkdUT05FIj4lMSRzPC94bGlmZjpnPikiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyaW5ndG9uZV9kZWZhdWx0IiBtc2dpZD0iMzc4OTc1ODk4MDM1NzY5NjkzNiI+Ik5hZGEgZGVyaW5nIGRlZmF1bHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyaW5ndG9uZV9kZWZhdWx0X3dpdGhfYWN0dWFsIiBtc2dpZD0iODEyOTU2MzQ4MDg5NTk5MDM3MiI+Ik5hZGEgZGVyaW5nIGRlZmF1bHQgKDx4bGlmZjpnIGlkPSJBQ1RVQUxfUklOR1RPTkUiPiUxJHM8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InJpbmd0b25lX3NpbGVudCIgbXNnaWQ9IjQ0NDAzMjQ0MDc4MDc0Njg3MTMiPiJTZW55YXAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyaW5ndG9uZV9waWNrZXJfdGl0bGUiIG1zZ2lkPSIzNTE1MTQzOTM5MTc1MTE5MDk0Ij4iTmFkYSBkZXJpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyaW5ndG9uZV91bmtub3duIiBtc2dpZD0iNTQ3NzkxOTk4ODcwMTc4NDc4OCI+Ik5hZGEgZGVyaW5nIHRpZGFrIGRpa2VuYWwiPC9zdHJpbmc+CkBAIC0xMDA3LDcgKzEwMTUsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0idGltZV9waWNrZXJfZGlhbG9nX3RpdGxlIiBtc2dpZD0iODM0OTM2MjYyMzA2ODgxOTI5NSI+IlNldGVsIHdha3R1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGF0ZV9waWNrZXJfZGlhbG9nX3RpdGxlIiBtc2dpZD0iNTg3OTQ1MDY1OTQ1Mzc4MjI3OCI+IlNldGVsIHRhbmdnYWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkYXRlX3RpbWVfc2V0IiBtc2dpZD0iNTc3NzA3NTYxNDMyMTA4Nzc1OCI+IlNldGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF9wZXJtaXNzaW9uX2dyb3VwIiBtc2dpZD0iMjY5MDE2MDk5MTQwNTY0NjEyOCI+IkJhd2FhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRlZmF1bHRfcGVybWlzc2lvbl9ncm91cCIgbXNnaWQ9IjI2OTAxNjA5OTE0MDU2NDYxMjgiPiJEZWZhdWx0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfbmV3X3Blcm1fcHJlZml4IiBtc2dpZD0iODI1Nzc0MDcxMDc1NDMwMTQwNyI+PGZvbnQgc2l6ZT0iMTIiIGZnY29sb3I9IiNmZmZmYTNhMyI+IkJBUlU6ICI8L2ZvbnQ+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJub19wZXJtaXNzaW9ucyIgbXNnaWQ9IjcyODMzNTc3MjgyMTkzMzgxMTIiPiJUaWRhayBwZXJsdSBpemluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybXNfaGlkZSIgbXNnaWQ9IjcyODM5MTUzOTEzMjA2NzYyMjYiPjxiPiJTZW1idW55aWthbiI8L2I+PC9zdHJpbmc+CkBAIC0xMDc2LDcgKzEwODQsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wa2dVc2FnZVN0YXRzIiBtc2dpZD0iODc4NzM1MjA3NDMyNjc0ODg5MiI+InBlcmJhcnVpIHN0YXRpc3RpayBwZW5nZ3VuYWFuIGtvbXBvbmVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGtnVXNhZ2VTdGF0cyIgbXNnaWQ9IjExMDY2MTI0MjQyNTQyNzc2MzAiPiJNZW5naXppbmthbiBhcGwgbWVtb2RpZmlrYXNpIHN0YXRpc3RpayBwZW5nZ3VuYWFuIGtvbXBvbmVuIHlhbmcgZGlrdW1wdWxrYW4uIFRpZGFrIHVudHVrIGRpZ3VuYWthbiBvbGVoIGFwbCBub3JtYWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jb3B5UHJvdGVjdGVkRGF0YSIgbXNnaWQ9IjQzNDEwMzYzMTEyMTE0MDY2OTIiPiJtZW55YWxpbiBrb250ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb3B5UHJvdGVjdGVkRGF0YSIgbXNnaWQ9IjQzOTA2OTcxMjQyODgzMTc4MzEiPiJNZW5naXppbmthbiBhcGwgbWVuamFsYW5rYW4gbGF5YW5hbiBrb250YWluZXIgYmF3YWFuIHVudHVrIG1lbnlhbGluIGtvbnRlbi4gVGlkYWsgdW50dWsgZGlndW5ha2FuIG9sZWggYXBsIG5vcm1hbC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb3B5UHJvdGVjdGVkRGF0YSIgbXNnaWQ9IjQzOTA2OTcxMjQyODgzMTc4MzEiPiJNZW5naXppbmthbiBhcGwgbWVuamFsYW5rYW4gbGF5YW5hbiBrb250YWluZXIgZGVmYXVsdCB1bnR1ayBtZW55YWxpbiBrb250ZW4uIFRpZGFrIHVudHVrIGRpZ3VuYWthbiBvbGVoIGFwbCBub3JtYWwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idHV0b3JpYWxfZG91YmxlX3RhcF90b196b29tX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI0MDcwNDMzMjA4MTYwMDYzNTM4Ij4iU2VudHVoIGR1YSBrYWxpIHVudHVrIG1lbmdvbnRyb2wgcGVyYmVzYXIvcGVya2VjaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJnYWRnZXRfaG9zdF9lcnJvcl9pbmZsYXRpbmciIG1zZ2lkPSI0ODgyMDA0MzE0OTA2NDY2MTYyIj4iVGlkYWsgZGFwYXQgbWVuYW1iYWhrYW4gZ2F3aXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaW1lX2FjdGlvbl9nbyIgbXNnaWQ9IjgzMjA4NDU2NTE3MzczNjkwMjciPiJCdWthIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKaW5kZXggOTZjNjcwOS4uMmQxYTQxMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJDb25zZW50ZSBhbGxcJ2FwcGxpY2F6aW9uZSBkaSBsZWdnZXJlIHBhcm9sZSwgZnJhc2kgZSBub21pIHByaXZhdGkgY2hlIGxcJ3V0ZW50ZSBwb3RyZWJiZSBhdmVyIG1lbW9yaXp6YXRvIG5lbCBkaXppb25hcmlvIHV0ZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJzY3JpdHR1cmEgbmVsIGRpemlvbmFyaW8gZGVmaW5pdG8gZGFsbFwndXRlbnRlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkNvbnNlbnRlIGFsbFwnYXBwbGljYXppb25lIGRpIHNjcml2ZXJlIG51b3ZlIHBhcm9sZSBuZWwgZGl6aW9uYXJpbyB1dGVudGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+Im1vZGlmaWNhL2VsaW1pbmF6LiBjb250ZW51dGkgYXJjaGl2aW8gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXJlL2VsaW1pbmFyZSBpIGNvbnRlbnV0aSBkZWxsYSBzY2hlZGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iQ29uc2VudGUgYWxsXCdhcHBsaWNhemlvbmUgZGkgc2NyaXZlcmUgbmVsbFwnYXJjaGl2aW8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCmluZGV4IDQ4NWUwYjAuLmU0OWI3MjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i157XkNek16nXqCDXnNeZ15nXqdeV150g15zXp9eo15XXkCDXnteZ15zXmdedLCDXqdee15XXqiDXldeR15nXmNeV15nXmdedINek16jXmNeZ15nXnSDXqdeU157Xqdeq157XqSDXkNeX16HXnyDXkdee15nXnNeV158g15TXntep16rXntepLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Iteb16rXmdeR15Qg15zXnteZ15zXldefINeR15TXkteT16jXqiDXlNee16nXqtee16kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i157XkNek16nXqCDXnNeZ15nXqdeV150g15zXm9eq15XXkSDXnteZ15zXmdedINeX15PXqdeV16og15HXnteZ15zXldefINeU157Xqdeq157XqS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i16nXoNeUL9ee15fXpyDXqteV15vXnyDXkdeQ157Xptei15kg15DXl9eh15XXnyDXnteh15XXkiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+Itep16DXlC/XnteX16cg16rXldeb158g16nXnCDXm9eo15jXmdehIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+Itee15DXpNep16gg15zXmdeZ16nXldedINec15vXqteV15Eg15zXlNeq16fXnyDXlNeQ15fXodeV158g157XodeV15IgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCmluZGV4IGJjOTg0MGQuLjU1MTJlYWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i44Om44O844K244O844GM5Y2Y6Kqe44Oq44K544OI44Gr5YCL5Lq65oOF5aCx44Go44GX44Gm55m76Yyy44GX44Gf5Y+v6IO95oCn44Gu44GC44KL6Kqe5Y+l44KE5ZCN5YmN44KS6Kqt44G/6L6844KA44GT44Go44KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i5Y2Y6Kqe44Oq44K544OI44G444Gu5pu444GN6L6844G/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuWNmOiqnuODquOCueODiOOBq+aWsOOBl+OBhOiqnuWPpeOCkuabuOOBjei+vOOCgOOBk+OBqOOCkuOCouODl+ODquOBq+ioseWPr+OBl+OBvuOBmeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJVU0Ljgrnjg4jjg6zjg7zjgrjjga7jgrPjg7Pjg4bjg7Pjg4Tjga7lpInmm7Qv5YmK6ZmkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTROOCq+ODvOODieOBruOCs+ODs+ODhuODs+ODhOOCkuS/ruatoy/liYrpmaTjgZnjgosiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iVVNC44K544OI44Os44O844K444G444Gu5pu444GN6L6844G/44KS44Ki44OX44Oq44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKaW5kZXggYzk4MDFhMy4uMjlhNzIxMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLslbHsnbQg7IKs7Jqp7J6QIOyCrOyghOyXkCDrs7TqtIDrkJjslrQg7J6I64qUIOu5hOqzteqwnCDri6jslrQsIOydtOumhCDrsI8g6rWs66y47J2EIOydveuPhOuhnSDtl4jsmqntlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i7IKs7Jqp7J6QIOygleydmCDsgqzsoITsl5Ag7J6R7ISxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuyVseydtCDsgqzsmqnsnpAg7IKs7KCE7JeQIOyDiCDri6jslrTrpbwg7J6F66Cl7ZWgIOyImCDsnojrj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJVU0Ig7KCA7J6l7IaMIOy9mO2FkOy4oCDsiJjsoJUv7IKt7KCcIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJTRCDsubTrk5wg7L2Y7YWQ7LigIOyImOyglS/sgq3soJwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i7JWx7J20IFVTQiDsoIDsnqXshozsl5Ag7JO4IOyImCDsnojrj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCmluZGV4IDQ0MjRhZDUuLmRhNzQ3YjYyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkxlaWTFvmlhbWEgcHJvZ3JhbWFpIHNrYWl0eXRpIHByaXZhxI1pdXMgxb5vZMW+aXVzLCB2YXJkdXMgaXIgZnJhemVzLCBrdXJpdW9zIG5hdWRvdG9qYXMgacWhc2F1Z29qbyBuYXVkb3Rvam8gxb5vZHluZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJyYcWheXRpIG5hdWRvdG9qbyBudXN0YXR5dGFtZSDFvm9keW5lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IkxlaWTFvmlhbWEgcHJvZ3JhbWFpIHJhxaF5dGkgbmF1anVzIMW+b2TFvml1cyDEryBuYXVkb3Rvam8gxb5vZHluxIUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ImtlaXN0aSAvIGnFoXRyaW50aSBVU0IgYXRtaW50aW7El3MgdHVyaW7EryI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ia2Vpc3RpIC8gacWhdHJpbnRpIFNEIGtvcnRlbMSXcyB0dXJpbsSvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IkxlaWTFvi4gcHJvZ3IuIHJhxaEuIMSvIFVTQiBhdG0uIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKaW5kZXggODliYWFhYS4uYzk2ZGY1ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLEu2F1aiBsaWV0b3RuZWkgbGFzxKt0IGplYmt1cnVzIHByaXbEgXR1IHbEgXJkdXMsIG5vc2F1a3VtdXMgdW4gZnLEgXplcywga28gbGlldG90xIFqcyBzYWdsYWLEgWppcyBzYXbEgSBsaWV0b3TEgWphIHbEgXJkbsSrY8SBLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InJha3N0xKt0IGxpZXRvdMSBamEgbm90ZWlrdMSBIHbEgXJkbsSrY8SBIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IsS7YXVqIGxpZXRvdG5laSByYWtzdMSrdCBqYXVudXMgdsSBcmR1cyBsaWV0b3TEgWphIHbEgXJkbsSrY8SBLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJwxIFydmVpZG90L2R6xJNzdCBVU0LCoGtyLiBzYXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJwxIFydmVpZG90L2R6xJNzdCBTRMKga2FydGVzIHNhdHVydSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLEu2F1aiBsaWV0b3RuZWkgcmFrc3TEq3QgVVNCwqBhdG1pxYbEgS4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAppbmRleCAzODViZWJiLi5mOTdmNDgxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+Ik1lbWJlbmFya2FuIGFwbCBtZW1iYWNhIHNlYmFyYW5nIGthdGEta2F0YSBwZXJpYmFkaSwgbmFtYSBkYW4gZnJhc2EgeWFuZyBtdW5na2luIHRlbGFoIGRpc2ltcGFuIG9sZWggcGVuZ2d1bmEgZGFsYW0ga2FtdXMgcGVuZ2d1bmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4idHVsaXMga2Uga2FtdXMgeWFuZyBkaXRha3JpZmthbiBwZW5nZ3VuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJNZW1iZW5hcmthbiBhcGwgbWVudWxpcyBwZXJrYXRhYW4gYmFoYXJ1IGtlIGRhbGFtIGthbXVzIHBlbmdndW5hLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJ1YmFoIHN1YWkvcGFkYW0ga2RnbiBzdG9ybiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InViYWggc3VhaS9wYWRhbWthbiBrYW5kdW5nYW4ga2FkIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+Ik1lbWJlbmFya2FuIGFwbCBtZW51bGlzIGtlIHN0b3JhbiBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggZTcwYTY2NC4uOWUzZTQ4MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJMYXIgYXBwZW4gbGVzZSBldmVudHVlbGxlIHByaXZhdGUgb3JkLCBuYXZuIG9nIHV0dHJ5a2sgc29tIGJydWtlcmVuIGthbiBoYSBsYWdyZXQgaSBicnVrZXJvcmRsaXN0ZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2tyaXZlIGkgYnJ1a2VyZGVmaW5lcnQgb3JkbGlzdGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iTGFyIGFwcGVuIHNrcml2ZSBueWUgb3JkIGkgYnJ1a2Vyb3JkbGlzdGVuLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJlbmRyZS9zbGV0dGUgaW5uaC4gaSBVU0ItbGFnci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+InJlZGlnZXJlL3NsZXR0ZSBpbm5ob2xkIHDDpSBtaW5uZWtvcnQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iR2lyIGFwcGVuIHRpbGxhdGVsc2UgdGlsIMOlIHNrcml2ZSB0aWwgVVNCLWxhZ3Jpbmdlbi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAppbmRleCA2ODc2YzYzLi44OTQ2YmJiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkhpZXJtZWUga2FuIGRlIGFwcCBwcml2w6l3b29yZGVuLCBuYW1lbiBlbiB3b29yZGNvbWJpbmF0aWVzIGxlemVuIGRpZSBkZSBnZWJydWlrZXIgaGVlZnQgb3BnZXNsYWdlbiBpbiBoZXQgZ2VicnVpa2Vyc3dvb3JkZW5ib2VrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InNjaHJpanZlbiBuYWFyIGRvb3IgZ2VicnVpa2VyIGdlZGVmaW5pZWVyZCB3b29yZGVuYm9layI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJIaWVybWVlIGthbiBkZSBhcHAgbmlldXdlIHdvb3JkZW4gc2NocmlqdmVuIG5hYXIgaGV0IGdlYnJ1aWtlcnN3b29yZGVuYm9lay4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iaW5ob3VkIHZhbiBVU0Itb3BzbGFnIGFhbnBhc3Nlbi92ZXJ3aWpkZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iaW5ob3VkIG9wIGRlIFNELWthYXJ0IGFhbnBhc3Nlbi92ZXJ3aWpkZXJlbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJIaWVybWVlIGthbiBkZSBhcHAgc2NocmlqdmVuIG5hYXIgZGUgVVNCLW9wc2xhZy4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAppbmRleCA5NmRjZmEwLi5hMWJmYTdjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBvendhbGEgYXBsaWthY2ppIG5hIG9kY3p5dHl3YW5pZSB3c3plbGtpY2ggcHJ5d2F0bnljaCBzxYLDs3csIG5hencgaSB3eXJhxbxlxYQgemFwaXNhbnljaCB3IHPFgm93bmlrdSB1xbx5dGtvd25pa2EuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iemFwaXN5d2FuaWUgdyBzxYJvd25pa3UgemRlZmluaW93YW55bSBwcnpleiB1xbx5dGtvd25pa2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iUG96d2FsYSBhcGxpa2FjamkgbmEgemFwaXN5d2FuaWUgbm93eWNoIHPFgsOzdyBkbyBzxYJvd25pa2EgdcW8eXRrb3duaWthLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJNb2R5Zmlrb3dhbmllL3VzdXdhbmllIHogbm/Fm25pa2EgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2R5Zmlrb3dhbmllL3VzdXdhbmllIHphd2FydG/Fm2NpIGthcnR5IFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBvendhbGEgYXBsaWthY2ppIG5hIHphcGlzIHcgcGFtacSZY2kgVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggN2YwMzFmZC4uZTViMjYyOCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBlcm1pdGUgw6AgYXBsaWNhw6fDo28gbGVyIHF1YWlzcXVlciBwYWxhdnJhcywgbm9tZXMgZSBleHByZXNzw7VlcyBwcml2YWRhcyBxdWUgbyB1dGlsaXphZG9yIHBvc3NhIHRlciBhcm1hemVuYWRvIG5vIGRpY2lvbsOhcmlvIGRvIHV0aWxpemFkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iZXNjcmV2ZXIgbm8gZGljaW9uw6FyaW8gZGVmaW5pZG8gcGVsbyB1dGlsaXphZG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgw6AgYXBsaWNhw6fDo28gZXNjcmV2ZXIgbm92YXMgcGFsYXZyYXMgbm8gZGljaW9uw6FyaW8gZG8gdXRpbGl6YWRvci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kLi9lbGltLiBjb250ZcO6ZG8gZG8gYXJtYXouIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyL2VsaW1pbmFyIGNvbnRlw7pkbyBkbyBjYXJ0w6NvIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IlBlcm1pdGUgcXVlIGEgYXBsaWNhw6fDo28gZXNjcmV2YSBuYSB1bmlkYWRlIGRlIGFybWF6ZW5hbWVudG8gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IGZiZmU4OGYuLmM5Nzk0YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iUGVybWl0ZSBxdWUgbyBhcGxpY2F0aXZvIGxlaWEgcGFsYXZyYXMsIG5vbWVzIGUgZnJhc2VzIHBhcnRpY3VsYXJlcyBhcm1hemVuYWRvcyBwZWxvIHVzdcOhcmlvIG5vIGRpY2lvbsOhcmlvIGRvIHVzdcOhcmlvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImdyYXZhciBubyBkaWNpb27DoXJpbyBkZWZpbmlkbyBwZWxvIHVzdcOhcmlvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlBlcm1pdGUgcXVlIG8gYXBsaWNhdGl2byBncmF2ZSBub3ZhcyBwYWxhdnJhcyBubyBkaWNpb27DoXJpbyBkbyB1c3XDoXJpby4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ibW9kaWZpY2FyL2V4Y2x1aXIgY29udC4gVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZmljYXIvZXhjbHVpciBjb250ZcO6ZG8gZG8gY2FydMOjbyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQZXJtaXRlIGdyYXZhciBubyBhcm1hei4gVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCmluZGV4IGZmNzZmNzQuLmM1OGEwYTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbApAQCAtNzY0LDYgKzc2NCwxNCBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5ICg4MTg1Mzg1NzE2MjU1MDY1MjkxKSAtLT4KICAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkV3JpdGUgKDg1NDMwODc2MzEwNzY0NzUyKSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJtb2RpZml0Z2FyL3N0aXp6YXIgY3VudGVnbnMgZGEgbGEgY2FydGEgU0QiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAppbmRleCBjYWM1ODZlLi4zZjM2NThjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBlcm1pdGUgYXBsaWNhxaNpZWkgc8SDIGNpdGVhc2PEgyBjdXZpbnRlLCBudW1lIMWfaSBleHByZXNpaSBwcml2YXRlIHN0b2NhdGUgZGUgdXRpbGl6YXRvciDDrm4gZGljxaNpb25hcnVsIHPEg3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ic2NyaWVyZSDDrm4gZGljxaNpb25hcnVsIGRlZmluaXQgZGUgdXRpbGl6YXRvciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJQZXJtaXRlIGFwbGljYcWjaWVpIHPEgyBzY3JpZSBjdXZpbnRlIG5vaSDDrm4gZGljxaNpb25hcnVsIHV0aWxpemF0b3J1bHVpLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJtb2RpZmljYXJlL8WfdGVyZ2VyZSBhIGNvbsWjaW51dHVsdWkgc3RvY8SDcmlpIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ibW9kaWZpY2FyZS/Fn3RlcmdlcmUgY29uxaNpbnV0IGNhcmQgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iUGVybWl0ZSBzY3JpZXJlIMOubiBzdG9jLiBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggM2E1NTRkNi4uNDU4ZDEwNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDQv9C+0LvRg9GH0LjRgiDQtNC+0YHRgtGD0L8g0LrQviDQstGB0LXQvCDRgdC70L7QstCw0LwsINC40LzQtdC90LDQvCDQuCDRhNGA0LDQt9Cw0LwsINC60L7RgtC+0YDRi9C1INGF0YDQsNC90Y/RgtGB0Y8g0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC+0Lwg0YHQu9C+0LLQsNGA0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i0LfQsNC/0LjRgdGMINC00LDQvdC90YvRhSDQsiDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQuSDRgdC70L7QstCw0YDRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDRgdC80L7QttC10YIg0LTQvtCx0LDQstC70Y/RgtGMINGB0LvQvtCy0LAg0LIg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40Lkg0YHQu9C+0LLQsNGA0YwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC00L7RgdGC0YPQvyDQuiBVU0It0L3QsNC60L7Qv9C40YLQtdC70Y4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC40LfQvNC10L3Rj9GC0Ywv0YPQtNCw0LvRj9GC0Ywg0YHQvtC00LXRgNC20LjQvNC+0LUgU0Qt0LrQsNGA0YLRiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSDRgdC80L7QttC10YIg0LfQsNC/0LjRgdGL0LLQsNGC0Ywg0LTQsNC90L3Ri9C1INC90LAgVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmluZGV4IGRhYTMyMWQuLjNjOTAwMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iVW1vxb7FiHVqZSBhcGxpa8OhY2lpIMSNw610YcWlIHPDumtyb21uw6kgc2xvdsOhLCBuw6F6dnkgYSBmcsOhenksIGt0b3LDqSBtb2hvbCBwb3XFvsOtdmF0ZcS+IHVsb8W+acWlIGRvIHNsb3Zuw61rYSBwb3XFvsOtdmF0ZcS+YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJ6YXBpc292YcWlIGRvIHNsb3Zuw61rYSBkZWZpbm92YW7DqWhvIHBvdcW+w612YXRlxL5vbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJVbW/FvsWIdWplIGFwbGlrw6FjaWkgemFwaXNvdmHFpSBub3bDqSBzbG92w6EgZG8gcG91xb7DrXZhdGXEvnNrw6lobyBzbG92bsOta2EuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+InVwcmF2acWlL29kc3Ryw6FuacWlIG9ic2FoIHVrbC4gcHIuIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iWm1lbmnFpS9vZHN0csOhbmnFpSBvYnNhaCBrYXJ0eSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJVbW/FvsWIdWplIGFwbGlrw6FjaWkgesOhcGlzIGRvIHVrbGFkYWNpZWhvIHByaWVzdG9ydSBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKaW5kZXggMjBhZDU5Yi4uNDM0NTc0MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJQcm9ncmFtdSBvbW9nb8SNYSBicmFuamUgbW9yZWJpdG5paCB6YXNlYm5paCBiZXNlZCwgaW1lbiBpbiBpenJhem92LCBraSBqaWggamUgdXBvcmFibmlrIHNocmFuaWwgdiB1cG9yYWJuacWha2kgc2xvdmFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+InBpc2FuamUgdiB1cG9yYWJuacWha28gZG9sb8SNZW4gc2xvdmFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlByb2dyYW11IG9tb2dvxI1hIHBpc2FuamUgbm92ZSBiZXNlZGUgdiB1cG9yYWJuacWha2kgc2xvdmFyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJzcHJlbWluamFuamUgdnNlYmluZSBwb21uaWxuaWthIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ic3ByZW1pbmphbmplL2JyaXNhbmplIHZzZWJpbmUga2FydGljZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQcm9ncmFtdSBvbW9nb8SNYSB6YXBpc292YW5qZSB2IHBvbW5pbG5payBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKaW5kZXggOWZiOGFiZi4uZTIxNmU1NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiLQlNC+0LfQstC+0ZnQsNCy0LAg0LDQv9C70LjQutCw0YbQuNGY0Lgg0LTQsCDRh9C40YLQsCDRgdCy0LUg0L/RgNC40LLQsNGC0L3QtSDRgNC10YfQuCwg0L3QsNC30LjQstC1INC4INGE0YDQsNC30LUg0LrQvtGY0LUg0ZjQtSDQutC+0YDQuNGB0L3QuNC6INGB0LDRh9GD0LLQsNC+INGDINC60L7RgNC40YHQvdC40YfQutC+0Lwg0YDQtdGH0L3QuNC60YMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i0YPQv9C40YHQuNCy0LDRmtC1INGDINGA0LXRh9C90LjQuiDQutC+0ZjQuCDRmNC1INC00LXRhNC40L3QuNGB0LDQviDQutC+0YDQuNGB0L3QuNC6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+ItCU0L7Qt9Cy0L7RmdCw0LLQsCDQsNC/0LvQuNC60LDRhtC40ZjQuCDQtNCwINGD0L/QuNGB0YPRmNC1INC90L7QstC1INGA0LXRh9C4INGDINC60L7RgNC40YHQvdC40YfQutC4INGA0LXRh9C90LjQui4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4i0LjQt9C80LXQvdCwL9Cx0YDQuNGB0LDRmtC1INGB0LDQtNGA0LbQsNGY0LAgVVNCINC80LXQvNC+0YDQuNGY0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC40LfQvNC10L3QsC/QsdGA0LjRgdCw0ZrQtSDRgdCw0LTRgNC20LDRmNCwIFNEINC60LDRgNGC0LjRhtC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+ItCU0L7Qt9Cy0L7RmdCw0LLQsCDQsNC/0LvQuNC60LDRhtC40ZjQuCDQtNCwINGD0L/QuNGB0YPRmNC1INC/0L7QtNCw0YLQutC1INC90LAgVVNCINC80LXQvNC+0YDQuNGY0YMuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKaW5kZXggMmM0MTg5Yi4uZmJjYTNlNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJUaWxsw6V0ZXIgYXR0IGFwcGVuIGzDpHNlciBhbGxhIHByaXZhdGEgb3JkLCBuYW1uIG9jaCBmcmFzZXIgc29tIGFudsOkbmRhcmVuIGhhciBzcGFyYXQgaSBvcmRsaXN0YW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4ibMOkZ2dhIHRpbGwgaSBhbnbDpG5kYXJkZWZpbmllcmFkIG9yZGxpc3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IlRpbGzDpXRlciBhdHQgYXBwZW4gYW5nZXIgbnlhIG9yZCBpIGFudsOkbmRhcm9yZGxpc3Rhbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iw6RuZHJhL3RhIGJvcnQgZnLDpW4gVVNCLWVuaGV0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiLDpG5kcmEvdGEgYm9ydCBpbm5laMOlbGwgcMOlIFNELWtvcnRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJHw7ZyIGF0dCBhcHAgc2tyaXZlciB0aWxsIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAppbmRleCAxMzA1M2FiLi4wM2I0MGQ4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IkluYXJ1aHVzdSBwcm9ncmFtdSBrdXNvbWEgbWFuZW5vLCBtYWppbmEgbmEgdmlmdW5ndSB2eW92eW90ZSB2eWEga2liaW5hZnNpLCBhbWJhdnlvIGh1ZW5kYSBtdHVtaWFqaSBhbWVoaWZhZGhpIGthdGlrYSBrYW11c2kgeWEgbXR1bWlhamkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iYW5kaWthIGt3YSBrYW11c2kgaWxpeW9iYWluaXNod2EgbmEgbXR1bWlhamkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iSW5hcnVodXN1IHByb2dyYW11IGt1YW5kaWthIG1hbmVubyBtYXB5YSBrYXRpa2Ega2FtdXNpIHlhIG10dW1pYWppLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiJyZWtlYmlzaGEvZnV0YSBtYXVkaHVpIHlhIGhpZmFkaGkgeWEgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjgwNzk0MDM3NTkwMDE3NzcyOTEiPiJyZWtlYmlzaGEvZnV0YSBtYXVkaHVpIHlhIGthZGkgeWEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iSW5hcnVodXN1IHByb2dyYW11IGt1YW5kaWtpYSBoaWZhZGhpIHlhIFVTQi4iPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAppbmRleCBhOWExOTZjLi5iY2Q5ZmU2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IuC4reC4meC4uOC4jeC4suC4leC5g+C4q+C5ieC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4reC5iOC4suC4meC4hOC4syDguIrguLfguYjguK0g4LmB4Lil4Liw4Lin4Lil4Li14Liq4LmI4Lin4LiZ4Lia4Li44LiE4LiE4Lil4LiX4Li14LmI4Lic4Li54LmJ4LmD4LiK4LmJ4Lit4Liy4LiI4LmA4LiB4LmH4Lia4LmE4Lin4LmJ4LmD4LiZ4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4LiC4Lit4LiH4Lic4Li54LmJ4LmD4LiK4LmJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i4LmA4LiC4Li14Lii4LiZ4Lil4LiH4LmD4LiZ4Lie4LiI4LiZ4Liy4LiZ4Li44LiB4Lij4Lih4LiX4Li14LmI4Lic4Li54LmJ4LmD4LiK4LmJ4LiB4Liz4Lir4LiZ4LiUIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuC4reC4meC4uOC4jeC4suC4leC5g+C4q+C5ieC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC5gOC4guC4teC4ouC4meC4hOC4s+C5g+C4q+C4oeC5iOC4peC4h+C5g+C4meC4nuC4iOC4meC4suC4meC4uOC4geC4o+C4oeC4nOC4ueC5ieC5g+C4iuC5iSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLguYHguIHguYnguYTguIIv4Lil4Lia4LmA4LiZ4Li34LmJ4Lit4Lir4Liy4LiC4Lit4LiH4LiX4Li14LmI4LmA4LiB4LmH4Lia4LiC4LmJ4Lit4Lih4Li54LilIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4i4LmB4LiB4LmJ4LmE4LiCL+C4peC4muC4guC5ieC4reC4oeC4ueC4peC4geC4suC4o+C5jOC4lCBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguK8g4LmA4LiC4Li14Lii4LiZ4Lil4LiH4LmD4LiZIFVTQiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmluZGV4IDI2NzIwODMuLjllMzc1MzRhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKQEAgLTQ5OSw2ICs0OTksMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWREaWN0aW9uYXJ5IiBtc2dpZD0iODk3NzgxNTk4ODMyOTI4MzcwNSI+IlBpbmFwYXlhZ2FuIGFuZyBhcHAgbmEgbWFnYmFzYSBuZyBhbnVtYW5nIHByaWJhZG9uZyBtZ2Egc2FsaXRhLCBwYW5nYWxhbiBhdCBwYXJpcmFsYSBuYSBtYWFhcmluZyBpbmltYmFrIG5nIHVzZXIgc2EgZGlrc3l1bmFyeW8gbmcgdXNlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiJtYWdzdWxhdCBzYSBkaWtzeXVuYXJ5b25nIHRpbnVrb3kgbmcgdXNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJQaW5hcGF5YWdhbiBhbmcgYXBwIG5hIG1hZ3N1bGF0IG5nIG1nYSBiYWdvbmcgc2FsaXRhIHNhIGRpa3N5dW5hcnlvIG5nIHVzZXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ImJhZ3VoaW4vdGFuZ2dhbGluIGxhbWFuIG5nIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iYmFndWhpbi90YW5nZ2FsaW4gYW5nIG1nYSBuaWxhbGFtYW4gbmcgU0QgY2FyZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJQaW5hcGF5YWdhbiBhbmcgYXBwIG5hIG1hZ3N1bGF0IHNhIFVTQiBzdG9yYWdlLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IDA1OWNjZWEuLjI0NjJlOTAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4iVXlndWxhbWF5YSwga3VsbGFuxLFjxLFuxLFuIGt1bGxhbsSxY8SxIHPDtnpsw7zEn8O8bmRlIGRlcG9sYW3EscWfIG9sYWJpbGVjZcSfaSBracWfaXNlbCBrZWxpbWVsZXJpLCBhZGxhcsSxIHZlIGtlbGltZSDDtmJla2xlcmluaSBva3VtYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+Imt1bGxhbsSxY8SxIHRhbsSxbWzEsSBzw7Z6bMO8xJ9lIHlheiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJVeWd1bGFtYXlhLCBrdWxsYW7EsWPEsSBzw7Z6bMO8xJ/DvG5lIHllbmkga2VsaW1lbGVyIHlhem1hIGl6bmkgdmVyaXIuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+IlVTQiBkZXAgYmlybSBpw6dlcmnEn2luaSBkxJ/Fny9zaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IlNEIGthcnQgacOnZXJpa2xlcmluaSBkZcSfacWfdGlyL3NpbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJVeWd1bGFtYXlhIFVTQiBkZXBvbGFtYSBiaXJpbWluZSB5YXptYSBpem5pIHZlcmlyLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCmluZGV4IDQyOTI5ZWMuLmE0ZjhlNjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINGH0LjRgtCw0YLQuCDQsdGD0LTRjC3Rj9C60ZYg0L7RgdC+0LHQuNGB0YLRliDQstC40YHQu9C+0LLQuCwg0L3QsNC30LLQuCDRgtCwINGE0YDQsNC30LgsINGP0LrRliDQutC+0YDQuNGB0YLRg9Cy0LDRhyDQvNGW0LMg0LfQsdC10YDQtdCz0YLQuCDRgyDRgdCy0L7RlNC80YMg0YHQu9C+0LLQvdC40LrRgy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjIyOTYzODMxNjQ5MTQ4MTI3NzIiPiLQv9C40YHQsNGC0Lgg0YMg0LLQutCw0LfQsNC90LjQuSDQutC+0YDQuNGB0YLRg9Cy0LDRh9C10Lwg0YHQu9C+0LLQvdC40LoiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINC/0LjRgdCw0YLQuCDQvdC+0LLRliDRgdC70L7QstCwINCyINGB0LvQvtCy0L3QuNC6INC60L7RgNC40YHRgtGD0LLQsNGH0LAuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoNDA4NjIyMTM3NDYzOTE4MzI4MSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDg1Mzc4NzUxNTE4NDUxMzk1MzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoMTA1NTMwMjg5ODk5OTM1MjMzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICg3OTQ3NzkyMzczNTcwNjgzNTQyKSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI4NTQzMDg3NjMxMDc2NDc1MiI+ItC30LzRltC90Y7QstCw0YLQuC/QstC40LTQsNC70Y/RgtC4INCy0LzRltGB0YIg0L3QvtGB0ZbRjyBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+ItC30LzRltC90Y7QstCw0YLQuC/QstC40LTQsNC7LiDQstC80ZbRgdGCINC60LDRgNGC0LggU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4i0JTQvtC30LLQvtC70Y/RlCDQv9GA0L7Qs9GA0LDQvNGWINC/0LjRgdCw0YLQuCDQvdCwINC90L7RgdGW0LkgVVNCIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKaW5kZXggNjQ0NjlhYi4uMTNiZGZhNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJDaG8gcGjDqXAg4bupbmcgZOG7pW5nIMSR4buNYyBi4bqldCBr4buzIHThu6ssIHTDqm4gdsOgIGPhu6VtIHThu6sgcmnDqm5nIG7DoG8gbcOgIG5nxrDhu51pIGTDuW5nIGPDsyB0aOG7gyDEkcOjIGzGsHUgdHLhu68gdHJvbmcgdOG7qyDEkWnhu4NuIGPhu6dhIG5nxrDhu51pIGTDuW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iMjI5NjM4MzE2NDkxNDgxMjc3MiI+ImdoaSB2w6BvIHThu6sgxJFp4buDbiBkbyBuZ8aw4budaSBkw7luZyB4w6FjIMSR4buLbmgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSI4MTg1Mzg1NzE2MjU1MDY1MjkxIj4iQ2hvIHBow6lwIOG7qW5nIGThu6VuZyBnaGkgdOG7qyBt4bubaSB2w6BvIHThu6sgxJFp4buDbiBj4bunYSBuZ8aw4budaSBkw7luZy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4ic+G7rWEgxJHhu5VpL3jDs2EgbuG7mWkgZHVuZyBi4buZIG5o4bubIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4ic+G7rWEgxJHhu5VpL3jDs2EgbuG7mWkgZHVuZyB0aOG6uyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjYxNzU0MDYyOTk0NDU3MTA4ODgiPiJDaG8gcGjDqXAg4bupbmcgZOG7pW5nIGdoaSB2w6BvIGLhu5kgbMawdSB0cuG7ryBVU0IuIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAppbmRleCAyNjY0YWQzLi5kODQ4ZGQyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i5YWB6K645bqU55So56iL5bqP6K+75Y+W55So5oi35Y+v6IO95Zyo55So5oi36K+N5YW45Lit5bey5a2Y5YKo55qE5Lu75oSP56eB5pyJ5a2X6K+N44CB5ZCN56ew5ZKM55+t6K+t44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i5YaZ5YWl55So5oi35a6a5LmJ55qE6K+N5YW4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuWFgeiuuOW6lOeUqOeoi+W6j+WQkeeUqOaIt+ivjeWFuOS4reWGmeWFpeaWsOivjeOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLkv67mlLkv5Yig6ZmkIFVTQiDlrZjlgqjorr7lpIflhoXlrrkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IuS/ruaUuS/liKDpmaQgU0Qg5Y2h5Lit55qE5YaF5a65Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IuWFgeiuuOW6lOeUqOeoi+W6j+WGmeWFpSBVU0Ig5a2Y5YKo6K6+5aSH44CCIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCA3Yzg2MTdlLi5hZTE2YjZiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtNDk5LDYgKzQ5OSwxNCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZERpY3Rpb25hcnkiIG1zZ2lkPSI4OTc3ODE1OTg4MzI5MjgzNzA1Ij4i5YWB6Kix5oeJ55So56iL5byP6K6A5Y+W5L2/55So6ICF5YSy5a2Y5Zyo5L2/55So6ICF5a2X5YW45YWn55qE5Lu75L2V56eB5Lq65a2X6Kme44CB5ZCN56ix5ZKM6Kme57WE44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4i5a+r5YWl5L2/55So6ICF5a6a576p55qE5a2X5YW4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVEaWN0aW9uYXJ5IiBtc2dpZD0iODE4NTM4NTcxNjI1NTA2NTI5MSI+IuWFgeioseaHieeUqOeoi+W8j+Wwh+aWsOWtl+ipnuWvq+WFpeS9v+eUqOiAheeahOWtl+WFuOOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NkY2FyZFJlYWQgKDQwODYyMjEzNzQ2MzkxODMyODEpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg4NTM3ODc1MTUxODQ1MTM5NTM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDEwNTUzMDI4OTg5OTkzNTIzMzkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2RjYXJkUmVhZCAoNzk0Nzc5MjM3MzU3MDY4MzU0MikgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iODU0MzA4NzYzMTA3NjQ3NTIiPiLkv67mlLkv5Yiq6ZmkIFVTQiDlhLLlrZjoo53nva7lhaflrrkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA3OTQwMzc1OTAwMTc3NzI5MSI+IuS/ruaUuS/liKrpmaQgU0Qg5Y2h55qE5YWn5a65Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iNjE3NTQwNjI5OTQ0NTcxMDg4OCI+IuWFgeioseaHieeUqOeoi+W8j+Wvq+WFpSBVU0Ig5YSy5a2Y6KOd572u44CCIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKaW5kZXggMDk3NzdhYi4uOTMwMTY0OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCkBAIC00OTksNiArNDk5LDE0IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRGljdGlvbmFyeSIgbXNnaWQ9Ijg5Nzc4MTU5ODgzMjkyODM3MDUiPiJJdnVtZWxhIHVobGVsbyBsb2t1c2ViZW56YSB1a3VmdW5kYSBub21hIHlpbWFwaGkgYW1hZ2FtYSBheWltZmlobG8sIGFtYWdhbWEgbmVtaXNobyBsZXlvIHVtc2ViZW56aXNpIGF5aWdjaW5lIGt3aXNpY2hhemFtYXp3aSBzb21zZWJlbnppc2kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZURpY3Rpb25hcnkiIG1zZ2lkPSIyMjk2MzgzMTY0OTE0ODEyNzcyIj4iYmhhbGEga3dpc2ljaGF6YW1hendpIGVzaWNhY2lzaXdlIHNvbXNlYmVuemlzaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlRGljdGlvbmFyeSIgbXNnaWQ9IjgxODUzODU3MTYyNTUwNjUyOTEiPiJJdnVtZWxhIGluc2l6YSB1a3V0aGkgaWJoYWxlIGFtYWdhbWEgYW1hc2hhIGVzaWNoYXppbmltYXp3aS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZGNhcmRSZWFkICg0MDg2MjIxMzc0NjM5MTgzMjgxKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2RjYXJkUmVhZCAoODUzNzg3NTE1MTg0NTEzOTUzOSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZGNhcmRSZWFkICgxMDU1MzAyODk4OTk5MzUyMzM5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NkY2FyZFJlYWQgKDc5NDc3OTIzNzM1NzA2ODM1NDIpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NkY2FyZFdyaXRlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijg1NDMwODc2MzEwNzY0NzUyIj4iZ3VxdWxhL3N1c2Egb2t1cXVrZXRod2UgaXNpdG9yZWppIHNlLVVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2RjYXJkV3JpdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4MDc5NDAzNzU5MDAxNzc3MjkxIj4iZ3VxdWxhL3N1c2Egb2t1cXVrZXRod2Uga3dla2hhZGkgbGUtU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI2MTc1NDA2Mjk5NDQ1NzEwODg4Ij4iSXZ1bWVsYSBpbnNpemEgdWt1dGhpIGliaGFsZWxlIGVrdWxvbmRvbG96d2VuaSBrd2UtVVNCLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDcxMzdiN2MuLjc3OTlmNzQgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtOTQyLDYgKzk0MiwyNiBAQAogICAgICAgICBjb250YWN0IChhZGRyZXNzKSBkYXRhIHN0b3JlZCBvbiB5b3VyIHBob25lLiBNYWxpY2lvdXMKICAgICAgICAgYXBwcyBtYXkgdXNlIHRoaXMgdG8gZXJhc2Ugb3IgbW9kaWZ5IHlvdXIgY29udGFjdCBkYXRhLjwvc3RyaW5nPgogCisKKyAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGxMb2ciPnJlYWQgY2FsbCBsb2c8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxsTG9nIiBwcm9kdWN0PSJ0YWJsZXQiPkFsbG93cyB0aGUgYXBwIHRvIHJlYWQgeW91ciB0YWJsZXRcJ3MgY2FsbCBsb2csIGluY2x1ZGluZyBkYXRhIGFib3V0IGluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscy4KKyAgICAgICAgTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIHNlbmQgeW91ciBkYXRhIHRvIG90aGVyIHBlb3BsZS48L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRDYWxsTG9nIiBwcm9kdWN0PSJkZWZhdWx0Ij5BbGxvd3MgdGhlIGFwcCB0byByZWFkIHlvdXIgcGhvbmVcJ3MgY2FsbCBsb2csIGluY2x1ZGluZyBkYXRhIGFib3V0IGluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscy4KKyAgICAgICAgTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIHNlbmQgeW91ciBkYXRhIHRvIG90aGVyIHBlb3BsZS48L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUNhbGxMb2ciPndyaXRlIGNhbGwgbG9nPC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUNhbGxMb2ciIHByb2R1Y3Q9InRhYmxldCI+QWxsb3dzIHRoZSBhcHAgdG8gbW9kaWZ5IHlvdXIgdGFibGV0XCdzIGNhbGwgbG9nLCBpbmNsdWRpbmcgZGF0YSBhYm91dCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgY2FsbHMuCisgICAgICAgIE1hbGljaW91cyBhcHBzIG1heSB1c2UgdGhpcyB0byBlcmFzZSBvciBtb2RpZnkgeW91ciBjYWxsIGxvZy48L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQ2FsbExvZyIgcHJvZHVjdD0iZGVmYXVsdCI+QWxsb3dzIHRoZSBhcHAgdG8gbW9kaWZ5IHlvdXIgcGhvbmVcJ3MgY2FsbCBsb2csIGluY2x1ZGluZyBkYXRhIGFib3V0IGluY29taW5nIGFuZCBvdXRnb2luZyBjYWxscy4KKyAgICAgICAgTWFsaWNpb3VzIGFwcHMgbWF5IHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNhbGwgbG9nLjwvc3RyaW5nPgorCisKICAgICA8IS0tIFRpdGxlIG9mIHRoZSByZWFkIHByb2ZpbGUgcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBkZWNpZGUgd2hldGhlciB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gcmVhZCB0aGUgdXNlcidzIHBlcnNvbmFsIHByb2ZpbGUgZGF0YS4gW0NIQVIgTElNSVQ9MzBdIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkUHJvZmlsZSI+cmVhZCB5b3VyIHByb2ZpbGUgZGF0YTwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNjA0My4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0xvY2FsZVV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci1pbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOwotaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXROZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXcuTEFZT1VUX0RJUkVDVElPTl9MVFI7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3LkxBWU9VVF9ESVJFQ1RJT05fUlRMOwotCi1wdWJsaWMgY2xhc3MgTG9jYWxlVXRpbFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotCi0gICAgQFRlc3RUYXJnZXROZXcoCi0gICAgICAgIGxldmVsID0gVGVzdExldmVsLkNPTVBMRVRFLAotICAgICAgICBtZXRob2QgPSAiZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZSIsCi0gICAgICAgIGFyZ3MgPSB7TG9jYWxlLmNsYXNzfQotICAgICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShudWxsKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5FTkdMSVNIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuQ0FOQURBKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuQ0FOQURBX0ZSRU5DSCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkZSQU5DRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkZSRU5DSCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkdFUk1BTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkdFUk1BTlkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5JVEFMSUFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuSVRBTFkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5VSykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLlVTKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5ST09UKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DSElOQSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkNISU5FU0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5KQVBBTikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkpBUEFORVNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX0xUUiwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuS09SRUEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5LT1JFQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5QUkMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5TSU1QTElGSUVEX0NISU5FU0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5UQUlXQU4pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5UUkFESVRJT05BTF9DSElORVNFKSk7Ci0KLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiQUUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJCSCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkRaIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiRUciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJJUSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkpPIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiS1ciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJMQiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkxZIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiTUEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJPTSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlFBIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiU0EiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJTRCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlNZIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiVE4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJZRSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiZmEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJmYSIsICJBRiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImZhIiwgIklSIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJpdyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoIml3IiwgIklMIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiaGUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJoZSIsICJJTCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicGFfQXJhYiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInBhX0FyYWIiLCAiUEsiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInBzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgicHMiLCAiQUYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotCi0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInVyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMQVlPVVRfRElSRUNUSU9OX1JUTCwKLSAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXIiLCAiSU4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1ciIsICJQSyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0KLSAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXpfQXJhYiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9SVEwsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInV6X0FyYWIiLCAiQUYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExBWU9VVF9ESVJFQ1RJT05fUlRMLAotICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOwotCi0gICAgICAgIC8vIExvY2FsZSB3aXRob3V0IGEgcmVhbCBsYW5ndWFnZQotICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ6eiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTEFZT1VUX0RJUkVDVElPTl9MVFIsCi0gICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCAwZmZjMGE3Li5hM2VhYzNlIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiRHJtUGFzc3RocnVQbHVnSW4iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTU4LDcgKzU4LDcgQEAKIAogRHJtQ29uc3RyYWludHMqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldENvbnN0cmFpbnRzKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0Q29uc3RyYWludHMgRnJvbSBQYXRoOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0Q29uc3RyYWludHMgRnJvbSBQYXRoOiAlZCIsIHVuaXF1ZUlkKTsKICAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKIAogICAgIFN0cmluZzggdmFsdWUoImR1bW15X2F2YWlsYWJsZV90aW1lIik7CkBAIC03Myw3ICs3Myw3IEBACiB9CiAKIERybUluZm9TdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Qcm9jZXNzRHJtSW5mbyAtIEVudGVyIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvIC0gRW50ZXIgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICBEcm1JbmZvU3RhdHVzKiBkcm1JbmZvU3RhdHVzID0gTlVMTDsKICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvKSB7CiAgICAgICAgIHN3aXRjaCAoZHJtSW5mby0+Z2V0SW5mb1R5cGUoKSkgewpAQCAtMTAyLDI4ICsxMDIsMjggQEAKICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Qcm9jZXNzRHJtSW5mbyAtIEV4aXQiKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJvY2Vzc0RybUluZm8gLSBFeGl0Iik7CiAgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblNldE9uSW5mb0xpc3RlbmVyKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciogaW5mb0xpc3RlbmVyKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldE9uSW5mb0xpc3RlbmVyIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldE9uSW5mb0xpc3RlbmVyIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25UZXJtaW5hdGUgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uVGVybWluYXRlIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogRHJtU3VwcG9ydEluZm8qIERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRTdXBwb3J0SW5mbyA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRTdXBwb3J0SW5mbyA6ICVkIiwgdW5pcXVlSWQpOwogICAgIERybVN1cHBvcnRJbmZvKiBkcm1TdXBwb3J0SW5mbyA9IG5ldyBEcm1TdXBwb3J0SW5mbygpOwogICAgIC8vIEFkZCBtaW1ldHlwZSdzCiAgICAgZHJtU3VwcG9ydEluZm8tPmFkZE1pbWVUeXBlKFN0cmluZzgoImFwcGxpY2F0aW9uL3ZuZC5wYXNzdGhydS5kcm0iKSk7CkBAIC0xMzYsMTIgKzEzNiwxMiBAQAogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TYXZlUmlnaHRzIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNhdmVSaWdodHMgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBEcm1JbmZvKiBEcm1QYXNzdGhydVBsdWdJbjo6b25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25BY3F1aXJlRHJtSW5mbyA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25BY3F1aXJlRHJtSW5mbyA6ICVkIiwgdW5pcXVlSWQpOwogICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOwogCiAgICAgaWYgKE5VTEwgIT0gZHJtSW5mb1JlcXVlc3QpIHsKQEAgLTE1Nyw2NSArMTU3LDY1IEBACiB9CiAKIGJvb2wgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6Y2FuSGFuZGxlOiAlcyAiLCBwYXRoLnN0cmluZygpKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46OmNhbkhhbmRsZTogJXMgIiwgcGF0aC5zdHJpbmcoKSk7CiAgICAgU3RyaW5nOCBleHRlbnNpb24gPSBwYXRoLmdldFBhdGhFeHRlbnNpb24oKTsKICAgICBleHRlbnNpb24udG9Mb3dlcigpOwogICAgIHJldHVybiAoU3RyaW5nOCgiLnBhc3N0aHJ1IikgPT0gZXh0ZW5zaW9uKTsKIH0KIAogU3RyaW5nOCBEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0T3JpZ2luYWxNaW1lVHlwZSgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIFN0cmluZzgoInZpZGVvL3Bhc3N0aHJ1Iik7CiB9CiAKIGludCBEcm1QYXNzdGhydVBsdWdJbjo6b25HZXREcm1PYmplY3RUeXBlKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXREcm1PYmplY3RUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0RHJtT2JqZWN0VHlwZSgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OlVOS05PV047CiB9CiAKIGludCBEcm1QYXNzdGhydVBsdWdJbjo6b25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2hlY2tSaWdodHNTdGF0dXMoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DaGVja1JpZ2h0c1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgaW50IHJpZ2h0c1N0YXR1cyA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEOwogICAgIHJldHVybiByaWdodHNTdGF0dXM7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogYm9vbCBEcm1QYXNzdGhydVBsdWdJbjo6b25WYWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uVmFsaWRhdGVBY3Rpb24oKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25WYWxpZGF0ZUFjdGlvbigpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25SZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZUFsbFJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZUFsbFJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuQ29udmVydFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuQ29udmVydFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIERybUNvbnZlcnRlZFN0YXR1cyogRHJtUGFzc3RocnVQbHVnSW46Om9uQ29udmVydERhdGEoCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnZlcnREYXRhKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29udmVydERhdGEoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIERybUJ1ZmZlciogY29udmVydGVkRGF0YSA9IE5VTEw7CiAKICAgICBpZiAoTlVMTCAhPSBpbnB1dERhdGEgJiYgMCA8IGlucHV0RGF0YS0+bGVuZ3RoKSB7CkBAIC0yMjksMTMgKzIyOSwxMyBAQAogfQogCiBEcm1Db252ZXJ0ZWRTdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlQ29udmVydFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZUNvbnZlcnRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gbmV3IERybUNvbnZlcnRlZFN0YXR1cyhEcm1Db252ZXJ0ZWRTdGF0dXM6OlNUQVRVU19PSywgTlVMTCwgMCAvKm9mZnNldCovKTsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KICAgICBkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSA9IFN0cmluZzgoInZpZGVvL3Bhc3N0aHJ1Iik7CkBAIC0yNTQsNyArMjU0LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKICAgICAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKICAgICAgICAgICAgIGRlbGV0ZSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbzsgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwpAQCAtMjY2LDM0ICsyNjYsNDAgQEAKIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKLSAgICBBTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KICAgICAgKiBlbmNyeXB0ZWQgYnVmZmVyIGFzIGl0IGlzIHRvIGRlY3J5cHRlZCBidWZmZXIuIE5vdGUsIGRlY0J1ZmZlcgogICAgICAqIG1lbW9yeSBoYXMgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCiAgICAgICovCiAgICAgaWYgKE5VTEwgIT0gKCpkZWNCdWZmZXIpICYmIDAgPCAoKmRlY0J1ZmZlciktPmxlbmd0aCkgewotICAgICAgICBtZW1jcHkoKCpkZWNCdWZmZXIpLT5kYXRhLCBlbmNCdWZmZXItPmRhdGEsIGVuY0J1ZmZlci0+bGVuZ3RoKTsKLSAgICAgICAgKCpkZWNCdWZmZXIpLT5sZW5ndGggPSBlbmNCdWZmZXItPmxlbmd0aDsKKyAgICAgICAgaWYgKCgqZGVjQnVmZmVyKS0+bGVuZ3RoID49IGVuY0J1ZmZlci0+bGVuZ3RoKSB7CisgICAgICAgICAgICBtZW1jcHkoKCpkZWNCdWZmZXIpLT5kYXRhLCBlbmNCdWZmZXItPmRhdGEsIGVuY0J1ZmZlci0+bGVuZ3RoKTsKKyAgICAgICAgICAgICgqZGVjQnVmZmVyKS0+bGVuZ3RoID0gZW5jQnVmZmVyLT5sZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiZGVjQnVmZmVyIHNpemUgKCVkKSB0b28gc21hbGwgdG8gaG9sZCAlZCBieXRlcyIsCisgICAgICAgICAgICAgICAgKCpkZWNCdWZmZXIpLT5sZW5ndGgsIGVuY0J1ZmZlci0+bGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewotICAgIEFMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgQUxPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaAppbmRleCBhNTk2NzdhLi43OTc3YzIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmgKQEAgLTY1LDcgKzY1LDcgQEAKICAqICAgICAgYi4gSmF2YSBzZW5kcyBldmVudCB0aHJvdWdoIGRlZmF1bHQga2V5IGhhbmRsZXIuCiAgKiAgICAgIGMuIGV2ZW50IGlzIGZpbmlzaGVkLgogICovCi1zdHJ1Y3QgQUlucHV0UXVldWUgOiBwdWJsaWMgYW5kcm9pZDo6SW5wdXRFdmVudEZhY3RvcnlJbnRlcmZhY2Ugeworc3RydWN0IEFJbnB1dFF1ZXVlIHsKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgY29uc3VtZXIgYXNzb2NpYXRlZCB3aXRoIGFuIGlucHV0IGNoYW5uZWwuICovCiAgICAgZXhwbGljaXQgQUlucHV0UXVldWUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SW5wdXRDaGFubmVsPiYgY2hhbm5lbCwgaW50IHdvcmtXcml0ZSk7CkBAIC05NiwxNiArOTYsMTYgQEAKICAgICBhbmRyb2lkOjpLZXlFdmVudCogY29uc3VtZVVuaGFuZGxlZEV2ZW50KCk7CiAgICAgYW5kcm9pZDo6S2V5RXZlbnQqIGNvbnN1bWVQcmVEaXNwYXRjaGluZ0V2ZW50KGludCogb3V0U2VxKTsKIAotICAgIHZpcnR1YWwgYW5kcm9pZDo6S2V5RXZlbnQqIGNyZWF0ZUtleUV2ZW50KCk7Ci0gICAgdmlydHVhbCBhbmRyb2lkOjpNb3Rpb25FdmVudCogY3JlYXRlTW90aW9uRXZlbnQoKTsKKyAgICBhbmRyb2lkOjpLZXlFdmVudCogY3JlYXRlS2V5RXZlbnQoKTsKIAogICAgIGludCBtV29ya1dyaXRlOwogCiBwcml2YXRlOgogICAgIHZvaWQgZG9VbmhhbmRsZWRLZXkoYW5kcm9pZDo6S2V5RXZlbnQqIGtleUV2ZW50KTsKICAgICBib29sIHByZURpc3BhdGNoS2V5KGFuZHJvaWQ6OktleUV2ZW50KiBrZXlFdmVudCk7Ci0gICAgdm9pZCB3YWtldXBEaXNwYXRjaCgpOworICAgIHZvaWQgd2FrZXVwRGlzcGF0Y2hMb2NrZWQoKTsKIAorICAgIGFuZHJvaWQ6OlBvb2xlZElucHV0RXZlbnRGYWN0b3J5IG1Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeTsKICAgICBhbmRyb2lkOjpJbnB1dENvbnN1bWVyIG1Db25zdW1lcjsKICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+IG1Mb29wZXI7CiAKQEAgLTEyNywxMSArMTI3LDYgQEAKIAogICAgIGludCBtU2VxOwogCi0gICAgLy8gQ2FjaGUgb2YgcHJldmlvdXNseSBhbGxvY2F0ZWQga2V5IGV2ZW50cy4KLSAgICBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6S2V5RXZlbnQqPiBtQXZhaWxLZXlFdmVudHM7Ci0gICAgLy8gQ2FjaGUgb2YgcHJldmlvdXNseSBhbGxvY2F0ZWQgbW90aW9uIGV2ZW50cy4KLSAgICBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TW90aW9uRXZlbnQqPiBtQXZhaWxNb3Rpb25FdmVudHM7Ci0KICAgICAvLyBBbGwgaW5wdXQgZXZlbnRzIHRoYXQgYXJlIGFjdGl2ZWx5IGJlaW5nIHByb2Nlc3NlZC4KICAgICBhbmRyb2lkOjpWZWN0b3I8aW5fZmxpZ2h0X2V2ZW50PiBtSW5GbGlnaHRFdmVudHM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0LmggYi9pbmNsdWRlL2FuZHJvaWRmdy9JbnB1dC5oCmluZGV4IGY1ZGI2ZTI0Li5hNGViZDk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRmdy9JbnB1dC5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0LmgKQEAgLTYxNiw2ICs2MTYsMjYgQEAKIH07CiAKIC8qCisgKiBBbiBpbnB1dCBldmVudCBmYWN0b3J5IGltcGxlbWVudGF0aW9uIHRoYXQgbWFpbnRhaW5zIGEgcG9vbCBvZiBpbnB1dCBldmVudHMuCisgKi8KK2NsYXNzIFBvb2xlZElucHV0RXZlbnRGYWN0b3J5IDogcHVibGljIElucHV0RXZlbnRGYWN0b3J5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBQb29sZWRJbnB1dEV2ZW50RmFjdG9yeShzaXplX3QgbWF4UG9vbFNpemUgPSAyMCk7CisgICAgdmlydHVhbCB+UG9vbGVkSW5wdXRFdmVudEZhY3RvcnkoKTsKKworICAgIHZpcnR1YWwgS2V5RXZlbnQqIGNyZWF0ZUtleUV2ZW50KCk7CisgICAgdmlydHVhbCBNb3Rpb25FdmVudCogY3JlYXRlTW90aW9uRXZlbnQoKTsKKworICAgIHZvaWQgcmVjeWNsZShJbnB1dEV2ZW50KiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc2l6ZV90IG1NYXhQb29sU2l6ZTsKKworICAgIFZlY3RvcjxLZXlFdmVudCo+IG1LZXlFdmVudFBvb2w7CisgICAgVmVjdG9yPE1vdGlvbkV2ZW50Kj4gbU1vdGlvbkV2ZW50UG9vbDsKK307CisKKy8qCiAgKiBDYWxjdWxhdGVzIHRoZSB2ZWxvY2l0eSBvZiBwb2ludGVyIG1vdmVtZW50cyBvdmVyIHRpbWUuCiAgKi8KIGNsYXNzIFZlbG9jaXR5VHJhY2tlciB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRmdy9JbnB1dFRyYW5zcG9ydC5oIGIvaW5jbHVkZS9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuaAppbmRleCBhODQ2ZTY1Li4yOWMyOTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FuZHJvaWRmdy9JbnB1dFRyYW5zcG9ydC5oCisrKyBiL2luY2x1ZGUvYW5kcm9pZGZ3L0lucHV0VHJhbnNwb3J0LmgKQEAgLTI5Miw3ICsyOTIsMjkgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBzZW5kRmluaXNoZWRTaWduYWwodWludDMyX3Qgc2VxLCBib29sIGhhbmRsZWQpOwogCi0gICAgLyogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBiYXRjaC4gKi8KKyAgICAvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBkZWZlcnJlZCBldmVudCB3YWl0aW5nLgorICAgICAqCisgICAgICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGNvbnN1bWUoKSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgY29uc3VtZXIKKyAgICAgKiBoYXMgYSBkZWZlcnJlZCBldmVudCB0byBiZSBwcm9jZXNzZWQuICBEZWZlcnJlZCBldmVudHMgYXJlIHNvbWV3aGF0IHNwZWNpYWwgaW4KKyAgICAgKiB0aGF0IHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBjaGFubmVsLiAgSWYgdGhlIGlucHV0IGNoYW5uZWwKKyAgICAgKiBiZWNvbWVzIGVtcHR5LCB0aGUgY2xpZW50IG1heSBuZWVkIHRvIGRvIGV4dHJhIHdvcmsgdG8gZW5zdXJlIHRoYXQgaXQgcHJvY2Vzc2VzCisgICAgICogdGhlIGRlZmVycmVkIGV2ZW50IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGUgaW5wdHUgY2hhbm5lbCdzIGZpbGUgZGVzY3JpcHRvcgorICAgICAqIGlzIG5vdCByZWFkYWJsZS4KKyAgICAgKgorICAgICAqIE9uZSBvcHRpb24gaXMgc2ltcGx5IHRvIGNhbGwgY29uc3VtZSgpIGluIGEgbG9vcCB1bnRpbCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgorICAgICAqIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGFsbCBkZWZlcnJlZCBldmVudHMgd2lsbCBiZSBwcm9jZXNzZWQuCisgICAgICoKKyAgICAgKiBBbHRlcm5hdGVseSwgdGhlIGNhbGxlciBjYW4gY2FsbCBoYXNEZWZlcnJlZEV2ZW50KCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMKKyAgICAgKiBhIGRlZmVycmVkIGV2ZW50IHdhaXRpbmcgYW5kIHRoZW4gZW5zdXJlIHRoYXQgaXRzIGV2ZW50IGxvb3Agd2FrZXMgdXAgYXQgbGVhc3QKKyAgICAgKiBvbmUgbW9yZSB0aW1lIHRvIGNvbnN1bWUgdGhlIGRlZmVycmVkIGV2ZW50LgorICAgICAqLworICAgIGJvb2wgaGFzRGVmZXJyZWRFdmVudCgpIGNvbnN0OworCisgICAgLyogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBiYXRjaC4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgY2FsbGluZyBjb25zdW1lKCkgd2l0aCBjb25zdW1lQmF0Y2hlcyA9PSBmYWxzZSB0byBkZXRlcm1pbmUKKyAgICAgKiB3aGV0aGVyIGNvbnN1bWUoKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluIGxhdGVyIG9uIHdpdGggY29uc3VtZUJhdGNoZXMgPT0gdHJ1ZS4KKyAgICAgKi8KICAgICBib29sIGhhc1BlbmRpbmdCYXRjaCgpIGNvbnN0OwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKaW5kZXggNzg2OTAyMC4uMDg5YmUzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCkBAIC0zMiw3ICszMiw3IEBACiAKIGNsYXNzIElBdWRpb1JlY29yZCA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7Ci1wdWJsaWM6IAorcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQpOwogCiAgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KQEAgLTQyLDEzICs0MiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQocGlkX3QgdGlkKSA9IDA7CiAKICAgICAvKiBTdG9wIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAotICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkIAorICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCiAgICAgICogd2lsbCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmbHVzaCgpIGlzIGNhbGxlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7CiAKICAgICAvKiBnZXQgdGhpcyB0cmFja3MgY29udHJvbCBibG9jayAqLwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0ID0gMDsgICAgCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDc3ZjNlMjEuLjU3N2IwOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTMyLDcgKzMyLDcgQEAKIAogY2xhc3MgSUF1ZGlvVHJhY2sgOiBwdWJsaWMgSUludGVyZmFjZQogewotcHVibGljOiAKK3B1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvVHJhY2spOwogCiAgICAgLyogR2V0IHRoaXMgdHJhY2sncyBjb250cm9sIGJsb2NrICovCkBAIC00NSw3ICs0NSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChwaWRfdCB0aWQpID0gMDsKIAogICAgIC8qIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQgYW5kCi0gICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQgCisgICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQKICAgICAgKiB3aWxsIGNvbnRpbnVlIHRvIGJlIHByb2Nlc3NlZCwgdW5sZXNzL3VudGlsIGZsdXNoKCkgaXMgY2FsbGVkLgogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpID0gMDsKQEAgLTU5LDkgKzU5LDkgQEAKICAgICAgKiBXaGlsZSBtdXRlZCwgdGhlIGNhbGxiYWNrLCBpZiBzZXQsIGlzIHN0aWxsIGNhbGxlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG11dGUoYm9vbCkgPSAwOwotICAgIAorCiAgICAgLyogUGF1c2UgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQgYW5kCi0gICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQgCisgICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQKICAgICAgKiB3aWxsIGNvbnRpbnVlIHRvIGJlIHByb2Nlc3NlZCwgdW5sZXNzL3VudGlsIGZsdXNoKCkgaXMgY2FsbGVkLgogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggMWMxYzI2OC4uNmRiYjJkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtNTYsNCArNTYsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfSU1FRElBTUVUQURBVEFSRVRSSUVWRVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCAzOWQ1OGFiLi4wMGZhY2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBlbmRwb2ludCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgbmV4dCkgPSAwOwogCiAgICAgLy8gSW52b2tlIGEgZ2VuZXJpYyBtZXRob2Qgb24gdGhlIHBsYXllciBieSB1c2luZyBvcGFxdWUgcGFyY2VscwogICAgIC8vIGZvciB0aGUgcmVxdWVzdCBhbmQgcmVwbHkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaAppbmRleCBkYWVjMWM3Li44ZjE4NDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmgKQEAgLTQ1LDQgKzQ1LDMgQEAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0lNRURJQVBMQVlFUkNMSUVOVF9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCAwMDU4ZWYyLi5lN2QwMjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC00NSw0ICs0NSwzIEBACiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFSRUNPUkRFUkNMSUVOVF9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCmluZGV4IDQ5MWE5NTAuLjlmNmZmNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaApAQCAtNDAsMTMgKzQwLDEzIEBACiAgICAgc3RhdGljIGNvbnN0IGludCBKRVRfTlVNUVVFVUVEU0VHTUVOVF9VUERBVEUgPSAzOwogICAgIHN0YXRpYyBjb25zdCBpbnQgSkVUX1BBVVNFX1VQREFURSAgICAgICAgICAgID0gNDsKIAotICAgIEpldFBsYXllcihqb2JqZWN0IGphdmFKZXRQbGF5ZXIsIAotICAgICAgICAgICAgaW50IG1heFRyYWNrcyA9IDMyLCAKKyAgICBKZXRQbGF5ZXIoam9iamVjdCBqYXZhSmV0UGxheWVyLAorICAgICAgICAgICAgaW50IG1heFRyYWNrcyA9IDMyLAogICAgICAgICAgICAgaW50IHRyYWNrQnVmZmVyU2l6ZSA9IDEyMDApOwogICAgIH5KZXRQbGF5ZXIoKTsKICAgICBpbnQgaW5pdCgpOwogICAgIGludCByZWxlYXNlKCk7Ci0gICAgCisKICAgICBpbnQgbG9hZEZyb21GaWxlKGNvbnN0IGNoYXIqIHVybCk7CiAgICAgaW50IGxvYWRGcm9tRkQoY29uc3QgaW50IGZkLCBjb25zdCBsb25nIGxvbmcgb2Zmc2V0LCBjb25zdCBsb25nIGxvbmcgbGVuZ3RoKTsKICAgICBpbnQgY2xvc2VGaWxlKCk7CkBAIC02MCw3ICs2MCw3IEBACiAgICAgaW50IGNsZWFyUXVldWUoKTsKIAogICAgIHZvaWQgc2V0RXZlbnRDYWxsYmFjayhqZXRldmVudF9jYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgCisKICAgICBpbnQgZ2V0TWF4VHJhY2tzKCkgeyByZXR1cm4gbU1heFRyYWNrczsgfTsKIAogCkBAIC04OCw3ICs4OCw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICBtTWF4VHJhY2tzOyAvLyBtYXggbnVtYmVyIG9mIE1JREkgdHJhY2tzLCB1c3VhbGx5IDMyCiAgICAgRUFTX0RBVEFfSEFORExFICAgICBtRWFzRGF0YTsKICAgICBFQVNfRklMRV9MT0NBVE9SICAgIG1FYXNKZXRGaWxlTG9jOwotICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOy8vIEVBUyByZW5kZXJzIHRoZSBNSURJIGRhdGEgaW50byB0aGlzIGJ1ZmZlciwgCisgICAgRUFTX1BDTSogICAgICAgICAgICBtQXVkaW9CdWZmZXI7Ly8gRUFTIHJlbmRlcnMgdGhlIE1JREkgZGF0YSBpbnRvIHRoaXMgYnVmZmVyLAogICAgIEF1ZGlvVHJhY2sqICAgICAgICAgbUF1ZGlvVHJhY2s7IC8vIGFuZCB3ZSBwbGF5IGl0IGluIHRoaXMgYXVkaW8gdHJhY2sKICAgICBpbnQgICAgICAgICAgICAgICAgIG1UcmFja0J1ZmZlclNpemU7CiAgICAgU19KRVRfU1RBVFVTICAgICAgICBtSmV0U3RhdHVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAppbmRleCAyN2I3ZTRkLi5lY2MzYjY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAqKgotKiogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgCisqKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNTYsNCArNTYsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFNRVRBREFUQVJFVFJJRVZFUklOVEVSRkFDRV9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCA4MTY4ZGZmLi5kNGFhMjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBjbG9zZSgpID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZSkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsgcmV0dXJuIHRydWU7IH0KICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UoKSA6IG1Db29raWUoMCksIG1Ob3RpZnkoMCkge30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggMjUwZjI2Ny4uOWZjOTYyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTUxNiw0ICs1MTYsMyBAQAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfTUVESUFQUk9GSUxFU19ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oIGIvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKaW5kZXggYWMwZjZiMi4uZDI2MThhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKQEAgLTEsNCArMSwzIEBACi0KIC8qCiAgKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA5Y2Q1ZjlmLi42NjJkZDEzYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTk2LDYgKzk2LDkgQEAKIGVudW0gbWVkaWFfaW5mb190eXBlIHsKICAgICAvLyAweHgKICAgICBNRURJQV9JTkZPX1VOS05PV04gPSAxLAorICAgIC8vIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKKyAgICAvLyBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrCisgICAgTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAogICAgIC8vIDd4eAogICAgIC8vIFRoZSB2aWRlbyBpcyB0b28gY29tcGxleCBmb3IgdGhlIGRlY29kZXI6IGl0IGNhbid0IGRlY29kZSBmcmFtZXMgZmFzdAogICAgIC8vIGVub3VnaC4gUG9zc2libHkgb25seSB0aGUgYXVkaW8gcGxheXMgZmluZSBhdCB0aGlzIHN0YWdlLgpAQCAtMjA3LDYgKzIxMCw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBjaGFyKiBhZGRyU3RyaW5nLCB1aW50MTZfdCBwb3J0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSGFyZHdhcmVBUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlZmQzNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSEFSRFdBUkVfQVBJX0hfCi0KLSNkZWZpbmUgSEFSRFdBUkVfQVBJX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIHRoZSBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgotLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzJyBleHRlbnNpb24KLS8vIGlzIGdpdmVuLgotLy8KLS8vIFdoZW4gQW5kcm9pZCBuYXRpdmUgYnVmZmVyIHVzZSBpcyBkaXNhYmxlZCBmb3IgYSBwb3J0ICh0aGUgZGVmYXVsdCBzdGF0ZSksCi0vLyB0aGUgT01YIG5vZGUgc2hvdWxkIG9wZXJhdGUgYXMgbm9ybWFsLCBhbmQgZXhwZWN0IFVzZUJ1ZmZlciBjYWxscyB0byBzZXQgaXRzCi0vLyBidWZmZXJzLiAgVGhpcyBpcyB0aGUgbW9kZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIENQVSBhY2Nlc3MgdG8gdGhlIGJ1ZmZlciBpcwotLy8gcmVxdWlyZWQuCi0vLwotLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGhhcyBiZWVuIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gcG9ydCwgdGhlIHZpZGVvCi0vLyBjb2xvciBmb3JtYXQgZm9yIHRoZSBwb3J0IGlzIHRvIGJlIGludGVycHJldGVkIGFzIGFuIEFuZHJvaWQgcGl4ZWwgZm9ybWF0Ci0vLyByYXRoZXIgdGhhbiBhbiBPTVggY29sb3IgZm9ybWF0LiAgVGhlIG5vZGUgc2hvdWxkIHRoZW4gZXhwZWN0IHRvIHJlY2VpdmUKLS8vIFVzZUFuZHJvaWROYXRpdmVCdWZmZXIgY2FsbHMgKHZpYSBPTVhfU2V0UGFyYW1ldGVyKSByYXRoZXIgdGhhbiBVc2VCdWZmZXIKLS8vIGNhbGxzIGZvciB0aGF0IHBvcnQuCi1zdHJ1Y3QgRW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBlbmFibGU7Ci19OwotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIoKSB3aGVuIHRoZSBleHRlbnNpb24KLS8vIGluZGV4ICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIKLS8vIGlzIGdpdmVuLgotLy8KLS8vIFdoZW4gbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgdmlkZW8gYnVmZmVycyBwYXNzZWQgYmV0d2VlbiBPTVggY2xpZW50cwotLy8gYW5kIE9NWCBjb21wb25lbnRzLCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnVmZmVyIGRhdGEgaXMgdXAgdG8gdGhlCi0vLyBidWZmZXIgcmVjZWl2ZXIsIGFuZCB0aGUgZGF0YSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgYWN0dWFsIHZpZGVvIGRhdGEsIGJ1dAotLy8gc29tZSBpbmZvcm1hdGlvbiBoZWxwZnVsIGZvciB0aGUgcmVjZWl2ZXIgdG8gbG9jYXRlIHRoZSBhY3R1YWwgZGF0YS4KLS8vIFRoZSBidWZmZXIgcmVjZWl2ZXIgdGh1cyBuZWVkcyB0byBrbm93IGhvdyB0byBpbnRlcnByZXQgd2hhdCBpcyBzdG9yZWQKLS8vIGluIHRoZXNlIGJ1ZmZlcnMsIHdpdGggbWVjaGFuaXNtcyBwcmUtZGV0ZXJtaW5lZCBleHRlcm5hbGx5LiBIb3cgdG8KLS8vIGludGVycHJldCB0aGUgbWV0YSBkYXRhIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgbWV0aG9kLgotLy8KLS8vIEN1cnJlbnRseSwgdGhpcyBpcyBzcGVjaWZpY2FsbHkgdXNlZCB0byBwYXNzIG1ldGEgZGF0YSBmcm9tIHZpZGVvIHNvdXJjZQotLy8gKGNhbWVyYSBjb21wb25lbnQsIGZvciBpbnN0YW5jZSkgdG8gdmlkZW8gZW5jb2RlciB0byBhdm9pZCBtZW1jcHlpbmcgb2YKLS8vIGlucHV0IHZpZGVvIGZyYW1lIGRhdGEuIFRvIGRvIHRoaXMsIGJTdG9yZU1ldGFEdGEgaXMgc2V0IHRvIE9NWF9UUlVFLgotLy8gSWYgYlN0b3JlTWV0YURhdGEgaXMgc2V0IHRvIGZhbHNlLCByZWFsIFlVViBmcmFtZSBkYXRhIHdpbGwgYmUgc3RvcmVkCi0vLyBpbiB0aGUgYnVmZmVycy4gSW4gYWRkaXRpb24sIGlmIG5vIE9NWF9TZXRQYXJhbWV0ZXIoKSBjYWxsIGlzIG1hZGUKLS8vIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uIGluZGV4LCByZWFsIFlVViBkYXRhIGlzIHN0b3JlZAotLy8gaW4gdGhlIGJ1ZmZlcnMuCi1zdHJ1Y3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJTdG9yZU1ldGFEYXRhOwotfTsKLQotLy8gQSBwb2ludGVyIHRvIHRoaXMgc3RydWN0IGlzIHBhc3NlZCB0byBPTVhfU2V0UGFyYW1ldGVyIHdoZW4gdGhlIGV4dGVuc2lvbgotLy8gaW5kZXggZm9yIHRoZSAnT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXInIGV4dGVuc2lvbiBpcwotLy8gZ2l2ZW4uICBUaGlzIGNhbGwgd2lsbCBvbmx5IGJlIHBlcmZvcm1lZCBpZiBhIHByaW9yIGNhbGwgd2FzIG1hZGUgd2l0aCB0aGUKLS8vICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbiBpbmRleCwKLS8vIGVuYWJsaW5nIHVzZSBvZiBBbmRyb2lkIG5hdGl2ZSBidWZmZXJzLgotc3RydWN0IFVzZUFuZHJvaWROYXRpdmVCdWZmZXJQYXJhbXMgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUFRSIHBBcHBQcml2YXRlOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVySGVhZGVyOwotICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dCdWZmZXI+JiBuYXRpdmVCdWZmZXI7Ci19OwotCi0vLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9HZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCi0vLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZ2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlJwotLy8gZXh0ZW5zaW9uIGlzIGdpdmVuLiAgVGhlIHVzYWdlIGJpdHMgcmV0dXJuZWQgZnJvbSB0aGlzIHF1ZXJ5IHdpbGwgYmUgdXNlZCB0bwotLy8gYWxsb2NhdGUgdGhlIEdyYWxsb2MgYnVmZmVycyB0aGF0IGdldCBwYXNzZWQgdG8gdGhlIHVzZUFuZHJvaWROYXRpdmVCdWZmZXIKLS8vIGNvbW1hbmQuCi1zdHJ1Y3QgR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlclVzYWdlUGFyYW1zIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLy8gSU4KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLy8gSU4KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLy8gSU4KLSAgICBPTVhfVTMyIG5Vc2FnZTsgICAgICAgICAgICAgLy8gT1VUCi19OwotCi0vLyBBbiBlbnVtIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlIHRvIGluZGljYXRlIGFuIG9wYXF1ZSBjb2xvcmZvcm1hdAotLy8gaXMgZGVjbGFyZWQgaW4gbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAotLy8gVGhpcyB3aWxsIGluZm9ybSB0aGUgZW5jb2RlciB0aGF0IHRoZSBhY3R1YWwKLS8vIGNvbG9yZm9ybWF0IHdpbGwgYmUgcmVsYXllZCBieSB0aGUgR1JhbGxvYyBCdWZmZXJzLgotLy8gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgID0gMHg3RjAwMDAwMSwKLQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1leHRlcm4gYW5kcm9pZDo6T01YUGx1Z2luQmFzZSAqY3JlYXRlT01YUGx1Z2luKCk7Ci0KLSNlbmRpZiAgLy8gSEFSRFdBUkVfQVBJX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhZGF0YUJ1ZmZlclR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZjhhYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFkYXRhQnVmZmVyVHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQURBVEFfQlVGRkVSX1RZUEVfSAotI2RlZmluZSBNRVRBREFUQV9CVUZGRVJfVFlQRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0jZW5kaWYKLQotLyoKLSAqIE1ldGFkYXRhQnVmZmVyVHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXJzIHRoYXQKLSAqIGNhbiBiZSBwYXNzZWQgdG8gdmlkZW8gZW5jb2RlciBjb21wb25lbnQgZm9yIGVuY29kaW5nLCB2aWEgU3RhZ2VmcmlnaHQKLSAqIG1lZGlhIHJlY29yZGluZyBmcmFtZXdvcmsuIFRvIHNlZSBob3cgdG8gd29yayB3aXRoIHRoZSBtZXRhZGF0YSBidWZmZXJzCi0gKiBpbiBtZWRpYSByZWNvcmRpbmcgZnJhbWV3b3JrLCBwbGVhc2UgY29uc3VsdCBIYXJkd2FyZUFQSS5oCi0gKgotICogVGhlIGNyZWF0b3Igb2YgbWV0YWRhdGEgYnVmZmVycyBhbmQgdmlkZW8gZW5jb2RlciBzaGFyZSBjb21tb24ga25vd2xlZGdlCi0gKiBvbiB3aGF0IGlzIGFjdHVhbGx5IGJlaW5nIHN0b3JlZCBpbiB0aGVzZSBtZXRhZGF0YSBidWZmZXJzLCBhbmQKLSAqIGhvdyB0aGUgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIgY29tcG9uZW50Ci0gKiB0byBsb2NhdGUgdGhlIGFjdHVhbCBwaXhlbCBkYXRhIGFzIHRoZSBzb3VyY2UgaW5wdXQgZm9yIHZpZGVvCi0gKiBlbmNvZGVyLCBwbHVzIHdoYXRldmVyIG90aGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVjZXNzYXJ5LiBTdGFnZWZyaWdodAotICogbWVkaWEgcmVjb3JkaW5nIGZyYW1ld29yayBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgc3BlY2lmaWMgYWJvdXQgdGhlCi0gKiBtZXRhZGF0YSBidWZmZXJzLCBleGNlcHQgZm9yIHJlY2V2aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXRhZGF0YSBidWZmZXIKLSAqIGFzIHRoZSBzb3VyY2UgaW5wdXQsIG1ha2luZyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHBhc3NpbmcgdGhlCi0gKiBjb3B5IHZpYSBPcGVuTUFYIEFQSSB0byB0aGUgdmlkZW8gZW5jb2RlciBjb21wb25lbnQuCi0gKgotICogVGhlIGNyZWF0b3Igb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlcnMgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QKLSAqIDQgYnl0ZXMgaW4gZXZlcnkgbWV0YWRhdGEgYnVmZmVyIGluZGljYXRlcyBpdHMgYnVmZmVyIHR5cGUsCi0gKiBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciBjb250YWlucyB0aGUKLSAqIGFjdHVhbCBtZXRhZGF0YSBpbmZvcm1hdGlvbi4gV2hlbiBhIHZpZGVvIGVuY29kZXIgY29tcG9uZW50IHJlY2VpdmVzCi0gKiBhIG1ldGFkYXRhIGJ1ZmZlciwgaXQgdXNlcyB0aGUgZmlyc3QgNCBieXRlcyBpbiB0aGF0IGJ1ZmZlciB0byBmaW5kCi0gKiBvdXQgdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhIGJ1ZmZlciwgYW5kIHRha2VzIGFjdGlvbiBhcHByb3ByaWF0ZQotICogdG8gdGhhdCB0eXBlIG9mIG1ldGFkYXRhIGJ1ZmZlcnMgKGZvciBpbnN0YW5jZSwgbG9jYXRlIHRoZSBhY3R1YWwKLSAqIHBpeGVsIGRhdGEgaW5wdXQgYW5kIHRoZW4gZW5jb2RpbmcgdGhlIGlucHV0IGRhdGEgdG8gcHJvZHVjZSBhCi0gKiBjb21wcmVzc2VkIG91dHB1dCBidWZmZXIpLgotICoKLSAqIFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGxheW91dCBvZiBhIG1ldGFkYXRhIGJ1ZmZlciwKLSAqIHdoZXJlIGJ1ZmZlciB0eXBlIGlzIGEgNC1ieXRlIGZpZWxkIG9mIE1ldGFkYXRhQnVmZmVyVHlwZSwKLSAqIGFuZCB0aGUgcGF5bG9hZCBpcyB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24uCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgIGJ1ZmZlciB0eXBlICB8ICAgICAgICAgIHBheWxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqLwotdHlwZWRlZiBlbnVtIHsKLQotICAgIC8qCi0gICAgICoga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKLSAgICAgKiB0aGUgc291cmNlIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaXMgdGhlIGNhbWVyYSBjb21wb25lbnQuCi0gICAgICovCi0gICAga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSAgPSAwLAotCi0gICAgLyoKLSAgICAgKiBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQKLSAgICAgKiB0aGUgcGF5bG9hZCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMKLSAgICAgKiBhIGJ1ZmZlcl9oYW5kbGVfdC4KLSAgICAgKiBTbyBpbiB0aGlzIGNhc2UsdGhlIG1ldGFkYXRhIHRoYXQgdGhlIGVuY29kZXIgcmVjZWl2ZXMKLSAgICAgKiB3aWxsIGhhdmUgYSBieXRlIHN0cmVhbSB0aGF0IGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgKiAxLiBGaXJzdCwgdGhlcmUgaXMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgYSBHUkFsbG9jCi0gICAgICogc291cmNlIChrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkKLSAgICAgKiAyLiBUaGlzIGlzIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJfaGFuZGxlX3QgdGhhdCBpcyBhIGhhbmRsZSB0byB0aGUKLSAgICAgKiBHUmFsbG9jIGJ1ZmZlci4gVGhlIGVuY29kZXIgbmVlZHMgdG8gaW50ZXJwcmV0IHRoaXMgR1JhbGxvYyBoYW5kbGUKLSAgICAgKiBhbmQgZW5jb2RlIHRoZSBmcmFtZXMuCi0gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiB8ICBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSB8IHNpemVvZihidWZmZXJfaGFuZGxlX3QpIHwKLSAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAqLwotICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlID0gMSwKLQotICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KLQotfSBNZXRhZGF0YUJ1ZmZlclR5cGU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIE1FVEFEQVRBX0JVRkZFUl9UWVBFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YUGx1Z2luQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDhlMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBPTVhfUExVR0lOX0JBU0VfSF8KLQotI2RlZmluZSBPTVhfUExVR0lOX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhDb21wb25lbnRCYXNlOwotCi1zdHJ1Y3QgT01YUGx1Z2luQmFzZSB7Ci0gICAgT01YUGx1Z2luQmFzZSgpIHt9Ci0gICAgdmlydHVhbCB+T01YUGx1Z2luQmFzZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgPSAwOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIE9NWF9VMzIgaW5kZXgpID0gMDsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpID0gMDsKLQotcHJpdmF0ZToKLSAgICBPTVhQbHVnaW5CYXNlKGNvbnN0IE9NWFBsdWdpbkJhc2UgJik7Ci0gICAgT01YUGx1Z2luQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE9NWFBsdWdpbkJhc2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9NWF9QTFVHSU5fQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9BdWRpby5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9BdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgyODQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIEBmaWxlIE9NWF9BdWRpby5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IEF1ZGlvIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW5taWx0cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9BdWRpb19oCi0jZGVmaW5lIE9NWF9BdWRpb19oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9Db3JlLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgbWlkaSBNSURJCi0gKiBAaW5ncm91cCBhdWRpbwotICovCi0gCi0vKiogQGRlZmdyb3VwIGVmZmVjdHMgQXVkaW8gZWZmZWN0cwotICogQGluZ3JvdXAgYXVkaW8KLSAqLwotCi0vKiogQGRlZmdyb3VwIGF1ZGlvIE9wZW5NQVggSUwgQXVkaW8gRG9tYWluCi0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEF1ZGlvIGRvbWFpbgotICogQHsKLSAqLwotCi0vKiogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGF1ZGlvIGNvZGluZ3MuICAKLSAqICBJZiAiT01YX0FVRElPX0NvZGluZ1VudXNlZCIgaXMgc2VsZWN0ZWQsIHRoZSBjb2Rpbmcgc2VsZWN0aW9uIG11c3QgCi0gKiAgYmUgZG9uZSBpbiBhIHZlbmRvciBzcGVjaWZpYyB3YXkuICBTaW5jZSB0aGlzIGlzIGZvciBhbiBhdWRpbyAKLSAqICBwcm9jZXNzaW5nIGVsZW1lbnQgdGhpcyBlbnVtIGlzIHJlbGV2YW50LiAgSG93ZXZlciwgZm9yIGFub3RoZXIgCi0gKiAgdHlwZSBvZiBjb21wb25lbnQgb3RoZXIgZW51bXMgd291bGQgYmUgaW4gdGhpcyBhcmVhLgotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NPRElOR1RZUEUgewotICAgIE9NWF9BVURJT19Db2RpbmdVbnVzZWQgPSAwLCAgLyoqPCBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGNvZGluZyBpcyBOL0EgICovCi0gICAgT01YX0FVRElPX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IGF1dG8gZGV0ZWN0aW9uIG9mIGF1ZGlvIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQQ00sICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQQ00gY29kaW5nICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FEUENNLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFEUENNIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdBTVIsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBTVIgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBmdWxscmF0ZSAoaS5lLiBHU002MTApICovCi0gICAgT01YX0FVRElPX0NvZGluZ0dTTUVGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEqLwotICAgIE9NWF9BVURJT19Db2RpbmdHU01IUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1BEQ0ZSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nUERDRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdQRENIUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgSGFsZnJhdGUgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1RETUFGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MjApICovCi0gICAgT01YX0FVRElPX0NvZGluZ1RETUFFRlIsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFRETUEgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhIChUSUEvRUlBLTEzNi00MTApICovCi0gICAgT01YX0FVRElPX0NvZGluZ1FDRUxQOCwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDhrYnBzIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdRQ0VMUDEzLCAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBRQ0VMUCAxM2ticHMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0VWUkMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEVWUkMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1NNViwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNNViBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcxMSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MTEgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0c3MjMsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzIzIGRvdCAxIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdHNzI2LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyNiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nRzcyOSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjkgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ0FBQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFBQyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nTVAzLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTVAzIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdTQkMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBTQkMgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0NvZGluZ1ZPUkJJUywgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFZPUkJJUyBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nV01BLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgV01BIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdSQSwgICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBSQSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nTUlESSwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgTUlESSBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19DT0RJTkdUWVBFOwotCi0KLS8qKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqICBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBhdWRpbyAKLSAqICBwYXRoLiAgSWYgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQotICogIHBvcnQgKHN1Y2ggYXMgZnJlcXVlbmN5KSwgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIG11c3QgYmUgc2VudCBzdWNoIGFzIHRoZQotICogIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBzdHJ1Y3R1cmUgdG8gc3VwcGx5IHRoZSBleHRyYSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9ydC4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1NUUklORyBjTUlNRVR5cGU7ICAgICAgICAgICAgLyoqPCBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQgKi8KLSAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsgLyoqIDwgcGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBvdXRwdXQgZGV2aWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMCAqLwotICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsgIC8qKjwgVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIE9NWCBjb21wb25lbnQgKi8KLSAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLwotfSBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFOwotCi0KLS8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKLSAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldCAqLwotICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLwotICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgcG9ydCAoZS5nLiBQQ00sIEFNUiwgTVAzLCBldGMpICovCi19IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRTsKLQotCi0vKiogUENNIG1vZGUgdHlwZSAgKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX1BDTU1PREVUWVBFIHsgCi0gICAgT01YX0FVRElPX1BDTU1vZGVMaW5lYXIgPSAwLCAgLyoqPCBMaW5lYXIgUENNIGVuY29kZWQgZGF0YSAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZUFMYXcsICAgICAgICAvKio8IEEgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAqLyAKLSAgICBPTVhfQVVESU9fUENNTW9kZU1VTGF3LCAgICAgICAvKio8IE11IGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fUENNTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19QQ01NT0RFVFlQRTsgCi0KLQotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMVFlQRSB7Ci0gICAgT01YX0FVRElPX0NoYW5uZWxOb25lID0gMHgwLCAgICAvKio8IFVudXNlZCBvciBlbXB0eSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTEYgICA9IDB4MSwgICAgLyoqPCBMZWZ0IGZyb250ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxSRiAgID0gMHgyLCAgICAvKio8IFJpZ2h0IGZyb250ICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxDRiAgID0gMHgzLCAgICAvKio8IENlbnRlciBmcm9udCAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTFMgICA9IDB4NCwgICAgLyoqPCBMZWZ0IHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxSUyAgID0gMHg1LCAgICAvKio8IFJpZ2h0IHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMRkUgID0gMHg2LCAgICAvKio8IExvdyBmcmVxdWVuY3kgZWZmZWN0cyAqLwotICAgIE9NWF9BVURJT19DaGFubmVsQ1MgICA9IDB4NywgICAgLyoqPCBCYWNrIHN1cnJvdW5kICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxMUiAgID0gMHg4LCAgICAvKio8IExlZnQgcmVhci4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbFJSICAgPSAweDksICAgIC8qKjwgUmlnaHQgcmVhci4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ2hhbm5lbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNYXggID0gMHg3RkZGRkZGRiAKLX0gT01YX0FVRElPX0NIQU5ORUxUWVBFOwotCi0jZGVmaW5lIE9NWF9BVURJT19NQVhDSEFOTkVMUyAxNiAgLyoqPCBtYXhpbXVtIG51bWJlciBkaXN0aW5jdCBhdWRpbyBjaGFubmVscyB0aGF0IGEgYnVmZmVyIG1heSBjb250YWluICovCi0jZGVmaW5lIE9NWF9NSU5fUENNUEFZTE9BRF9NU0VDIDUgLyoqPCBNaW5pbXVtIGF1ZGlvIGJ1ZmZlciBwYXlsb2FkIHNpemUgZm9yIHVuY29tcHJlc3NlZCAoUENNKSBhdWRpbyAqLwotCi0vKiogUENNIGZvcm1hdCBkZXNjcmlwdGlvbiAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIChlLmcuIDIgZm9yIHN0ZXJlbykgKi8gCi0gICAgT01YX05VTUVSSUNBTERBVEFUWVBFIGVOdW1EYXRhOyAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIHNpZ25lZCBvciB1bnNpZ25lZCAqLyAKLSAgICBPTVhfRU5ESUFOVFlQRSBlRW5kaWFuOyAgICAgICAgICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgbGl0dGxlIG9yIGJpZyBlbmRpYW4gKi8gCi0gICAgT01YX0JPT0wgYkludGVybGVhdmVkOyAgICAgICAgICAgIC8qKjwgVHJ1ZSBmb3Igbm9ybWFsIGludGVybGVhdmVkIGRhdGE7IGZhbHNlIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24taW50ZXJsZWF2ZWQgZGF0YSAoZS5nLiBibG9jayBkYXRhKSAqLyAKLSAgICBPTVhfVTMyIG5CaXRQZXJTYW1wbGU7ICAgICAgICAgICAgLyoqPCBCaXQgcGVyIHNhbXBsZSAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovIAotICAgIE9NWF9BVURJT19QQ01NT0RFVFlQRSBlUENNTW9kZTsgICAvKio8IFBDTSBtb2RlIGVudW1lcmF0aW9uICovIAotICAgIE9NWF9BVURJT19DSEFOTkVMVFlQRSBlQ2hhbm5lbE1hcHBpbmdbT01YX0FVRElPX01BWENIQU5ORUxTXTsgLyoqPCBTbG90IGkgY29udGFpbnMgY2hhbm5lbCBkZWZpbmVkIGJ5IGVDaGFubmVsTWFwW2ldICovCi0KLX0gT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFOyAKLQotCi0vKiogQXVkaW8gY2hhbm5lbCBtb2RlLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggQUFDIGFuZCBNUDMsIGFsdGhvdWdoIHRoZSBuYW1lcyBhcmUgbW9yZSBhcHByb3ByaWF0ZQotICogZm9yIHRoZSBNUDMuICBGb3IgZXhhbXBsZSwgSm9pbnRTdGVyZW8gZm9yIE1QMyBpcyBDb3VwbGluZ0NoYW5uZWxzIGZvciBBQUMuIAotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSB7Ci0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvID0gMCwgIC8qKjwgMiBjaGFubmVscywgdGhlIGJpdHJhdGUgYWxsb2NhdGlvbiBiZXR3ZWVuIHRob3NlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIGNoYW5uZWxzIGNoYW5nZXMgYWNjb3JkaW5nbHkgdG8gZWFjaCBjaGFubmVsIGluZm9ybWF0aW9uICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlSm9pbnRTdGVyZW8sIC8qKjwgbW9kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB3aGF0IGlzIGNvbW1vbiBiZXR3ZWVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgY2hhbm5lbHMgZm9yIGhpZ2hlciBjb21wcmVzc2lvbiBnYWluICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlRHVhbCwgICAgICAgIC8qKjwgMiBtb25vLWNoYW5uZWxzLCBlYWNoIGNoYW5uZWwgaXMgZW5jb2RlZCB3aXRoIGhhbGYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHJhdGUgb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1vbm8sICAgICAgICAvKio8IE1vbm8gY2hhbm5lbCBtb2RlICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0NoYW5uZWxNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFOwotCi0KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSB7Ci0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMUxheWVyMyA9IDAsIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyTGF5ZXIzLCAgICAgLyoqPCBNUDMgQXVkaW8gTVBFRyAyIExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDJfNUxheWVyMywgICAvKio8IE1QMyBBdWRpbyBNUEVHMi41IExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLwotICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEU7Ci0KLS8qKiBNUDMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCi0gICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAgICAgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBNUDMgc3RyZWFtIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRTsKLQotCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgewotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDJBRFRTID0gMCwgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDIgZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMsICAgICAvKio8IEFBQyBBdWRpbyBEYXRhIFRyYW5zcG9ydCBTdHJlYW0gNCBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TE9BUywgICAgIC8qKjwgQUFDIExvdyBPdmVyaGVhZCBBdWRpbyBTdHJlYW0gZm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExBVE0sICAgICAvKio8IEFBQyBMb3cgb3ZlcmhlYWQgQXVkaW8gVHJhbnNwb3J0IE11bHRpcGxleCAqLwotICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRBRElGLCAgICAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBJbnRlcmNoYW5nZSBGb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkYsICAgICAgIC8qKjwgQUFDIGluc2lkZSBNUEVHLTQvSVNPIEZpbGUgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFJBVywgICAgICAgICAvKio8IEFBQyBSYXcgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRTsKLQotCi0vKiogQUFDIG1vZGUgdHlwZS4gIE5vdGUgdGhhdCB0aGUgdGVybSBwcm9maWxlIGlzIHVzZWQgd2l0aCB0aGUgTVBFRy0yCi0gKiBzdGFuZGFyZCBhbmQgdGhlIHRlcm0gb2JqZWN0IHR5cGUgYW5kIHByb2ZpbGUgaXMgdXNlZCB3aXRoIE1QRUctNCAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRXsKLSAgT01YX0FVRElPX0FBQ09iamVjdE51bGwgPSAwLCAgICAgIC8qKjwgTnVsbCwgbm90IHVzZWQgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdE1haW4gPSAxLCAgICAgIC8qKjwgQUFDIE1haW4gb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RMQywgICAgICAgICAgICAvKio8IEFBQyBMb3cgQ29tcGxleGl0eSBvYmplY3QgKEFBQyBwcm9maWxlKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0U1NSLCAgICAgICAgICAgLyoqPCBBQUMgU2NhbGFibGUgU2FtcGxlIFJhdGUgb2JqZWN0ICovCi0gIE9NWF9BVURJT19BQUNPYmplY3RMVFAsICAgICAgICAgICAvKio8IEFBQyBMb25nIFRlcm0gUHJlZGljdGlvbiBvYmplY3QgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgICAgICAgICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSAob2JqZWN0IHR5cGUgU0JSLCBIRS1BQUMgcHJvZmlsZSkgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdFNjYWxhYmxlLCAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIG9iamVjdCAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0RVJMQyA9IDE3LCAgICAgLyoqPCBFUiBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChFcnJvciBSZXNpbGllbnQgQUFDLUxDKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0TEQgPSAyMywgICAgICAgLyoqPCBBQUMgTG93IERlbGF5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50KSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMgPSAyOSwgICAgLyoqPCBBQUMgSGlnaCBFZmZpY2llbmN5IHdpdGggUGFyYW1ldHJpYyBTdGVyZW8gY29kaW5nIChIRS1BQUMgdjIsIG9iamVjdCB0eXBlIFBTKSAqLwotICBPTVhfQVVESU9fQUFDT2JqZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fQUFDT2JqZWN0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX0FBQ09iamVjdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFOwotCi0KLS8qKiBBQUMgdG9vbCB1c2FnZSAoZm9yIG5BQUN0b29scyBpbiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUpLgotICogUmVxdWlyZWQgZm9yIGVuY29kZXIgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uYWwgYXMgZGVjb2RlciBpbmZvIG91dHB1dC4KLSAqIEZvciBNUDMsIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgaXMgc3VmZmljaWVudC4gKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xOb25lIDB4MDAwMDAwMDAgLyoqPCBubyBBQUMgdG9vbHMgYWxsb3dlZCAoZW5jb2RlciBjb25maWcpIG9yIGFjdGl2ZSAoZGVjb2RlciBpbmZvIG91dHB1dCkgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xNUyAgIDB4MDAwMDAwMDEgLyoqPCBNUzogTWlkL3NpZGUgam9pbnQgY29kaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xJUyAgIDB4MDAwMDAwMDIgLyoqPCBJUzogSW50ZW5zaXR5IHN0ZXJlbyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sVE5TICAweDAwMDAwMDA0IC8qKjwgVE5TOiBUZW1wb3JhbCBOb2lzZSBTaGFwaW5nIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xQTlMgIDB4MDAwMDAwMDggLyoqPCBQTlM6IE1QRUctNCBQZXJjZXB0dWFsIE5vaXNlIHN1YnN0aXR1dGlvbiB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTFRQICAweDAwMDAwMDEwIC8qKjwgTFRQOiBNUEVHLTQgTG9uZyBUZXJtIFByZWRpY3Rpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbEFsbCAgMHg3RkZGRkZGRiAvKio8IGFsbCBBQUMgdG9vbHMgYWxsb3dlZCBvciBhY3RpdmUgKCovCi0KLS8qKiBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgKEVSKSB0b29sIHVzYWdlIChmb3IgbkFBQ0VSdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KLSAqIFJlcXVpcmVkIGZvciBFUiBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQgKi8KLSNkZWZpbmUgT01YX0FVRElPX0FBQ0VSTm9uZSAgMHgwMDAwMDAwMCAgLyoqPCBubyBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUlZDQjExIDB4MDAwMDAwMDEgIC8qKjwgVkNCMTE6IFZpcnR1YWwgQ29kZSBCb29rcyBmb3IgQUFDIHNlY3Rpb24gZGF0YSAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJSVkxDICAweDAwMDAwMDAyICAvKio8IFJWTEM6IFJldmVyc2libGUgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAqLwotI2RlZmluZSBPTVhfQVVESU9fQUFDRVJIQ1IgICAweDAwMDAwMDA0ICAvKio8IEhDUjogSHVmZm1hbiBDb2Rld29yZCBSZW9yZGVyaW5nICovCi0jZGVmaW5lIE9NWF9BVURJT19BQUNFUkFsbCAgIDB4N0ZGRkZGRkYgIC8qKjwgYWxsIEFBQyBFUiB0b29scyBhbGxvd2VkL3VzZWQgKi8KLQotCi0vKiogQUFDIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLwotICAgIE9NWF9VMzIgbkZyYW1lTGVuZ3RoOyAgICAgICAgICAvKio8IEZyYW1lIGxlbmd0aCAoaW4gYXVkaW8gc2FtcGxlcyBwZXIgY2hhbm5lbCkgb2YgdGhlIGNvZGVjLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSAxMDI0IG9yIDk2MCAoQUFDLUxDKSwgMjA0OCAoSEUtQUFDKSwgNDgwIG9yIDUxMiAoQUFDLUxEKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfVTMyIG5BQUN0b29sczsgICAgICAgICAgICAgLyoqPCBBQUMgdG9vbCB1c2FnZSAqLwotICAgIE9NWF9VMzIgbkFBQ0VSdG9vbHM7ICAgICAgICAgICAvKio8IE1QRUctNCBBQUMgZXJyb3IgcmVzaWxpZW5jZSB0b29sIHVzYWdlICovCi0gICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIGVBQUNQcm9maWxlOyAgIC8qKjwgQUFDIHByb2ZpbGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRSBlQUFDU3RyZWFtRm9ybWF0OyAvKio8IEFBQyBzdHJlYW0gZm9ybWF0IGVudW1lcmF0aW9uICovCi0gICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7ICAgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLX0gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFOwotCi0KLS8qKiBWT1JCSVMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgZW5jb2RlZCBkYXRhIGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcy4gRW5jb2RpbmcgaXMgc2V0IHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlIGNsb3Nlc3QgdG8gc3BlY2lmaWVkICB2YWx1ZSAoaW4gYnBzKSAqLwotICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgLyoqPCBTZXRzIG1pbmltdW0gYml0cmF0ZSAoaW4gYnBzKS4gKi8KLSAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtYXhpbXVtIGJpdHJhdGUgKGluIGJwcykuICovCi0KLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCi0gICAgT01YX1MzMiBuUXVhbGl0eTsJCSAgLyoqPCBTZXRzIGVuY29kaW5nIHF1YWxpdHkgdG8gbiwgYmV0d2VlbiAtMSAobG93KSBhbmQgMTAgKGhpZ2gpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbiwgdGVoIHF1YWxpdHkgbGV2ZWwgaXMgMy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIHF1YWxpdHkgcmFuZ2UgaXMgMCAtIDEwLiAqLwotICAgIE9NWF9CT09MIGJNYW5hZ2VkOwkJICAvKio8IFNldCAgYml0cmF0ZSAgbWFuYWdlbWVudCAgbW9kZS4gVGhpcyB0dXJucyBvZmYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbCBWQlIgZW5jb2RpbmcsIGJ1dCBhbGxvd3MgaGFyZCBvciBzb2Z0IGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMgdG8gYmUgZW5mb3JjZWQgYnkgdGhlIGVuY29kZXIuIFRoaXMgbW9kZSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2xvd2VyLCBhbmQgbWF5IGFsc28gYmUgbG93ZXIgcXVhbGl0eS4gSXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWZ1bCBmb3Igc3RyZWFtaW5nLiAqLwotICAgIE9NWF9CT09MIGJEb3dubWl4OwkJICAvKio8IERvd25taXggaW5wdXQgZnJvbSBzdGVyZW8gdG8gbW9ubyAoaGFzIG5vIGVmZmVjdCBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLXN0ZXJlbyBzdHJlYW1zKS4gVXNlZnVsIGZvciBsb3dlci1iaXRyYXRlIGVuY29kaW5nLiAqLyAgICAgCi19IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFOwotCi0KLS8qKiBXTUEgVmVyc2lvbiAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIHsKLSAgT01YX0FVRElPX1dNQUZvcm1hdFVudXNlZCA9IDAsIC8qKjwgZm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXQ3LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDcgKi8KLSAgT01YX0FVRElPX1dNQUZvcm1hdDgsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOCAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0OSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA5ICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19XTUFGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fV01BRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fV01BRk9STUFUVFlQRTsKLQotCi0vKiogV01BIFByb2ZpbGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgewotICBPTVhfQVVESU9fV01BUHJvZmlsZVVudXNlZCA9IDAsICAvKio8IHByb2ZpbGUgdW51c2VkIG9yIHVua25vd24gKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVMMSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwxICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlTDIsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMiAqLwotICBPTVhfQVVESU9fV01BUHJvZmlsZUwzLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDMgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9BVURJT19XTUFQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1dNQVByb2ZpbGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRTsKLQotCi0vKiogV01BIHBhcmFtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1dNQVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMTYgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLwotICAgIE9NWF9BVURJT19XTUFGT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLwotCU9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSBlUHJvZmlsZTsgIC8qKjwgUHJvZmlsZSBvZiBXTUEgc3RyZWFtIC8gZGF0YSAqLwotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLwotICAgIE9NWF9VMTYgbkJsb2NrQWxpZ247ICAgICAgLyoqPCBpcyB0aGUgYmxvY2sgYWxpZ25tZW50LCBvciBibG9jayBzaXplLCBpbiBieXRlcyBvZiB0aGUgYXVkaW8gY29kZWMgKi8KLSAgICBPTVhfVTE2IG5FbmNvZGVPcHRpb25zOyAgIC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLwotICAgIE9NWF9VMzIgblN1cGVyQmxvY2tBbGlnbjsgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCi19IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFOwotCi0vKiogCi0gKiBSZWFsQXVkaW8gZm9ybWF0Ci0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIHsKLSAgICBPTVhfQVVESU9fUkFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9BVURJT19SQTgsICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDggY29kZWMgKi8KLSAgICBPTVhfQVVESU9fUkE5LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA5IGNvZGVjICovCi0gICAgT01YX0FVRElPX1JBMTBfQUFDLCAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGNvZGVjIGZvciBiaXRyYXRlcyBvZiBtb3JlIHRoYW4gMTI4a2JwcyAqLwotICAgIE9NWF9BVURJT19SQTEwX0NPREVDLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIGNvZGVjIGZvciBiaXRyYXRlcyBsZXNzIHRoYW4gMTI4IGticHMgKi8KLSAgICBPTVhfQVVESU9fUkExMF9MT1NTTEVTUywgICAgICAvKio8IFJlYWxBdWRpbyBMb3NzbGVzcyAqLwotICAgIE9NWF9BVURJT19SQTEwX01VTFRJQ0hBTk5FTCwgIC8qKjwgUmVhbEF1ZGlvIE11bHRpY2hhbm5lbCAqLwotICAgIE9NWF9BVURJT19SQTEwX1ZPSUNFLCAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIFZvaWNlIGZvciBiaXRyYXRlcyBiZWxvdyAxNSBrYnBzICovCi0gICAgT01YX0FVRElPX1JBRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19SQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1JBRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fUkFGT1JNQVRUWVBFOwotCi0vKiogUkEgKFJlYWwgQXVkaW8pIHBhcmFtcyAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9SQVRZUEUgeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgLyoqPCBpcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8gCi0gICAgT01YX1UzMiBuQml0c1BlckZyYW1lOyAgICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBiaXRzIHBlciBmcmFtZSAgKi8gCi0gICAgT01YX1UzMiBuU2FtcGxlUGVyRnJhbWU7ICAgIC8qKjwgaXMgdGhlIHZhbHVlIGZvciBzYW1wbGVzIHBlciBmcmFtZSAqLyAKLSAgICBPTVhfVTMyIG5Db3VwbGluZ1F1YW50Qml0czsgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIGNvdXBsaW5nIHF1YW50aXphdGlvbiBiaXRzIGluIHRoZSBzdHJlYW0gKi8gCi0gICAgT01YX1UzMiBuQ291cGxpbmdTdGFydFJlZ2lvbjsgICAvKio8IGlzIHRoZSBjb3VwbGluZyBzdGFydCByZWdpb24gaW4gdGhlIHN0cmVhbSAgKi8gCi0gICAgT01YX1UzMiBuTnVtUmVnaW9uczsgICAgICAgIC8qKjwgaXMgdGhlIG51bWJlciBvZiByZWdpb25zIHZhbHVlICovIAotICAgIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBpcyB0aGUgUmVhbEF1ZGlvIGF1ZGlvIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fUkFUWVBFOyAKLQotCi0vKiogU0JDIEFsbG9jYXRpb24gTWV0aG9kIFR5cGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIHsKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTG91ZG5lc3MsIC8qKjwgTG91ZG5lc3MgYWxsb2NhdGlvbiBtZXRob2QgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kU05SLCAgICAgIC8qKjwgU05SIGFsbG9jYXRpb24gbWV0aG9kICovCi0gIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFOwotCi0KLS8qKiBTQkMgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCi0gICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwotICAgIE9NWF9VMzIgbkJsb2NrczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJsb2NrcyAqLwotICAgIE9NWF9VMzIgblN1YmJhbmRzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHN1YmJhbmRzICovCi0gICAgT01YX1UzMiBuQml0UG9vbDsgICAgICAgICAgLyoqPCBCaXRwb29sIHZhbHVlICovCi0gICAgT01YX0JPT0wgYkVuYWJsZUJpdHJhdGU7ICAgLyoqPCBVc2UgYml0cmF0ZSB2YWx1ZSBpbnN0ZWFkIG9mIGJpdHBvb2wgKi8KLSAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgLyoqPCBDaGFubmVsIG1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIGVTQkNBbGxvY1R5cGU7ICAgLyoqPCBTQkMgQWxsb2NhdGlvbiBtZXRob2QgdHlwZSAqLwotfSBPTVhfQVVESU9fUEFSQU1fU0JDVFlQRTsKLQotCi0vKiogQURQQ00gc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfVTMyIG5CaXRzUGVyU2FtcGxlOyAgICAgLyoqPCBOdW1iZXIgb2YgYml0cyBpbiBlYWNoIHNhbXBsZSAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCi19IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEU7IAotCi0KLS8qKiBHNzIzIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyM1JBVEUgewotICAgIE9NWF9BVURJT19HNzIzTW9kZVVudXNlZCA9IDAsICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZUxvdywgICAgICAgICAvKio8IDUzMDAgYnBzICovCi0gICAgT01YX0FVRElPX0c3MjNNb2RlSGlnaCwgICAgICAgIC8qKjwgNjMwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX0c3MjNNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fRzcyM01vZGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzIzUkFURTsKLQotCi0vKiogRzcyMyAtIFNhbXBsZSByYXRlIG11c3QgYmUgOCBLSHogKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8gCi0gICAgT01YX0FVRElPX0c3MjNSQVRFIGVCaXRSYXRlOyAgLyoqPCB0b2RvOiBTaG91bGQgdGhpcyBiZSBtb3ZlZCB0byBhIGNvbmZpZz8gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovIAotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIFBvc3QgRmlsdGVyICovIAotfSBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEU7IAotCi0KLS8qKiBJVFUgRzcyNiAoQURQQ00pIHJhdGUgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyNk1PREUgewotICAgIE9NWF9BVURJT19HNzI2TW9kZVVudXNlZCA9IDAsICAvKio8IEc3MjYgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlMTYsICAgICAgICAgIC8qKjwgMTYga2JwcyAqLwotICAgIE9NWF9BVURJT19HNzI2TW9kZTI0LCAgICAgICAgICAvKio8IDI0IGticHMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGUzMiwgICAgICAgICAgLyoqPCAzMiBrYnBzLCBtb3N0IGNvbW1vbiByYXRlLCBhbHNvIEc3MjEgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGU0MCwgICAgICAgICAgLyoqPCA0MCBrYnBzICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19HNzI2TW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjZNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fRzcyNk1PREU7Ci0KLQotLyoqIEcuNzI2IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIG11c3QgYmUgYXQgOEtIeiAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLyAKLSAgICAgT01YX0FVRElPX0c3MjZNT0RFIGVHNzI2TW9kZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFOyAKLQotCi0vKiogRzcyOSBjb2RlciB0eXBlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjlUWVBFIHsKLSAgICBPTVhfQVVESU9fRzcyOSA9IDAsICAgICAgICAgICAvKio8IElUVSBHLjcyOSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlBLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXggQSAgZW5jb2RlZCBkYXRhICovCi0gICAgT01YX0FVRElPX0c3MjlCLCAgICAgICAgICAgICAgLyoqPCBJVFUgRy43Mjkgd2l0aCBhbm5leCBCIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19HNzI5QUIsICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4ZXMgQSBhbmQgQiBlbmNvZGVkIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fRzcyOUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fRzcyOVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0c3MjlNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19HNzI5VFlQRTsKLQotCi0vKiogRzcyOSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBmaXhlZCA2S0h6IHNhbXBsZSByYXRlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwotICAgIE9NWF9BVURJT19HNzI5VFlQRSBlQml0VHlwZTsKLX0gT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFOwotCi0KLS8qKiBBTVIgRnJhbWUgZm9ybWF0ICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgeyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZSA9IDAsICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgQ29uZm9ybWFuY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhbmRhcmQpIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjEsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDEgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYyLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAyKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEZpbGUgU3RvcmFnZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRSVFBQYXlsb2FkLCAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgUmVhbC1UaW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IFByb3RvY29sIFBheWxvYWQgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElUVSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIElUVSBGb3JtYXQgKGFkZGVkIGF0IE1vdG9yb2xhIHJlcXVlc3QpICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEU7IAotCi0KLS8qKiBBTVIgYmFuZCBtb2RlICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSB7Ci0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkID0gMCwgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMCA9ICA0NzUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAxID0gIDUxNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8gCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDMgPSAgNjcwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNCA9ICA3NDAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA1ID0gIDc5NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDYgPSAxMDIwMCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNyA9IDEyMjAwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAwID0gIDY2MDAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDEgPSAgODg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMiA9IDEyNjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMyA9IDE0MjUwIGJwcyAqLyAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjQsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNCA9IDE1ODUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA1ID0gMTgyNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I2LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDYgPSAxOTg1MCBicHMgKi8KLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjcsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNyA9IDIzMDUwIGJwcyAqLwotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCOCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA4ID0gMjM4NTAgYnBzICovICAgICAgCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFOwotICAgICAKLQotLyoqIEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBtb2RlICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSB7IAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmID0gMCwgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgaXMgZGlzYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDEsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDEgKFZBRDEpIGlzIGVuYWJsZWQgKi8gCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDIsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlIEFjdGl2aXR5IERldGVjdG9yIDIgKFZBRDIpIGlzIGVuYWJsZWQgKi8gICAgICAgCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVPbkF1dG8sICAgICAgICAgLyoqPCBUaGUgY29kZWMgd2lsbCBhdXRvbWF0aWNhbGx5IHNlbGVjdCBiZXR3ZWVuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmLCBWQUQxIG9yIFZBRDIgbW9kZXMgKi8gCi0KLSAgICBPTVhfQVVESU9fQU1SRFRYYXNFRlIsICAgICAgICAgICAgIC8qKjwgRFRYIGFzIEVGUiBpbnN0ZWFkIG9mIEFNUiBzdGFuZGFyZCAoM0dQUCAyNi4xMDEsIGZyYW1lIHR5cGUgPTgsOSwxMCkgKi8KLQotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRTsgCi0gCi0KLS8qKiBBTVIgcGFyYW1zICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgcmVhZCBvbmx5IGZpZWxkICovCi0gICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBlQU1SQmFuZE1vZGU7IC8qKjwgQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbiAqLyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgIGVBTVJEVFhNb2RlOyAgLyoqPCBBTVIgRFRYIE1vZGUgZW51bWVyYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIGVBTVJGcmFtZUZvcm1hdDsgLyoqPCBBTVIgZnJhbWUgZm9ybWF0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFOwotCi0KLS8qKiBHU01fRlIgKEVUU0kgMDYuMTAsIDNHUFAgNDYuMDEwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEU7Ci0KLQotLyoqIEdTTS1IUiAoRVRTSSAwNi4yMCwgM0dQUCA0Ni4wMjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KLX0gT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRTsKLQotCi0vKiogR1NNLUVGUiAoRVRTSSAwNi42MCwgM0dQUCA0Ni4wNjApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFOwotCi0KLS8qKiBURE1BIEZSIChUSUEvRUlBLTEzNi00MjAsIFZTRUxQIDcuOTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRTsKLQotCi0vKiogVERNQSBFRlIgKFRJQS9FSUEtMTM2LTQxMCwgQUNFTFAgNy40a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRTsKLQotCi0vKiogUERDIEZSICggUkNSLTI3LCBWU0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEU7Ci0KLQotLyoqIFBEQyBFRlIgKCBSQ1ItMjcsIEFDRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFOwotCi0vKiogUERDIEhSICggUkNSLTI3LCBQU0ktQ0VMUCAzLjQ1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCi0gICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLwotfSBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFOwotCi0KLS8qKiBDRE1BIFJhdGUgdHlwZXMgKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIHsKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVCbGFuayA9IDAsICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGlzIGJsYW5rICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRnVsbCwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBmdWxsIHJhdGUgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVIYWxmLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGhhbGYgcmF0ZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZVF1YXJ0ZXIsICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gcXVhcnRlciByYXRlICovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRWlnaHRoLCAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBlaWdodGggcmF0ZSAoRFRYKSovCi0gICAgT01YX0FVRElPX0NETUFSYXRlRXJhc3VyZSwgICAgICAgICAgICAvKio8IENETUEgZXJhc3VyZSBmcmFtZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQVVESU9fQ0RNQVJhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0NETUFSQVRFVFlQRTsKLQotCi0vKiogUUNFTFA4IChUSUEvRUlBLTk2LCB1cCB0byA4a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLwotICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCi19IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFOwotCi0KLS8qKiBRQ0VMUDEzICggQ0RNQSwgRUlBL1RJQS03MzMsIDEzLjNrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLX0gT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFOwotCi0KLS8qKiBFVlJDICggQ0RNQSwgRUlBL1RJQS0xMjcsIFJDRUxQIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLwotICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IGFjdHVhbCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KLSAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KLSAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciAqLwotICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCi0gICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyICovCi19IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRTsKLQotCi0vKiogU01WICggdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KLSAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCi0gICAgT01YX0JPT0wgYlJBVEVfUkVEVUNvbjsgICAgICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCi0gICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSA/PyovCi0gICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgPz8qLwotICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyID8/Ki8KLSAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLwotICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciA/PyovCi19IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFOwotCi0KLS8qKiBNSURJIEZvcm1hdCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJRk9STUFUVFlQRQotewotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VW5rbm93biA9IDAsIC8qKjwgTUlESSBGb3JtYXQgdW5rbm93biBvciBkb24ndCBjYXJlICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYwLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAwICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYxLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAxICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTTUYyLCAgICAgICAgLyoqPCBTdGFuZGFyZCBNSURJIEZpbGUgVHlwZSAyICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRTUE1JREksICAgICAgLyoqPCBTUC1NSURJICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYwLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDAgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjEsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0TW9iaWxlWE1GLCAgIC8qKjwgTW9iaWxlIFhNRiAoZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAyKSAqLwotICAgIE9NWF9BVURJT19NSURJRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19NSURJRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX01JRElGT1JNQVRUWVBFOwotCi0KLS8qKiBNSURJIHBhcmFtcyAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBmaWxlIHBhc3NlZCBpbiwgb3RoZXJ3aXNlIGlmIDB4MCwgdGhlIE1JREkgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtZXJnZWQgYW5kIHN0cmVhbWVkIChpbnN0ZWFkIG9mIHBhc3NlZCBhcyBhbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgTUlESSBmaWxlKSAqLwotICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9CT09MIGJMb2FkRGVmYXVsdFNvdW5kOyAgICAvKio8IFdoZXRoZXIgdG8gbG9hZCBkZWZhdWx0IHNvdW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmsgYXQgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUgZU1pZGlGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiB0aGUgTUlESSBmaWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRTsKLQotCi0vKiogVHlwZSBvZiB0aGUgTUlESSBzb3VuZCBiYW5rIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIHsKLSAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1VudXNlZCA9IDAsICAgICAgICAgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMxLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAxICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtETFMyLCAgICAgICAgICAgICAgICAgLyoqPCBETFMgdmVyc2lvbiAyICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNCYXNlLCAgICAgICAgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNb2JpbGVETFNQbHVzT3B0aW9ucywgLyoqPCBNb2JpbGUgRExTLCB1c2luZyB0aGUgc3BlY2lmaWNhdGlvbi1kZWZpbmVkIG9wdGlvbmFsIGZlYXR1cmUgc2V0ICovCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEU7Ci0KLQotLyoqIEJhbmsgTGF5b3V0IGRlc2NyaWJlcyBob3cgYmFuayBNU0IgJiBMU0IgYXJlIHVzZWQgaW4gdGhlIERMUyBpbnN0cnVtZW50IGRlZmluaXRpb25zIHNvdW5kIGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgewotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVbnVzZWQgPSAwLCAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00sICAgICAgICAgICAvKio8IEdTIGxheW91dCAoYmFzZWQgb24gYmFuayBNU0IgMHgwMCkgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0R00yLCAgICAgICAgICAvKio8IEdlbmVyYWwgTUlESSAyIGxheW91dCAodXNpbmcgTVNCIDB4NzgvMHg3OSwgTFNCIDB4MDApICovCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVzZXIsICAgICAgICAgLyoqPCBEb2VzIG5vdCBjb25mb3JtIHRvIGFueSBiYW5rIG51bWJlcmluZyBzdGFuZGFyZHMgKi8KLSAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRTsKLQotCi0vKiogTUlESSBwYXJhbXMgdG8gbG9hZC91bmxvYWQgdXNlciBzb3VuZGJhbmsgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkRMU0luZGV4OyAgICAgICAgLyoqPCBETFMgZmlsZSBpbmRleCB0byBiZSBsb2FkZWQgKi8KLSAgICBPTVhfVTMyIG5ETFNTaXplOyAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcyAqLwotICAgIE9NWF9QVFIgcERMU0RhdGE7ICAgICAgICAgLyoqPCBQb2ludGVyIHRvIERMUyBmaWxlIGRhdGEgKi8KLSAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgZU1pZGlTb3VuZEJhbms7ICAgLyoqPCBNaWRpIHNvdW5kIGJhbmsgdHlwZSBlbnVtZXJhdGlvbiAqLwotICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSBlTWlkaVNvdW5kQmFua0xheW91dDsgLyoqPCBNaWRpIHNvdW5kIGJhbmsgbGF5b3V0IGVudW1lcmF0aW9uICovCi19IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEU7Ci0KLQotLyoqIFN0cnVjdHVyZSBmb3IgTGl2ZSBNSURJIGV2ZW50cyBhbmQgTUlQIG1lc3NhZ2VzLiAKLSAqIChNSVAgPSBNYXhpbXVtIEluc3RhbnRhbmVvdXMgUG9seXBob255OyBwYXJ0IG9mIHRoZSBTUC1NSURJIHN0YW5kYXJkLikgCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuTWlkaUV2ZW50U2l6ZTsgICAvKio8IFNpemUgb2YgaW1tZWRpYXRlIE1JREkgZXZlbnRzIG9yIE1JUCBtZXNzYWdlIGluIGJ5dGVzICAqLwotICAgIE9NWF9VOCBuTWlkaUV2ZW50c1sxXTsgICAgLyoqPCBNSURJIGV2ZW50IGFycmF5IHRvIGJlIHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvciBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBmb3IgdGhlIE1JUCBtZXNzYWdlIGJ1ZmZlciwgd2hlcmUgdGhlIHNpemUgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSBuTWlkaUV2ZW50U2l6ZSAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEU7Ci0KLQotLyoqIE1JREkgc291bmQgYmFuay8gcHJvZ3JhbSBwYWlyIGluIGEgZ2l2ZW4gY2hhbm5lbCAKLSAqIEBpbmdyb3VwIG1pZGkKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IFZhbGlkIGNoYW5uZWwgdmFsdWVzIHJhbmdlIGZyb20gMSB0byAxNiAqLwotICAgIE9NWF9VMTYgbklEUHJvZ3JhbTsgICAgICAgICAvKio8IFZhbGlkIHByb2dyYW0gSUQgcmFuZ2UgaXMgMSB0byAxMjggKi8KLSAgICBPTVhfVTE2IG5JRFNvdW5kQmFuazsgICAgICAgLyoqPCBTb3VuZCBiYW5rIElEICovCi0gICAgT01YX1UzMiBuVXNlclNvdW5kQmFua0luZGV4Oy8qKjwgVXNlciBzb3VuZGJhbmsgaW5kZXgsIGVhc2llciB0byBhY2Nlc3Mgc291bmRiYW5rcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBpbmRleCBpZiBtdWx0aXBsZSBiYW5rcyBhcmUgcHJlc2VudCAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRTsKLQotCi0vKiogTUlESSBjb250cm9sIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JTMzIgc1BpdGNoVHJhbnNwb3NpdGlvbjsgLyoqPCBQaXRjaCB0cmFuc3Bvc2l0aW9uIGluIHNlbWl0b25lcywgc3RvcmVkIGFzIFEyMi4xMCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBiYXNlZCBvbiBKQVZBIE1NQVBJIChKU1ItMTM1KSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9CVTMyIHNQbGF5QmFja1JhdGU7ICAgICAgIC8qKjwgUmVsYXRpdmUgcGxheWJhY2sgcmF0ZSwgc3RvcmVkIGFzIFExNC4xNyBmaXhlZC1wb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KLSAgICBPTVhfQlUzMiBzVGVtcG8gOyAgICAgICAgICAgICAvKio8IFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSksIHN0b3JlZCBhcyBRMjIuMTAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1wb2ludCBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9VMzIgbk1heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLwotICAgIE9NWF9VMzIgbk51bVJlcGVhdDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBwbGF5YmFjayAqLwotICAgIE9NWF9VMzIgblN0b3BUaW1lOyAgICAgICAgICAgIC8qKjwgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gaW5kaWNhdGUgd2hlbiBwbGF5YmFjayAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RvcCBhdXRvbWF0aWNhbGx5LiAgU2V0IHRvIHplcm8gaWYgbm90IHVzZWQgKi8KLSAgICBPTVhfVTE2IG5DaGFubmVsTXV0ZU1hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIG11dGUgc3RhdHVzICovCi0gICAgT01YX1UxNiBuQ2hhbm5lbFNvbG9NYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBzb2xvIHN0YXR1cyAqLwotICAgIE9NWF9VMzIgblRyYWNrMDAzMU11dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLwotICAgIE9NWF9VMzIgblRyYWNrMzI2M011dGVNYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIG11dGUgc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KLSAgICBPTVhfVTMyIG5UcmFjazAwMzFTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KLSAgICBPTVhfVTMyIG5UcmFjazMyNjNTb2xvTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBzb2xvIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCi0KLX0gT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEU7Ci0KLQotLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSB7Ci0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVVua25vd24gPSAwLCAgICAgIC8qKjwgVW5rbm93biBzdGF0ZSBvciBzdGF0ZSBkb2VzIG5vdCBtYXAgdG8gCi0gIAkJCQkJCQkJCQkJCQlvdGhlciBkZWZpbmVkIHN0YXRlcyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVDbG9zZWRFbmdhZ2VkLCAgICAvKio8IE5vIE1JREkgcmVzb3VyY2UgaXMgY3VycmVudGx5IG9wZW4uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGV2ZW50cy4gKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGFyc2luZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgaXMgYmVpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWVkLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU9wZW5FbmdhZ2VkLCAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIHByaW1lZCBidXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiBUaGUgdHJhbnNpdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RhdGUgaXMgb25seSBwb3NzaWJsZSBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlICdwbGF5YmFjayBoZWFkJyByZWFjaGVzIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtZWRpYSBkYXRhIG9yIHRoZSBwbGF5YmFjayBzdG9wcyBkdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9wIHRpbWUgc2V0LiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGN1cnJlbnRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdQYXJ0aWFsbHksIC8qKjwgQmVzdC1lZmZvcnQgcGxheWJhY2sgZHVlIHRvIFNQLU1JREkvRExTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgY29uc3RyYWludHMgKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1NpbGVudGx5LCAgLyoqPCBEdWUgdG8gc3lzdGVtIHJlc291cmNlIGNvbnN0cmFpbnRzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQLU1JREkgY29udGVudCBjb25zdHJhaW50cywgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBhdWRpYmxlIE1JREkgY29udGVudCBkdXJpbmcgcGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkuIFRoZSBzaXR1YXRpb24gbWF5IGNoYW5nZSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBhcmUgZnJlZWQgbGF0ZXIuKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVNYXggPSAweDdGRkZGRkZGCi19IE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEU7Ci0KLQotLyoqIE1JREkgc3RhdHVzIAotICogQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTE2IG5OdW1UcmFja3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTUlESSB0cmFja3MgaW4gdGhlIGZpbGUsIHJlYWQgb25seSBmaWVsZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5EdXJhdGlvbjsgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBNSURJIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcy4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8gIAotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgICAvKio8IEN1cnJlbnQgUG9zaXRpb24gb2YgdGhlIE1JREkgcmVzb3VyY2UgYmVpbmcgcGxheWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE9NWF9CT09MIGJWaWJyYTsgICAgICAgICAgICAvKio8IERvZXMgVmlicmEgdHJhY2sgZXhpc3Q/IE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KLSAgICBPTVhfVTMyIG5OdW1NZXRhRXZlbnRzOyAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgTUlESSBNZXRhIEV2ZW50cyBpbiB0aGUgY3VycmVudGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KLSAgICBPTVhfVTMyIG5OdW1BY3RpdmVWb2ljZXM7ICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIHZvaWNlcyBpbiB0aGUgY3VycmVudGx5IHBsYXlpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSByZXNvdXJjZS4gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIHVudGlsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLwotICAgIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgZU1JRElQbGF5QmFja1N0YXRlOyAgLyoqPCBNSURJIHBsYXliYWNrIHN0YXRlIGVudW1lcmF0aW9uLCByZWFkIG9ubHkgZmllbGQgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRTsKLQotCi0vKiogTUlESSBNZXRhIEV2ZW50IHN0cnVjdHVyZSBvbmUgcGVyIE1ldGEgRXZlbnQuCi0gKiAgTUlESSBNZXRhIEV2ZW50cyBhcmUgbGlrZSBhdWRpbyBtZXRhZGF0YSwgZXhjZXB0IHRoYXQgdGhleSBhcmUgaW50ZXJzcGVyc2VkIAotICogIHdpdGggdGhlIE1JREkgY29udGVudCB0aHJvdWdob3V0IHRoZSBmaWxlIGFuZCBhcmUgbm90IGxvY2FsaXplZCBpbiB0aGUgaGVhZGVyLiAKLSAqICBBcyBzdWNoLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgTWV0YSBFdmVudHMgZnJvbSAKLSAqICB0aGUgZW5naW5lLCBhcyBpdCBlbmNvdW50ZXJzIHRoZXNlIE1ldGEgRXZlbnRzIHdpdGhpbiB0aGUgTUlESSBjb250ZW50LiAKLSAqICBGb3IgZXhhbXBsZSwgU01GIGZpbGVzIGNhbiBoYXZlIHVwIHRvIDE0IHR5cGVzIG9mIE1JREkgTWV0YSBFdmVudHMgKGNvcHlyaWdodCwgCi0gKiAgYXV0aG9yLCBkZWZhdWx0IHRlbXBvLCBldGMuKSBzY2F0dGVyZWQgdGhyb3VnaG91dCB0aGUgZmlsZS4gCi0gKiAgQGluZ3JvdXAgbWlkaQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFeyAKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKLSAgICBPTVhfVTggbk1ldGFFdmVudFR5cGU7ICAgIC8qKjwgTWV0YSBFdmVudCBUeXBlLCA3Yml0cyAoaS5lLiAwIC0gMTI3KSAqLyAKLSAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKLSAgICBPTVhfVTMyIG5UcmFjazsgICAgICAgICAgIC8qKjwgdHJhY2sgbnVtYmVyIGZvciB0aGUgbWV0YSBldmVudCAqLwotICAgIE9NWF9VMzIgblBvc2l0aW9uOyAgICAgICAgLyoqPCBQb3NpdGlvbiBvZiB0aGUgbWV0YS1ldmVudCBpbiBtaWxsaXNlY29uZHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRTsgCi0KLQotLyoqIE1JREkgTWV0YSBFdmVudCBEYXRhIHN0cnVjdHVyZSAtIG9uZSBwZXIgTWV0YSBFdmVudC4gCi0gKiBAaW5ncm91cCBtaWRpCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCi0gICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1U4IG5EYXRhWzFdOyAgICAgICAgICAvKio8IGFycmF5IG9mIG9uZSBvciBtb3JlIGJ5dGVzIG9mIG1ldGEgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLyAKLX0gT01YX0FVRElPX0NPTkZJR19fTUlESU1FVEFFVkVOVERBVEFUWVBFOyAKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgcG9ydCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgVGhlIHZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2b2x1bWUgYXJlIGluIG1CIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGdhaW4gb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi19IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRTsKLQotCi0vKiogQXVkaW8gVm9sdW1lIGFkanVzdG1lbnQgZm9yIGEgY2hhbm5lbCAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KLSAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IHZvbHVtZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2FyaXRobWljIHNjYWxlIChtQikgKi8KLSAgICBPTVhfQlMzMiBzVm9sdW1lOyAgICAgICAgICAgLyoqPCBWb2x1bWUgbGluZWFyIHNldHRpbmcgaW4gdGhlIDAuLjEwMCByYW5nZSwgT1IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWUgbG9nYXJpdGhtaWMgc2V0dGluZyBmb3IgdGhpcyBwb3J0LiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3Igdm9sdW1lIGFyZSBpbiBtQiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlIHRvIGEgZ2FpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgdG8gdGhlIHJlcXVlc3RlZCB2YWx1ZSwgaXQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBjbG9zZXN0IHZhbHVlIEJFTE9XCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3RlZCB2YWx1ZS4gIFdoZW4gZ2V0dGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgc2V0dGluZywgdGhlIGN1cnJlbnQgYWN0dWFsIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgcmV0dXJuZWQuICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIGJhbGFuY2Ugc2V0dGluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBiYWxhbmNlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlLiAqLwotICAgIE9NWF9TMzIgbkJhbGFuY2U7ICAgICAgICAgICAvKio8IGJhbGFuY2Ugc2V0dGluZyBmb3IgdGhpcyBwb3J0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAwIHRvIDEwMCwgd2hlcmUgLTEwMCBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgbGVmdCwgYW5kIG5vIHJpZ2h0ICovCi19IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEU7Ci0KLQotLyoqIEF1ZGlvIFBvcnQgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBtdXRlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlLiAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBwb3J0ICovCi19IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEU7Ci0KLQotLyoqIEF1ZGlvIENoYW5uZWwgbXV0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgbXV0ZSBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBjaGFubmVsICovCi0gICAgT01YX0JPT0wgYklzTUlESTsgICAgICAgICAgIC8qKjwgVFJVRSBpZiBuQ2hhbm5lbCByZWZlcnMgdG8gYSBNSURJIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlICovIAotfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRTsKLQotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBsb3VkbmVzcyBjb250cm9sLCB3aGljaCBib29zdHMgYmFzcyBhbmQgdG8gYSAKLSAqICBzbWFsbGVyIGV4dGVudCBoaWdoIGVuZCBmcmVxdWVuY2llcyB0byBjb21wZW5zYXRlIGZvciBoZWFyaW5nCi0gKiAgYWJpbGl0eSBhdCB0aGUgZXh0cmVtZSBlbmRzIG9mIHRoZSBhdWRpbyBzcGVjdHJ1bQotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJMb3VkbmVzczsgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGxvdWRuZXNzICovCi19IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBiYXNzLCB3aGljaCBjb250cm9scyBsb3cgZnJlcXVlbmNpZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGJhc3MgY29udHJvbCAqLwotICAgIE9NWF9TMzIgbkJhc3M7ICAgICAgICAgICAgIC8qKjwgYmFzcyBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gYmFzcyBsZXZlbCkqLwotfSBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciB0cmVibGUsIHdoaWNoIGNvbnRyb2xzIGhpZ2ggZnJlcXVlbmNpZXMgdG9uZXMKLSAqLyAKLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgdHJlYmxlIGNvbnRyb2wgKi8KLSAgICBPTVhfUzMyICBuVHJlYmxlOyAgICAgICAgICAvKio8IHRyZWJsZSBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiB0cmVibGUgbGV2ZWwpICovCi19IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRTsKLQotCi0vKiogQW4gZXF1YWxpemVyIGlzIHR5cGljYWxseSB1c2VkIGZvciB0d28gcmVhc29uczogdG8gY29tcGVuc2F0ZSBmb3IgYW4gCi0gKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsIAotICogIG9yIHRvIGNyZWF0ZSBpbnRlbnRpb25hbGx5IHNvbWUgdW5uYXR1cmFsIGNvbG9yaW5nIHRvIHRoZSBzb3VuZCB0byBjcmVhdGUKLSAqICBhbiBlZmZlY3QuCi0gKiAgQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGVxdWFsaXplciAqLwotICAgIE9NWF9CVTMyIHNCYW5kSW5kZXg7ICAgICAgIC8qKjwgQmFuZCBudW1iZXIgdG8gYmUgc2V0LiAgVXBwZXIgTGltaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLTEsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBiYW5kcywgbG93ZXIgbGltaXQgaXMgMCAqLwotICAgIE9NWF9CVTMyIHNDZW50ZXJGcmVxOyAgICAgIC8qKjwgQ2VudGVyIGZyZXF1ZWNpZXMgaW4gSHouICBUaGlzIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgb25seSBlbGVtZW50IGFuZCBpcyB1c2VkIHRvIGRldGVybWluZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsb3dlciwgY2VudGVyIGFuZCB1cHBlciBmcmVxdWVuY3kgb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhbmQuICAqLwotICAgIE9NWF9CUzMyIHNCYW5kTGV2ZWw7ICAgICAgIC8qKjwgYmFuZCBsZXZlbCBpbiBtaWxsaWJlbHMgKi8KLX0gT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFOwotCi0KLS8qKiBTdGVyZW8gd2lkZW5pbmcgbW9kZSB0eXBlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBlbnVtIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0hlYWRwaG9uZXMsICAgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBsb3Vkc3BlYWtlcnMgKi8KLSAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdMb3Vkc3BlYWtlcnMsICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgY2xvc2VseSBzcGFjZWQgbG91ZHNwZWFrZXJzICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBDb250cm9sIGZvciBzdGVyZW8gd2lkZW5pbmcsIHdoaWNoIGlzIGEgc3BlY2lhbCAyLWNoYW5uZWwKLSAqICBjYXNlIG9mIHRoZSBhdWRpbyB2aXJ0dWFsaXplciBlZmZlY3QuIEZvciBleGFtcGxlLCBmb3IgNS4xLWNoYW5uZWwgCi0gKiAgb3V0cHV0LCBpdCB0cmFuc2xhdGVzIHRvIHZpcnR1YWwgc3Vycm91bmQgc291bmQuIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHN0ZXJlbyB3aWRlbmluZyBjb250cm9sICovCi0gICAgT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSBlV2lkZW5pbmdUeXBlOyAvKio8IFN0ZXJlbyB3aWRlbmluZyBhbGdvcml0aG0gdHlwZSAqLwotICAgIE9NWF9VMzIgIG5TdGVyZW9XaWRlbmluZzsgIC8qKjwgc3RlcmVvIHdpZGVuaW5nIHNldHRpbmcgZm9yIHRoZSBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBjb250aW51b3VzIHZhbHVlIGZyb20gMCB0byAxMDAgICovCi19IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFOwotCi0KLS8qKiBUaGUgY2hvcnVzIGVmZmVjdCAob3IgYGBjaG9yYWxpemVyJycpIGlzIGFueSBzaWduYWwgcHJvY2Vzc29yIHdoaWNoIG1ha2VzCi0gKiAgb25lIHNvdW5kIHNvdXJjZSAoc3VjaCBhcyBhIHZvaWNlKSBzb3VuZCBsaWtlIG1hbnkgc3VjaCBzb3VyY2VzIHNpbmdpbmcgCi0gKiAgKG9yIHBsYXlpbmcpIGluIHVuaXNvbi4gU2luY2UgcGVyZm9ybWFuY2UgaW4gdW5pc29uIGlzIG5ldmVyIGV4YWN0LCBjaG9ydXMgCi0gKiAgZWZmZWN0cyBzaW11bGF0ZSB0aGlzIGJ5IG1ha2luZyBpbmRlcGVuZGVudGx5IG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgaW5wdXQgCi0gKiAgc2lnbmFsLiBNb2RpZmljYXRpb25zIG1heSBpbmNsdWRlICgxKSBkZWxheSwgKDIpIGZyZXF1ZW5jeSBzaGlmdCwgYW5kIAotICogICgzKSBhbXBsaXR1ZGUgbW9kdWxhdGlvbi4KLSAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBjaG9ydXMgKi8KLSAgICBPTVhfQlUzMiBzRGVsYXk7ICAgICAgICAgICAvKio8IGF2ZXJhZ2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc01vZHVsYXRpb25SYXRlOyAgLyoqPCByYXRlIG9mIG1vZHVsYXRpb24gaW4gbWlsbGloZXJ0eiAqLwotICAgIE9NWF9VMzIgbk1vZHVsYXRpb25EZXB0aDsgIC8qKjwgZGVwdGggb2YgbW9kdWxhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSAoaS5lLiAwIHRvIDEwMCkgKi8KLSAgICBPTVhfQlUzMiBuRmVlZGJhY2s7ICAgICAgICAvKio8IEZlZWRiYWNrIGZyb20gY2hvcnVzIG91dHB1dCB0byBpbnB1dCBpbiBwZXJjZW50YWdlICovCi19IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRTsKLQotCi0vKiogUmV2ZXJiZXJhdGlvbiBpcyBwYXJ0IG9mIHRoZSByZWZsZWN0ZWQgc291bmQgdGhhdCBmb2xsb3dzIHRoZSBlYXJseSAKLSAqICByZWZsZWN0aW9ucy4gSW4gYSB0eXBpY2FsIHJvb20sIHRoaXMgY29uc2lzdHMgb2YgYSBkZW5zZSBzdWNjZXNzaW9uIG9mIAotICogIGVjaG9lcyB3aG9zZSBlbmVyZ3kgZGVjYXlzIGV4cG9uZW50aWFsbHkuIFRoZSByZXZlcmJlcmF0aW9uIGVmZmVjdCBzdHJ1Y3R1cmUgCi0gKiAgYXMgZGVmaW5lZCBoZXJlIGluY2x1ZGVzIGJvdGggKGVhcmx5KSByZWZsZWN0aW9ucyBhcyB3ZWxsIGFzIChsYXRlKSByZXZlcmJlcmF0aW9ucy4gCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHJldmVyYmVyYXRpb24gY29udHJvbCAqLwotICAgIE9NWF9CUzMyIHNSb29tTGV2ZWw7ICAgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIGZvciB0aGUgd2hvbGUgcm9vbSBlZmZlY3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBib3RoIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCBsYXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJiZXJhdGlvbikgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1Jvb21IaWdoRnJlcUxldmVsOyAgLyoqPCBBdHRlbnVhdGlvbiBhdCBoaWdoIGZyZXF1ZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgaW50ZW5zaXR5IGF0IGxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JTMzIgc1JlZmxlY3Rpb25zTGV2ZWw7ICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgZWFybHkgcmVmbGVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGl2ZSB0byByb29tIHZhbHVlKSwgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JVMzIgc1JlZmxlY3Rpb25zRGVsYXk7ICAgLyoqPCBEZWxheSB0aW1lIG9mIHRoZSBmaXJzdCByZWZsZWN0aW9uIHJlbGF0aXZlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRpcmVjdCBwYXRoLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlMzMiBzUmV2ZXJiTGV2ZWw7ICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBsYXRlIHJldmVyYmVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHJvb20gbGV2ZWwsIGluIG1pbGxpYmVscyAqLwotICAgIE9NWF9CVTMyIHNSZXZlcmJEZWxheTsgICAgICAgIC8qKjwgVGltZSBkZWxheSBmcm9tIHRoZSBmaXJzdCBlYXJseSByZWZsZWN0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JVMzIgc0RlY2F5VGltZTsgICAgICAgICAgLyoqPCBMYXRlIHJldmVyYmVyYXRpb24gZGVjYXkgdGltZSBhdCBsb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBuRGVjYXlIaWdoRnJlcVJhdGlvOyAvKio8IFJhdGlvIG9mIGhpZ2ggZnJlcXVlbmN5IGRlY2F5IHRpbWUgcmVsYXRpdmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb3cgZnJlcXVlbmN5IGRlY2F5IHRpbWUgaW4gcGVyY2VudCAgKi8KLSAgICBPTVhfVTMyIG5EZW5zaXR5OyAgICAgICAgICAgICAvKio8IE1vZGFsIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KLSAgICBPTVhfVTMyIG5EaWZmdXNpb247ICAgICAgICAgICAvKio8IEVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLwotICAgIE9NWF9CVTMyIHNSZWZlcmVuY2VIaWdoRnJlcTsgIC8qKjwgUmVmZXJlbmNlIGhpZ2ggZnJlcXVlbmN5IGluIEhlcnR6LiBUaGlzIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoaWdoLWZyZXF1ZW5jeSBzZXR0aW5ncyBhYm92ZSAqLwotCi19IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEU7Ci0KLQotLyoqIFBvc3NpYmxlIHNldHRpbmdzIGZvciB0aGUgRWNobyBDYW5jZWxhdGlvbiBzdHJ1Y3R1cmUgdG8gdXNlIAotICogQGluZ3JvdXAgZWZmZWN0cwotICovCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0VDSE9DQU5UWVBFIHsKLSAgIE9NWF9BVURJT19FY2hvQ2FuT2ZmID0gMCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBpcyBkaXNhYmxlZCAqLwotICAgT01YX0FVRElPX0VjaG9DYW5Ob3JtYWwsICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG5vcm1hbCBvcGVyYXRpb24gLSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIGZyb20gcGxhc3RpY3MgYW5kIGZhY2UgKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuSEZyZWUsICAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzIEZyZWUgb3BlcmF0aW9uICovCi0gICBPTVhfQVVESU9fRWNob0NhbkNhcktpdCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhciBLaXQgKGxvbmdlciBlY2hvKSAqLwotICAgT01YX0FVRElPX0VjaG9DYW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICBPTVhfQVVESU9fRWNob0NhblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfQVVESU9fRWNob0Nhbk1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0FVRElPX0VDSE9DQU5UWVBFOwotCi0KLS8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBlY2hvIGNhbmNlbGF0aW9uLCB3aGljaCByZW1vdmVzIHVuZGVzaXJlZCBlY2hvJ3MKLSAqICBmcm9tIHRoZSBhdWRpbwotICogQGluZ3JvdXAgZWZmZWN0cwotICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQVVESU9fRUNIT0NBTlRZUEUgZUVjaG9DYW5jZWxhdGlvbjsgLyoqPCBFY2hvIGNhbmNlbGF0aW9uIHNldHRpbmdzICovCi19IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRTsKLQotCi0vKiogRW5hYmxlIC8gRGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uLCB3aGljaCB1bmRlc2lyZWQgbm9pc2UgZnJvbQotICogdGhlIGF1ZGlvCi0gKiBAaW5ncm91cCBlZmZlY3RzCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYk5vaXNlUmVkdWN0aW9uOyAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igbm9pc2UgcmVkdWN0aW9uICovCi19IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbXBvbmVudC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db21wb25lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNzg0ZWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9Db21wb25lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX0NvbXBvbmVudC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db21wb25lbnQgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCi0gKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYSBjb21wb25lbnQuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCi0gKiAgYmUgdXNlZCBieSBib3RoIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4KLSAqLwotCi0jaWZuZGVmIE9NWF9Db21wb25lbnRfaAotI2RlZmluZSBPTVhfQ29tcG9uZW50X2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQotICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KLSNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxPTVhfSW1hZ2UuaD4KLSNpbmNsdWRlIDxPTVhfT3RoZXIuaD4KLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgZW51bSBPTVhfUE9SVERPTUFJTlRZUEUgeyAKLSAgICBPTVhfUG9ydERvbWFpbkF1ZGlvLCAKLSAgICBPTVhfUG9ydERvbWFpblZpZGVvLCAKLSAgICBPTVhfUG9ydERvbWFpbkltYWdlLCAKLSAgICBPTVhfUG9ydERvbWFpbk90aGVyLAotICAgIE9NWF9Qb3J0RG9tYWluS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9Qb3J0RG9tYWluVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfUG9ydERvbWFpbk1heCA9IDB4N2ZmZmZmZgotfSBPTVhfUE9SVERPTUFJTlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCBudW1iZXIgdGhlIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RJUlRZUEUgZURpcjsgICAgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uIChpbnB1dCBvciBvdXRwdXQpIG9mIHRoaXMgcG9ydCAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50QWN0dWFsOyAgICAvKio8IFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIG9uIHRoaXMgcG9ydCAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlckNvdW50TWluOyAgICAgICAvKio8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBidWZmZXJzIHRoaXMgcG9ydCByZXF1aXJlcyAqLwotICAgIE9NWF9VMzIgbkJ1ZmZlclNpemU7ICAgICAgICAgICAvKio8IFNpemUsIGluIGJ5dGVzLCBmb3IgYnVmZmVycyB0byBiZSB1c2VkIGZvciB0aGlzIGNoYW5uZWwgKi8KLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgICAgICAgICAgLyoqPCBQb3J0cyBkZWZhdWx0IHRvIGVuYWJsZWQgYW5kIGFyZSBlbmFibGVkL2Rpc2FibGVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlL09NWF9Db21tYW5kUG9ydERpc2FibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBkaXNhYmxlZCBhIHBvcnQgaXMgdW5wb3B1bGF0ZWQuIEEgZGlzYWJsZWQgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwb3B1bGF0ZWQgd2l0aCBidWZmZXJzIG9uIGEgdHJhbnNpdGlvbiB0byBJRExFLiAqLwotICAgIE9NWF9CT09MIGJQb3B1bGF0ZWQ7ICAgICAgICAgICAvKio8IFBvcnQgaXMgcG9wdWxhdGVkIHdpdGggYWxsIG9mIGl0cyBidWZmZXJzIGFzIGluZGljYXRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CdWZmZXJDb3VudEFjdHVhbC4gQSBkaXNhYmxlZCBwb3J0IGlzIGFsd2F5cyB1bnBvcHVsYXRlZC4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZW5hYmxlZCBwb3J0IGlzIHBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gT01YX1N0YXRlSWRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1bnBvcHVsYXRlZCBvbiBhIHRyYW5zaXRpb24gdG8gbG9hZGVkLiAqLwotICAgIE9NWF9QT1JURE9NQUlOVFlQRSBlRG9tYWluOyAgICAvKio8IERvbWFpbiBvZiB0aGUgcG9ydC4gRGV0ZXJtaW5lcyB0aGUgY29udGVudHMgb2YgbWV0YWRhdGEgYmVsb3cuICovCi0gICAgdW5pb24gewotICAgICAgICBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFIGF1ZGlvOwotICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHZpZGVvOwotICAgICAgICBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFIGltYWdlOwotICAgICAgICBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIG90aGVyOwotICAgIH0gZm9ybWF0OwotICAgIE9NWF9CT09MIGJCdWZmZXJzQ29udGlndW91czsKLSAgICBPTVhfVTMyIG5CdWZmZXJBbGlnbm1lbnQ7Ci19IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLS8qKiBAaW5ncm91cCBjb21wICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fVTMyVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuVTMyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVTMyIHZhbHVlICovCi19IE9NWF9QQVJBTV9VMzJUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIHsKLSAgICBPTVhfU3VzcGVuc2lvbkRpc2FibGVkLCAvKio8IE5vIHN1c3BlbnNpb247IHYxLjAgYmVoYXZpb3IgKi8KLSAgICBPTVhfU3VzcGVuc2lvbkVuYWJsZWQsICAvKio8IFN1c3BlbnNpb24gYWxsb3dlZCAqLyAgIAotICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5U3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3VzcGVuc2lvblBvbGljeU1heCA9IDB4N2ZmZmZmZmYKLX0gT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgCi0gICAgT01YX1NVU1BFTlNJT05QT0xJQ1lUWVBFIGVQb2xpY3k7Ci19IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OVFlQRSB7Ci0gICAgT01YX05vdFN1c3BlbmRlZCwgLyoqPCBjb21wb25lbnQgaXMgbm90IHN1c3BlbmRlZCAqLwotICAgIE9NWF9TdXNwZW5kZWQsICAgIC8qKjwgY29tcG9uZW50IGlzIHN1c3BlbmRlZCAqLwotICAgIE9NWF9TdXNwZW5zaW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdXNwZW5zaW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfU3VzcGVuZE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX1NVU1BFTlNJT05UWVBFOwotCi0vKiogQGluZ3JvdXAgcnBtICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAKLSAgICBPTVhfU1VTUEVOU0lPTlRZUEUgZVR5cGU7ICAgICAgICAgICAgIAotfSBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgCi19IE9NWF9DT05GSUdfQk9PTEVBTlRZUEU7Ci0KLS8qIFBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBjb250ZW50IHVyaSB0byB1c2UuICovCi0vKiogQGluZ3JvdXAgY3AgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRQotewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBVUkkgbmFtZSAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCBjb250ZW50VVJJWzFdOyAgICAgICAgICAgICAgIC8qKjwgVGhlIFVSSSBuYW1lICovCi19IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRTsKLQotLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHBpcGUgdG8gdXNlLiAqLwotLyoqIEBpbmdyb3VwIGNwICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9IQU5ETEVUWVBFIGhQaXBlOyAgICAgICAvKio8IFRoZSBwaXBlIGhhbmRsZSovCi19IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEU7Ci0KLS8qKiBAaW5ncm91cCBycG0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiUmVzb3VyY2VDb25jZWFsbWVudEZvcmJpZGRlbjsgLyoqPCBkaXNhbGxvdyB0aGUgdXNlIG9mIHJlc291cmNlIGNvbmNlYWxtZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIChsaWtlIGRlZ3JhZGluZyBhbGdvcml0aG0gcXVhbGl0eSB0byAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gb3IgZnVuY3Rpb25hbCBieXBhc3MpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhIGNvbXBvbmVudCBhcyBhIHJlc29sdXRpb24gdG8gcmVzb3VyY2UgY29uZmxpY3RzLiAqLwotfSBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEU7Ci0KLQotLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCi10eXBlZGVmIGVudW0gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgewotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVbmtub3duID0gMCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QVNDSUksCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEJpbmFyeSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0Q29kZVBhZ2UxMjUyLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEY4LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRKYXZhQ29uZm9ybWFudFVURjgsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjcsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEltYXBVVEY3LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkxFLCAKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGMTZCRSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxMjM0NSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SFpHQjIzMTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldEdCMjMxMiwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IxODAzMCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0JLLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRCaWc1LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MSwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTIsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkzLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk2LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTgsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk5LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMywKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTE0LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTUsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFNoaWZ0SklTLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU08yMDIySlAsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUDEsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldElTT0VVQ0pQLAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRTTVM3Qml0LAotICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFR5cGVNYXg9IDB4N0ZGRkZGRkYKLX0gT01YX01FVEFEQVRBQ0hBUlNFVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNDT1BFVFlQRQotewotICAgIE9NWF9NZXRhZGF0YVNjb3BlQWxsTGV2ZWxzLAotICAgIE9NWF9NZXRhZGF0YVNjb3BlVG9wTGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVQb3J0TGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVOb2RlTGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhU2NvcGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9NZXRhZGF0YVNjb3BlVHlwZU1heCA9IDB4N2ZmZmZmZmYKLX0gT01YX01FVEFEQVRBU0NPUEVUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRQotewotICAgIE9NWF9NZXRhZGF0YVNlYXJjaFZhbHVlU2l6ZUJ5SW5kZXgsCi0gICAgT01YX01ldGFkYXRhU2VhcmNoSXRlbUJ5SW5kZXgsCi0gICAgT01YX01ldGFkYXRhU2VhcmNoTmV4dEl0ZW1CeUtleSwKLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX01ldGFkYXRhU2VhcmNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWV0YWRhdGFTZWFyY2hUeXBlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRTsKLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUKLXsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKLSAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKLSAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1Db3VudDsKLX0gT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX01FVEFEQVRBU0NPUEVUWVBFIGVTY29wZU1vZGU7Ci0gICAgT01YX1UzMiBuU2NvcGVTcGVjaWZpZXI7Ci0gICAgT01YX1UzMiBuTWV0YWRhdGFJdGVtSW5kZXg7ICAKLSAgICBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRSBlU2VhcmNoTW9kZTsKLSAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKLSAgICBPTVhfVTggbktleVNpemVVc2VkOwotICAgIE9NWF9VOCBuS2V5WzEyOF07Ci0gICAgT01YX01FVEFEQVRBQ0hBUlNFVFRZUEUgZVZhbHVlQ2hhcnNldDsKLSAgICBPTVhfU1RSSU5HIHNMYW5ndWFnZUNvdW50cnk7Ci0gICAgT01YX1UzMiBuVmFsdWVNYXhTaXplOwotICAgIE9NWF9VMzIgblZhbHVlU2l6ZVVzZWQ7Ci0gICAgT01YX1U4IG5WYWx1ZVsxXTsKLX0gT01YX0NPTkZJR19NRVRBREFUQUlURU1UWVBFOwotCi0vKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFQ09VTlRUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkFsbEtleXM7Ci0gICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOwotICAgIE9NWF9VMzIgbk51bU5vZGVzOwotfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEU7Ci0KLS8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX0JPT0wgYkFsbEtleXM7Ci0gICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOwotICAgIE9NWF9VMzIgbk5vZGVJbmRleDsgCi0gICAgT01YX1UzMiBuTm9kZUlEOyAKLSAgICBPTVhfU1RSSU5HIGNOb2RlTmFtZTsKLSAgICBPTVhfQk9PTCBiSXNMZWFmVHlwZTsKLX0gT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFOwotCi0vKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NRVRBREFUQUZJTFRFUlRZUEUgCi17IAotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX0JPT0wgYkFsbEtleXM7CS8qIGlmIHRydWUgdGhlbiB0aGlzIHN0cnVjdHVyZSByZWZlcnMgdG8gYWxsIGtleXMgYW5kIAotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHRocmVlIGtleSBmaWVsZHMgYmVsb3cgYXJlIGlnbm9yZWQgKi8KLSAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKLSAgICBPTVhfVTMyIG5LZXlTaXplVXNlZDsgCi0gICAgT01YX1U4ICAgbktleSBbMTI4XTsgCi0gICAgT01YX1UzMiBuTGFuZ3VhZ2VDb3VudHJ5U2l6ZVVzZWQ7Ci0gICAgT01YX1U4IG5MYW5ndWFnZUNvdW50cnlbMTI4XTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsJLyogaWYgdHJ1ZSB0aGVuIGtleSBpcyBwYXJ0IG9mIGZpbHRlciAoZS5nLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHJldGFpbmVkIGZvciBxdWVyeSBsYXRlcikuIElmIGZhbHNlIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGtleSBpcyBub3QgcGFydCBvZiBmaWx0ZXIgKi8KLX0gT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRTsgCi0KLS8qKiBUaGUgT01YX0hBTkRMRVRZUEUgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbXBvbmVudCBoYW5kbGUuICBUaGUgY29tcG9uZW50IAotICogIGhhbmRsZSBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNvbXBvbmVudCdzIHB1YmxpYyBtZXRob2RzIGFuZCBhbHNvCi0gKiAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGNvbXBvbmVudCdzIHByaXZhdGUgZGF0YSBhcmVhLiAgVGhlIGNvbXBvbmVudAotICogIGhhbmRsZSBpcyBpbml0aWFsaXplZCBieSB0aGUgT01YIGNvcmUgKHdpdGggaGVscCBmcm9tIHRoZSBjb21wb25lbnQpCi0gKiAgZHVyaW5nIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcgdGhlIGNvbXBvbmVudC4gIEFmdGVyIHRoZSBjb21wb25lbnQgaXMKLSAqICBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIHNhZmVseSBhY2Nlc3MgYW55IG9mIHRoZQotICogIGNvbXBvbmVudCdzIHB1YmxpYyBmdW5jdGlvbnMgKGFsdGhvdWdoIHNvbWUgbWF5IHJldHVybiBhbiBlcnJvciBiZWNhdXNlCi0gKiAgdGhlIHN0YXRlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBhY2Nlc3MpLgotICogCi0gKiAgQGluZ3JvdXAgY29tcAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UVFlQRQotewotICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gYnl0ZXMuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkKLSAgICAgICAgb2YgdGhlIGFsbG9jYXRvciBvZiB0aGlzIHN0cnVjdHVyZSB0byBmaWxsIGluIHRoaXMgdmFsdWUuICBTaW5jZQotICAgICAgICB0aGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIEdldEhhbmRsZSBmdW5jdGlvbiwgdGhpcwotICAgICAgICBmdW5jdGlvbiB3aWxsIGZpbGwgaW4gdGhpcyB2YWx1ZS4gKi8KLSAgICBPTVhfVTMyIG5TaXplOwotCi0gICAgLyoqIG5WZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBPTVggc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBzdHJ1Y3R1cmUgCi0gICAgICAgIGlzIGJ1aWx0IGFnYWluc3QuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNyZWF0b3Igb2YgdGhpcyAKLSAgICAgICAgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhpcyB2YWx1ZSBhbmQgZXZlcnkgdXNlciBvZiB0aGlzIHN0cnVjdHVyZSAKLSAgICAgICAgc2hvdWxkIHZlcmlmeSB0aGF0IGl0IGtub3dzIGhvdyB0byB1c2UgdGhlIGV4YWN0IHZlcnNpb24gb2YgCi0gICAgICAgIHRoaXMgc3RydWN0dXJlIGZvdW5kIGhlcmVpbi4gKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0KLSAgICAvKiogcENvbXBvbmVudFByaXZhdGUgaXMgYSBwb2ludGVyIHRvIHRoZSBjb21wb25lbnQgcHJpdmF0ZSBkYXRhIGFyZWEuICAKLSAgICAgICAgVGhpcyBtZW1iZXIgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBieSB0aGUgY29tcG9uZW50IHdoZW4gdGhlIAotICAgICAgICBjb21wb25lbnQgaXMgZmlyc3QgbG9hZGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYWNjZXNzIHRoaXMgCi0gICAgICAgIGRhdGEgYXJlYS4gKi8KLSAgICBPTVhfUFRSIHBDb21wb25lbnRQcml2YXRlOwotCi0gICAgLyoqIHBBcHBsaWNhdGlvblByaXZhdGUgaXMgYSBwb2ludGVyIHRoYXQgaXMgYSBwYXJhbWV0ZXIgdG8gdGhlIAotICAgICAgICBPTVhfR2V0SGFuZGxlIG1ldGhvZCwgYW5kIGNvbnRhaW5zIGFuIGFwcGxpY2F0aW9uIHByaXZhdGUgdmFsdWUgCi0gICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBJTCBjbGllbnQuICBUaGlzIGFwcGxpY2F0aW9uIHByaXZhdGUgZGF0YSBpcyAKLSAgICAgICAgcmV0dXJuZWQgdG8gdGhlIElMIENsaWVudCBieSBPTVggaW4gYWxsIGNhbGxiYWNrcyAqLwotICAgIE9NWF9QVFIgcEFwcGxpY2F0aW9uUHJpdmF0ZTsKLQotICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbXBvbmVudFZlcnNpb24gbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRDb21wb25lbnRWZXJzaW9uKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUUklORyBwQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwQ29tcG9uZW50VmVyc2lvbiwKLSAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwU3BlY1ZlcnNpb24sCi0gICAgICAgICAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSogcENvbXBvbmVudFVVSUQpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZW5kQ29tbWFuZCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNlbmRDb21tYW5kIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2VuZENvbW1hbmQpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQ09NTUFORFRZUEUgQ21kLAotICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5QYXJhbTEsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENtZERhdGEpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRQYXJhbWV0ZXIgbWV0aG9kLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRQYXJhbWV0ZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuUGFyYW1JbmRleCwgIAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7Ci0KLQotICAgIC8qKiByZWZlciB0byBPTVhfU2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0UGFyYW1ldGVyIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqU2V0UGFyYW1ldGVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LAotICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX0dldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbmZpZyBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkdldENvbmZpZykoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOwotCi0KLSAgICAvKiogcmVmZXIgdG8gT01YX1NldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFNldENvbmZpZyBtZXRob2QuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKlNldENvbmZpZykoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRFeHRlbnNpb25JbmRleCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldEV4dGVuc2lvbkluZGV4IG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0RXh0ZW5zaW9uSW5kZXgpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfU1RSSU5HIGNQYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFKiBwSW5kZXhUeXBlKTsKLQotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRTdGF0ZSBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFN0YXRlIG1ldGhvZC4KLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqR2V0U3RhdGUpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX09VVCBPTVhfU1RBVEVUWVBFKiBwU3RhdGUpOwotCi0gICAgCi0gICAgLyoqIFRoZSBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB3aWxsIGludGVyYWN0IHdpdGggYW5vdGhlciBPTVgKLSAgICAgICAgY29tcG9uZW50IHRvIGRldGVybWluZSBpZiB0dW5uZWxpbmcgaXMgcG9zc2libGUgYW5kIHRvIHNldHVwIHRoZQotICAgICAgICB0dW5uZWxpbmcuICBUaGUgcmV0dXJuIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBub3QgcG9zc2libGUsIG9yIGlmIHR1bm5lbGluZyBpcyBub3QKLSAgICAgICAgc3VwcG9ydGVkLiAgCi0gICAgICAgIAotICAgICAgICBCYXNlIHByb2ZpbGUgY29tcG9uZW50cyAoaS5lLiBub24taW50ZXJvcCkgZG8gbm90IHN1cHBvcnQgdGhpcwotICAgICAgICBtZXRob2QgYW5kIHNob3VsZCByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgCi0KLSAgICAgICAgVGhlIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgTVVTVCBzdXBwb3J0IHR1bm5lbGluZyB0byBhbm90aGVyIAotICAgICAgICBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IHdpdGggYSBjb21wYXRpYmxlIHBvcnQgcGFyYW1ldGVycy4gIAotICAgICAgICBBIGNvbXBvbmVudCBtYXkgYWxzbyBzdXBwb3J0IHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24uCi0gICAgICAgIAotICAgICAgICBJZiBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIHN1cHBvcnRlZCB0aGUgbmVnb3RpYXRpb24gb2YgCi0gICAgICAgIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgZG9uZSBvdXRzaWRlIG9mIE9NWCBpbiBhIHZlbmRvciAKLSAgICAgICAgc3BlY2lmaWMgd2F5LiBJdCBpcyBvbmx5IHJlcXVpcmVkIHRoYXQgdGhlIHByb3BlciByZXN1bHQgYmUgCi0gICAgICAgIHJldHVybmVkIGFuZCB0aGUgZGV0YWlscyBvZiBob3cgdGhlIHNldHVwIGlzIGRvbmUgaXMgbGVmdCAKLSAgICAgICAgdG8gdGhlIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbi4gIAotICAgIAotICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBvdXRwdXQgcG9ydCwgdGhlCi0gICAgICAgIGNvbXBvbmVudCB3aWxsOgotICAgICAgICAxLiAgUG9wdWxhdGUgdGhlIHBUdW5uZWxTZXR1cCBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3V0cHV0IHBvcnQncyAKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cyBhbmQgY29uc3RyYWludHMgZm9yIHRoZSB0dW5uZWwuCi0KLSAgICAgICAgV2hlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gblBvcnQgaW4gYW4gaW5wdXQgcG9ydCwgdGhlCi0gICAgICAgIGNvbXBvbmVudCB3aWxsOgotICAgICAgICAxLiAgUXVlcnkgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIG91dHB1dCBwb3J0IHRvIAotICAgICAgICAgICAgZGV0ZXJtaW5lIGlmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSBmb3IgdHVubmVsaW5nCi0gICAgICAgIDIuICBJZiB0aGUgcG9ydHMgYXJlIGNvbXBhdGlibGUsIHRoZSBjb21wb25lbnQgc2hvdWxkIHN0b3JlCi0gICAgICAgICAgICB0aGUgdHVubmVsIHN0ZXAgcHJvdmlkZWQgYnkgdGhlIG91dHB1dCBwb3J0Ci0gICAgICAgIDMuICBEZXRlcm1pbmUgd2hpY2ggcG9ydCAoZWl0aGVyIGlucHV0IG9yIG91dHB1dCkgaXMgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgc3VwcGxpZXIsIGFuZCBjYWxsIE9NWF9TZXRQYXJhbWV0ZXIgb24gdGhlIG91dHB1dCBwb3J0IHRvCi0gICAgICAgICAgICBpbmRpY2F0ZSB0aGlzIHNlbGVjdGlvbi4KLSAgICAgICAgCi0gICAgICAgIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICAgICAgQHBhcmFtIFtpbl0gaENvbXAKLSAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kLgotICAgICAgICBAcGFyYW0gW2luXSBuUG9ydAotICAgICAgICAgICAgblBvcnQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0byBiZSB1c2VkCi0gICAgICAgICAgICBmb3IgdHVubmVsaW5nLgotICAgICAgICBAcGFyYW0gW2luXSBoVHVubmVsZWRDb21wCi0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byB0dW5uZWwgd2l0aC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudCAKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuICBXaGVuCi0gICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyAweDAgdGhlIGNvbXBvbmVudCBzaG91bGQgc2V0dXAgdGhlIHBvcnQgZm9yCi0gICAgICAgICAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgotICAgICAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAotICAgICAgICAgICAgblBvcnRPdXRwdXQgaXMgdXNlZCBpbmRpY2F0ZSB0aGUgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZAotICAgICAgICAgICAgdHVubmVsIHdpdGguCi0gICAgICAgIEBwYXJhbSBbaW5dIHBUdW5uZWxTZXR1cAotICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgdHVubmVsIHNldHVwIHN0cnVjdHVyZS4gIFdoZW4gblBvcnQgaXMgYW4gb3V0cHV0IHBvcnQKLSAgICAgICAgICAgIHRoZSBjb21wb25lbnQgc2hvdWxkIHBvcHVsYXRlIHRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUuICBXaGVuCi0gICAgICAgICAgICBXaGVuIG5Qb3J0IGlzIGFuIGlucHV0IHBvcnQgdGhlIGNvbXBvbmVudCBzaG91bGQgcmV2aWV3IHRoZSBzZXR1cAotICAgICAgICAgICAgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSBvdXRwdXQgcG9ydC4KLSAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgICAgQGluZ3JvdXAgdHVuCi0gICAgKi8KLQotICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRUdW5uZWxSZXF1ZXN0KSgKLSAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcCwKLSAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0LAotICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCi0gICAgICAgIE9NWF9JTiAgT01YX1UzMiBuVHVubmVsZWRQb3J0LAotICAgICAgICBPTVhfSU5PVVQgIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHBUdW5uZWxTZXR1cCk7IAotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9Vc2VCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAotICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBVc2VCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqVXNlQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuU2l6ZUJ5dGVzLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VOCogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0FsbG9jYXRlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgQWxsb2NhdGVCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqQWxsb2NhdGVCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlciwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCi0gICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMpOwotCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9GcmVlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRnJlZUJ1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpGcmVlQnVmZmVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydEluZGV4LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0VtcHR5VGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCi0gICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEVtcHR5VGhpc0J1ZmZlciBtZXRob2QuCi0gICAgICAgIEBpbmdyb3VwIGJ1ZgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpFbXB0eVRoaXNCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogcmVmZXIgdG8gT01YX0ZpbGxUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKLSAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRmlsbFRoaXNCdWZmZXIgbWV0aG9kLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRmlsbFRoaXNCdWZmZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLSAgICAvKiogVGhlIFNldENhbGxiYWNrcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgY29yZSB0byBzcGVjaWZ5IHRoZSBjYWxsYmFjawotICAgICAgICBzdHJ1Y3R1cmUgZnJvbSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZwotICAgICAgICBjYWxsLiAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBbaW5dIHBDYWxsYmFja3MKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSAKLSAgICAgICAgICAgIGNhbGxiYWNrIGluZm9ybWF0aW9uIHRvIHRoZSBjb21wb25lbnQKLSAgICAgICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZS4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQgCi0gICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gd2lsbCBwYXNzIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIG9yIGEgInRoaXMKLSAgICAgICAgICAgIHBvaW50ZXIiIGluIHRoaXMgYXJlYSB0byBhbGxvdyB0aGUgY2FsbGJhY2sgKGluIHRoZSBhcHBsaWNhdGlvbikKLSAgICAgICAgICAgIHRvIGRldGVybWluZSB0aGUgY29udGV4dCBvZiB0aGUgY2FsbAotICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRDYWxsYmFja3MpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfQ0FMTEJBQ0tUWVBFKiBwQ2FsbGJhY2tzLCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSk7Ci0KLSAgICAvKiogQ29tcG9uZW50RGVJbml0IG1ldGhvZCBpcyB1c2VkIHRvIGRlaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50Ci0gICAgICAgIHByb3ZpZGluZyBhIG1lYW5zIHRvIGZyZWUgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYXQgY29tcG9uZW50Ci0gICAgICAgIGluaXRpYWxpemF0aW9uLiAgTk9URTogIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29tcG9uZW50IGhhbmRsZSBpcwotICAgICAgICBub3QgdmFsaWQgZm9yIGZ1cnRoZXIgdXNlLgotICAgICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudERlSW5pdCkoCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOwotCi0gICAgLyoqIEBpbmdyb3VwIGJ1ZiAqLwotICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VFR0xJbWFnZSkoCi0gICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVySGRyLAotICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKLSAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAotICAgICAgICAgICAgT01YX0lOIHZvaWQqIGVnbEltYWdlKTsKLQotICAgIE9NWF9FUlJPUlRZUEUgKCpDb21wb25lbnRSb2xlRW51bSkoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotCQlPTVhfT1VUIE9NWF9VOCAqY1JvbGUsCi0JCU9NWF9JTiBPTVhfVTMyIG5JbmRleCk7Ci0KLX0gT01YX0NPTVBPTkVOVFRZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5ZTRkYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvbnRlbnRQaXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9Db250ZW50UGlwZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9Db250ZW50UGlwZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKLSAqICB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgY29udGVudCBwaXBsZXMuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCi0gKiAgYmUgdXNlZCBieSB0aGUgY29tcG9uZW50LgotICovCi0KLSNpZm5kZWYgT01YX0NPTlRFTlRQSVBFX0gKLSNkZWZpbmUgT01YX0NPTlRFTlRQSVBFX0gKLQotI2lmbmRlZiBLRF9FQUNDRVMKLS8qIE9wZW5LT0RFIGVycm9yIGNvZGVzLiBDUFJlc3VsdCB2YWx1ZXMgbWF5IGJlIHplcm8gKGluZGljYXRpbmcgc3VjY2VzcwotICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzKSAqLwotI2RlZmluZSBLRF9FQUNDRVMgKDEpCi0jZGVmaW5lIEtEX0VBRERSSU5VU0UgKDIpCi0jZGVmaW5lIEtEX0VBR0FJTiAoNSkKLSNkZWZpbmUgS0RfRUJBREYgKDcpCi0jZGVmaW5lIEtEX0VCVVNZICg4KQotI2RlZmluZSBLRF9FQ09OTlJFRlVTRUQgKDkpCi0jZGVmaW5lIEtEX0VDT05OUkVTRVQgKDEwKQotI2RlZmluZSBLRF9FREVBRExLICgxMSkKLSNkZWZpbmUgS0RfRURFU1RBRERSUkVRICgxMikKLSNkZWZpbmUgS0RfRVJBTkdFICgzNSkKLSNkZWZpbmUgS0RfRUVYSVNUICgxMykKLSNkZWZpbmUgS0RfRUZCSUcgKDE0KQotI2RlZmluZSBLRF9FSE9TVFVOUkVBQ0ggKDE1KQotI2RlZmluZSBLRF9FSU5WQUwgKDE3KQotI2RlZmluZSBLRF9FSU8gKDE4KQotI2RlZmluZSBLRF9FSVNDT05OICgyMCkKLSNkZWZpbmUgS0RfRUlTRElSICgyMSkKLSNkZWZpbmUgS0RfRU1GSUxFICgyMikKLSNkZWZpbmUgS0RfRU5BTUVUT09MT05HICgyMykKLSNkZWZpbmUgS0RfRU5PRU5UICgyNCkKLSNkZWZpbmUgS0RfRU5PTUVNICgyNSkKLSNkZWZpbmUgS0RfRU5PU1BDICgyNikKLSNkZWZpbmUgS0RfRU5PU1lTICgyNykKLSNkZWZpbmUgS0RfRU5PVENPTk4gKDI4KQotI2RlZmluZSBLRF9FUEVSTSAoMzMpCi0jZGVmaW5lIEtEX0VUSU1FRE9VVCAoMzYpCi0jZGVmaW5lIEtEX0VJTFNFUSAoMTkpCi0jZW5kaWYKLQotLyoqIE1hcCB0eXBlcyBmcm9tIE9NWCBzdGFuZGFyZCB0eXBlcyBvbmx5IGhlcmUgc28gaW50ZXJmYWNlIGlzIGFzIGdlbmVyaWMgYXMgcG9zc2libGUuICovCi10eXBlZGVmIE9NWF9VMzIgICAgQ1ByZXN1bHQ7Ci10eXBlZGVmIGNoYXIgKiAgICAgQ1BzdHJpbmc7ICAKLXR5cGVkZWYgdm9pZCAqICAgICBDUGhhbmRsZTsKLXR5cGVkZWYgT01YX1UzMiAgICBDUHVpbnQ7Ci10eXBlZGVmIE9NWF9TMzIgICAgQ1BpbnQ7ICAKLXR5cGVkZWYgY2hhciAgICAgICBDUGJ5dGU7ICAKLXR5cGVkZWYgT01YX0JPT0wgICBDUGJvb2w7Ci0KLS8qKiBlbnVtZXJhdGlvbiBvZiBvcmlnaW4gdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBTZWVrIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX09SSUdJTlRZUEUgewotICAgIENQX09yaWdpbkJlZ2luLCAgICAgIAotICAgIENQX09yaWdpbkN1ciwgICAgICAKLSAgICBDUF9PcmlnaW5FbmQsICAgICAgCi0gICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX09yaWdpblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfT3JpZ2luTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9PUklHSU5UWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGFjdCBhY2Nlc3MgdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBPcGVuIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0FDQ0VTU1RZUEUgewotICAgIENQX0FjY2Vzc1JlYWQsICAgICAgCi0gICAgQ1BfQWNjZXNzV3JpdGUsICAKLSAgICBDUF9BY2Nlc3NSZWFkV3JpdGUgLCAgCi0gICAgQ1BfQWNjZXNzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0FjY2Vzc1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfQWNjZXNzTWF4ID0gMFg3RkZGRkZGRgotfSBDUF9BQ0NFU1NUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgQ1BfUElQRVRZUEUncyBDaGVja0F2YWlsYWJsZUJ5dGVzIGZ1bmN0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0NIRUNLQllURVNSRVNVTFRUWVBFCi17Ci0gICAgQ1BfQ2hlY2tCeXRlc09rLCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGVyZSBhcmUgYXQgbGVhc3QgdGhlIHJlcXVlc3QgbnVtYmVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLwotICAgIENQX0NoZWNrQnl0ZXNOb3RSZWFkeSwgICAgICAgICAgICAgIC8qKjwgVGhlIHBpcGUgaXMgc3RpbGwgcmV0cmlldmluZyBieXRlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJlc2VudGx5IGxhY2tzIHN1ZmZpY2llbnQgYnl0ZXMuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzSW5zdWZmaWNpZW50Qnl0ZXMgICwgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJldHJpZXZlZCBhbGwgYnl0ZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRob3NlIGF2YWlsYWJsZSBhcmUgbGVzcyB0aGFuIHRob3NlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCAqLwotICAgIENQX0NoZWNrQnl0ZXNBdEVuZE9mU3RyZWFtLCAgICAgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNPdXRPZkJ1ZmZlcnMsICAgICAgICAgIC8qKjwgQWxsIHJlYWQvd3JpdGUgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIENQX0NoZWNrQnl0ZXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIENQX0NoZWNrQnl0ZXNNYXggPSAwWDdGRkZGRkZGCi19IENQX0NIRUNLQllURVNSRVNVTFRUWVBFOwotCi0vKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2suIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBlbnVtIENQX0VWRU5UVFlQRXsKLSAgICBDUF9CeXRlc0F2YWlsYWJsZSwgICAgICAJICAgIC8qKiBieXRlcyByZXF1ZXN0ZWQgaW4gYSBDaGVja0F2YWlsYWJsZUJ5dGVzIGNhbGwgYXJlIG5vdyBhdmFpbGFibGUqLwotICAgIENQX092ZXJmbG93LCAgCQkgICAgICAgICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCi0gICAgQ1BfUGlwZURpc2Nvbm5lY3RlZCAgLCAgCQkgICAgLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrKi8KLSAgICBDUF9FdmVudEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBDUF9FdmVudFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgQ1BfRXZlbnRNYXggPSAwWDdGRkZGRkZGCi19IENQX0VWRU5UVFlQRTsKLQotLyoqIGNvbnRlbnQgcGlwZSBkZWZpbml0aW9uIAotICogQGluZ3JvdXAgY3AKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgQ1BfUElQRVRZUEUKLXsKLSAgICAvKiogT3BlbiBhIGNvbnRlbnQgc3RyZWFtIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovIAotICAgIENQcmVzdWx0ICgqT3BlbikoIENQaGFuZGxlKiBoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkksIENQX0FDQ0VTU1RZUEUgZUFjY2VzcyApOwotCi0gICAgLyoqIENsb3NlIGEgY29udGVudCBzdHJlYW0uICovIAotICAgIENQcmVzdWx0ICgqQ2xvc2UpKCBDUGhhbmRsZSBoQ29udGVudCApOwotCi0gICAgLyoqIENyZWF0ZSBhIGNvbnRlbnQgc291cmNlIGFuZCBvcGVuIGl0IGZvciB3cml0aW5nLiAqLyAKLSAgICBDUHJlc3VsdCAoKkNyZWF0ZSkoIENQaGFuZGxlICpoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkkgKTsKLQotICAgIC8qKiBDaGVjayB0aGUgdGhhdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyAoZGVwZW5kaW5nIG9uIGFjY2VzcyB0eXBlKS4qLwotICAgIENQcmVzdWx0ICgqQ2hlY2tBdmFpbGFibGVCeXRlcykoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgbkJ5dGVzUmVxdWVzdGVkLCBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRSAqZVJlc3VsdCApOwotCi0gICAgLyoqIFNlZWsgdG8gY2VydGFpbiBwb3NpdGlvbiBpbiB0aGUgY29udGVudCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbi4gKi8KLSAgICBDUHJlc3VsdCAoKlNldFBvc2l0aW9uKSggQ1BoYW5kbGUgIGhDb250ZW50LCBDUGludCBuT2Zmc2V0LCBDUF9PUklHSU5UWVBFIGVPcmlnaW4pOwotCi0gICAgLyoqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gKi8KLSAgICBDUHJlc3VsdCAoKkdldFBvc2l0aW9uKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQdWludCAqcFBvc2l0aW9uKTsKLQotICAgIC8qKiBSZXRyaWV2ZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBmcm9tIHRoZSBjb250ZW50IHN0cmVhbSAoYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgc2l6ZSBvZiBkYXRhKS4KLSAgICAgICBOb3RlOiBwaXBlIGNsaWVudCBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBzbWFsbCBoaWdoIGZyZXF1ZW5jeSByZWFkcy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWQpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwRGF0YSwgQ1B1aW50IG5TaXplKTsgCi0KLSAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuIAotICAgICAgIEJ1ZmZlciBjb250YWlucyB0aGUgbmV4dCBibG9jayBvZiBieXRlcywgYXMgc3BlY2lmaWVkIGJ5IG5TaXplLCBvZiB0aGUgY29udGVudC4gblNpemUgYWxzbwotICAgICAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFjdHVhbGx5IHJlYWQuIENvbnRlbnQgcG9pbnRlciBhZHZhbmNlcyB0aGUgYnkgdGhlIHJldHVybmVkIHNpemUuIAotICAgICAgIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgcmVhZHMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIAotICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4gCi0KLSAgICAgICBJbiBzb21lIGNhc2VzIHRoZSByZXF1ZXN0ZWQgYmxvY2sgbWF5IG5vdCByZXNpZGUgaW4gY29udGlndW91cyBtZW1vcnkgd2l0aGluIHRoZQotICAgICAgIHBpcGUgaW1wbGVtZW50YXRpb24uIEZvciBpbnN0YW5jZSBpZiB0aGUgcGlwZSBsZXZlcmFnZXMgYSBjaXJjdWxhciBidWZmZXIgdGhlbiB0aGUgcmVxdWVzdGVkIAotICAgICAgIGJsb2NrIG1heSBzdHJhZGRsZSB0aGUgYm91bmRhcnkgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4gQnkgZGVmYXVsdCBhIHBpcGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgcGVyZm9ybXMgYSBjb3B5IGluIHRoaXMgY2FzZSB0byBwcm92aWRlIHRoZSBibG9jayB0byB0aGUgcGlwZSBjbGllbnQgaW4gb25lIGNvbnRpZ3VvdXMgYnVmZmVyLgotICAgICAgIElmLCBob3dldmVyLCB0aGUgY2xpZW50IHNldHMgYkZvcmJpZENvcHksIHRoZW4gdGhlIHBpcGUgcmV0dXJucyBvbmx5IHRob3NlIGJ5dGVzIHByZWNlZGluZyB0aGUgbWVtb3J5IAotICAgICAgIGJvdW5kYXJ5LiBIZXJlIHRoZSBjbGllbnQgbWF5IHJldHJpZXZlIHRoZSBkYXRhIGluIHNlZ21lbnRzIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscy4gKi8KLSAgICBDUHJlc3VsdCAoKlJlYWRCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCAqblNpemUsIENQYm9vbCBiRm9yYmlkQ29weSk7Ci0KLSAgICAvKiogUmVsZWFzZSBhIGJ1ZmZlciBvYnRhaW5lZCBieSBSZWFkQnVmZmVyIGJhY2sgdG8gdGhlIHBpcGUuICovCi0gICAgQ1ByZXN1bHQgKCpSZWxlYXNlUmVhZEJ1ZmZlcikoQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlcik7Ci0KLSAgICAvKiogV3JpdGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgdG8gdGhlIGNvbnRlbnQgKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCi0gICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgd3JpdGVzLiAqLwotICAgIENQcmVzdWx0ICgqV3JpdGUpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpkYXRhLCBDUHVpbnQgblNpemUpOyAKLQotICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBjb250ZW50LiAKLSAgICAgICBDbGllbnQgd2lsbCBmaWxsIGJ1ZmZlciB3aXRoIG91dHB1dCBkYXRhLiBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUKLSAgICAgICBmb3IgbGFyZ2Ugd3JpdGVzLiBUaGUgY2xpZW50IG11c3QgY2FsbCBXcml0ZUJ1ZmZlciB3aGVuIGRvbmUgaXQgaGFzIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggZGF0YS4qLwotICAgIENQcmVzdWx0ICgqR2V0V3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCBuU2l6ZSk7Ci0KLSAgICAvKiogRGVsaXZlciBhIGJ1ZmZlciBvYnRhaW5lZCB2aWEgR2V0V3JpdGVCdWZmZXIgdG8gdGhlIHBpcGUuIFBpcGUgd2lsbCB3cml0ZSB0aGUgCi0gICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gY29udGVudCBhbmQgYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLwotICAgIENQcmVzdWx0ICgqV3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwQnVmZmVyLCBDUHVpbnQgbkZpbGxlZFNpemUpOwotCi0gICAgLyoqIFJlZ2lzdGVyIGEgcGVyLWhhbmRsZSBjbGllbnQgY2FsbGJhY2sgd2l0aCB0aGUgY29udGVudCBwaXBlLiAqLwotICAgIENQcmVzdWx0ICgqUmVnaXN0ZXJDYWxsYmFjaykoIENQaGFuZGxlIGhDb250ZW50LCBDUHJlc3VsdCAoKkNsaWVudENhbGxiYWNrKShDUF9FVkVOVFRZUEUgZUV2ZW50LCBDUHVpbnQgaVBhcmFtKSk7Ci0KLX0gQ1BfUElQRVRZUEU7Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0NvcmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmIwZjZmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfQ29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0OCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogT01YX0NvcmUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBPTVhfQ29yZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSBib3RoIHRoZQotICogIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IHRvIGFjY2VzcyBjb21tb24gaXRlbXMuCi0gKi8KLQotI2lmbmRlZiBPTVhfQ29yZV9oCi0jZGVmaW5lIE9NWF9Db3JlX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLQotI2luY2x1ZGUgPE9NWF9JbmRleC5oPgotCi0KLS8qKiBUaGUgT01YX0NPTU1BTkRUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWN0aW9uIGluIHRoZQotICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4gIAotICogIEBpbmdyb3VwIGNvcmUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9DT01NQU5EVFlQRQotewotICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsICAgIC8qKjwgQ2hhbmdlIHRoZSBjb21wb25lbnQgc3RhdGUgKi8KLSAgICBPTVhfQ29tbWFuZEZsdXNoLCAgICAgICAvKio8IEZsdXNoIHRoZSBkYXRhIHF1ZXVlKHMpIG9mIGEgY29tcG9uZW50ICovCi0gICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgLyoqPCBEaXNhYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KLSAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUsICAvKio8IEVuYWJsZSBhIHBvcnQgb24gYSBjb21wb25lbnQuICovCi0gICAgT01YX0NvbW1hbmRNYXJrQnVmZmVyLCAgLyoqPCBNYXJrIGEgY29tcG9uZW50L2J1ZmZlciBmb3Igb2JzZXJ2YXRpb24gKi8KLSAgICBPTVhfQ29tbWFuZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQ29tbWFuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbW1hbmRNYXggPSAwWDdGRkZGRkZGCi19IE9NWF9DT01NQU5EVFlQRTsKLQotCi0KLS8qKiBUaGUgT01YX1NUQVRFVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIG9yIGNoYW5nZSB0aGUgY29tcG9uZW50Ci0gKiAgc3RhdGUuICBUaGlzIGVudW1lcmF0aW9uIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21wb25lbnQgd2hlbgotICogIHVzZWQgd2l0aCB0aGUgT01YX0dldFN0YXRlIG1hY3JvIG9yIGJlY29tZXMgdGhlIHBhcmFtZXRlciBpbiBhIHN0YXRlIGNoYW5nZQotICogIGNvbW1hbmQgd2hlbiB1c2VkIHdpdGggdGhlIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4KLSAqCi0gKiAgVGhlIGNvbXBvbmVudCB3aWxsIGJlIGluIHRoZSBMb2FkZWQgc3RhdGUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkKLSAqICBsb2FkZWQgaW50byBtZW1vcnkuICBJbiB0aGUgTG9hZGVkIHN0YXRlLCB0aGUgY29tcG9uZW50IGlzIG5vdCBhbGxvd2VkIHRvCi0gKiAgYWxsb2NhdGUgb3IgaG9sZCByZXNvdXJjZXMgb3RoZXIgdGhhbiB0byBidWlsZCBpdCdzIGludGVybmFsIHBhcmFtZXRlcgotICogIGFuZCBjb25maWd1cmF0aW9uIHRhYmxlcy4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHNlbmQgb25lIG9yIG1vcmUKLSAqICBTZXRQYXJhbWV0ZXJzL0dldFBhcmFtZXRlcnMgYW5kIFNldENvbmZpZy9HZXRDb25maWcgY29tbWFuZHMgdG8gdGhlCi0gKiAgY29tcG9uZW50IGFuZCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVyIGFuZAotICogIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgdXNlIGxhdGVyLiAgV2hlbiB0aGUgYXBwbGljYXRpb24gc2VuZHMgdGhlCi0gKiAgSWRsZSBjb21tYW5kLCB0aGUgY29tcG9uZW50IHdpbGwgYWNxdWlyZSB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlCi0gKiAgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgaWRsZSBzdGF0ZSBpZiB0aGUKLSAqICBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwuICBJZiB0aGUgY29tcG9uZW50IGNhbm5vdCBzdWNjZXNzZnVsbHkKLSAqICB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGZvciBhbnkgcmVhc29uLCB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudAotICogIHNoYWxsIGJlIGZ1bGx5IHJvbGxlZCBiYWNrIHRvIHRoZSBMb2FkZWQgc3RhdGUgKGUuZy4gYWxsIGFsbG9jYXRlZCAKLSAqICByZXNvdXJjZXMgc2hhbGwgYmUgcmVsZWFzZWQpLiAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBjb21tYW5kCi0gKiAgdG8gZ28gdG8gdGhlIEV4ZWN1dGluZyBzdGF0ZSwgaXQgc2hhbGwgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzIGJ5Ci0gKiAgc2VuZGluZyBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgYXBwbGljYXRpb24uICBXaGlsZQotICogIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIElkbGUgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBzZW5kIHRoZQotICogIFBhdXNlIGNvbW1hbmQuICBJZiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kIHdoaWxlIGluIHRoZQotICogIElkbGUgc3RhdGUsIHRoZSBjb21wb25lbnQgc2hhbGwgc2VuZCBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgCi0gKiAgYXBwbGljYXRpb24sIGJ1dCBzaGFsbCBub3QgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzLiAgVGhpcyB3aWxsIGFsbG93IHRoZQotICogIGFwcGxpY2F0aW9uIHRvIHByZWZpbGwgYnVmZmVycy4KLSAqIAotICogIEBpbmdyb3VwIGNvbXAKLSAqLwotCi10eXBlZGVmIGVudW0gT01YX1NUQVRFVFlQRQotewotICAgIE9NWF9TdGF0ZUludmFsaWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIHRoYXQgaXQncyBpbnRlcm5hbCBkYXRhIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBjb3JydXB0ZWQgdG8gdGhlIHBvaW50IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGRldGVybWluZSBpdCdzIHN0YXRlIHByb3Blcmx5ICovCi0gICAgT01YX1N0YXRlTG9hZGVkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZCBidXQgaGFzIG5vdCBjb21wbGV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uICBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gYXJlIHRoZSBvbmx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIHRoaXMgc3RhdGUuICovCi0gICAgT01YX1N0YXRlSWRsZSwgICAgICAgIC8qKjwgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgYW5kIHRoZSBjb21wb25lbnQgaXMgcmVhZHkgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQuICovCi0gICAgT01YX1N0YXRlRXhlY3V0aW5nLCAgIC8qKjwgY29tcG9uZW50IGhhcyBhY2NlcHRlZCB0aGUgc3RhcnQgY29tbWFuZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJvY2Vzc2luZyBkYXRhIChpZiBkYXRhIGlzIGF2YWlsYWJsZSkgKi8KLSAgICBPTVhfU3RhdGVQYXVzZSwgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIHJlY2VpdmVkIHBhdXNlIGNvbW1hbmQgKi8KLSAgICBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzLCAvKio8IGNvbXBvbmVudCBpcyB3YWl0aW5nIGZvciByZXNvdXJjZXMsIGVpdGhlciBhZnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdGlvbiBvciBiZWZvcmUgaXQgZ2V0cyB0aGUgcmVzb3VyY2VzIHJlcXVlc3RlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRldGFpbHMuICovCi0gICAgT01YX1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9TdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1N0YXRlTWF4ID0gMFg3RkZGRkZGRgotfSBPTVhfU1RBVEVUWVBFOwotCi0vKiogVGhlIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgc3RhbmRhcmQgT01YIEVycm9ycy4gIFRoZXNlIAotICogIGVycm9ycyBzaG91bGQgY292ZXIgbW9zdCBvZiB0aGUgY29tbW9uIGZhaWx1cmUgY2FzZXMuICBIb3dldmVyLCAKLSAqICB2ZW5kb3JzIGFyZSBmcmVlIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2VzIG9mIHRoZWlyIG93biBhcyAKLSAqICBsb25nIGFzIHRoZXkgZm9sbG93IHRoZXNlIHJ1bGVzOgotICogIDEuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIDB4OTAwMDAwMDAgdG8KLSAqICAgICAgMHg5MDAwRkZGRi4KLSAqICAyLiAgVmVuZG9yIGVycm9yIG1lc3NhZ2VzIHNoYWxsIGJlIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBwcm92aWRlZAotICogICAgICB3aXRoIHRoZSBjb21wb25lbnQuICBObyBlcnJvciBtZXNzYWdlcyBhcmUgYWxsb3dlZCB0aGF0IGFyZQotICogICAgICBub3QgZGVmaW5lZC4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FUlJPUlRZUEUKLXsKLSAgT01YX0Vycm9yTm9uZSA9IDAsCi0KLSAgLyoqIFRoZXJlIHdlcmUgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uICovCi0gIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyA9IChPTVhfUzMyKSAweDgwMDAxMDAwLAotCi0gIC8qKiBUaGVyZSB3YXMgYW4gZXJyb3IsIGJ1dCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICovCi0gIE9NWF9FcnJvclVuZGVmaW5lZCA9IChPTVhfUzMyKSAweDgwMDAxMDAxLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IG5hbWUgc3RyaW5nIHdhcyBub3QgdmFsaWQgKi8KLSAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWUgPSAoT01YX1MzMikgMHg4MDAwMTAwMiwKLQotICAvKiogTm8gY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHN0cmluZyB3YXMgZm91bmQgKi8KLSAgT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQgPSAoT01YX1MzMikgMHg4MDAwMTAwMywKLQotICAvKiogVGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgZGlkIG5vdCBoYXZlIGEgIk9NWF9Db21wb25lbnRJbml0IiBvcgotICAgICAgIk9NWF9Db21wb25lbnREZUluaXQgZW50cnkgcG9pbnQgKi8KLSAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCA9IChPTVhfUzMyKSAweDgwMDAxMDA0LAotCi0gIC8qKiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHdlcmUgbm90IHZhbGlkICovCi0gIE9NWF9FcnJvckJhZFBhcmFtZXRlciA9IChPTVhfUzMyKSAweDgwMDAxMDA1LAotCi0gIC8qKiBUaGUgcmVxdWVzdGVkIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotICBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDA2LAotCi0gIC8qKiBUaGUgYnVmZmVyIHdhcyBlbXB0aWVkIGJlZm9yZSB0aGUgbmV4dCBidWZmZXIgd2FzIHJlYWR5ICovCi0gIE9NWF9FcnJvclVuZGVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA3LAotCi0gIC8qKiBUaGUgYnVmZmVyIHdhcyBub3QgYXZhaWxhYmxlIHdoZW4gaXQgd2FzIG5lZWRlZCAqLwotICBPTVhfRXJyb3JPdmVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA4LAotCi0gIC8qKiBUaGUgaGFyZHdhcmUgZmFpbGVkIHRvIHJlc3BvbmQgYXMgZXhwZWN0ZWQgKi8KLSAgT01YX0Vycm9ySGFyZHdhcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwOSwKLQotICAvKiogVGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgc3RhdGUgT01YX1N0YXRlSW52YWxpZCAqLwotICBPTVhfRXJyb3JJbnZhbGlkU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAwQSwKLQotICAvKiogU3RyZWFtIGlzIGZvdW5kIHRvIGJlIGNvcnJ1cHQgKi8KLSAgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCA9IChPTVhfUzMyKSAweDgwMDAxMDBCLAotCi0gIC8qKiBQb3J0cyBiZWluZyBjb25uZWN0ZWQgYXJlIG5vdCBjb21wYXRpYmxlICovCi0gIE9NWF9FcnJvclBvcnRzTm90Q29tcGF0aWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDBDLAotCi0gIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGlkbGUgY29tcG9uZW50IGhhdmUgYmVlbgotICAgICAgbG9zdCByZXN1bHRpbmcgaW4gdGhlIGNvbXBvbmVudCByZXR1cm5pbmcgdG8gdGhlIGxvYWRlZCBzdGF0ZSAqLwotICBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEQsCi0KLSAgLyoqIE5vIG1vcmUgaW5kaWNpZXMgY2FuIGJlIGVudW1lcmF0ZWQgKi8KLSAgT01YX0Vycm9yTm9Nb3JlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEUsCi0KLSAgLyoqIFRoZSBjb21wb25lbnQgZGV0ZWN0ZWQgYSB2ZXJzaW9uIG1pc21hdGNoICovCi0gIE9NWF9FcnJvclZlcnNpb25NaXNtYXRjaCA9IChPTVhfUzMyKSAweDgwMDAxMDBGLAotCi0gIC8qKiBUaGUgY29tcG9uZW50IGlzIG5vdCByZWFkeSB0byByZXR1cm4gZGF0YSBhdCB0aGlzIHRpbWUgKi8KLSAgT01YX0Vycm9yTm90UmVhZHkgPSAoT01YX1MzMikgMHg4MDAwMTAxMCwKLQotICAvKiogVGhlcmUgd2FzIGEgdGltZW91dCB0aGF0IG9jY3VycmVkICovCi0gIE9NWF9FcnJvclRpbWVvdXQgPSAoT01YX1MzMikgMHg4MDAwMTAxMSwKLQotICAvKiogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBzdGF0ZSB5b3UgYXJlIGFscmVhZHkgaW4gKi8KLSAgT01YX0Vycm9yU2FtZVN0YXRlID0gKE9NWF9TMzIpIDB4ODAwMDEwMTIsCi0KLSAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gZXhlY3V0aW5nIG9yIHBhdXNlZCBjb21wb25lbnQgaGF2ZSBiZWVuIAotICAgICAgcHJlZW1wdGVkLCBjYXVzaW5nIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIHRvIHRoZSBpZGxlIHN0YXRlICovCi0gIE9NWF9FcnJvclJlc291cmNlc1ByZWVtcHRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDEzLCAKLQotICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgTE9BREVEIHRvIHRoZSBJRExFIHN0YXRlIG9yCi0gICAgICBvbiBhIHBvcnQgcmVzdGFydCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAotICAgICAgdG8gc2VuZCBpdCBhbiBhbGxvY2F0ZWQgYnVmZmVyIHZpYSBhIFVzZUJ1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nQWxsb2NhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE0LAotCi0gIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAotICAgICAgZHVyaW5nIHRoZSBkZWFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIHN0YXRlIG9yIAotICAgICAgb24gYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKLSAgICAgIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvbiBvZiBhIGJ1ZmZlciBoZWFkZXIgdmlhIGEgRnJlZUJ1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTUsCi0KLSAgLyoqIEEgc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgc3RvcHBpbmcgb2YgYSBwb3J0IChlaXRoZXIgb24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIAotICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIAotICAgICAgdGhlIG5vbi1zdXBwbGllciB0byByZXR1cm4gYSBidWZmZXIgdmlhIGFuIEVtcHR5VGhpc0J1ZmZlciBvciBGaWxsVGhpc0J1ZmZlciBjYWxsLiAqLwotICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nU3RvcCA9IChPTVhfUzMyKSAweDgwMDAxMDE2LAotCi0gIC8qKiBBdHRlbXB0aW5nIGEgc3RhdGUgdHJhbnN0aW9uIHRoYXQgaXMgbm90IGFsbG93ZWQgKi8KLSAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTcsCi0KLSAgLyogQXR0ZW1wdGluZyBhIGNvbW1hbmQgdGhhdCBpcyBub3QgYWxsb3dlZCBkdXJpbmcgdGhlIHByZXNlbnQgc3RhdGUuICovCi0gIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTgsIAotCi0gIC8qKiBUaGUgdmFsdWVzIGVuY2Fwc3VsYXRlZCBpbiB0aGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBzdHJ1Y3R1cmUgYXJlIG5vdCBzdXBwb3J0ZWQuICovCi0gIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyA9IChPTVhfUzMyKSAweDgwMDAxMDE5LAotCi0gIC8qKiBUaGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIGluZGV4IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0gIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQSwKLQotICAvKiogVGhlIHBvcnQgaW5kZXggc3VwcGxpZWQgaXMgaW5jb3JyZWN0LiAqLwotICBPTVhfRXJyb3JCYWRQb3J0SW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQiwKLQotICAvKiogVGhlIHBvcnQgaGFzIGxvc3Qgb25lIG9yIG1vcmUgb2YgaXRzIGJ1ZmZlcnMgYW5kIGl0IHRodXMgdW5wb3B1bGF0ZWQuICovCi0gIE9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDFDLAotCi0gIC8qKiBDb21wb25lbnQgc3VzcGVuZGVkIGR1ZSB0byB0ZW1wb3JhcnkgbG9zcyBvZiByZXNvdXJjZXMgKi8KLSAgT01YX0Vycm9yQ29tcG9uZW50U3VzcGVuZGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUQsCi0KLSAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIGFuIGluYWJpbGl0eSB0byBhY3F1aXJlIGR5bmFtaWMgcmVzb3VyY2VzICovCi0gIE9NWF9FcnJvckR5bmFtaWNSZXNvdXJjZXNVbmF2YWlsYWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDFFLAotCi0gIC8qKiBXaGVuIHRoZSBtYWNyb2Jsb2NrIGVycm9yIHJlcG9ydGluZyBpcyBlbmFibGVkIHRoZSBjb21wb25lbnQgcmV0dXJucyBuZXcgZXJyb3IgCi0gIGZvciBldmVyeSBmcmFtZSB0aGF0IGhhcyBlcnJvcnMgKi8KLSAgT01YX0Vycm9yTWJFcnJvcnNJbkZyYW1lID0gKE9NWF9TMzIpIDB4ODAwMDEwMUYsCi0KLSAgLyoqIEEgY29tcG9uZW50IHJlcG9ydHMgdGhpcyBlcnJvciB3aGVuIGl0IGNhbm5vdCBwYXJzZSBvciBkZXRlcm1pbmUgdGhlIGZvcm1hdCBvZiBhbiBpbnB1dCBzdHJlYW0uICovCi0gIE9NWF9FcnJvckZvcm1hdE5vdERldGVjdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjAsIAotCi0gIC8qKiBUaGUgY29udGVudCBvcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCi0gIE9NWF9FcnJvckNvbnRlbnRQaXBlT3BlbkZhaWxlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIxLAotCi0gIC8qKiBUaGUgY29udGVudCBjcmVhdGlvbiBvcGVyYXRpb24gZmFpbGVkLiAqLwotICBPTVhfRXJyb3JDb250ZW50UGlwZUNyZWF0aW9uRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjIsCi0KLSAgLyoqIFNlcGFyYXRlIHRhYmxlIGluZm9ybWF0aW9uIGlzIGJlaW5nIHVzZWQgKi8KLSAgT01YX0Vycm9yU2VwZXJhdGVUYWJsZXNVc2VkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjMsCi0KLSAgLyoqIFR1bm5lbGluZyBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50Ki8KLSAgT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyNCwKLQotICBPTVhfRXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IChPTVhfUzMyKTB4OEYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gIE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkID0gKE9NWF9TMzIpMHg5MDAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gIE9NWF9FcnJvck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VSUk9SVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvcmUgKi8KLXR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKiBPTVhfQ09NUE9ORU5USU5JVFRZUEUpKE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7Ci0KLS8qKiBAaW5ncm91cCBjb3JlICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFCi17Ci0gIGNvbnN0IGNoYXIgICAgICAgICAgKiBwTmFtZTsgICAgICAgLyogQ29tcG9uZW50IG5hbWUsIDEyOCBieXRlIGxpbWl0IChpbmNsdWRpbmcgJ1wwJykgYXBwbGllcyAqLwotICBPTVhfQ09NUE9ORU5USU5JVFRZUEUgcEluaXRpYWxpemU7IC8qIENvbXBvbmVudCBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLwotfSBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFOwotCi0vKiogQGluZ3JvdXAgY29yZSAqLwotZXh0ZXJuIE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUgT01YX0NvbXBvbmVudFJlZ2lzdGVyZWRbXTsKLQotLyoqIEBpbmdyb3VwIHJwbSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BSSU9SSVRZTUdNVFRZUEUgewotIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gT01YX1UzMiBuR3JvdXBQcmlvcml0eTsgICAgICAgICAgICAvKio8IFByaW9yaXR5IG9mIHRoZSBjb21wb25lbnQgZ3JvdXAgKi8KLSBPTVhfVTMyIG5Hcm91cElEOyAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLwotfSBPTVhfUFJJT1JJVFlNR01UVFlQRTsKLQotLyogQ29tcG9uZW50IG5hbWUgYW5kIFJvbGUgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotI2RlZmluZSBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAxMjgKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCBjUm9sZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07ICAvKio8IG5hbWUgb2Ygc3RhbmRhcmQgY29tcG9uZW50IHdoaWNoIGRlZmluZXMgY29tcG9uZW50IHJvbGUgKi8KLX0gT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFOwotCi0vKiogRW5kIG9mIFN0cmVhbSBCdWZmZXIgRmxhZzogCi0gICoKLSAgKiBBIGNvbXBvbmVudCBzZXRzIEVPUyB3aGVuIGl0IGhhcyBubyBtb3JlIGRhdGEgdG8gZW1pdCBvbiBhIHBhcnRpY3VsYXIgCi0gICogb3V0cHV0IHBvcnQuIFRodXMgYW4gb3V0cHV0IHBvcnQgc2hhbGwgc2V0IEVPUyBvbiB0aGUgbGFzdCBidWZmZXIgaXQgCi0gICogZW1pdHMuIEEgY29tcG9uZW50J3MgZGV0ZXJtaW5hdGlvbiBvZiB3aGVuIGFuIG91dHB1dCBwb3J0IHNob3VsZCAKLSAgKiBjZWFzZSBzZW5kaW5nIGRhdGEgaXMgaW1wbGVtZW5hdGlvbiBzcGVjaWZpYy4KLSAgKiBAaW5ncm91cCBidWYKLSAgKi8KLQotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FT1MgMHgwMDAwMDAwMSAKLQotLyoqIFN0YXJ0IFRpbWUgQnVmZmVyIEZsYWc6IAotICoKLSAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIFNUQVJUVElNRQotICogZmxhZyBvbiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlCi0gKiBzdHJlYW0uIFRoZSBzdGFydGluZyB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGRhdGEgdGhhdAotICogc2hvdWxkIGJlIGRpc3BsYXllZCBhdCBzdGFydHVwIG9yIGFmdGVyIGEgc2Vlay4KLSAqIFRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHN0cmVhbSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHN0YXJ0IHRpbWUuCi0gKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgc2VlayB0byBhIHBhcnRpY3VsYXIgdmlkZW8gZnJhbWUsIAotICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mIAotICogdGhlIHN0cmVhbSB3aWxsIGJlIHRoZSBpbnRyYS1mcmFtZSBwcmVjZWRpbmcgdGhlIHRhcmdldCBmcmFtZSBhbmQKLSAqIHRoZSBzdGFydHRpbWUgd2lsbCBvY2N1ciB3aXRoIHRoZSB0YXJnZXQgZnJhbWUgKHdpdGggYW55IG90aGVyCi0gKiByZXF1aXJlZCBmcmFtZXMgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIHRhcmdldCBpbnRlcnZlbmluZykuCi0gKgotICogVGhlIFNUQVJUVElNRSBmbGFnIGlzIGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyJ3MgCi0gKiB0aW1lc3RhbXAgJyB0aHVzIGl0cyBhc3NvY2lhdGlvbiB0byBidWZmZXIgZGF0YSBhbmQgaXRzIAotICogcHJvcGFnYXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSB0aW1lc3RhbXAncy4KLSAqCi0gKiBXaGVuIGEgU3luYyBDb21wb25lbnQgY2xpZW50IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGggdGhlIAotICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0IAotICogdXNpbmcgT01YX0NvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUgYW5kIHBhc3NpbmcgdGhlIGJ1ZmZlcidzCi0gKiB0aW1lc3RhbXAuCi0gKiAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIDB4MDAwMDAwMDIKLQotIAotCi0vKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6IAotICoKLSAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIERFQ09ERU9OTFkKLSAqIGZsYWcgb24gYW55IGJ1ZmZlciB0aGF0IHNob3VsZCBzaGFsbCBiZSBkZWNvZGVkIGJ1dCBzaG91bGQgbm90IGJlCi0gKiBkaXNwbGF5ZWQuIFRoaXMgZmxhZyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsIHdoZW4gYSBzb3VyY2Ugc2Vla3MgdG8gCi0gKiBhIHRhcmdldCBpbnRlcmZyYW1lIHRoYXQgcmVxdWlyZXMgdGhlIGRlY29kZSBvZiBmcmFtZXMgcHJlY2VkaW5nIHRoZSAKLSAqIHRhcmdldCB0byBmYWNpbGl0YXRlIHRoZSB0YXJnZXQncyByZWNvbnN0cnVjdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSAKLSAqIHNvdXJjZSB3b3VsZCBlbWl0IHRoZSBmcmFtZXMgcHJlY2VkaW5nIHRoZSB0YXJnZXQgZG93bnN0cmVhbSAKLSAqIGJ1dCBtYXJrIHRoZW0gYXMgZGVjb2RlIG9ubHkuCi0gKgotICogVGhlIERFQ09ERU9OTFkgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciBkYXRhIGFuZCBwcm9wYWdhdGVkIGluIGEgCi0gKiBtYW5uZXIgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgdGltZXN0YW1wLgotICoKLSAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBkYXRhIHNob3VsZCBpZ25vcmUgYWxsIGJ1ZmZlcnMgd2l0aCAKLSAqIHRoZSBERUNPREVPTkxZIGZsYWcgc2V0LgotICogCi0gKiBAaW5ncm91cCBidWYKLSAqLwotCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0RFQ09ERU9OTFkgMHgwMDAwMDAwNAotCi0KLS8qIERhdGEgQ29ycnVwdCBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIElMIGNsaWVudCBiZWxpZXZlcyB0aGUgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBidWZmZXIgaXMgY29ycnVwdCAKLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREFUQUNPUlJVUFQgMHgwMDAwMDAwOAotCi0vKiBFbmQgb2YgRnJhbWU6IFRoZSBidWZmZXIgY29udGFpbnMgZXhhY3RseSBvbmUgZW5kIG9mIGZyYW1lIGFuZCBubyBkYXRhCi0gKiAgb2NjdXJzIGFmdGVyIHRoZSBlbmQgb2YgZnJhbWUuIFRoaXMgZmxhZyBpcyBhbiBvcHRpb25hbCBoaW50LiBUaGUgYWJzZW5jZQotICogIG9mIHRoaXMgZmxhZyBkb2VzIG5vdCBpbXBseSB0aGUgYWJzZW5jZSBvZiBhbiBlbmQgb2YgZnJhbWUgd2l0aGluIHRoZSBidWZmZXIuIAotICogQGluZ3JvdXAgYnVmCi0qLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIDB4MDAwMDAwMTAKLQotLyogU3luYyBGcmFtZSBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGJ1ZmZlciBjb250ZW50IGNvbnRhaW5zIGEgY29kZWQgc3luYyBmcmFtZSAnIAotICogIGEgZnJhbWUgdGhhdCBoYXMgbm8gZGVwZW5kZW5jeSBvbiBhbnkgb3RoZXIgZnJhbWUgaW5mb3JtYXRpb24gCi0gKiAgQGluZ3JvdXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FIDB4MDAwMDAwMjAKLQotLyogRXh0cmEgZGF0YSBwcmVzZW50IGZsYWc6IHRoZXJlIGlzIGV4dHJhIGRhdGEgYXBwZW5kZWQgdG8gdGhlIGRhdGEgc3RyZWFtCi0gKiByZXNpZGluZyBpbiB0aGUgYnVmZmVyIAotICogQGluZ3JvdXAgYnVmICAKLSAqLwotI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FWFRSQURBVEEgMHgwMDAwMDA0MAotCi0vKiogQ29kZWMgQ29uZmlnIEJ1ZmZlciBGbGFnOiAKLSogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgaXMgYW4gb3B0aW9uYWwgZmxhZyB0aGF0IGlzIHNldCBieSBhbgotKiBvdXRwdXQgcG9ydCB3aGVuIGFsbCBieXRlcyBpbiB0aGUgYnVmZmVyIGZvcm0gcGFydCBvciBhbGwgb2YgYSBzZXQgb2YKLSogY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLiAgRXhhbXBsZXMgaW5jbHVkZSBTUFMvUFBTIG5hbCB1bml0cwotKiBmb3IgT01YX1ZJREVPX0NvZGluZ0FWQyBvciBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgZm9yCi0qIE9NWF9BVURJT19Db2RpbmdBQUMuICBBbnkgY29tcG9uZW50IHRoYXQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHNldHMgCi0qIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNoYWxsIG5vdCBtaXggY29kZWMgY29uZmlndXJhdGlvbiBieXRlcwotKiB3aXRoIGZyYW1lIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyLCBhbmQgc2hhbGwgc2VuZCBhbGwgYnVmZmVycwotKiBjb250YWluaW5nIGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMgYmVmb3JlIGFueSBidWZmZXJzIGNvbnRhaW5pbmcKLSogZnJhbWUgZGF0YSB0aGF0IHRob3NlIGNvbmZpZ3VyYXRpb25zIGJ5dGVzIGRlc2NyaWJlLgotKiBJZiB0aGUgc3RyZWFtIGZvcm1hdCBmb3IgYSBwYXJ0aWN1bGFyIGNvZGVjIGhhcyBhIGZyYW1lIHNwZWNpZmljCi0qIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCBmcmFtZSwgZm9yIGV4YW1wbGUgT01YX0FVRElPX0NvZGluZ01QMyBvcgotKiBPTVhfQVVESU9fQ29kaW5nQUFDIGluIEFEVFMgbW9kZSwgdGhlbiB0aGVzZSBzaGFsbCBiZSBwcmVzZW50ZWQgYXMKLSogbm9ybWFsIHdpdGhvdXQgc2V0dGluZyBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRy4KLSAqIEBpbmdyb3VwIGJ1ZgotICovCi0jZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIDB4MDAwMDAwODAKLQotCi0KLS8qKiBAaW5ncm91cCBidWYgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFCi17Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCi0gICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KLSAgICBPTVhfVTMyIG5PZmZzZXQ7ICAgICAgICAgICAgLyoqPCBzdGFydCBvZmZzZXQgb2YgdmFsaWQgZGF0YSBpbiBieXRlcyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBBcHBQcml2YXRlOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX1BUUiBwUGxhdGZvcm1Qcml2YXRlOyAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLyAKLSAgICBPTVhfUFRSIHBJbnB1dFBvcnRQcml2YXRlOyAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBpbnB1dCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KLSAgICBPTVhfUFRSIHBPdXRwdXRQb3J0UHJpdmF0ZTsgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBvdXRwdXQgcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCi0gICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGV2ZW50IHVwb24gcHJvY2Vzc2luZyB0aGlzIGJ1ZmZlci4gKi8KLSAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLwotICAgIE9NWF9VMzIgblRpY2tDb3VudDsgICAgICAgICAvKio8IE9wdGlvbmFsIGVudHJ5IHRoYXQgdGhlIGNvbXBvbmVudCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHdpdGggYSB0aWNrIGNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGFjY2VzcyB0aGUgY29tcG9uZW50LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBpbiBtaWNyb3NlY29uZHMuICBTaW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgYSB2YWx1ZSByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBwb2ludCwgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgdXNlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KLSBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgc2FtcGxlcyB3aXRoaW4gdGhlIGJ1ZmZlciBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmZlcnJlZCBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlciB0byB0aGUgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIuKi8KLSAgT01YX1UzMiAgICAgbkZsYWdzOyAgICAgICAgICAgLyoqPCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MgKi8KLSAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCi0gIE9NWF9VMzIgbklucHV0UG9ydEluZGV4OyAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBpbnB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KLX0gT01YX0JVRkZFUkhFQURFUlRZUEU7Ci0KLS8qKiBUaGUgT01YX0VYVFJBREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkZWZpbmUgdGhlIAotICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgotICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKLSAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAotICogT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbi4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFRSQURBVEFUWVBFCi17Ci0gICBPTVhfRXh0cmFEYXRhTm9uZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGF0IG5vIG1vcmUgZXh0cmEgZGF0YSBzZWN0aW9ucyBmb2xsb3cgKi8gICAgICAgIAotICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCi0gICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRVhUUkFEQVRBVFlQRTsKLQotCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRVhUUkFEQVRBVFlQRSBlVHlwZTsgICAgICAgLyogRXh0cmEgRGF0YSB0eXBlICovCi0gICAgT01YX1UzMiBuRGF0YVNpemU7ICAgLyogU2l6ZSBvZiB0aGUgc3VwcG9ydGluZyBkYXRhIHRvIGZvbGxvdyAqLwotICAgIE9NWF9VOCAgZGF0YVsxXTsgICAgIC8qIFN1cHBvcnRpbmcgZGF0YSBoaW50ICAqLwotfSBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRTsKLQotLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QT1JUX1BBUkFNX1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLwotICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCi19IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAotCi0vKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKLXsKLSAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29tbWFuZCAqLwotICAgIE9NWF9FdmVudEVycm9yLCAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBlcnJvciBjb25kaXRpb24gKi8KLSAgICBPTVhfRXZlbnRNYXJrLCAgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBidWZmZXIgbWFyayAqLwotICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qKjwgY29tcG9uZW50IGlzIHJlcG9ydGVkIGEgcG9ydCBzZXR0aW5ncyBjaGFuZ2UgKi8KLSAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLCAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gRU9TICovIAotICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KLSAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLwotICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KLSAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLwotICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgIE9NWF9FdmVudE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VWRU5UVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NBTExCQUNLVFlQRQotewotICAgIC8qKiBUaGUgRXZlbnRIYW5kbGVyIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gd2hlbiBhbgotICAgICAgICBldmVudCBvZiBpbnRlcmVzdCBvY2N1cnMuICBFdmVudHMgYXJlIGRlZmluZWQgaW4gdGhlIE9NWF9FVkVOVFRZUEUKLSAgICAgICAgZW51bWVyYXRpb24uICBQbGVhc2Ugc2VlIHRoYXQgZW51bWVyYXRpb24gZm9yIGRldGFpbHMgb2Ygd2hhdCB3aWxsCi0gICAgICAgIGJlIHJldHVybmVkIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuIENhbGxiYWNrcyBzaG91bGQgbm90IHJldHVybgotICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgc2hhbGwgaGFuZGxlIGl0IGludGVybmFsbHkuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLQotICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjIHRvIGF2b2lkCi0gICAgICAgIGJsb2NraW5nIHRoZSBjb21wb25lbnQgZm9yIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCi0KLSAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgICAgIEBwYXJhbSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKLSAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCi0gICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCi0gICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KLSAgICAgICAgQHBhcmFtIGVFdmVudAotICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCi0gICAgICAgIEBwYXJhbSBuRGF0YTEKLSAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAotICAgICAgICAgICAgYW4gT01YX0NPTU1BTkRUWVBFIGZvciBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgYW5kIE9NWF9JTkRFWFRZUEUgZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCi0gICAgICAgICBAcGFyYW0gbkRhdGEyCi0gICAgICAgICAgICBuRGF0YTIgd2lsbCBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQuIENhbiBiZSBPTVhfU1RBVEVUWVBFIGZvcgotICAgICAgICAgICAgYSBPTVhfQ29tbWFuZFN0YXRlU2V0IGNvbW1hbmQgb3IgcG9ydCBpbmRleCBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KLSAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMCBpZiBub3QgdXNlZC4gKQotICAgICAgICBAcGFyYW0gcEV2ZW50RGF0YQotICAgICAgICAgICAgUG9pbnRlciB0byBhZGRpdGlvbmFsIGV2ZW50LXNwZWNpZmljIGRhdGEgKHNlZSBzcGVjIGZvciBtZWFuaW5nKS4KLSAgICAgICovCi0KLSAgIE9NWF9FUlJPUlRZUEUgKCpFdmVudEhhbmRsZXIpKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCi0gICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKLSAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAotICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwotCi0gICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCi0gICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCi0gICAgICAgIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVmaWxsIHRoZSBidWZmZXJzIGR1cmluZyB0aGlzCi0gICAgICAgIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlbSBhbmQgcmVmaWxsIHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZQotICAgICAgICBpcyBubyBlcnJvciByZXR1cm4sIHNvIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQKLSAgICAgICAgaW50ZXJuYWxseS4gIAotICAgICAgICAKLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAgICAgCi0gICAgICAgIEBwYXJhbSBoQ29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCi0gICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAotICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCi0gICAgICAgIEBwYXJhbSBwQnVmZmVyCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKLSAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBlbXB0aWVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlCdWZmZXJEb25lKSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAotICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwotCi0gICAgLyoqIFRoZSBGaWxsQnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZmlsbGVkIGJ1ZmZlcnMgZnJvbSBhbgotICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuICAKLSAgICAgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byAKLSAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycyAKLSAgICAgICAgYW5kIGVtcHR5IHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHNvIAotICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGludGVybmFsbHkuICBUaGUgCi0gICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgICAgIAotICAgICAgICBAcGFyYW0gaENvbXBvbmVudAotICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICAgICAgQHBhcmFtIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAotICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKLSAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgotICAgICAgICBAcGFyYW0gcEJ1ZmZlcgotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZmlsbGVkLgotICAgICAgICBAaW5ncm91cCBidWYKLSAgICAgKi8KLSAgICBPTVhfRVJST1JUWVBFICgqRmlsbEJ1ZmZlckRvbmUpKAotICAgICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgIE9NWF9PVVQgT01YX1BUUiBwQXBwRGF0YSwKLSAgICAgICAgT01YX09VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7Ci0KLX0gT01YX0NBTExCQUNLVFlQRTsKLQotLyoqIFRoZSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGljdGF0ZSBwb3J0IHN1cHBsaWVyCi0gICAgcHJlZmVyZW5jZSB3aGVuIHR1bm5lbGluZyBiZXR3ZWVuIHR3byBwb3J0cy4KLSAgICBAaW5ncm91cCB0dW4gYnVmCi0qLwotdHlwZWRlZiBlbnVtIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUKLXsKLSAgICBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQgPSAweDAsIC8qKjwgcG9ydCBzdXBwbHlpbmcgdGhlIGJ1ZmZlcnMgaXMgdW5zcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLwotICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfQnVmZmVyU3VwcGx5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQnVmZmVyU3VwcGx5TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFOwotCi0KLS8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyIAotICogQGluZ3JvdXAgdHVuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVCdWZmZXJTdXBwbGllcjsgLyoqPCBidWZmZXIgc3VwcGxpZXIgKi8KLX0gT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRTsKLQotCi0vKio8IGluZGljYXRlcyB0aGF0IGJ1ZmZlcnMgcmVjZWl2ZWQgYnkgYW4gaW5wdXQgcG9ydCBvZiBhIHR1bm5lbCAKLSAgICAgbWF5IG5vdCBtb2RpZnkgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcnMgCi0gICAgIEBpbmdyb3VwIHR1bgotICovCi0jZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAotCi0KLS8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKLSAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKLSAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCi0gICAgQGluZ3JvdXAgdHVuCi0gKi8gICAKLXR5cGVkZWYgc3RydWN0IE9NWF9UVU5ORUxTRVRVUFRZUEUKLXsKLSAgICBPTVhfVTMyIG5UdW5uZWxGbGFnczsgICAgICAgICAgICAgLyoqPCBiaXQgZmxhZ3MgZm9yIHR1bm5lbGluZyAqLwotICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZVN1cHBsaWVyOyAvKio8IHN1cHBsaWVyIHByZWZlcmVuY2UgKi8KLX0gT01YX1RVTk5FTFNFVFVQVFlQRTsgCi0KLS8qIE9NWCBDb21wb25lbnQgaGVhZGVycyBpcyBpbmNsdWRlZCB0byBlbmFibGUgdGhlIGNvcmUgdG8gdXNlCi0gICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4gIAotICAgRGV2ZWxvcGVycyBzaG91bGQgbm90IGFjY2VzcyBhbnkgc3RydWN0dXJlcyBvciBkYXRhIGZyb20gd2l0aGluCi0gICB0aGUgY29tcG9uZW50IGhlYWRlciBkaXJlY3RseSAqLwotLyogVE8gQkUgUkVNT1ZFRCAtICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+ICovCi0KLS8qKiBHZXRDb21wb25lbnRWZXJzaW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wb25lbnQuICAKLSAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZQotICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYSBhIGNvcmUgbWFjcm8pLiAgVGhlCi0gICAgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudE5hbWUKLSAgICAgICAgcG9pbnRlciB0byBhbiBlbXB0eSBzdHJpbmcgb2YgbGVuZ3RoIDEyOCBieXRlcy4gIFRoZSBjb21wb25lbnQgCi0gICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUgCi0gICAgICAgIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLiAgVGhlIG5hbWUgb2YgYSBjb21wb25lbnQgd2lsbCAKLSAgICAgICAgYmUgMTI3IGJ5dGVzIG9yIGxlc3MgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4gIAotICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5BQkMuQ2hhbm5lbE1peGVyXDAiLgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VmVyc2lvbgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAotICAgICAgICBpbi4gIFRoZSBjb21wb25lbnQgd2lsbCBmaWxsIGluIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIAotICAgICAgICBjb21wb25lbnQgdmVyc2lvbi4gIE5PVEU6IHRoZSBjb21wb25lbnQgdmVyc2lvbiBpcyBOT1QgdGhlIHNhbWUgCi0gICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUgCi0gICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBvZiB0aGUgY29tcG9uZW50IGFuZCAKLSAgICAgICAgaXRzIHZhbHVlIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBjb21wb25lbnQgdmVuZG9yLgotICAgIEBwYXJhbSBbb3V0XSBwU3BlY1ZlcnNpb24KLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKLSAgICAgICAgaW4uICBUaGUgU3BlY1ZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdC4gIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgb3IgCi0gICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlIAotICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QgdGhlIDIuMCBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIAotICAgICAgICBhcHBsaWNhdGlvbiAod2hpY2ggY3JlYXRlcyB0aGUgc3RydWN0dXJlIGlzIGJ1aWx0IGFnYWluc3QgdGhlIAotICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgotICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAotICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCi0gICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAotICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKLSAgICAgICAgdGhlIGNvbXBvbmVudC4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wCi0gKi8KLSNkZWZpbmUgT01YX0dldENvbXBvbmVudFZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29tcG9uZW50VmVyc2lvbiggIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgY2FsbCBpcyBhIG5vbi1ibG9ja2luZyBjYWxsLgotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHF1ZXVlIHRoZSBjb21tYW5kCi0gICAgdG8gdGhlIGNvbXBvbmVudCB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuICBUaGUgY29tcG9uZW50IHRocmVhZCBzaGFsbCAKLSAgICBzZW5kIHRoZSBFdmVudEhhbmRsZXIoKSBjYWxsYmFjayBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgY29tbWFuZC4gCi0gICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQotICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgdGhlIGNvbXBvbmVudCB3aWxsIHF1ZXVlIGEKLSAgICBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUgaWRlbmZpZWQgaW4gblBhcmFtLgotICAgIAotICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kRmx1c2giLCB0byBmbHVzaCBhIHBvcnQncyBidWZmZXIgcXVldWVzLAotICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWSAKLSAgICBCRUlORyBQUk9DRVNTRUQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGJ1ZmZlcnMgCi0gICAgd2VyZSByZWNlaXZlZC4KLSAgICAKLSAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvciAKLSAgICAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgKGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZgotICAgIG5QYXJhbSkgd2lsbCBiZSBzdG9wcGVkIG9yIHJlc3RhcnRlZC4gCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIiBpcyB1c2VkIHRvIG1hcmsgYSBidWZmZXIsIHRoZQotICAgIHBDbWREYXRhIHdpbGwgcG9pbnQgdG8gYSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAotICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGV4YW1pbmUgdGhlIGJ1ZmZlciBjaGFpbiBmb3IgdGhlIG1hcmsuICBuUGFyYW0xCi0gICAgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBwb3J0IG9uIHdoaWNoIHRoZSBidWZmZXIgbWFyayBpcyBhcHBsaWVkLgotCi0gICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuIAotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCi0gICAgQHBhcmFtIFtpbl0gQ21kCi0gICAgICAgIENvbW1hbmQgZm9yIHRoZSBjb21wb25lbnQgdG8gZXhlY3V0ZQotICAgIEBwYXJhbSBbaW5dIG5QYXJhbQotICAgICAgICBQYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAKLSAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgdmFsdWUgaXMgYSBtZW1iZXIgb2YgT01YX1NUQVRFVFlQRS4gIFdoZW4gQ21kIGhhcyAKLSAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKSAKLSAgICAgICAgdG8gZmx1c2guIC0xIGlzIHVzZWQgdG8gZmx1c2ggYWxsIHBvcnRzIGEgc2luZ2xlIHBvcnQgaW5kZXggd2lsbCAKLSAgICAgICAgb25seSBmbHVzaCB0aGF0IHBvcnQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIgotICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkgCi0gICAgICAgIHRoZSB2YWx1ZSBvZiBuUGFyYW0uICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiCi0gICAgICAgIHRoZSBjb21wb25lbnRzIHBvdCBpcyBnaXZlbiBieSB0aGUgdmFsdWUgb2YgblBhcmFtLgotICAgIEBwYXJhbSBbaW5dIHBDbWREYXRhCi0gICAgICAgIFBhcmFtZXRlciBwb2ludGluZyB0byB0aGUgT01YX01BUktUWVBFIHN0cnVjdHVyZSB3aGVuIENtZCBoYXMgdGhlIHZhbHVlCi0gICAgICAgICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiLiAgICAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZW5kQ29tbWFuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZW5kQ29tbWFuZCggICAgICAgICBcCi0gICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIAotICAgIHNldHRpbmdzIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2Fubm90IG9ubHkgYmUgaW52b2tlZCB3aGVuIAotICAgIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUludmFsaWQgc3RhdGUuICBUaGUgblBhcmFtSW5kZXgKLSAgICBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20KLSAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSAKLSAgICBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIAotICAgIGludm9raW5nIHRoaXMgbWFjcm8uICBXaGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQsIHRoZQotICAgIGNhbGxlciBzaGFsbCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBuUG9ydEluZGV4IHZhbHVlIGluZGljYXRpbmcgdGhlCi0gICAgcG9ydCBvbiB3aGljaCB0aGUgcGFyYW1ldGVyIGFwcGxpZXMuIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgCi0gICAgYW55IHNldHRpbmdzIGNoYW5nZWQsIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIAotICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgCi0gICAgY2FsbC4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUGFyYW1JbmRleAotICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQotICAgICAgICBQb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKLSAgICAgICAgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgc2VuZCBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKLSAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCi0gICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKLSAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKLSAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCi0gICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCi0gICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAotICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKLSAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgotICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKLSAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKLSAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKLSAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgotICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfU2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0UGFyYW1ldGVyKCAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAotICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAotICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKLSAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKLSAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAotICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCi0gICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKLSAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAotICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCi0gICAgQHBhcmFtIFtpbl0gbkluZGV4Ci0gICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgotICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCi0gICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAotICAgICAgICBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotKi8gICAgICAgIAotI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29uZmlnKCAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCi0gICAgc3RydWN0dXJlcyB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKLSAgICBlYWNoIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIAotICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgCi0gICAgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSAKLSAgICBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyAKLSAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciAKLSAgICB0aGUgY2FsbCBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuQ29uZmlnSW5kZXgKLSAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQotICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGFib3ZlLgotICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCi0gICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9TZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRDb25maWcoICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUgCi0gICAgYSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYW4gT01YIAotICAgIHN0cnVjdHVyZSBpbmRleC4gIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgdmVuZG9yIHRvIHN1cHBvcnQgCi0gICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFIAotICAgIGVudW1lcmF0aW9uICh0aGlzIGlzIGRvbmUgdG8gc2F2ZSBzcGFjZSBpbiBzbWFsbCBjb21wb25lbnRzKS4gIFRoZSAKLSAgICBjb21wb25lbnQgc2hhbGwgc3VwcG9ydCBhbGwgdmVuZG9yIHN1cHBsaWVkIGV4dGVuc2lvbiBpbmRleGVzIG5vdCBmb3VuZAotICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAotICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBjUGFyYW1ldGVyTmFtZQotICAgICAgICBPTVhfU1RSSU5HIHRoYXQgc2hhbGwgYmUgbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nCi0gICAgICAgIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGdldCAKLSAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgotICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCi0gICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcAotICovCi0jZGVmaW5lIE9NWF9HZXRFeHRlbnNpb25JbmRleCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldEV4dGVuc2lvbkluZGV4KCAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQgCi0gICAgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgcGxhY2UgdGhlIHN0YXRlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uCi0gICAgcG9pbnRlZCB0byBieSBwU3RhdGUuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcFN0YXRlCi0gICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCi0gICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAKLSAqLwotI2RlZmluZSBPTVhfR2V0U3RhdGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRTdGF0ZSggICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX1VzZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQotICAgIGEgYnVmZmVyIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKSBhbHJlYWR5IGFsbG9jYXRlZCAKLSAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nIAotICAgIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29tcCBidWYKLSAqLwotCi0jZGVmaW5lIE9NWF9Vc2VCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUJ1ZmZlciggICAgICAgICAgICBcCi0gICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHBCdWZmZXIpCi0KLQotLyoqIFRoZSBPTVhfQWxsb2NhdGVCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZSAKLSAgICBhIG5ldyBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuICBUaGUgY29tcG9uZW50IHdpbGwgYWxsb2NhdGUgdGhlIAotICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAKLSAgICBoZWFkZXIuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAotICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgotICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKLSAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAotICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKLSAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKLSAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAotICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KLSAgICBAcGFyYW0gW2luXSBuU2l6ZUJ5dGVzCi0gICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZS4gIFVzZWQgd2hlbiBiQWxsb2NhdGVOZXcgaXMgdHJ1ZS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovICAgIAotI2RlZmluZSBPTVhfQWxsb2NhdGVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5BbGxvY2F0ZUJ1ZmZlciggICAgICAgXAotICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwotCi0KLS8qKiBUaGUgT01YX0ZyZWVCdWZmZXIgbWFjcm8gd2lsbCByZWxlYXNlIGEgYnVmZmVyIGhlYWRlciBmcm9tIHRoZSBjb21wb25lbnQKLSAgICB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBPTVhfQWxsb2NhdGVCdWZmZXIgb3IgT01YX1VzZUJ1ZmZlci4gSWYgIAotICAgIHRoZSBjb21wb25lbnQgYWxsb2NhdGVkIHRoZSBidWZmZXIgKHNlZSB0aGUgT01YX1VzZUJ1ZmZlciBtYWNybykgdGhlbiAKLSAgICB0aGUgY29tcG9uZW50IHNoYWxsIGZyZWUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gVGhpcyBpcyBhIAotICAgIGJsb2NraW5nIGNhbGwuIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZyZWVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RnJlZUJ1ZmZlciggICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0vKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKLSAgICBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBFbXB0eUJ1ZmZlckRvbmUgY2FsbCBiYWNrLgotICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgotICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZW1wdHkgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCi0gICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKLSAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0Ci0gICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKLSAgICAKLSAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KLSAgICBAcGFyYW0gW2luXSBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgotICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovCi0jZGVmaW5lIE9NWF9FbXB0eVRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkVtcHR5VGhpc0J1ZmZlciggICAgICBcCi0gICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCi0KLQotLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKLSAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAotICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCi0gICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCi0gICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAotICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCi0gICAgaXMgaW4gdGhlIE9NWF9FeGVjdXRpbmdTdGF0ZS4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQKLSAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAotICAgIAotICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCi0gICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX0ZpbGxUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RmlsbFRoaXNCdWZmZXIoICAgICAgIFwKLSAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KLQotCi0KLS8qKiBUaGUgT01YX1VzZUVHTEltYWdlIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCi0gICAgYSBFR0xJbWFnZSBwcm92aWRlZCBieSBFR0wgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpCi0gICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gICAgCi0gICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKLSAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKLSAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAotICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gdXNlZAotICAgICAgICBmb3IgdGhpcyBidWZmZXIgaXMgTk9UIHZpc2libGUgdG8gdGhlIElMIENsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4Ci0gICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKLSAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4Ci0gICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgotICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCi0gICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKLSAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCi0gICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKLSAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQotICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKLSAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKLSAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvbXAgYnVmCi0gKi8KLSNkZWZpbmUgT01YX1VzZUVHTEltYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlRUdMSW1hZ2UoICAgICAgICAgIFwKLSAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgZWdsSW1hZ2UpCi0KLS8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKLSAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKLSAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLQotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfSW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9EZWluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIAotICAgIHRoZSBsYXN0IGNhbGwgbWFkZSBpbnRvIE9NWC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcmUgZGV0ZXJtaW5lcyB0aGF0IAotICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuIAotICAgIHdpdGggYW4gZXJyb3IgcmF0aGVyIHRoYW4gdHJ5IHRvIHVubG9hZCB0aGUgY29tcG9uZW50cy4KLSAgICAgICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KLSAgICBAaW5ncm91cCBjb3JlCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCh2b2lkKTsKLQotCi0vKiogVGhlIE9NWF9Db21wb25lbnROYW1lRW51bSBtZXRob2Qgd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgdGhlIG5hbWVzIG9mCi0gICAgcmVjb2duaXNlZCB2YWxpZCBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQKLSAgICBhcyBhIG1lYW5zIHRvIGRldGVjdCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBydW4tdGltZS4gVGhlcmUgaXMKLSAgICBubyBzdHJpY3Qgb3JkZXJpbmcgdG8gdGhlIGVudW1lcmF0aW9uIG9yZGVyIG9mIGNvbXBvbmVudCBuYW1lcywgYWx0aG91Z2gKLSAgICBlYWNoIG5hbWUgd2lsbCBvbmx5IGJlIGVudW1lcmF0ZWQgb25jZS4gIElmIHRoZSBPTVggY29yZSBzdXBwb3J0cyBydW4tdGltZQotICAgIGluc3RhbGxhdGlvbiBvZiBuZXcgY29tcG9uZW50cywgaXQgaXMgb25seSByZXF1cmllZCB0byBkZXRlY3QgbmV3bHkKLSAgICBpbnN0YWxsZWQgY29tcG9uZW50cyB3aGVuIHRoZSBmaXJzdCBjYWxsIHRvIGVudW1lcmF0ZSBjb21wb25lbnQgbmFtZXMKLSAgICBpcyBtYWRlIChpLmUuIHdoZW4gbkluZGV4IGlzIDB4MCkuCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgotICAgIAotICAgIEBwYXJhbSBbb3V0XSBjQ29tcG9uZW50TmFtZQotICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQotICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAotICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAotICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAotICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKLSAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgotICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCi0gICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKLSAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKLSAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKLSAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgotICAgIEBwYXJhbSBbaW5dIG5JbmRleAotICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAotICAgICAgICBNdWx0aXBsZSBjYWxscyB0byBPTVhfQ29tcG9uZW50TmFtZUVudW0gd2l0aCBpbmNyZWFzaW5nIHZhbHVlcwotICAgICAgICBvZiBuSW5kZXggd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgY29tcG9uZW50IG5hbWVzIGluIHRoZQotICAgICAgICBzeXN0ZW0gdW50aWwgT01YX0Vycm9yTm9Nb3JlIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlIG9mIG5JbmRleAotICAgICAgICBpcyAwIHRvIChOLTEpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW5zdGFsbGVkIGNvbXBvbmVudHMKLSAgICAgICAgaW4gdGhlIHN5c3RlbS4KLSAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKLSAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQotICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZiAKLSAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIG1pbnVzIDEsIE9NWF9FcnJvck5vTW9yZSB3aWxsIGJlCi0gICAgICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfQ29tcG9uZW50TmFtZUVudW0oCi0gICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KTsKLQotCi0vKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQotICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQotICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKLSAgICBAcGFyYW0gW291dF0gcEhhbmRsZQotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9IQU5ETEVUWVBFIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgbWV0aG9kLgotICAgIEBwYXJhbSBbaW5dIGNDb21wb25lbnROYW1lCi0gICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCi0gICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCi0gICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCi0gICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAotICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCi0gICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKLSAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZAotICAgICAgICBkdXJpbmcgY2FsbGJhY2tzIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSB0aGUgc291cmNlCi0gICAgICAgIG9mIHRoZSBjYWxsYmFjay4KLSAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCi0gICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCi0gICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAotICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKLSAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsQmFja3MpOwotCi0KLS8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUgCi0gICAgbWV0aG9kLiAgSWYgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY29tcG9uZW50IHdpbGwKLSAgICBiZSB1bmxvYWRlZCBmcm9tIG1lbW9yeS4gIAotICAgIAotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMgd2hlbiB0aGUgY29tcG9uZW50IGlzIAotICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCi0KLSAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50Ci0gICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50Ci0gICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgotICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQotICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRnJlZUhhbmRsZSgKLSAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOwotCi0KLQotLyoqIFRoZSBPTVhfU2V0dXBUdW5uZWwgbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIGNvbXBvbmVudHMKLSAgICB0byBzZXR1cCB0aGUgc3BlY2lmaWVkIHR1bm5lbCB0aGUgdHdvIGNvbXBvbmVudHMuICBOT1RFOiBUaGlzIGlzCi0gICAgYW4gYWN0dWFsIG1ldGhvZCAobm90IGEgI2RlZmluZSBtYWNybykuICBUaGlzIG1ldGhvZCB3aWxsIG1ha2UgY2FsbHMgaW50bwotICAgIHRoZSBjb21wb25lbnQgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB0dW5uZWwgCi0gICAgY29ubmVjdGlvbi4gIAotCi0gICAgVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIG9uIGJvdGggY29tcG9uZW50cyB3aWxsIGJlIGNhbGxlZC4gCi0gICAgVGhpcyBtZXRob2Qgc2hhbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgCi0gICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQotICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCi0gICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKLQotICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gaE91dHB1dAotICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCi0gICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKLSAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAotICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhPdXRwdXQgYmUgdGhlIHNvdXJjZSBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRPdXRwdXQgaXMgYW4gb3V0cHV0IHBvcnQpLiAgSWYgMHgwLCB0aGUgY29tcG9uZW50Ci0gICAgICAgIHNwZWNpZmllZCBpbiBoSW5wdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRJbnB1dAotICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KLSAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAotICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc291cmNlIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCi0gICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4gCi0gICAgQHBhcmFtIFtpbl0gaElucHV0Ci0gICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQotICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQotICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCi0gICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaElucHV0IGJlIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgd2hlbgotICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRJbnV0IGlzIGFuIGlucHV0IHBvcnQpLiAgIElmIDB4MCwgdGhlIGNvbXBvbmVudAotICAgICAgICBzcGVjaWZpZWQgaW4gaE91dHB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydFBPdXRwdXQKLSAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCi0gICAgQHBhcmFtIFtpbl0gblBvcnRJbnB1dAotICAgICAgICBuUG9ydElucHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQotICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCi0gICAgQHJldHVybiBPTVhfRVJST1JUWVBFCi0gICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKLSAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgIFdoZW4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQsIG9uZSBvciBib3RoIGNvbXBvbmVudHMgaXMgCi0gICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KLSAgICAgICAgCi0gICAgICAgIE9uIGZhaWx1cmUsIHRoZSBwb3J0cyBvZiBib3RoIGNvbXBvbmVudHMgYXJlIHNldHVwIGZvciBjb21tdW5pY2F0aW9uCi0gICAgICAgIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgotICAgIEBpbmdyb3VwIGNvcmUgdHVuCi0gKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX1NldHVwVHVubmVsKAotICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaE91dHB1dCwKLSAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCi0gICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCi0gICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOwotICAgIAotLyoqIEBpbmdyb3VwIGNwICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgICBPTVhfR2V0Q29udGVudFBpcGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCi0gICAgT01YX0lOIE9NWF9TVFJJTkcgc3pVUkkpOwotCi0vKiogVGhlIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgotICAgIHJvbGUgYW5kIChpZiB0aGUgY29tcE5hbWVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2UgY29tcG9uZW50cy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAotICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKLSAgICBjbGllbnQgc2hvdWxkOgotICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb21wb25lbnQgbmFtZXMKLSAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCi0gICAgQHBhcmFtIFtpbl0gcm9sZQotICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKLSAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCi0gICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCi0gICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAotIAotICAgICAgICBJZiBjb21wTmFtZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IGNvbXBvbmVudHMgc3VwcG9ydAotICAgICAgICB0aGUgZ2l2ZW4gcm9sZS4KLSAgICAgCi0gICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAotICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIGNvbXBOYW1lcyBwYXJhbWV0ZXIuCi0gICAgQHBhcmFtIFtpbm91dF0gY29tcE5hbWVzCi0gICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIHdoaWNoIGFjY2VwdHMgCi0gICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4gCi0gICAgICAgIEVhY2ggbmFtZSBpcyBOVUxMIHRlcm1pbmF0ZWQuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgotICAgIEBpbmdyb3VwIGNvcmUKLSAqLwotT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlICggCi0JT01YX0lOICAgICAgT01YX1NUUklORyByb2xlLAotICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Db21wcywKLSAgICBPTVhfSU5PVVQgICBPTVhfVTggICoqY29tcE5hbWVzKTsKLQotLyoqIFRoZSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiByb2xlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuCi0gICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKLSAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCi0gICAgY2xpZW50IHNob3VsZDoKLSAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb2xlIG5hbWVzCi0gICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCi0gICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCi0KLSAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0KLSAgICBAcGFyYW0gW2luXSBjb21wTmFtZQotICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcXVlcmllZCBhYm91dC4KLSAgICBAcGFyYW0gW2lub3V0XSBwTnVtUm9sZXMKLSAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCi0gCi0gICAgICAgIElmIHJvbGVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSByb2xlcyB0aGUgY29tcG9uZW50IHN1cHBvcnRzLgotICAgICAKLSAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCi0gICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KLSAgICBAcGFyYW0gW291dF0gcm9sZXMKLSAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCi0gICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCi0gICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCi0gICAgQGluZ3JvdXAgY29yZQotICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgKCAKLQlPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLCAKLSAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtUm9sZXMsCi0gICAgT01YX09VVCAgICAgT01YX1U4ICoqcm9sZXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiNGRlZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLS8qKgotICogQGZpbGUgT01YX0lWQ29tbW9uLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgVmlkZW8gYW5kIEltYWdlIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKLSAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KLSAqLwotI2lmbmRlZiBPTVhfSVZDb21tb25faAotI2RlZmluZSBPTVhfSVZDb21tb25faAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSBoZWFkZXIKLSAqIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGhlYWRlcgotICogZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQotICovCi0KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0vKiogQGRlZmdyb3VwIGl2IE9wZW5NQVggSUwgSW1hZ2luZyBhbmQgVmlkZW8gRG9tYWluCi0gKiBDb21tb24gc3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBkb21haW5zCi0gKiBAewotICovCi0KLQotLyoqCi0gKiBFbnVtZXJhdGlvbiBkZWZpbmluZyBwb3NzaWJsZSB1bmNvbXByZXNzZWQgaW1hZ2UvdmlkZW8gZm9ybWF0cy4KLSAqCi0gKiBFTlVNUzoKLSAqICBVbnVzZWQgICAgICAgICAgICAgICAgIDogUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BCi0gKiAgTW9ub2Nocm9tZSAgICAgICAgICAgICA6IGJsYWNrIGFuZCB3aGl0ZQotICogIDhiaXRSR0IzMzIgICAgICAgICAgICAgOiBSZWQgNzo1LCBHcmVlbiA0OjIsIEJsdWUgMTowCi0gKiAgMTJiaXRSR0I0NDQgICAgICAgICAgICA6IFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCi0gKiAgMTZiaXRBUkdCNDQ0NCAgICAgICAgICA6IEFscGhhIDE1OjEyLCBSZWQgMTE6OCwgR3JlZW4gNzo0LCBCbHVlIDM6MAotICogIDE2Yml0QVJHQjE1NTUgICAgICAgICAgOiBBbHBoYSAxNSwgUmVkIDE0OjEwLCBHcmVlbiA5OjUsIEJsdWUgNDowCi0gKiAgMTZiaXRSR0I1NjUgICAgICAgICAgICA6IFJlZCAxNToxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKLSAqICAxNmJpdEJHUjU2NSAgICAgICAgICAgIDogQmx1ZSAxNToxMSwgR3JlZW4gMTA6NSwgUmVkIDQ6MAotICogIDE4Yml0UkdCNjY2ICAgICAgICAgICAgOiBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCi0gKiAgMThiaXRBUkdCMTY2NSAgICAgICAgICA6IEFscGhhIDE3LCBSZWQgMTY6MTEsIEdyZWVuIDEwOjUsIEJsdWUgNDowCi0gKiAgMTliaXRBUkdCMTY2NiAgICAgICAgICA6IEFscGhhIDE4LCBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCi0gKiAgMjRiaXRSR0I4ODggICAgICAgICAgICA6IFJlZCAyNDoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKLSAqICAyNGJpdEJHUjg4OCAgICAgICAgICAgIDogQmx1ZSAyNDoxNiwgR3JlZW4gMTU6OCwgUmVkIDc6MAotICogIDI0Yml0QVJHQjE4ODcgICAgICAgICAgOiBBbHBoYSAyMywgUmVkIDIyOjE1LCBHcmVlbiAxNDo3LCBCbHVlIDY6MAotICogIDI1Yml0QVJHQjE4ODggICAgICAgICAgOiBBbHBoYSAyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIDMyYml0QkdSQTg4ODggICAgICAgICAgOiBCbHVlIDMxOjI0LCBHcmVlbiAyMzoxNiwgUmVkIDE1OjgsIEFscGhhIDc6MAotICogIDMyYml0QVJHQjg4ODggICAgICAgICAgOiBBbHBoYSAzMToyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAotICogIFlVVjQxMVBsYW5hciAgICAgICAgICAgOiBVLFkgYXJlIHN1YnNhbXBsZWQgYnkgYSBmYWN0b3Igb2YgNCBob3Jpem9udGFsbHkKLSAqICBZVVY0MTFQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKLSAqICBZVVY0MjBQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgotICogIFlVVjQyMFBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcwotICogIFlVVjQyMFNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCi0gKiAgWVVWNDIyUGxhbmFyICAgICAgICAgICA6IFRocmVlIGFycmF5cyBZLFUsVi4KLSAqICBZVVY0MjJQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKLSAqICBZVVY0MjJTZW1pUGxhbmFyICAgICAgIDogVHdvIGFycmF5cywgb25lIGlzIGFsbCBZLCB0aGUgb3RoZXIgaXMgVSBhbmQgVgotICogIFlDYllDciAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgWVVZViAoaS5lLiBZQ2JZQ3IpCi0gKiAgWUNyWUNiICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVllVIChpLmUuIFlDcllDYikKLSAqICBDYllDclkgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFVZVlkgKGkuZS4gQ2JZQ3JZKQotICogIENyWUNiWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVllVWSAoaS5lLiBDcllDYlkpCi0gKiAgWVVWNDQ0SW50ZXJsZWF2ZWQgICAgICA6IEVhY2ggcGl4ZWwgY29udGFpbnMgZXF1YWwgcGFydHMgWVVWCi0gKiAgUmF3QmF5ZXI4Yml0ICAgICAgICAgICA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKLSAqICBSYXdCYXllcjEwYml0ICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAotICogIFJhd0JheWVyOGJpdGNvbXByZXNzZWQgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0Ci0gKi8KLXR5cGVkZWYgZW51bSBPTVhfQ09MT1JfRk9STUFUVFlQRSB7Ci0gICAgT01YX0NPTE9SX0Zvcm1hdFVudXNlZCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TW9ub2Nocm9tZSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0UkdCODg4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEJHUjg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NywKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXIsCi0gICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciwKLSAgICBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ3JZQ2IsCi0gICAgT01YX0NPTE9SX0Zvcm1hdENiWUNyWSwKLSAgICBPTVhfQ09MT1JfRm9ybWF0Q3JZQ2JZLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjEwYml0LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDQsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEw4LAotICAgIE9NWF9DT0xPUl9Gb3JtYXRMMTYsCi0gICAgT01YX0NPTE9SX0Zvcm1hdEwyNCwKLSAgICBPTVhfQ09MT1JfRm9ybWF0TDMyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyLAotICAgIE9NWF9DT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKLSAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0NPTE9SX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgLyoqPFJlc2VydmVkIGFuZHJvaWQgb3BhcXVlIGNvbG9yZm9ybWF0LiBUZWxscyB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICogdGhlIGFjdHVhbCBjb2xvcmZvcm1hdCB3aWxsIGJlICByZWxheWVkIGJ5IHRoZQotICAgICAqIEdyYWxsb2MgQnVmZmVycy4KLSAgICAgKiBGSVhNRTogSW4gdGhlIHByb2Nlc3Mgb2YgcmVzZXJ2aW5nIHNvbWUgZW51bSB2YWx1ZXMgZm9yCi0gICAgICogQW5kcm9pZC1zcGVjaWZpYyBPTVggSUwgY29sb3Jmb3JtYXRzLiBDaGFuZ2UgdGhpcyBlbnVtIHRvCi0gICAgICogYW4gYWNjZXB0YWJsZSByYW5nZSBvbmNlIHRoYXQgaXMgZG9uZS4KLSAgICAgKiAqLwotICAgIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlID0gMHg3RjAwMDc4OSwKLSAgICBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N0YwMDAxMDAsCi0gICAgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDAsCi0gICAgT01YX0NPTE9SX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0NPTE9SX0ZPUk1BVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBSR0IgdG8gWVVWIG9yIHZpY2UgdmVyc2EuCi0gKiBpQ29sb3JNYXRyaXggc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGZpeGVkIHBvaW50IHZhbHVlcwotICogdXNlZCBpbiBjb252ZXJ0aW5nIGJldHdlZW4gZm9ybWF0cy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwotICAgIE9NWF9TMzIgeENvbG9yTWF0cml4WzNdWzNdOyAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotICAgIE9NWF9TMzIgeENvbG9yT2Zmc2V0WzRdOyAgICAvKio8IFN0b3JlZCBpbiBzaWduZWQgUTE2IGZvcm1hdCAqLwotfU9NWF9DT05GSUdfQ09MT1JDT05WRVJTSU9OVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBkZWZpbmluZyBwZXJjZW50IHRvIHNjYWxlIGVhY2ggZnJhbWUgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6Ci0gKiBUbyBtYWtlIHRoZSB3aWR0aCA1MCUgbGFyZ2VyLCB1c2UgZldpZHRoID0gMS41IGFuZCB0byBtYWtlIHRoZSB3aWR0aAotICogMS8yIHRoZSBvcmlnaW5hbCBzaXplLCB1c2UgZldpZHRoID0gMC41Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0byAqLwotICAgIE9NWF9TMzIgeFdpZHRoOyAgICAgICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCi0gICAgT01YX1MzMiB4SGVpZ2h0OyAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KLX1PTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRTsKLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGltYWdlIGZpbHRlciB0eXBlcwotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFRklMVEVSVFlQRSB7Ci0gICAgT01YX0ltYWdlRmlsdGVyTm9uZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJOb2lzZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJFbWJvc3MsCi0gICAgT01YX0ltYWdlRmlsdGVyTmVnYXRpdmUsCi0gICAgT01YX0ltYWdlRmlsdGVyU2tldGNoLAotICAgIE9NWF9JbWFnZUZpbHRlck9pbFBhaW50LAotICAgIE9NWF9JbWFnZUZpbHRlckhhdGNoLAotICAgIE9NWF9JbWFnZUZpbHRlckdwZW4sCi0gICAgT01YX0ltYWdlRmlsdGVyQW50aWFsaWFzLAotICAgIE9NWF9JbWFnZUZpbHRlckRlUmluZywKLSAgICBPTVhfSW1hZ2VGaWx0ZXJTb2xhcml6ZSwKLSAgICBPTVhfSW1hZ2VGaWx0ZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSW1hZ2VGaWx0ZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JbWFnZUZpbHRlck1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFRklMVEVSVFlQRTsKLQotCi0vKioKLSAqIEltYWdlIGZpbHRlciBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUltYWdlRmlsdGVyIDogSW1hZ2UgZmlsdGVyIHR5cGUgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfSU1BR0VGSUxURVJUWVBFIGVJbWFnZUZpbHRlcjsKLX0gT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEU7Ci0KLQotLyoqCi0gKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgYkNvbG9yRW5oYW5jZW1lbnQgOiBFbmFibGUvZGlzYWJsZSBjb2xvciBlbmhhbmNlbWVudAotICogIG5DdXN0b21pemVkVSAgICAgIDogUHJhY3RpY2FsIHZhbHVlczogMTYtMjQwLCByYW5nZTogMC0yNTUsIHZhbHVlIHNldCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIFUgY29tcG9uZW50Ci0gKiAgbkN1c3RvbWl6ZWRWICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvcgotICogICAgICAgICAgICAgICAgICAgICAgViBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJDb2xvckVuaGFuY2VtZW50OwotICAgIE9NWF9VOCBuQ3VzdG9taXplZFU7Ci0gICAgT01YX1U4IG5DdXN0b21pemVkVjsKLX0gT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRTsKLQotCi0vKioKLSAqIERlZmluZSBjb2xvciBrZXkgYW5kIGNvbG9yIGtleSBtYXNrCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkFSR0JDb2xvciA6IDMyYml0IEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIENvbG9yCi0gKiAgbkFSR0JNYXNrICA6IDMyYml0IE1hc2sgZm9yIEFscGhhLCBSZWQsIEdyZWVuLCBCbHVlIGNoYW5uZWxzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQVJHQkNvbG9yOwotICAgIE9NWF9VMzIgbkFSR0JNYXNrOwotfSBPTVhfQ09ORklHX0NPTE9SS0VZVFlQRTsKLQotCi0vKioKLSAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcKLSAqCi0gKiBFTlVNUzoKLSAqICBOb25lICAgICAgICAgIDogTm8gY29sb3IgYmxlbmRpbmcgcHJlc2VudAotICogIEFscGhhQ29uc3RhbnQgOiBGdW5jdGlvbiBpcyAoYWxwaGFfY29uc3RhbnQgKiBzcmMpICsKLSAqICAgICAgICAgICAgICAgICAgKDEgLSBhbHBoYV9jb25zdGFudCkgKiBkc3QpCi0gKiAgQWxwaGFQZXJQaXhlbCA6IEZ1bmN0aW9uIGlzIChhbHBoYSAqIHNyYykgKyAoMSAtIGFscGhhKSAqIGRzdCkKLSAqICBBbHRlcm5hdGUgICAgIDogRnVuY3Rpb24gaXMgYWx0ZXJuYXRpbmcgcGl4ZWxzIGZyb20gc3JjIGFuZCBkc3QKLSAqICBBbmQgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyAmIGRzdCkKLSAqICBPciAgICAgICAgICAgIDogRnVuY3Rpb24gaXMgKHNyYyB8IGRzdCkKLSAqICBJbnZlcnQgICAgICAgIDogRnVuY3Rpb24gaXMgfnNyYwotICovCi10eXBlZGVmIGVudW0gT01YX0NPTE9SQkxFTkRUWVBFIHsKLSAgICBPTVhfQ29sb3JCbGVuZE5vbmUsCi0gICAgT01YX0NvbG9yQmxlbmRBbHBoYUNvbnN0YW50LAotICAgIE9NWF9Db2xvckJsZW5kQWxwaGFQZXJQaXhlbCwKLSAgICBPTVhfQ29sb3JCbGVuZEFsdGVybmF0ZSwKLSAgICBPTVhfQ29sb3JCbGVuZEFuZCwKLSAgICBPTVhfQ29sb3JCbGVuZE9yLAotICAgIE9NWF9Db2xvckJsZW5kSW52ZXJ0LAotICAgIE9NWF9Db2xvckJsZW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0NvbG9yQmxlbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9Db2xvckJsZW5kTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfQ09MT1JCTEVORFRZUEU7Ci0KLQotLyoqCi0gKiBDb2xvciBibGVuZCBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblJHQkFscGhhQ29uc3RhbnQgOiBDb25zdGFudCBnbG9iYWwgYWxwaGEgdmFsdWVzIHdoZW4gZ2xvYmFsIGFscGhhIGlzIHVzZWQKLSAqICBlQ29sb3JCbGVuZCAgICAgICA6IENvbG9yIGJsZW5kIHR5cGUgZW51bWVyYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblJHQkFscGhhQ29uc3RhbnQ7Ci0gICAgT01YX0NPTE9SQkxFTkRUWVBFICBlQ29sb3JCbGVuZDsKLX0gT01YX0NPTkZJR19DT0xPUkJMRU5EVFlQRTsKLQotCi0vKioKLSAqIEhvbGQgZnJhbWUgZGltZW5zaW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbldpZHRoICAgICA6IEZyYW1lIHdpZHRoIGluIHBpeGVscwotICogIG5IZWlnaHQgICAgOiBGcmFtZSBoZWlnaHQgaW4gcGl4ZWxzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9GUkFNRVNJWkVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuV2lkdGg7Ci0gICAgT01YX1UzMiBuSGVpZ2h0OwotfSBPTVhfRlJBTUVTSVpFVFlQRTsKLQotCi0vKioKLSAqIFJvdGF0aW9uIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUm90YXRpb24gIDogKy8tIGludGVnZXIgcm90YXRpb24gdmFsdWUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5Sb3RhdGlvbjsKLX0gT01YX0NPTkZJR19ST1RBVElPTlRZUEU7Ci0KLQotLyoqCi0gKiBQb3NzaWJsZSBtaXJyb3JpbmcgZGlyZWN0aW9ucyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZwotICoKLSAqIEVOVU1TOgotICogIE5vbmUgICAgICAgOiBObyBtaXJyb3JpbmcKLSAqICBWZXJ0aWNhbCAgIDogVmVydGljYWwgbWlycm9yaW5nLCBmbGlwIG9uIFggYXhpcwotICogIEhvcml6b250YWwgOiBIb3Jpem9udGFsIG1pcnJvcmluZywgZmxpcCBvbiBZIGF4aXMKLSAqICBCb3RoICAgICAgIDogQm90aCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBtaXJyb3JpbmcKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9NSVJST1JUWVBFIHsKLSAgICBPTVhfTWlycm9yTm9uZSA9IDAsCi0gICAgT01YX01pcnJvclZlcnRpY2FsLAotICAgIE9NWF9NaXJyb3JIb3Jpem9udGFsLAotICAgIE9NWF9NaXJyb3JCb3RoLAotICAgIE9NWF9NaXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWlycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfTWlycm9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfTUlSUk9SVFlQRTsKLQotCi0vKioKLSAqIE1pcnJvcmluZyBjb25maWd1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZU1pcnJvciAgICA6IE1pcnJvciB0eXBlIGVudW1lcmF0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUlSUk9SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9NSVJST1JUWVBFICBlTWlycm9yOwotfSBPTVhfQ09ORklHX01JUlJPUlRZUEU7Ci0KLQotLyoqCi0gKiBQb3NpdGlvbiBpbmZvcm1hdGlvbiBvbmx5Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblggICAgICAgICA6IFggY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50Ci0gKiAgblkgICAgICAgICA6IFkgY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUE9JTlRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuWDsKLSAgICBPTVhfUzMyIG5ZOwotfSBPTVhfQ09ORklHX1BPSU5UVFlQRTsKLQotCi0vKioKLSAqIEZyYW1lIHNpemUgcGx1cyBwb3NpdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5MZWZ0ICAgICAgOiBYIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCi0gKiAgblRvcCAgICAgICA6IFkgQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKLSAqICBuV2lkdGggICAgIDogV2lkdGggb2YgdGhlIHJlY3RhbmdsZQotICogIG5IZWlnaHQgICAgOiBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JFQ1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuTGVmdDsKLSAgICBPTVhfUzMyIG5Ub3A7Ci0gICAgT01YX1UzMiBuV2lkdGg7Ci0gICAgT01YX1UzMiBuSGVpZ2h0OwotfSBPTVhfQ09ORklHX1JFQ1RUWVBFOwotCi0KLS8qKgotICogRGVibG9ja2luZyBzdGF0ZTsgaXQgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHVwIGJlZm9yZSBzdGFydGluZyB0aGUgY29kZWMKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRGVibG9ja2luZyA6IEVuYWJsZS9kaXNhYmxlIGRlYmxvY2tpbmcgbW9kZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfQk9PTCBiRGVibG9ja2luZzsKLX0gT01YX1BBUkFNX0RFQkxPQ0tJTkdUWVBFOwotCi0KLS8qKgotICogU3RhYmlsaXphdGlvbiBzdGF0ZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGJTdGFiICAgICAgOiBFbmFibGUvZGlzYWJsZSBmcmFtZSBzdGFiaWxpemF0aW9uIHN0YXRlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJTdGFiOwotfSBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEU7Ci0KLQotLyoqCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgdHlwZQotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIFN1bkxpZ2h0IDogUmVmZXJlbmNlZCBpbiBKU1ItMjM0Ci0gKiAgRmxhc2ggICAgOiBPcHRpbWFsIGZvciBkZXZpY2UncyBpbnRlZ3JhdGVkIGZsYXNoCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSB7Ci0gICAgT01YX1doaXRlQmFsQ29udHJvbE9mZiA9IDAsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEF1dG8sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFN1bkxpZ2h0LAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xDbG91ZHksCi0gICAgT01YX1doaXRlQmFsQ29udHJvbFNoYWRlLAotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xUdW5nc3RlbiwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sRmx1b3Jlc2NlbnQsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEluY2FuZGVzY2VudCwKLSAgICBPTVhfV2hpdGVCYWxDb250cm9sRmxhc2gsCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEhvcml6b24sCi0gICAgT01YX1doaXRlQmFsQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9XSElURUJBTENPTlRST0xUWVBFOwotCi0KLS8qKgotICogV2hpdGUgQmFsYW5jZSBjb250cm9sIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlV2hpdGVCYWxDb250cm9sIDogV2hpdGUgYmFsYW5jZSBlbnVtZXJhdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfV0hJVEVCQUxDT05UUk9MVFlQRSBlV2hpdGVCYWxDb250cm9sOwotfSBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEU7Ci0KLQotLyoqCi0gKiBFeHBvc3VyZSBjb250cm9sIHR5cGUKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIHsKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sT2ZmID0gMCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sQXV0bywKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sTmlnaHQsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJhY2tMaWdodCwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sU3BvdExpZ2h0LAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG9ydHMsCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFNub3csCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbEJlYWNoLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xMYXJnZUFwZXJ0dXJlLAotICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTbWFsbEFwcGVydHVyZSwKLSAgICBPTVhfRXhwb3N1cmVDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0V4cG9zdXJlQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEU7Ci0KLQotLyoqCi0gKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVFeHBvc3VyZUNvbnRyb2wgOiBFeHBvc3VyZSBjb250cm9sIGVudW1lcmF0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9FWFBPU1VSRUNPTlRST0xUWVBFIGVFeHBvc3VyZUNvbnRyb2w7Ci19IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgc2Vuc29yIHN1cHBvcnRlZCBtb2RlLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5GcmFtZVJhdGUgOiBTaW5nbGUgc2hvdCBtb2RlIGlzIGluZGljYXRlZCBieSBhIDAKLSAqICBiT25lU2hvdCAgIDogRW5hYmxlIGZvciBzaW5nbGUgc2hvdCwgZGlzYWJsZSBmb3Igc3RyZWFtaW5nCi0gKiAgc0ZyYW1lU2l6ZSA6IEZyYW1lc2l6ZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5GcmFtZVJhdGU7Ci0gICAgT01YX0JPT0wgYk9uZVNob3Q7Ci0gICAgT01YX0ZSQU1FU0laRVRZUEUgc0ZyYW1lU2l6ZTsKLX0gT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBjb250cmFzdCBsZXZlbAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5Db250cmFzdCAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgY29udHJhc3QgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1MzMiBuQ29udHJhc3Q7Ci19IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBicmlnaHRuZXNzIGxldmVsCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkJyaWdodG5lc3MgOiAwLTEwMCUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkJyaWdodG5lc3M7Ci19IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGJhY2tsaWdodCBsZXZlbCBjb25maWd1cmF0aW9uIGZvciBhIHZpZGVvIHNpbmssIGUuZy4gTENEIHBhbmVsCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbkJhY2tsaWdodCA6IFZhbHVlcyBhbGxvd2VkIGZvciBiYWNrbGlnaHQgMC0xMDAlCi0gKiAgblRpbWVvdXQgICA6IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGJhY2tsaWdodCBhdXRvbWF0aWNhbGx5IHR1cm5zCi0gKiAgICAgICAgICAgICAgIG9mZi4gIEEgdmFsdWUgb2YgMHgwIGRpc2FibGVzIGJhY2tpZ2h0IHRpbWVvdXQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CQUNLTElHSFRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuQmFja2xpZ2h0OwotICAgIE9NWF9VMzIgblRpbWVvdXQ7Ci19IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRTsKLQotCi0vKioKLSAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuR2FtbWEgICAgIDogVmFsdWVzIGFsbG93ZWQgZm9yIGdhbW1hIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vIGNoYW5nZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0dBTU1BVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9TMzIgbkdhbW1hOwotfSBPTVhfQ09ORklHX0dBTU1BVFlQRTsKLQotCi0vKioKLSAqIERlZmluZSBmb3Igc2V0dGluZyBzYXR1cmF0aW9uCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNhdHVyYXRpb24gOiBWYWx1ZXMgYWxsb3dlZCBmb3Igc2F0dXJhdGlvbiAtMTAwIHRvIDEwMCwgemVybyBtZWFucwotICogICAgICAgICAgICAgICAgbm8gY2hhbmdlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5TYXR1cmF0aW9uOwotfSBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFOwotCi0KLS8qKgotICogRGVmaW5lIGZvciBzZXR0aW5nIExpZ2h0bmVzcwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5MaWdodG5lc3MgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgbGlnaHRuZXNzIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIG5vCi0gKiAgICAgICAgICAgICAgIGNoYW5nZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfUzMyIG5MaWdodG5lc3M7Ci19IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRTsKLQotCi0vKioKLSAqIFBsYW5lIGJsZW5kIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogSW5kZXggb2YgaW5wdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYW5lLgotICogIG5EZXB0aCAgICAgOiBEZXB0aCBvZiB0aGUgcGxhbmUgaW4gcmVsYXRpb24gdG8gdGhlIHNjcmVlbi4gSGlnaGVyCi0gKiAgICAgICAgICAgICAgIG51bWJlcmVkIGRlcHRocyBhcmUgImJlaGluZCIgbG93ZXIgbnVtYmVyIGRlcHRocy4KLSAqICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgZGVmYXVsdHMgdG8gdGhlIFBvcnQgSW5kZXggbnVtYmVyLgotICogIG5BbHBoYSAgICAgOiBUcmFuc3BhcmVuY3kgYmxlbmRpbmcgY29tcG9uZW50IGZvciB0aGUgZW50aXJlIHBsYW5lLgotICogICAgICAgICAgICAgICBTZWUgYmxlbmRpbmcgbW9kZXMgZm9yIG1vcmUgZGV0YWlsLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuRGVwdGg7Ci0gICAgT01YX1UzMiBuQWxwaGE7Ci19IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmUgaW50ZXJsYWNlIHR5cGUKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRW5hYmxlICAgICAgICAgICAgICAgOiBFbmFibGUgY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBiZWxvdykKLSAqICBuSW50ZXJsZWF2ZVBvcnRJbmRleCAgOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJsZWF2ZWQgcGxhbmUuCi0gKiAgcFBsYW5hclBvcnRJbmRleGVzWzRdIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBsYW5hciBwb3J0cy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZTsKLSAgICBPTVhfVTMyIG5JbnRlcmxlYXZlUG9ydEluZGV4OwotfSBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBwaWN0dXJlIGVmZmVjdCB1c2VkIGZvciBhbiBpbnB1dCBwaWN0dXJlCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgewotICAgIE9NWF9FZmZlY3ROb25lLAotICAgIE9NWF9FZmZlY3RGYWRlRnJvbUJsYWNrLAotICAgIE9NWF9FZmZlY3RGYWRlVG9CbGFjaywKLSAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRUaHJvdWdoQ29uc3RhbnRDb2xvciwKLSAgICBPTVhfRWZmZWN0RGlzc29sdmUsCi0gICAgT01YX0VmZmVjdFdpcGUsCi0gICAgT01YX0VmZmVjdFVuc3BlY2lmaWVkTWl4T2ZUd29TY2VuZXMsCi0gICAgT01YX0VmZmVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FZmZlY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9FZmZlY3RNYXggPSAweDdGRkZGRkZGCi19IE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHRyYW5zaXRpb24gZWZmZWN0Ci0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiBlRWZmZWN0ICAgIDogRWZmZWN0IHRvIGVuYWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFIGVFZmZlY3Q7Ci19IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGRhdGEgdW5pdCB0eXBlcyBmb3IgZW5jb2RlZCB2aWRlbyBkYXRhLiBUaGUgZGF0YSB1bml0Ci0gKiB0eXBlcyBhcmUgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvciBwbGF5YmFjayBhcyB3ZWxsIGFzCi0gKiBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVFRZUEUgewotICAgIE9NWF9EYXRhVW5pdENvZGVkUGljdHVyZSwKLSAgICBPTVhfRGF0YVVuaXRWaWRlb1NlZ21lbnQsCi0gICAgT01YX0RhdGFVbml0U2V2ZXJhbFNlZ21lbnRzLAotICAgIE9NWF9EYXRhVW5pdEFyYml0cmFyeVN0cmVhbVNlY3Rpb24sCi0gICAgT01YX0RhdGFVbml0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0RhdGFVbml0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGF0YVVuaXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9EQVRBVU5JVFRZUEU7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHBvc3NpYmxlIGVuY2Fwc3VsYXRpb24gdHlwZXMgZm9yIGNvZGVkIHZpZGVvIGRhdGEgdW5pdC4gVGhlCi0gKiBlbmNhcHN1bGF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IKLSAqIHBsYXliYWNrIGFzIHdlbGwgYXMgZW5jb2RlZCB2aWRlbyBvdXRwdXQgZnJvbSByZWNvcmRpbmcuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSB7Ci0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uRWxlbWVudGFyeVN0cmVhbSwKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25HZW5lcmljUGF5bG9hZCwKLSAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25SdHBQYXlsb2FkLAotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiBiZWluZyBkZWNvZGVkL2VuY29kZWQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0RBVEFVTklUVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RBVEFVTklUVFlQRSBlVW5pdFR5cGU7Ci0gICAgT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEUgZUVuY2Fwc3VsYXRpb25UeXBlOwotfSBPTVhfUEFSQU1fREFUQVVOSVRUWVBFOwotCi0KLS8qKgotICogRGVmaW5lcyBkaXRoZXIgdHlwZXMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9ESVRIRVJUWVBFIHsKLSAgICBPTVhfRGl0aGVyTm9uZSwKLSAgICBPTVhfRGl0aGVyT3JkZXJlZCwKLSAgICBPTVhfRGl0aGVyRXJyb3JEaWZmdXNpb24sCi0gICAgT01YX0RpdGhlck90aGVyLAotICAgIE9NWF9EaXRoZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGl0aGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRGl0aGVyTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRElUSEVSVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHR5cGUgb2YgZGl0aGVyaW5nCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRElUSEVSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0RJVEhFUlRZUEUgZURpdGhlcjsgICAvKio8IFR5cGUgb2YgZGl0aGVyaW5nIHRvIHVzZSAqLwotfSBPTVhfQ09ORklHX0RJVEhFUlRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX0JPT0wgYkNvbnRpbnVvdXM7ICAgLyoqPCBJZiB0cnVlIHRoZW4gaWdub3JlIGZyYW1lIHJhdGUgYW5kIGVtaXQgY2FwdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGF0YSBhcyBmYXN0IGFzIHBvc3NpYmxlIChvdGhlcndpc2Ugb2JleSBwb3J0J3MgZnJhbWUgcmF0ZSkuICovCi0gICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcyAob3RoZXJ3aXNlIHRoZSBwb3J0IGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgdW50aWwgaW5zdHJ1Y3RlZCB0byBkbyBzbyBieSB0aGUgY2xpZW50KS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC4gKi8KLSAgICBPTVhfVTMyIG5GcmFtZUxpbWl0OyAgICAgIC8qKjwgTGltaXQgb24gbnVtYmVyIG9mIGZyYW1lcyBlbWl0dGVkIGR1cmluZyBhIGNhcHR1cmUgKG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdmFsaWQgaWYgYkZyYW1lTGltaXRlZCBpcyBzZXQpLiAqLwotfSBPTVhfQ09ORklHX0NBUFRVUkVNT0RFVFlQRTsKLQotdHlwZWRlZiBlbnVtIE9NWF9NRVRFUklOR1RZUEUgewotCi0gICAgT01YX01ldGVyaW5nTW9kZUF2ZXJhZ2UsICAgICAvKio8IENlbnRlci13ZWlnaHRlZCBhdmVyYWdlIG1ldGVyaW5nLiAqLwotICAgIE9NWF9NZXRlcmluZ01vZGVTcG90LCAgCSAgICAgIC8qKjwgU3BvdCAocGFydGlhbCkgbWV0ZXJpbmcuICovCi0gICAgT01YX01ldGVyaW5nTW9kZU1hdHJpeCwgICAgICAvKio8IE1hdHJpeCBvciBldmFsdWF0aXZlIG1ldGVyaW5nLiAqLwotCi0gICAgT01YX01ldGVyaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX01ldGVyaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRVZNb2RlTWF4ID0gMHg3ZmZmZmZmZgotfSBPTVhfTUVURVJJTkdUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX01FVEVSSU5HVFlQRSBlTWV0ZXJpbmc7Ci0gICAgT01YX1MzMiB4RVZDb21wZW5zYXRpb247ICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCi0gICAgT01YX1UzMiBuQXBlcnR1cmVGTnVtYmVyOyAgICAgLyoqPCBlLmcuIG5BcGVydHVyZUZOdW1iZXIgPSAyIGltcGxpZXMgImYvMiIgLSBRMTYgZm9ybWF0ICovCi0gICAgT01YX0JPT0wgYkF1dG9BcGVydHVyZTsJCS8qKjwgV2hldGhlciBhcGVydHVyZSBudW1iZXIgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi0gICAgT01YX1UzMiBuU2h1dHRlclNwZWVkTXNlYzsgICAgLyoqPCBTaHV0dGVyc3BlZWQgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgT01YX0JPT0wgYkF1dG9TaHV0dGVyU3BlZWQ7CS8qKjwgV2hldGhlciBzaHV0dGVyIHNwZWVkIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLwotICAgIE9NWF9VMzIgblNlbnNpdGl2aXR5OyAgICAgICAgIC8qKjwgZS5nLiBuU2Vuc2l0aXZpdHkgPSAxMDAgaW1wbGllcyAiSVNPIDEwMCIgKi8KLSAgICBPTVhfQk9PTCBiQXV0b1NlbnNpdGl2aXR5OwkvKio8IFdoZXRoZXIgc2Vuc2l0aXZpdHkgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCi19IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEU7Ci0KLS8qKgotICogRm9jdXMgcmVnaW9uIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiQ2VudGVyICAgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiTGVmdCAgICAgICAgICAgOiBVc2UgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYlJpZ2h0ICAgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wICAgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tICAgICAgICAgOiBVc2UgYm90dG9tIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wTGVmdCAgICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BSaWdodCAgICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJCb3R0b21MZWZ0ICAgICA6IFVzZSBib3R0b20gbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbVJpZ2h0ICAgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkNlbnRlcjsKLSAgICBPTVhfQk9PTCBiTGVmdDsKLSAgICBPTVhfQk9PTCBiUmlnaHQ7Ci0gICAgT01YX0JPT0wgYlRvcDsKLSAgICBPTVhfQk9PTCBiQm90dG9tOwotICAgIE9NWF9CT09MIGJUb3BMZWZ0OwotICAgIE9NWF9CT09MIGJUb3BSaWdodDsKLSAgICBPTVhfQk9PTCBiQm90dG9tTGVmdDsKLSAgICBPTVhfQk9PTCBiQm90dG9tUmlnaHQ7Ci19IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFOwotCi0vKioKLSAqIEZvY3VzIFN0YXR1cyB0eXBlCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfRk9DVVNTVEFUVVNUWVBFIHsKLSAgICBPTVhfRm9jdXNTdGF0dXNPZmYgPSAwLAotICAgIE9NWF9Gb2N1c1N0YXR1c1JlcXVlc3QsCi0gICAgT01YX0ZvY3VzU3RhdHVzUmVhY2hlZCwKLSAgICBPTVhfRm9jdXNTdGF0dXNVbmFibGVUb1JlYWNoLAotICAgIE9NWF9Gb2N1c1N0YXR1c0xvc3QsCi0gICAgT01YX0ZvY3VzU3RhdHVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCi0gICAgT01YX0ZvY3VzU3RhdHVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfRm9jdXNTdGF0dXNNYXggPSAweDdGRkZGRkZGCi19IE9NWF9GT0NVU1NUQVRVU1RZUEU7Ci0KLS8qKgotICogRm9jdXMgc3RhdHVzIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9jdXNTdGF0dXMgICAgICAgIDogU3BlY2lmaWVzIHRoZSBmb2N1cyBzdGF0dXMKLSAqICBiQ2VudGVyU3RhdHVzICAgICAgIDogVXNlIGNlbnRlciByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkxlZnRTdGF0dXMgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiUmlnaHRTdGF0dXMgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiVG9wU3RhdHVzICAgICAgICAgIDogVXNlIHRvcCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKiAgYkJvdHRvbVN0YXR1cyAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BMZWZ0U3RhdHVzICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAotICogIGJUb3BSaWdodFN0YXR1cyAgICAgOiBVc2UgdG9wIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tTGVmdFN0YXR1cyAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKLSAqICBiQm90dG9tUmlnaHRTdGF0dXMgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9GT0NVU1NUQVRVU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfRk9DVVNTVEFUVVNUWVBFIGVGb2N1c1N0YXR1czsKLSAgICBPTVhfQk9PTCBiQ2VudGVyU3RhdHVzOwotICAgIE9NWF9CT09MIGJMZWZ0U3RhdHVzOwotICAgIE9NWF9CT09MIGJSaWdodFN0YXR1czsKLSAgICBPTVhfQk9PTCBiVG9wU3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21TdGF0dXM7Ci0gICAgT01YX0JPT0wgYlRvcExlZnRTdGF0dXM7Ci0gICAgT01YX0JPT0wgYlRvcFJpZ2h0U3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0U3RhdHVzOwotICAgIE9NWF9CT09MIGJCb3R0b21SaWdodFN0YXR1czsKLX0gT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRTsKLQotLyoqIEB9ICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW1hZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlMzllYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0ltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKi8KLQotLyoqIAotICogQGZpbGUgT01YX0ltYWdlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgYW5kIAotICogY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCi0gKi8KLSNpZm5kZWYgT01YX0ltYWdlX2gKLSNkZWZpbmUgT01YX0ltYWdlX2gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSAKLSAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCAgCi0gKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKLSAqLwotCi0jaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+Ci0KLS8qKiBAZGVmZ3JvdXAgaW1hZ2luZyBPcGVuTUFYIElMIEltYWdpbmcgRG9tYWluCi0gKiBAaW5ncm91cCBpdgotICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGRvbWFpbgotICogQHsKLSAqLwotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgaW1hZ2UgY29tcHJlc3Npb24gY29kaW5nLiAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9DT0RJTkdUWVBFIHsKLSAgICBPTVhfSU1BR0VfQ29kaW5nVW51c2VkLCAgICAgIC8qKjwgVmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IEF1dG8gZGV0ZWN0aW9uIG9mIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHLCAgICAgICAgLyoqPCBKUEVHL0pGSUYgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0pQRUcySywgICAgICAvKio8IEpQRUcgMjAwMCBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nRVhJRiwgICAgICAgIC8qKjwgRVhJRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nVElGRiwgICAgICAgIC8qKjwgVElGRiBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nR0lGLCAgICAgICAgIC8qKjwgR3JhcGhpY3MgaW1hZ2UgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ1BORywgICAgICAgICAvKio8IFBORyBpbWFnZSBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nTFpXLCAgICAgICAgIC8qKjwgTFpXIGltYWdlIGZvcm1hdCAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdCTVAsICAgICAgICAgLyoqPCBXaW5kb3dzIEJpdG1hcCBmb3JtYXQgKi8KLSAgICBPTVhfSU1BR0VfQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9Db2RpbmdNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9DT0RJTkdUWVBFOwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW4gaW1hZ2UgcGF0aC4gVGhlIG51bWJlciBvZiBpbWFnZSBwYXRocyAKLSAqIGZvciBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBpbWFnZSBjb21wb25lbnQuICAKLSAqIAotICogIElucHV0IChha2EgU291cmNlKSA6IFplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAotICogIFNwbGl0dGVyICAgICAgICAgICA6IE9uZSBJbnB1dCwgMiBvciBtb3JlIE91dHB1dHMsCi0gKiAgUHJvY2Vzc2luZyBFbGVtZW50IDogT25lIElucHV0LCBvbmUgb3V0cHV0LAotICogIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCi0gKiAgT3V0cHV0IChha2EgU2luaykgIDogT25lIElucHV0LCB6ZXJvIG91dHB1dHMuCi0gKiAKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgIAotICogaW1hZ2UgcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCAgCi0gKiBiZSB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgIAotICogQ29tcGxpYW50IGNvbXBvbmVudHMgd2lsbCBwcmVwb3B1bGF0ZSB0aGlzIHN0cnVjdHVyZSB3aXRoIG9wdGltYWwgIAotICogdmFsdWVzIGR1cmluZyB0aGUgT01YX0dldFBhcmFtZXRlcigpIGNvbW1hbmQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCi0gKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCi0gKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldCBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKLSAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIGVDb2xvckZvcm1hdCBpcyB2YWxpZAotICogIGVDb2xvckZvcm1hdCAgICAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAotICogIHBOYXRpdmVXaW5kb3cgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSB3aW5kb3cgb2JqZWN0IGlmIGEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBzaW5rICwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMHgwLiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSB7Ci0gICAgT01YX1NUUklORyBjTUlNRVR5cGU7Ci0gICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7Ci0gICAgT01YX1UzMiBuRnJhbWVXaWR0aDsgCi0gICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7Ci0gICAgT01YX1MzMiBuU3RyaWRlOyAgICAgCi0gICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7Ci0gICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OwotICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Ci0gICAgT01YX05BVElWRV9XSU5ET1dUWVBFIHBOYXRpdmVXaW5kb3c7Ci19IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEU7Ci0KLQotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAotICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKLSAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiBuSW5kZXg7Ci0gICAgT01YX0lNQUdFX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLX0gT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgdHlwZSAKLSAqCi0gKiBFTlVNUwotICogIFRvcmNoIDogRmxhc2ggZm9yY2VkIGNvbnN0YW50bHkgb24KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT24gPSAwLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xPZmYsCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEF1dG8sCi0gICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFJlZEV5ZVJlZHVjdGlvbiwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sRmlsbGluLAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xUb3JjaCwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xNYXggPSAweDdGRkZGRkZGCi19IE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIEZsYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRmxhc2hDb250cm9sIDogRmxhc2ggY29udHJvbCB0eXBlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEUgZUZsYXNoQ29udHJvbDsKLX0gT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEU7Ci0KLQotLyoqIAotICogRm9jdXMgY29udHJvbCB0eXBlIAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEUgewotICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPbiA9IDAsCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9mZiwKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0bywKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0b0xvY2ssCi0gICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRTsKLQotIAotLyoqIAotICogRm9jdXMgY29udHJvbCBjb25maWd1cmF0aW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVGb2N1c0NvbnRyb2wgICA6IEZvY3VzIGNvbnRyb2wKLSAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LiAKLSAqICAgICAgICAgICAgICAgICAgICBJbnRlcmVzdCBpcyBvbmx5IGluIG51bWJlciBvZiBzdGVwcyBvdmVyIHRoaXMgcmFuZ2UuCi0gKiAgbkZvY3VzU3RlcEluZGV4IDogQ3VycmVudCBmb2N1cyBzdGVwIGluZGV4Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIGVGb2N1c0NvbnRyb2w7Ci0gICAgT01YX1UzMiBuRm9jdXNTdGVwczsKLSAgICBPTVhfVTMyIG5Gb2N1c1N0ZXBJbmRleDsKLX0gT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFOwotCi0KLS8qKiAKLSAqIFEgRmFjdG9yIGZvciBKUEVHIGNvbXByZXNzaW9uLCB3aGljaCBjb250cm9scyB0aGUgdHJhZGVvZmYgYmV0d2VlbiBpbWFnZQotICogcXVhbGl0eSBhbmQgc2l6ZS4gIFEgRmFjdG9yIHByb3ZpZGVzIGEgbW9yZSBzaW1wbGUgbWVhbnMgb2YgY29udHJvbGxpbmcKLSAqIEpQRUcgY29tcHJlc3Npb24gcXVhbGl0eSwgd2l0aG91dCBkaXJlY3RseSBwcm9ncmFtbWluZyBRdWFudGl6YXRpb24KLSAqIHRhYmxlcyBmb3IgY2hyb21hIGFuZCBsdW1hIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgblFGYWN0b3IgICA6IEpQRUcgUSBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDEtMTAwLiBBIGZhY3RvciBvZiAxIAotICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IgCi0gKiAgICAgICAgICAgICAgIG9mIDEwMCBwcm9kdWNlcyB0aGUgbGFyZ2VzdCwgYmVzdCBxdWFsaXR5IGltYWdlcy4gIEEgCi0gKiAgICAgICAgICAgICAgIHR5cGljYWwgZGVmYXVsdCBpcyA3NSBmb3Igc21hbGwgZ29vZCBxdWFsaXR5IGltYWdlcyAgICAgICAgICAgICAgIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9VMzIgblFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfSBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEU7Ci0KLS8qKiAKLSAqIFF1YW50aXphdGlvbiB0YWJsZSB0eXBlIAotICovCi0KLXR5cGVkZWYgZW51bSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVMdW1hID0gMCwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWEsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ2IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ3IsCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFOwotCi0vKiogCi0gKiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIERDVCBjb21wcmVzc2lvbiBmb3IKLSAqIFlVViBkYXRhLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIFEgZmFjdG9yLCBwcm92aWRpbmcgZXhhY3QgCi0gKiBjb250cm9sIG9mIGNvbXByZXNzaW9uIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlUXVhbnRpemF0aW9uVGFibGUgICAgICA6IFF1YW50aXphdGlvbiB0YWJsZSB0eXBlCi0gKiAgblF1YW50aXphdGlvbk1hdHJpeFs2NF0gOiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZSBvZiBjb2VmZmljaWVudHMgc3RvcmVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW5jcmVhc2luZyBjb2x1bW5zIHRoZW4gYnkgcm93cyBvZiBkYXRhIChpLmUuIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDEsIC4uLiByb3cgOCkuIFF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmdlIDAtMjU1IGFuZCBzdG9yZWQgaW4gbGluZWFyIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgY29tcG9uZW50IHdpbGwgemlnLXphZyB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gdGFibGUgZGF0YSBpZiByZXF1aXJlZCBpbnRlcm5hbGx5KSAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEUgZVF1YW50aXphdGlvblRhYmxlOwotICAgIE9NWF9VOCBuUXVhbnRpemF0aW9uTWF0cml4WzY0XTsKLX0gT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKLQotCi0vKiogCi0gKiBIdWZmbWFuIHRhYmxlIHR5cGUsIHRoZSBzYW1lIEh1ZmZtYW4gdGFibGUgaXMgYXBwbGllZCBmb3IgY2hyb21hIGFuZCAKLSAqIGx1bWEgY29tcG9uZW50IAotICovCi10eXBlZGVmIGVudW0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgewotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQyA9IDAsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0x1bWEsCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZU1heCA9IDB4N0ZGRkZGRkYKLX0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEU7Ci0KLS8qKiAKLSAqIEpQRUcgSHVmZm1hbiB0YWJsZSAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlSHVmZm1hblRhYmxlICAgICAgICAgICAgICAgICAgICA6IEh1ZmZtYW4gdGFibGUgdHlwZQotICogIG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdIDogMC0xNiwgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgZWFjaCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxlbmd0aAotICogIG5IdWZmbWFuVGFibGVbMjU2XSAgICAgICAgICAgICAgIDogMC0yNTUsIHRoZSBzaXplIHVzZWQgZm9yIEFDIGFuZCBEQyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZSBhcmUgMTYgYW5kIDE2MiAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgZUh1ZmZtYW5UYWJsZTsKLSAgICBPTVhfVTggbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl07Ci0gICAgT01YX1U4IG5IdWZmbWFuVGFibGVbMjU2XTsKLX1PTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEU7Ci0KLS8qKiBAfSAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JbmRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGI4ZDkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSW5kZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwotICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAotICoKLSAqLwotCi0vKiogQGZpbGUgT01YX0luZGV4LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKLSAqICBUaGUgT01YX0luZGV4IGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgYm90aCBhcHBsaWNhdGlvbnMKLSAqICBhbmQgY29tcG9uZW50cyAuCi0gKi8KLQotCi0jaWZuZGVmIE9NWF9JbmRleF9oCi0jZGVmaW5lIE9NWF9JbmRleF9oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCi0gKi8KLSNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KLQotCi0vKiogVGhlIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYSBzdHJ1Y3R1cmUgd2hlbiBlaXRoZXIKLSAqICBnZXR0aW5nIG9yIHNldHRpbmcgcGFyYW1ldGVycyBhbmQvb3IgY29uZmlndXJhdGlvbiBkYXRhLiAgRWFjaCBlbnRyeSBpbiAKLSAqICB0aGlzIGVudW1lcmF0aW9uIG1hcHMgdG8gYW4gT01YIHNwZWNpZmllZCBzdHJ1Y3R1cmUuICBXaGVuIHRoZSAKLSAqICBPTVhfR2V0UGFyYW1ldGVyLCBPTVhfU2V0UGFyYW1ldGVyLCBPTVhfR2V0Q29uZmlnIG9yIE9NWF9TZXRDb25maWcgbWV0aG9kcwotICogIGFyZSB1c2VkLCB0aGUgc2Vjb25kIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBiZSBhbiBlbnRyeSBmcm9tIHRoaXMgZW51bWVyYXRpb24KLSAqICBhbmQgdGhlIHRoaXJkIGVudHJ5IHdpbGwgYmUgdGhlIHN0cnVjdHVyZSBzaG93biBpbiB0aGUgY29tbWVudHMgZm9yIHRoZSBlbnRyeS4KLSAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZyBhIGNyb3BwaW5nIGZ1bmN0aW9uLCB0aGUgCi0gKiAgT01YX1NldENvbmZpZyBjb21tYW5kIHdvdWxkIGhhdmUgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIAotICogIGFuZCB3b3VsZCBzZW5kIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBPTVhfUkVDVFRZUEUgc3RydWN0dXJlIGFzIHRoZSAKLSAqICB0aGlyZCBwYXJhbWV0ZXIuCi0gKiAgCi0gKiAgVGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUgT01YX0NvbmZpZyBwcmVmaXggYXJlIHNlbnQgdXNpbmcKLSAqICB0aGUgT01YX1NldENvbmZpZyBjb21tYW5kIGFuZCB0aGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZQotICogIE9NWF9QQVJBTV8gcHJlZml4IGFyZSBzZW50IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIGNvbW1hbmQuCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfSU5ERVhUWVBFIHsKLQotICAgIE9NWF9JbmRleENvbXBvbmVudFN0YXJ0VW51c2VkID0gMHgwMTAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1JbWFnZUluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1PdGhlckluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1OdW1BdmFpbGFibGVTdHJlYW1zLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQWN0aXZlU3RyZWFtLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVN1c3BlbnNpb25Qb2xpY3ksICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tcG9uZW50U3VzcGVuZGVkLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyaW5nLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAotICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmVNb2RlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgKi8gCi0gICAgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAotICAgIE9NWF9JbmRleFBhcmFtQ29udGVudFVSSSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFICovIAotICAgIE9NWF9JbmRleFBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW1Db3VudCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29udGFpbmVyTm9kZUNvdW50LCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW0sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvdW50ZXJOb2RlSUQsICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUZpbHRlclR5cGUsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUtleUZpbHRlciwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnUHJpb3JpdHlNZ210LCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUFJJT1JJVFlNR01UVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICovCi0KLSAgICBPTVhfSW5kZXhQb3J0U3RhcnRVbnVzZWQgPSAweDAyMDAwMDAwLAotICAgIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqLyAKLSAgICBPTVhfSW5kZXhSZXNlcnZlZFN0YXJ0VW51c2VkID0gMHgwMzAwMDAwMCwKLQotICAgIC8qIEF1ZGlvIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4QXVkaW9TdGFydFVudXNlZCA9IDB4MDQwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1JhLCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUkFUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb01wMywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BZHBjbSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzIzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjksICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1dtYSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TYmMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTWlkaSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpTG9hZFVzZXJTb3VuZCwgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI2LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRUZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0hSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9GUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRUZSLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHA4LCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwMTMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRXZyYywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICovCi0KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlJbW1lZGlhdGVFdmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUNvbnRyb2wsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtLCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTdGF0dXMsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnREYXRhLCAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0JhbGFuY2UsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxNdXRlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9NdXRlLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Mb3VkbmVzcywgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvRWNob0NhbmNlbGF0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9Ob2lzZVJlZHVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFzcywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvVHJlYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9TdGVyZW9XaWRlbmluZywgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hvcnVzLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQXVkaW9FcXVhbGl6ZXIsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb1JldmVyYmVyYXRpb24sICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxWb2x1bWUsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgKi8KLQotICAgIC8qIEltYWdlIHNwZWNpZmljIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCi0gICAgT01YX0luZGV4SW1hZ2VTdGFydFVudXNlZCA9IDB4MDUwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1JbWFnZVBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUZsYXNoQ29udHJvbCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnRm9jdXNDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVFGYWN0b3IsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtUXVhbnRpemF0aW9uVGFibGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtSHVmZm1hblRhYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnRmxhc2hDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSAqLwotCi0gICAgLyogVmlkZW8gc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KLSAgICBPTVhfSW5kZXhWaWRlb1N0YXJ0VW51c2VkID0gMHgwNjAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvRmFzdFVwZGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTW90aW9uVmVjdG9yLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvVkJTTUMsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzIsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvV212LCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1J2LCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUlZUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFNQlJlZnJlc2gsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9NQkVycm9yUmVwb3J0aW5nLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1WaWRlb01hY3JvYmxvY2tzUGVyRnJhbWUsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnVmlkZW9NYWNyb0Jsb2NrRXJyb3JNYXAsIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbVZpZGVvU2xpY2VGTU8sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCAqLwotICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFICovCi0KLSAgICAvKiBJbWFnZSAmIFZpZGVvIGNvbW1vbiBDb25maWd1cmF0aW9ucyAqLwotICAgIE9NWF9JbmRleENvbW1vblN0YXJ0VW51c2VkID0gMHgwNzAwMDAwMCwKLSAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkRlYmxvY2tpbmcsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uU2Vuc29yTW9kZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFICovCi0gICAgT01YX0luZGV4UGFyYW1Db21tb25JbnRlcmxlYXZlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckZvcm1hdENvbnZlcnNpb24sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW1hZ2VGaWx0ZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRW5oYW5jZW1lbnQsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yS2V5LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUktFWVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25GcmFtZVN0YWJpbGlzYXRpb24sLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ST1RBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25NaXJyb3IsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUlSUk9SVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dFBvc2l0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19QT0lOVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25EaWdpdGFsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3B0aWNhbFpvb20sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uV2hpdGVCYWxhbmNlLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbnRyYXN0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UUkFTVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25CcmlnaHRuZXNzLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25CYWNrbGlnaHQsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkdhbW1hLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19HQU1NQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25TYXR1cmF0aW9uLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25MaWdodG5lc3MsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4Y2x1c2lvblJlY3QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpdGhlcmluZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ESVRIRVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUGxhbmVCbGVuZCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhwb3N1cmVWYWx1ZSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0U2l6ZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfRlJBTUVTSVpFVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRXh0cmFRdWFudERhdGEsICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0VYVFJBREFUQVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1JlZ2lvbiwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRm9jdXNTdGF0dXMsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnQ29tbW9uVHJhbnNpdGlvbkVmZmVjdCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFICovCi0KLSAgICAvKiBSZXNlcnZlZCBDb25maWd1cmF0aW9uIHJhbmdlICovCi0gICAgT01YX0luZGV4T3RoZXJTdGFydFVudXNlZCA9IDB4MDgwMDAwMDAsCi0gICAgT01YX0luZGV4UGFyYW1PdGhlclBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdPdGhlclBvd2VyLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFICovCi0gICAgT01YX0luZGV4Q29uZmlnT3RoZXJTdGF0cywgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRSAqLwotCi0KLSAgICAvKiBSZXNlcnZlZCBUaW1lIHJhbmdlICovCi0gICAgT01YX0luZGV4VGltZVN0YXJ0VW51c2VkID0gMHgwOTAwMDAwMCwKLSAgICBPTVhfSW5kZXhDb25maWdUaW1lU2NhbGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xvY2tTdGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVBY3RpdmVSZWZDbG9jaywgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIChyZWFkIG9ubHkpICovCi0gICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lTWVkaWFUaW1lUmVxdWVzdCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRSAod3JpdGUgb25seSkgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lLCAgICAgLyoqPHJlZmVyZW5jZTogIE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLwotICAgIE9NWF9JbmRleENvbmZpZ1RpbWVQb3NpdGlvbiwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKi8KLSAgICBPTVhfSW5kZXhDb25maWdUaW1lU2Vla01vZGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgKi8KLQotCi0gICAgT01YX0luZGV4S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIC8qIFZlbmRvciBzcGVjaWZpYyBhcmVhICovCi0gICAgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAotICAgIC8qIFZlbmRvciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg3RjAwMDAwMCAKLSAgICAgICB0byAweDdGRkZGRkZFLiAgVGhpcyByYW5nZSBpcyBub3QgYnJva2VuIG91dCBieSB2ZW5kb3IsIHNvCi0gICAgICAgcHJpdmF0ZSBpbmRleGVzIGFyZSBub3QgZ3VhcmFudGVlZCB1bmlxdWUgYW5kIHRoZXJlZm9yZSBzaG91bGQKLSAgICAgICBvbmx5IGJlIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4gKi8KLQotICAgIE9NWF9JbmRleE1heCA9IDB4N0ZGRkZGRkYKLQotfSBPTVhfSU5ERVhUWVBFOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYKLS8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX090aGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYmNlODMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9PdGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiBAZmlsZSBPTVhfT3RoZXIuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBPdGhlciBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCi0gKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCi0gKi8KLQotI2lmbmRlZiBPTVhfT3RoZXJfaAotI2RlZmluZSBPTVhfT3RoZXJfaAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQotICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfQ29yZS5oPgotCi0KLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRhdGEgdHlwZXMgd2hpY2ggbWF0Y2ggdG8gbXVsdGlwbGUgZG9tYWlucyBvciBubwotICogZG9tYWluIGF0IGFsbC4gIEZvciB0eXBlcyB3aGljaCBhcmUgdmVuZG9yIHNwZWNpZmljLCBhIHZhbHVlIGFib3ZlCi0gKiBPTVhfT1RIRVJfVkVORE9SVFNUQVJUIHNob3VsZCBiZSB1c2VkLgotICovCi10eXBlZGVmIGVudW0gT01YX09USEVSX0ZPUk1BVFRZUEUgewotICAgIE9NWF9PVEhFUl9Gb3JtYXRUaW1lID0gMCwgLyoqPCBUcmFuc21pc3Npb24gb2YgdmFyaW91cyB0aW1lc3RhbXBzLCBlbGFwc2VkIHRpbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGRlbHRhcywgZXRjICovCi0gICAgT01YX09USEVSX0Zvcm1hdFBvd2VyLCAgICAvKio8IFBlcmhhcHMgdXNlZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHBvd2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VtZW50LCBzZXR0aW5nIGNsb2Nrcz8gKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0U3RhdHMsICAgIC8qKjwgQ291bGQgYmUgdGhpbmdzIHN1Y2ggYXMgZnJhbWUgcmF0ZSwgZnJhbWVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLCBldGMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0QmluYXJ5LCAgIC8qKjwgQXJiaXRyYXJ5IGJpbmFyeSBkYXRhICovCi0gICAgT01YX09USEVSX0Zvcm1hdFZlbmRvclJlc2VydmVkID0gMTAwMCwgLyoqPCBTdGFydGluZyB2YWx1ZSBmb3IgdmVuZG9yIHNwZWNpZmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyAqLwotCi0gICAgT01YX09USEVSX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfT1RIRVJfRk9STUFUVFlQRTsKLQotLyoqIAotICogRW51bWVyYXRpb24gb2Ygc2VlayBtb2Rlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1NFRUtNT0RFVFlQRSB7Ci0gICAgT01YX1RJTUVfU2Vla01vZGVGYXN0ID0gMCwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byBhbiBhcHByb3hpbWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIG92ZXIgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgYWN0dWFsIHNlZWsgcG9zaXRpb24gaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXN1bHRzIGluIGEgZmFzdGVyIHNlZWsuICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVBY2N1cmF0ZSwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byB0aGUgYWN0dWFsIHNlZWsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9zaXRpb24gb3ZlciBhbiBhcHByb3hpbWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIGV2ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiBpdCByZXN1bHRzIGluIGEgc2xvd2VyIHNlZWsuICovCi0gICAgT01YX1RJTUVfU2Vla01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1RJTUVfU2Vla01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9USU1FX1NlZWtNb2RlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9TRUVLTU9ERVRZUEU7Ci0KLS8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHNlZWttb2RlIG9mIHRoZSBjb21wb25lbnQgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX1NFRUtNT0RFVFlQRSBlVHlwZTsgICAgLyoqPCBUaGUgc2VlayBtb2RlICovCi19IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEU7Ci0KLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdGltZSBzdGFtcCB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWdzIAotICogb24gdGhlIENsb2NrIENvbXBvbmVudCAoQ0MpOgotICogCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IHdhbGwgIAotICogICAgIHRpbWUKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lOiBxdWVyeSBvZiB0aGUgQ0OScyBjdXJyZW50IG1lZGlhCi0gKiAgICAgdGltZQotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSBhbmQgIAotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZTogYXVkaW8vdmlkZW8gcmVmZXJlbmNlIAotICogICAgIGNsb2NrIHNlbmRpbmcgU0MgaXRzIHJlZmVyZW5jZSB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lOiBhIENsb2NrIENvbXBvbmVudCBjbGllbnQgc2VuZHMgCi0gKiAgICAgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcgb24gaXRzIAotICogICAgIGNsaWVudCBwb3J0IHdoZW4gaXQgcmVjZWl2ZXMgYSBidWZmZXIgd2l0aAotICogICAgIE9NWF9CVUZGRVJGTEFHX1NUQVJUVElNRSBzZXQuIEl0IG11c3QgdXNlIHRoZSB0aW1lc3RhbXAKLSAqICAgICBzcGVjaWZpZWQgYnkgdGhhdCBidWZmZXIgZm9yIG5TdGFydFRpbWVzdGFtcC4gCi0gKgotICogSXSScyBhbHNvIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZyBvbiBjb21wb25lbnRzIGluIGdlbmVyYWw6Ci0gKgotICogT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOiBJTCBjbGllbnQgcXVlcnlpbmcgY29tcG9uZW50IHBvc2l0aW9uIAotICogKEdldENvbmZpZykgb3IgY29tbWFuZGluZyBhIGNvbXBvbmVudCB0byBzZWVrIHRvIHRoZSBnaXZlbiBsb2NhdGlvbgotICogKFNldENvbmZpZykKLSAqLwkKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1RJQ0tTIG5UaW1lc3RhbXA7ICAJICAgICAvKio8IHRpbWVzdGFtcCAuKi8gCi19IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFOyAgCi0KLS8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwotdHlwZWRlZiBlbnVtIE9NWF9USU1FX1VQREFURVRZUEUgewotICAgICAgT01YX1RJTUVfVXBkYXRlUmVxdWVzdEZ1bGZpbGxtZW50LCAgICAvKio8IFVwZGF0ZSBpcyB0aGUgZnVsZmlsbG1lbnQgb2YgYSBtZWRpYSB0aW1lIHJlcXVlc3QuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVTY2FsZUNoYW5nZWQsCSAgICAgICAgLyoqPCBVcGRhdGUgd2FzIGdlbmVyYXRlZCBiZWNhdXNlIHRoZSBzY2FsZSBjaGFnbmVkLiAqLwotICAgICAgT01YX1RJTUVfVXBkYXRlQ2xvY2tTdGF0ZUNoYW5nZWQsICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGNsb2NrIHN0YXRlIGNoYW5nZWQuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgICBPTVhfVElNRV9VcGRhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgICAgT01YX1RJTUVfVXBkYXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9VUERBVEVUWVBFOwotCi0vKiogRW51bWVyYXRpb24gb2YgcG9zc2libGUgcmVmZXJlbmNlIGNsb2NrcyB0byB0aGUgbWVkaWEgdGltZS4gKi8KLXR5cGVkZWYgZW51bSBPTVhfVElNRV9SRUZDTE9DS1RZUEUgewotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tOb25lLCAgICAvKio8IFVzZSBubyByZWZlcmVuY2VzLiAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tBdWRpbywJLyoqPCBVc2UgcmVmZXJlbmNlcyBzZW50IHRocm91Z2ggT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWaWRlbywgICAvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICAgIE9NWF9USU1FX1JlZkNsb2NrTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9SRUZDTE9DS1RZUEU7Ci0KLS8qKiBFbnVtZXJhdGlvbiBvZiBjbG9jayBzdGF0ZXMuICovCi10eXBlZGVmIGVudW0gT01YX1RJTUVfQ0xPQ0tTVEFURSB7Ci0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZywgICAgICAgICAgICAgLyoqPCBDbG9jayBydW5uaW5nLiAqLwotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUsIC8qKjwgQ2xvY2sgd2FpdGluZyB1bnRpbCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBwcmVzY3JpYmVkIGNsaWVudHMgZW1pdCB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3RhcnQgdGltZS4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVTdG9wcGVkLCAgICAgICAgICAgICAvKio8IENsb2NrIHN0b3BwZWQuICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgICBPTVhfVElNRV9DbG9ja1N0YXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVElNRV9DTE9DS1NUQVRFOwotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIG1lZGlhIHRpbWUgcmVxdWVzdCB0byB0aGUgY2xvY2sgY29tcG9uZW50LgotICoKLSAqICBBIGNsaWVudCBjb21wb25lbnQgc2VuZHMgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIENsb2NrIENvbXBvbmVudCB2aWEgYSBTZXRDb25maWcKLSAqICBvbiBpdHMgY2xpZW50IHBvcnQgdG8gc3BlY2lmeSBhIG1lZGlhIHRpbWVzdGFtcCB0aGUgQ2xvY2sgQ29tcG9uZW50Ci0gKiAgc2hvdWxkIGVtaXQuICBUaGUgQ2xvY2sgQ29tcG9uZW50IHNob3VsZCBmdWxmaWxsIHRoZSByZXF1ZXN0IGJ5IHNlbmRpbmcgYQotICogIE9NWF9USU1FX01FRElBVElNRVRZUEUgd2hlbiBpdHMgbWVkaWEgY2xvY2sgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIAotICogIHRpbWVzdGFtcC4KLSAqCi0gKiAgVGhlIGNsaWVudCBtYXkgcmVxdWlyZSBhIG1lZGlhIHRpbWUgcmVxdWVzdCBiZSBmdWxmaWxsZWQgc2xpZ2h0bHkKLSAqICBlYXJsaWVyIHRoYW4gdGhlIG1lZGlhIHRpbWUgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2UgdGhlIGNsaWVudCBzcGVjaWZpZXMgCi0gKiAgYW4gb2Zmc2V0IHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gd2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgCi0gKiAgdG8gdGhlIHJlcXVlc3RlZCBtZWRpYSB0aW1lIGFuZCB0aGUgd2FsbCB0aW1lIHdoZW4gaXQgd2lsbCBiZSAKLSAqICBmdWxmaWxsZWQuIAotICoKLSAqICBBIGNsaWVudCBjb21wb25lbnQgbWF5IHVzZXMgdGhlc2UgcmVxdWVzdHMgYW5kIHRoZSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvCi0gKiAgdGltZSBldmVudHMgYWNjb3JkaW5nIHRvIHRpbWVzdGFtcHMuIElmIGEgY2xpZW50IG11c3QgcGVyZm9ybSBhbiBvcGVyYXRpb24gTyBhdAotICogIGEgdGltZSBUIChlLmcuIGRlbGl2ZXIgYSB2aWRlbyBmcmFtZSBhdCBpdHMgY29ycmVzcG9uZGluZyB0aW1lc3RhbXApLCBpdCBtYWtlcyBhIAotICogIG1lZGlhIHRpbWUgcmVxdWVzdCBhdCBUIChwZXJoYXBzIHNwZWNpZnlpbmcgYW4gb2Zmc2V0IHRvIGVuc3VyZSB0aGUgcmVxdWVzdCBmdWxmaWxsbWVudAotICogIGlzIGEgbGl0dGxlIGVhcmx5KS4gV2hlbiB0aGUgY2xvY2sgY29tcG9uZW50IHBhc3NlcyB0aGUgcmVzdWx0aW5nIE9NWF9USU1FX01FRElBVElNRVRZUEUKLSAqICBzdHJ1Y3R1cmUgYmFjayB0byB0aGUgY2xpZW50IGNvbXBvbmVudCwgdGhlIGNsaWVudCBtYXkgcGVyZm9ybSBvcGVyYXRpb24gTyAocGVyaGFwcyBoYXZpbmcKLSAqICB0byB3YWl0IGEgc2xpZ2h0IGFtb3VudCBtb3JlIHRpbWUgaXRzZWxmIGFzIHNwZWNpZmllZCBieSB0aGUgcmV0dXJuIHZhbHVlcykuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfUFRSIHBDbGllbnRQcml2YXRlOyAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBmcm9tIG90aGVycyAoZS5nLiB0aGUgbnVtYmVyIG9mIHRoZSBmcmFtZSB0byBkZWxpdmVyKS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRHVwbGljYXRlZCBpbiB0aGUgbWVkaWEgdGltZSBzdHJ1Y3R1cmUgdGhhdCBmdWxmaWxscyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGlzIHJlcXVlc3QuIEEgdmFsdWUgb2YgemVybyBpcyByZXNlcnZlZCBmb3IgdGltZSBzY2FsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB1cGRhdGVzLiAqLwotICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAvKio8IE1lZGlhIHRpbWVzdGFtcCByZXF1ZXN0ZWQuKi8gCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgQW1vdW50IG9mIHdhbGwgY2xvY2sgdGltZSBieSB3aGljaCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCBzaG91bGQgYmUgZnVsZmlsbGVkIGVhcmx5ICovCi19IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRTsKLQotLyoqPCBTdHJ1Y3R1cmUgc2VudCBmcm9tIHRoZSBjbG9jayBjb21wb25lbnQgY2xpZW50IGVpdGhlciB3aGVuIGZ1bGZpbGxpbmcgCi0gKiAgIGEgbWVkaWEgdGltZSByZXF1ZXN0IG9yIHdoZW4gdGhlIHRpbWUgc2NhbGUgaGFzIGNoYW5nZWQuIAotICoKLSAqICAgSW4gdGhlIGZvcm1lciBjYXNlIHRoZSBDbG9jayBDb21wb25lbnQgZmlsbHMgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRpbWVzIGl0cyBlbWlzc2lvbiAKLSAqICAgdG8gYSBjbGllbnQgY29tcG9uZW50ICh2aWEgdGhlIGNsaWVudCBwb3J0KSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWVkaWEgCi0gKiAgIHRpbWUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQuIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIHRpbWUgdGhlIGVtaXNzaW9uIHRvIG9jY3VyCi0gKiAgIHdoZW4gdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgbWF0Y2hlcyB0aGUgQ2xvY2sgQ29tcG9uZW50J3MgbWVkaWEgdGltZSBidXQgYWxzbyB0aGUgCi0gKiAgIHByZXNjcmliZWQgb2Zmc2V0IGVhcmx5LiAKLSAqCi0gKiAgIFVwb24gc2NhbGUgY2hhbmdlcyB0aGUgY2xvY2sgY29tcG9uZW50IGNsZWFycyB0aGUgbkNsaWVudFByaXZhdGUgZGF0YSwgc2VuZHMgdGhlIGN1cnJlbnQKLSAqICAgbWVkaWEgdGltZSBhbmQgc2V0cyB0aGUgblNjYWxlIHRvIHRoZSBuZXcgc2NhbGUgdmlhIHRoZSBjbGllbnQgcG9ydC4gSXQgZW1pdHMgYSAKLSAqICAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB0byBhbGwgY2xpZW50cyBpbmRlcGVuZGVudCBvZiBhbnkgcmVxdWVzdHMuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gCi0gKiAgIGFsdGVyIHByb2Nlc3NpbmcgdG8gYWNjb21vZGF0ZSBzY2FsaW5nLiBGb3IgaW5zdGFuY2UgYSB2aWRlbyBjb21wb25lbnQgbWlnaHQgc2tpcCBpbnRlci1mcmFtZXMgCi0gKiAgIGluIHRoZSBjYXNlIG9mIGV4dHJlbWUgZmFzdGZvcndhcmQuIExpa2V3aXNlIGFuIGF1ZGlvIGNvbXBvbmVudCBtaWdodCBhZGQgb3IgcmVtb3ZlIHNhbXBsZXMgCi0gKiAgIGZyb20gYW4gYXVkaW8gZnJhbWUgdG8gc2NhbGUgYXVkaW8gZGF0YS4gCi0gKgotICogICBJdCBpcyBleHBlY3RlZCB0aGF0IHNvbWUgY2xvY2sgY29tcG9uZW50cyBtYXkgbm90IGJlIGFibGUgdG8gZnVsZmlsbCByZXF1ZXN0cwotICogICBhdCBleGFjdGx5IHRoZSBwcmVzY3JpYmVkIHRpbWUuIFRoaXMgaXMgYWNjZXB0YWJsZSBzbyBsb25nIGFzIHRoZSByZXF1ZXN0IGlzIAotICogICBmdWxmaWxsZWQgYXQgbGVhc3QgYXMgZWFybHkgYXMgZGVzY3JpYmVkIGFuZCBub3QgbGF0ZXIuIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIAotICogICBmaWVsZHMgdGhlIGNsaWVudCBtYXkgdXNlIHRvIHdhaXQgZm9yIHRoZSByZW1haW5pbmcgdGltZS4KLSAqCi0gKiAgIFRoZSBjbGllbnQgbWF5IHVzZSBlaXRoZXIgdGhlIG5PZmZzZXQgb3IgbldhbGxUaW1lQXRNZWRpYSBmaWVsZHMgdG8gZGV0ZXJtaW5lIHRoZSAKLSAqICAgd2FsbCB0aW1lIHVudGlsIHRoZSBuTWVkaWFUaW1lc3RhbXAgYWN0dWFsbHkgb2NjdXJzLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCi0gKiAgIGNsaWVudCBjYW4gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB2YWx1ZSBmb3Igb2Zmc2V0IGJ5IGdldHRpbmcgdGhlIGN1cnJlbnQgd2FsbAotICogICBmcm9tIHRoZSBjbG9jIGNvbXBvbmVudCBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSBuV2FsbFRpbWVBdE1lZGlhLiAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5DbGllbnRQcml2YXRlOyAgICAgICAgIC8qKjwgQ2xpZW50IHByaXZhdGUgZGF0YSB0byBkaXNhYmlndWF0ZSB0aGlzIG1lZGlhIHRpbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzLiBDb3BpZWQgZnJvbSB0aGUgbWVkaWEgdGltZSByZXF1ZXN0LiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIHVwZGF0ZXMuICovCi0gICAgT01YX1RJTUVfVVBEQVRFVFlQRSBlVXBkYXRlVHlwZTsgLyoqPCBSZWFzb24gZm9yIHRoZSB1cGRhdGUgKi8KLSAgICBPTVhfVElDS1Mgbk1lZGlhVGltZXN0YW1wOyAgICAgIC8qKjwgTWVkaWEgdGltZSByZXF1ZXN0ZWQuIElmIG5vIG1lZGlhIHRpbWUgd2FzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0ZWQgdGhlbiB0aGlzIGlzIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUuICovIAotICAgIE9NWF9USUNLUyBuT2Zmc2V0OyAgICAgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdCB3YXMgYWN0dWFsbHkgZnVsZmlsbGVkIGVhcmx5ICovCi0KLSAgICBPTVhfVElDS1MgbldhbGxUaW1lQXRNZWRpYVRpbWU7IC8qKjwgV2FsbCB0aW1lIGNvcnJlc3BvbmRpbmcgdG8gbk1lZGlhVGltZVN0YW1wLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIGNsaWVudCBtYXkgY29tcGFyZSB0aGlzIHZhbHVlIHRvIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgbWVkaWEgdGltZSBvYnRhaW5lZCBmcm9tIHRoZSBDbG9jayBDb21wb25lbnQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoZSB3YWxsIHRpbWUgdW50aWwgdGhlIG1lZGlhIHRpbWVzdGFtcCBpcyByZWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgY3VycmVudC4gKi8KLSAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGluIFExNiBmb3JtYXQuICovCi0gICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7ICAgICAvKiBTZWVraW5nIENoYW5nZS4gQWRkZWQgNy8xMi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KLX0gT01YX1RJTUVfTUVESUFUSU1FVFlQRTsgIAotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGZhY3Rvci4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrIAotICogIGNvbXBvbmVudCwgb3RoZXIgY29tcG9uZW50cyBzZWUgc2NhbGUgY2hhbmdlcyB2aWEgT01YX1RJTUVfTUVESUFUSU1FVFlQRSBidWZmZXJzIHNlbnQgdmlhCi0gKiAgdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgcG9ydHMuIFVwb24gcmVjaWV2aW5nIHRoaXMgY29uZmlnIHRoZSBjbG9jayBjb21wb25lbnQgY2hhbmdlcyAKLSAqICB0aGUgcmF0ZSBieSB3aGljaCB0aGUgbWVkaWEgdGltZSBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGVmZmVjdGl2ZWx5IGltcGxlbWVudGluZyB0cmljayBtb2Rlcy4gCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfUzMyIHhTY2FsZTsgICAgICAgICAgICAgICAgIC8qKjwgVGhpcyBpcyBhIHZhbHVlIGluIFExNiBmb3JtYXQgd2hpY2ggaXMgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNjYWxpbmcgdGhlIG1lZGlhIHRpbWUgKi8KLX0gT01YX1RJTUVfQ09ORklHX1NDQUxFVFlQRTsKLSAKLS8qKiBCaXRzIHVzZWQgdG8gaWRlbnRpZnkgYSBjbG9jayBwb3J0LiBVc2VkIGluIE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRZJzIG5XYWl0TWFzayBmaWVsZCAqLwotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMCAweDAwMDAwMDAxCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQxIDB4MDAwMDAwMDIKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDIgMHgwMDAwMDAwNAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMyAweDAwMDAwMDA4Ci0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ0IDB4MDAwMDAwMTAKLSNkZWZpbmUgT01YX0NMT0NLUE9SVDUgMHgwMDAwMDAyMAotI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNiAweDAwMDAwMDQwCi0jZGVmaW5lIE9NWF9DTE9DS1BPUlQ3IDB4MDAwMDAwODAKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgbWVkaWEgY2xvY2suIAotICogIElMIENsaWVudCB1c2VzIHRoaXMgY29uZmlnIHRvIGNoYW5nZSBvciBxdWVyeSB0aGUgbW9kZSBvZiB0aGUgCi0gKiAgbWVkaWEgY2xvY2sgb2YgdGhlIGNsb2NrIGNvbXBvbmVudC4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrCi0gKiAgY29tcG9uZW50LiAKLSAqICAKLSAqICBPbiBhIFNldENvbmZpZyBpZiBlU3RhdGUgaXMgT01YX1RJTUVfQ2xvY2tTdGF0ZVJ1bm5pbmcgbWVkaWEgdGltZQotICogIHN0YXJ0cyBpbW1lZGlhdGVseSBhdCB0aGUgcHJlc2NyaWJlZCBzdGFydCB0aW1lLiBJZgotICogIE9NWF9USU1FX0Nsb2NrU3RhdGVXYWl0aW5nRm9yU3RhcnRUaW1lIHRoZSBDbG9jayBDb21wb25lbnQgaWdub3JlcwotICogIHRoZSBnaXZlbiBuU3RhcnRUaW1lIGFuZCB3YWl0cyBmb3IgYWxsIGNsaWVudHMgc3BlY2lmaWVkIGluIHRoZSAKLSAqICBuV2FpdE1hc2sgdG8gc2VuZCBzdGFydHRpbWVzICh2aWEgCi0gKiAgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSkuIFRoZSBDbG9jayBDb21wb25lbnQgdGhlbiBzdGFydHMgCi0gKiAgdGhlIG1lZGlhIGNsb2NrIHVzaW5nIHRoZSBlYXJsaWVzdCBzdGFydCB0aW1lIHN1cHBsaWVkLiAqLyAgICAKLXR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX0NMT0NLU1RBVEUgZVN0YXRlOyAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotICAgIE9NWF9USUNLUyBuU3RhcnRUaW1lOyAgICAgICAvKio8IFN0YXJ0IHRpbWUgb2YgdGhlIG1lZGlhIHRpbWUuICovCi0gICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgIC8qKjwgVGltZSB0byBvZmZzZXQgdGhlIG1lZGlhIHRpbWUgYnkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlLmcuIHByZXJvbGwpLiBNZWRpYSB0aW1lIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVwb3J0ZWQgdG8gYmUgbk9mZnNldCB0aWNrcyBlYXJsaWVyLiAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VMzIgbldhaXRNYXNrOyAgICAgICAgICAvKio8IE1hc2sgb2YgT01YX0NMT0NLUE9SVCB2YWx1ZXMuICovCi19IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRTsKLQotLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHJlZmVyZW5jZSBjbG9jayBjdXJyZW50bHkgYmVpbmcgdXNlZCB0bwotICogIGNvbXB1dGUgbWVkaWEgdGltZS4gSUwgY2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSAKLSAqICBjbG9jayBjb21wb25lbnQncyBhY3RpdmUgcmVmZXJlbmNlIGNsb2NrICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfQUNUSVZFUkVGQ0xPQ0tUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVElNRV9SRUZDTE9DS1RZUEUgZUNsb2NrOyAgIC8qKjwgUmVmZXJlbmNlIGNsb2NrIHVzZWQgdG8gY29tcHV0ZSBtZWRpYSB0aW1lICovICAgICAgICAgICAgICAgICAgICAgICAgCi19IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEU7Ci0KLS8qKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHNwZWNpZmljcyBvZiBwb3dlciB0eXBlLgotICogIE5vdGU6IHRoaXMgc3RydWN0dXJlIGlzIGxpc3RlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX0JPT0wgYkVuYWJsZVBNOyAgICAgICAvKio8IEZsYWcgdG8gZW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgKi8KLX0gT01YX09USEVSX0NPTkZJR19QT1dFUlRZUEU7Ci0KLQotLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHN0YXRzIHR5cGUuCi0gKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICAvKiB3aGF0IGdvZXMgaGVyZSAqLwotfSBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRTsKLQotCi0vKioKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgb3RoZXIgCi0gKiBwYXRoLgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgY2hhbm5lbCAqLwotfSBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFOwotCi0vKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCi0gICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCi0gICovCi10eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0ICovCi0gICAgT01YX1UzMiBuSW5kZXg7IC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KLSAgICBPTVhfT1RIRVJfRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCi19IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRTsgCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZgotLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmZDRiYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwotICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKLSAqCi0gKi8KLQotLyoqIE9NWF9UeXBlcy5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9UeXBlcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgcHJpbWl0aXZlIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSAKLSAqICB0aGUgY29yZSwgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LiAgVGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCi0gKiAgbW9kaWZpZWQgdG8gYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgImNoYXIiIHNldCB0byA4IGJpdHMsIAotICogICJzaG9ydCIgc2V0IHRvIDE2IGJpdHMgYW5kICJsb25nIiBzZXQgdG8gMzIgYml0cy4KLSAqLwotCi0jaWZuZGVmIE9NWF9UeXBlc19oCi0jZGVmaW5lIE9NWF9UeXBlc19oCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyoqIFRoZSBPTVhfQVBJIGFuZCBPTVhfQVBJRU5UUlkgYXJlIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zIHVzZWQKLSAqICB0byBkZWNsYXJlIE9NWCBmdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhleSBhcmUgbW9kaWZpZWQgdG8gbWVldCB0aGUKLSAqICByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSAqLwotI2lmZGVmIF9fU1lNQklBTjMyX18gICAKLSMgICBpZmRlZiBfX09NWF9FWFBPUlRTCi0jICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgIGVsc2UKLSMgICAgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgCi0jICAgICAgIGVsc2UKLSMgICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgICBlbmRpZgotIyAgIGVuZGlmCi0jZWxzZQotIyAgIGlmZGVmIF9XSU4zMgotIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKLSMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZWxzZQotLy8jICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotI2RlZmluZSBPTVhfQVBJCi0jICAgICAgZW5kaWYKLSMgICBlbHNlCi0jICAgICAgaWZkZWYgX19PTVhfRVhQT1JUUwotIyAgICAgICAgICBkZWZpbmUgT01YX0FQSQotIyAgICAgIGVsc2UKLSMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgZXh0ZXJuCi0jICAgICAgZW5kaWYKLSMgICBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT01YX0FQSUVOVFJZCi0jZGVmaW5lIE9NWF9BUElFTlRSWSAKLSNlbmRpZiAKLQotLyoqIE9NWF9JTiBpcyB1c2VkIHRvIGlkZW50aWZ5IGlucHV0cyB0byBhbiBPTVggZnVuY3Rpb24uICBUaGlzIGRlc2lnbmF0aW9uIAotICAgIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBhcmFtZXRlciAKLSAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLwotI2lmbmRlZiBPTVhfSU4KLSNkZWZpbmUgT01YX0lOCi0jZW5kaWYKLQotLyoqIE9NWF9PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyAKLSAgICBkZXNpZ25hdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgCi0gICAgdG8gYSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0LiAqLwotI2lmbmRlZiBPTVhfT1VUCi0jZGVmaW5lIE9NWF9PVVQKLSNlbmRpZgotCi0KLS8qKiBPTVhfSU5PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIGVpdGhlciBpbnB1dHMgb3IKLSAgICBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwgCi0gICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdCAKLSAgICBpcyB1c2VkIGJvdGggYXMgYW4gaW5wdXQgYW5kIGFuIG91dHB1dC4gKi8KLSNpZm5kZWYgT01YX0lOT1VUCi0jZGVmaW5lIE9NWF9JTk9VVAotI2VuZGlmCi0KLS8qKiBPTVhfQUxMIGlzIHVzZWQgdG8gYXMgYSB3aWxkY2FyZCB0byBzZWxlY3QgYWxsIGVudGl0aWVzIG9mIHRoZSBzYW1lIHR5cGUKLSAqICB3aGVuIHNwZWNpZnlpbmcgdGhlIGluZGV4LCBvciByZWZlcnJpbmcgdG8gYSBvYmplY3QgYnkgYW4gaW5kZXguICAoaS5lLgotICogIHVzZSBPTVhfQUxMIHRvIGluZGljYXRlIGFsbCBOIGNoYW5uZWxzKS4gV2hlbiB1c2VkIGFzIGEgcG9ydCBpbmRleAotICogIGZvciBhIGNvbmZpZyBvciBwYXJhbWV0ZXIgdGhpcyBPTVhfQUxMIGRlbm90ZXMgdGhhdCB0aGUgY29uZmlnIG9yCi0gKiAgcGFyYW1ldGVyIGFwcGxpZXMgdG8gdGhlIGVudGlyZSBjb21wb25lbnQgbm90IGp1c3Qgb25lIHBvcnQuICovCi0jZGVmaW5lIE9NWF9BTEwgMHhGRkZGRkZGRgotCi0vKiogSW4gdGhlIGZvbGxvd2luZyB3ZSBkZWZpbmUgZ3JvdXBzIHRoYXQgaGVscCBidWlsZGluZyBkb3h5Z2VuIGRvY3VtZW50YXRpb24gKi8KLQotLyoqIEBkZWZncm91cCBjb3JlIE9wZW5NQVggSUwgY29yZQotICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvcmUKLSAqLwotIAotIC8qKiBAZGVmZ3JvdXAgY29tcCBPcGVuTUFYIElMIGNvbXBvbmVudAotICogRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmUgcmVsYXRlZCB0byB0aGUgT01YIElMIGNvbXBvbmVudAotICovCi0gCi0vKiogQGRlZmdyb3VwIHJwbSBSZXNvdXJjZSBhbmQgUG9saWN5IE1hbmFnZW1lbnQgCi0gKiBTdHJ1Y3R1cmVzIGZvciByZXNvdXJjZSBhbmQgcG9saWN5IG1hbmFnZW1lbnQgb2YgY29tcG9uZW50cwotICovCi0KLS8qKiBAZGVmZ3JvdXAgYnVmIEJ1ZmZlciBNYW5hZ2VtZW50Ci0gKiBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzCi0gKi8KLSAgCi0vKiogQGRlZmdyb3VwIHR1biBUdW5uZWxpbmcKLSAqIEBpbmdyb3VwIGNvcmUgY29tcAotICogU3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHRvIG1hbmFnZSB0dW5uZWxzIGFtb25nIGNvbXBvbmVudCBwb3J0cwotICovCi0gCi0vKiogQGRlZmdyb3VwIGNwIENvbnRlbnQgUGlwZXMKLSAqICBAaW5ncm91cCBjb3JlCi0gKi8KLSAKLSAvKiogQGRlZmdyb3VwIG1ldGFkYXRhIE1ldGFkYXRhIGhhbmRsaW5nCi0gICogCi0gICovIAotCi0vKiogT01YX1U4IGlzIGFuIDggYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotCi0vKiogT01YX1M4IGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgY2hhciBPTVhfUzg7Ci0KLS8qKiBPTVhfVTE2IGlzIGEgMTYgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBPTVhfVTE2OwotCi0vKiogT01YX1MxNiBpcyBhIDE2IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBPTVhfUzE2OwotCi0vKiogT01YX1UzMiBpcyBhIDMyIGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBPTVhfVTMyOwotCi0vKiogT01YX1MzMiBpcyBhIDMyIGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIE9NWF9TMzI7Ci0KLQotLyogVXNlcnMgd2l0aCBjb21waWxlcnMgdGhhdCBjYW5ub3QgYWNjZXB0IHRoZSAibG9uZyBsb25nIiBkZXNpZ25hdGlvbiBzaG91bGQKLSAgIGRlZmluZSB0aGUgT01YX1NLSVA2NEJJVCBtYWNyby4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgbWF5IGNhdXNlIAotICAgc29tZSBjb21wb25lbnRzIHRvIGZhaWwgdG8gY29tcGlsZSBpZiB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuIHRvIHJlcXVpcmUKLSAgIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gIEhvd2V2ZXIsIHRoZXNlIGNvbXBvbmVudHMgd291bGQgTk9UIGNvbXBpbGUgYW55d2F5Ci0gICBzaW5jZSB0aGUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgd2F5IHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4uCi0qLwotI2lmbmRlZiBPTVhfU0tJUDY0QklUCi0jaWZkZWYgX19TWU1CSUFOMzJfXwotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OwotCi0vKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKLQotI2VsaWYgZGVmaW5lZChXSU4zMikKLQotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovICAgCi10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIE9NWF9VNjQ7Ci0KLS8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgT01YX1M2NDsKLQotI2Vsc2UgLyogV0lOMzIgKi8KLQotLyoqIE9NWF9VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OwotCi0vKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgT01YX1M2NDsKLQotI2VuZGlmIC8qIFdJTjMyICovCi0jZW5kaWYKLQotCi0vKiogVGhlIE9NWF9CT09MIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0cnVlIG9yIGEgZmFsc2UgCi0gICAgdmFsdWUgd2hlbiBwYXNzaW5nIHBhcmFtZXRlcnMgdG8gYW5kIGZyb20gdGhlIE9NWCBjb3JlIGFuZCBjb21wb25lbnRzLiAgVGhlCi0gICAgT01YX0JPT0wgaXMgYSAzMiBiaXQgcXVhbnRpdHkgYW5kIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgd29yZCBib3VuZGFyeS4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9CT09MIHsKLSAgICBPTVhfRkFMU0UgPSAwLAotICAgIE9NWF9UUlVFID0gIU9NWF9GQUxTRSwKLSAgICBPTVhfQk9PTF9NQVggPSAweDdGRkZGRkZGCi19IE9NWF9CT09MOyAKLSAKLS8qKiBUaGUgT01YX1BUUiB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBwb2ludGVycyBiZXR3ZWVuIHRoZSBPTVgKLSAgICBhcHBsaWNhdGlvbnMgYW5kIHRoZSBPTVggQ29yZSBhbmQgY29tcG9uZW50cy4gIFRoaXMgaXMgYSAzMiBiaXQgcG9pbnRlciBhbmQKLSAgICBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotICovCi10eXBlZGVmIHZvaWQqIE9NWF9QVFI7Ci0KLS8qKiBUaGUgT01YX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4KLSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIgCi0gICAgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQgYWxpZ25lZCBhbmQgCi0gICAgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuICAKLSAqLwotdHlwZWRlZiBjaGFyKiBPTVhfU1RSSU5HOwotCi0vKiogVGhlIE9NWF9CWVRFIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIGFycmF5cyBvZiBieXRlcyBzdWNoIGFzCi0gICAgYnVmZmVycyBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudCBhbmQgY29yZS4gIFRoZSBPTVhfQllURSAKLSAgICB0eXBlIGlzIGEgMzIgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQKLSAgICBhbGlnbmVkIGFuZCB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyKiBPTVhfQllURTsKLQotLyoqIE9NWF9VVUlEVFlQRSBpcyBhIHZlcnkgbG9uZyB1bmlxdWUgaWRlbnRpZmllciB0byB1bmlxdWVseSBpZGVudGlmeQotICAgIGF0IHJ1bnRpbWUuICBUaGlzIGlkZW50aWZpZXIgc2hvdWxkIGJlIGdlbmVyYXRlZCBieSBhIGNvbXBvbmVudCBpbiBhIHdheQotICAgIHRoYXQgZ3VhcmFudGVlcyB0aGF0IGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBpZGVudGlmaWVyIHJ1bm5pbmcgb24gdGhlIHN5c3RlbQotICAgIGlzIHVuaXF1ZS4gKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVVVJRFRZUEVbMTI4XTsKLQotLyoqIFRoZSBPTVhfRElSVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGEgcG9ydCBpcyBhbiBpbnB1dCBvcgotICAgIGFuIG91dHB1dCBwb3J0LiAgVGhpcyBlbnVtZXJhdGlvbiBpcyBjb21tb24gYWNyb3NzIGFsbCBjb21wb25lbnQgdHlwZXMuICAgIAotICovCi10eXBlZGVmIGVudW0gT01YX0RJUlRZUEUKLXsKLSAgICBPTVhfRGlySW5wdXQsICAgICAgICAgICAgICAvKio8IFBvcnQgaXMgYW4gaW5wdXQgcG9ydCAqLwotICAgIE9NWF9EaXJPdXRwdXQsICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBvdXRwdXQgcG9ydCAqLwotICAgIE9NWF9EaXJNYXggPSAweDdGRkZGRkZGCi19IE9NWF9ESVJUWVBFOwotCi0vKiogVGhlIE9NWF9FTkRJQU5UWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGJpdCBvcmRlcmluZyAKLSAgICBmb3IgbnVtZXJpY2FsIGRhdGEgKGkuZS4gYmlnIGVuZGlhbiwgb3IgbGl0dGxlIGVuZGlhbikuICAgIAotICovCi10eXBlZGVmIGVudW0gT01YX0VORElBTlRZUEUKLXsKLSAgICBPTVhfRW5kaWFuQmlnLCAvKio8IGJpZyBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTGl0dGxlLCAvKio8IGxpdHRsZSBlbmRpYW4gKi8KLSAgICBPTVhfRW5kaWFuTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfRU5ESUFOVFlQRTsKLQotCi0vKiogVGhlIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGlmIGRhdGEgCi0gICAgaXMgc2lnbmVkIG9yIHVuc2lnbmVkCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfTlVNRVJJQ0FMREFUQVRZUEUKLXsKLSAgICBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZCwgLyoqPCBzaWduZWQgZGF0YSAqLwotICAgIE9NWF9OdW1lcmljYWxEYXRhVW5zaWduZWQsIC8qKjwgdW5zaWduZWQgZGF0YSAqLwotICAgIE9NWF9OdW1lcmNpYWxEYXRhTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfTlVNRVJJQ0FMREFUQVRZUEU7Ci0KLQotLyoqIFVuc2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0JVMzIgewotICAgIE9NWF9VMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLwotICAgIE9NWF9VMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLwotICAgIE9NWF9VMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLwotfSBPTVhfQlUzMjsKLQotCi0vKiogU2lnbmVkIGJvdW5kZWQgdmFsdWUgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0JTMzIgewotICAgIE9NWF9TMzIgblZhbHVlOyAvKio8IGFjdHVhbCB2YWx1ZSAqLwotICAgIE9NWF9TMzIgbk1pbjsgICAvKio8IG1pbmltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA+PSBuTWluKSAqLwotICAgIE9NWF9TMzIgbk1heDsgICAvKio8IG1heGltdW0gZm9yIHZhbHVlIChpLmUuIG5WYWx1ZSA8PSBuTWF4KSAqLwotfSBPTVhfQlMzMjsKLQotCi0vKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyBzb21lIHRpbWUgb3IgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLiBUaGlzIHN0cnVjdHVyZQotICAqICBtdXN0IGJlIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS4gVGhlIHF1YW50aXR5IGlzIHNpZ25lZCB0byBhY2NvbW1vZGF0ZSAKLSAgKiAgbmVnYXRpdmUgZGVsdGFzIGFuZCBwcmVyb2xsIHNjZW5hcmlvcy4gVGhlIHF1YW50aXR5IGlzIHJlcHJlc2VudGVkIGluIG1pY3Jvc2Vjb25kcyAKLSAgKiAgdG8gYWNjb21vZGF0ZSBoaWdoIHJlc29sdXRpb24gdGltZXN0YW1wcyAoZS5nLiBEVkQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgYmFzZWQKLSAgKiAgb24gYSA5MGtIeiBjbG9jaykgYW5kIHRvIGFsbG93IG1vcmUgYWNjdXJhdGUgYW5kIHN5bmNocm9uaXplZCBkZWxpdmVyeSAoZS5nLiAKLSAgKiAgaW5kaXZpZHVhbCBhdWRpbyBzYW1wbGVzIGRlbGl2ZXJlZCBhdCAxOTIga0h6KS4gVGhlIHF1YW50aXR5IGlzIDY0IGJpdCB0byAKLSAgKiAgYWNjb21tb2RhdGUgYSBsYXJnZSBkeW5hbWljIHJhbmdlIChzaWduZWQgMzIgYml0IHZhbHVlcyB3b3VsZCBhbGxvdyBvbmx5IGZvciBwbHVzCi0gICogIG9yIG1pbnVzIDM1IG1pbnV0ZXMpLgotICAqCi0gICogIEltcGxlbWVudGF0aW9ucyB3aXRoIGxpbWl0ZWQgcHJlY2lzaW9uIG1heSBjb252ZXJ0IHRoZSBzaWduZWQgNjQgYml0IHZhbHVlIHRvIAotICAqICBhIHNpZ25lZCAzMiBiaXQgdmFsdWUgaW50ZXJuYWxseSBidXQgcmlzayBsb3NzIG9mIHByZWNpc2lvbi4gIAotICAqLwotI2lmbmRlZiBPTVhfU0tJUDY0QklUCi10eXBlZGVmIE9NWF9TNjQgT01YX1RJQ0tTOwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IE9NWF9USUNLUwotewotICAgIE9NWF9VMzIgbkxvd1BhcnQ7ICAgIC8qKiBsb3cgYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCi0gICAgT01YX1UzMiBuSGlnaFBhcnQ7ICAgLyoqIGhpZ2ggYml0cyBvZiB0aGUgc2lnbmVkIDY0IGJpdCB0aWNrIHZhbHVlICovCi19IE9NWF9USUNLUzsKLSNlbmRpZgotI2RlZmluZSBPTVhfVElDS1NfUEVSX1NFQ09ORCAxMDAwMDAwCi0KLS8qKiBEZWZpbmUgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIHRoZSBPTVggSGFuZGxlLiAgVGhlIGNvcmUgd2lsbCBub3QgdXNlCi0gICAgdGhpcyB2YWx1ZSBpbnRlcm5hbGx5LCBidXQgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBvbmx5IHVzZSB0aGlzIHZhbHVlLgotICovCi10eXBlZGVmIHZvaWQqIE9NWF9IQU5ETEVUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfTUFSS1RZUEUKLXsKLSAgICBPTVhfSEFORExFVFlQRSBoTWFya1RhcmdldENvbXBvbmVudDsgICAvKio8IFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgYSBtYXJrIGV2ZW50IHVwb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBtYXJrLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCi19IE9NWF9NQVJLVFlQRTsKLQotCi0vKiogT01YX05BVElWRV9ERVZJQ0VUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCi0gKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkaXNwbGF5IAotICogIG9yIGNhbiBiZSB1c2VkIGJ5IGEgYXVkaW8gcG9ydCBmb3IgbmF0aXZlIGF1ZGlvIHJlbmRlcmluZyAqLwotdHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX0RFVklDRVRZUEU7Ci0KLS8qKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKLSAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIHdpbmRvdyAqLwotdHlwZWRlZiB2b2lkKiBPTVhfTkFUSVZFX1dJTkRPV1RZUEU7Ci0KLS8qKiBUaGUgT01YX1ZFUlNJT05UWVBFIHVuaW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmVyc2lvbiBmb3IKLSAgICBhIHN0cnVjdHVyZSBvciBjb21wb25lbnQuICBGb3IgYSBjb21wb25lbnQsIHRoZSB2ZXJzaW9uIGlzIGVudGlyZWx5Ci0gICAgc3BlY2lmaWVkIGJ5IHRoZSBjb21wb25lbnQgdmVuZG9yLiAgQ29tcG9uZW50cyBkb2luZyB0aGUgc2FtZSBmdW5jdGlvbgotICAgIGZyb20gZGlmZmVyZW50IHZlbmRvcnMgbWF5IG9yIG1heSBub3QgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uLiAgRm9yIAotICAgIHN0cnVjdHVyZXMsIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCBieSB0aGUgZW50aXR5IHRoYXQgYWxsb2NhdGVzIHRoZQotICAgIHN0cnVjdHVyZS4gIEZvciBzdHJ1Y3R1cmVzIHNwZWNpZmllZCBpbiB0aGUgT01YIDEuMSBzcGVjaWZpY2F0aW9uLCB0aGUKLSAgICB2YWx1ZSBvZiB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgdG8gMS4xLjAuMCBpbiBhbGwgY2FzZXMuICBBY2Nlc3MgdG8gdGhlCi0gICAgT01YX1ZFUlNJT05UWVBFIGNhbiBiZSBieSBhIHNpbmdsZSAzMiBiaXQgYWNjZXNzIChlLmcuIGJ5IG5WZXJzaW9uKSBvcgotICAgIGJ5IGFjY2Vzc2luZyBvbmUgb2YgdGhlIHN0cnVjdHVyZSBlbGVtZW50cyB0bywgZm9yIGV4YW1wbGUsIGNoZWNrIG9ubHkKLSAgICB0aGUgTWFqb3IgcmV2aXNpb24uCi0gKi8KLXR5cGVkZWYgdW5pb24gT01YX1ZFUlNJT05UWVBFCi17Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBPTVhfVTggblZlcnNpb25NYWpvcjsgICAvKio8IE1ham9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblZlcnNpb25NaW5vcjsgICAvKio8IE1pbm9yIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblJldmlzaW9uOyAgICAgICAvKio8IFJldmlzaW9uIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLwotICAgICAgICBPTVhfVTggblN0ZXA7ICAgICAgICAgICAvKio8IFN0ZXAgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCi0gICAgfSBzOwotICAgIE9NWF9VMzIgblZlcnNpb247ICAgICAgICAgICAvKio8IDMyIGJpdCB2YWx1ZSB0byBtYWtlIGFjY2Vzc2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZWFzaWx5IGRvbmUgaW4gYSBzaW5nbGUgd29yZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBjb3B5L2NvbXBhcmUgb3BlcmF0aW9uICovCi19IE9NWF9WRVJTSU9OVFlQRTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg0ODVkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfVmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzggKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0gKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCi0gKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQotICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCi0gKgotICovCi0KLS8qKiAKLSAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCi0gKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgotICovCi0jaWZuZGVmIE9NWF9WaWRlb19oCi0jZGVmaW5lIE9NWF9WaWRlb19oCi0KLS8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KLSAqIEBpbmdyb3VwIGl2Ci0gKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgotICogQHsKLSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCi0gKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAotICovCi0KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLQotCi0vKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCi0gKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAotICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAotICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCi0gKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAotICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCi0gKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgewotICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLwotICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCi0gICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nVlBYLCAgICAgICAgLyoqPCBHb29nbGUgVlBYLCBmb3JtZXJseSBrbm93biBhcyBPbjIgVlA4ICovCi0gICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fQ09ESU5HVFlQRTsKLQotCi0vKioKLSAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGEgdmlkZW8gcGF0aC4gIFRoZSBudW1iZXIgb2YgVmlkZW8gcGF0aHMgZm9yIAotICogaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgVmlkZW8gY29tcG9uZW50LiAgCi0gKiAKLSAqICAgIElucHV0IChha2EgU291cmNlKSA6IHplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAotICogICAgU3BsaXR0ZXIgICAgICAgICAgIDogb25lIElucHV0LCAyIG9yIG1vcmUgT3V0cHV0cywKLSAqICAgIFByb2Nlc3NpbmcgRWxlbWVudCA6IG9uZSBJbnB1dCwgb25lIG91dHB1dCwKLSAqICAgIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCi0gKiAgICBPdXRwdXQgKGFrYSBTaW5rKSAgOiBvbmUgSW5wdXQsIHplcm8gb3V0cHV0cy4KLSAqIAotICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCi0gKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCB2aWRlbyAKLSAqIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgCi0gKiB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgQ29tcGxpYW50IAotICogY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbCB2YWx1ZXMgZHVyaW5nIHRoZSAKLSAqIEdldERlZmF1bHRJbml0UGFyYW1zIGNvbW1hbmQuCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCi0gKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciB1bmtub3duLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKLSAqICBuRnJhbWVIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKLSAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIG5CaXRyYXRlICAgICAgICAgICAgICA6IEJpdCByYXRlIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIHhGcmFtZXJhdGUgICAgICAgICAgICA6IEZyYW1lIHJhdGUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIHVuY29tcHJlc3NlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sIGRvbid0IGNhcmUgb3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBVbml0cyBhcmUgUTE2IGZyYW1lcyBwZXIgc2Vjb25kLgotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgZUNvbG9yRm9ybWF0IGlzIHVzZWQKLSAqICBlQ29sb3JGb3JtYXQgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqICBwTmF0aXZlV2luZG93IDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHNpbmsgLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAweDAuIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHsKLSAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsKLSAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsKLSAgICBPTVhfVTMyIG5GcmFtZVdpZHRoOwotICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OwotICAgIE9NWF9TMzIgblN0cmlkZTsKLSAgICBPTVhfVTMyIG5TbGljZUhlaWdodDsKLSAgICBPTVhfVTMyIG5CaXRyYXRlOwotICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKLSAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7Ci0gICAgT01YX1ZJREVPX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLSAgICBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgcE5hdGl2ZVdpbmRvdzsKLX0gT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRTsKLQotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAotICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZCAKLSAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqICB4RnJhbWVSYXRlICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIHZpZGVvIGZyYW1lIHJhdGUgaW4gUTE2IGZvcm1hdAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7IAotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKLSAgICBPTVhfVTMyIHhGcmFtZXJhdGU7Ci19IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRTsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyaW5nIHZpZGVvIGNvbXByZXNzaW9uIHF1YW50aXphdGlvbiAKLSAqIHBhcmFtZXRlciB2YWx1ZXMuICBDb2RlY3MgbWF5IHN1cHBvcnQgZGlmZmVyZW50IFFQIHZhbHVlcyBmb3IgZGlmZmVyZW50Ci0gKiBmcmFtZSB0eXBlcy4KLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5RcEkgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIGluZGV4IGZyYW1lcwotICogIG5RcFAgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIFAgZnJhbWVzCi0gKiAgblFwQiAgICAgICA6IFFQIHZhbHVlcyB0byB1c2UgZm9yIGJpZGlyZWN0aW9uYWwgZnJhbWVzIAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblFwSTsKLSAgICBPTVhfVTMyIG5RcFA7Ci0gICAgT01YX1UzMiBuUXBCOwotfSBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRTsKLQotCi0vKiogCi0gKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgdmlkZW8gZmFzdCB1cGRhdGUgcGFyYW1ldGVycy4gCi0gKiAgCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiRW5hYmxlVkZVIDogRW5hYmxlL0Rpc2FibGUgdmlkZW8gZmFzdCB1cGRhdGUKLSAqICBuRmlyc3RHT0IgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgcm93Ci0gKiAgbkZpcnN0TUIgICA6IHNwZWNpZmllcyB0aGUgZmlyc3QgTUIgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBmaXJzdCBHT0IKLSAqICBuTnVtTUJzICAgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgTUJzIHRvIGJlIHJlZnJlc2hlZCBmcm9tIG5GaXJzdEdPQiAKLSAqICAgICAgICAgICAgICAgYW5kIG5GaXJzdE1CCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOyAgICAgIAotICAgIE9NWF9VMzIgbkZpcnN0R09COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5GaXJzdE1COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5OdW1NQnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfSBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiaXRyYXRlIGNvbnRyb2wgdHlwZXMgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIHsKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlLAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50LAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlU2tpcEZyYW1lcywKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFNraXBGcmFtZXMsCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFOwotCi0KLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KLSAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCi0gKiAgZUNvbnRyb2xSYXRlICAgOiBDb250cm9sIHJhdGUgdHlwZSBlbnVtCi0gKiAgblRhcmdldEJpdHJhdGUgOiBUYXJnZXQgYml0cmF0ZSB0byBlbmNvZGUgd2l0aAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOyAKLSAgICBPTVhfVTMyIG5UYXJnZXRCaXRyYXRlOyAgICAgICAgICAgICAgICAgCi19IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRTsKLQotCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtb3Rpb24gdmVjdG9yIChNVikgdHlwZXMgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRSB7Ci0gICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclBpeGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JIYWxmUGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JRdWFydGVyUGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JFaWdodGhQZWwsCi0gICAgT01YX1ZpZGVvX01vdGlvblZlY3Rvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdGhlIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB1c2VkIGFzIHdlbGwKLSAqIGFzIHRoZWlyIGFjY3VyYWN5LgotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbwotICogIG5Qb3J0SW5kZXggICAgICAgOiBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIGVBY2N1cmFjeSAgICAgICAgOiBFbnVtZXJhdGVkIE1WIGFjY3VyYWN5Ci0gKiAgYlVucmVzdHJpY3RlZE1WcyA6IEFsbG93IHVucmVzdHJpY3RlZCBNVnMKLSAqICBiRm91ck1WICAgICAgICAgIDogQWxsb3cgdXNlIG9mIDQgTVZzCi0gKiAgc1hTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgTVZzCi0gKiAgc1lTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gZm9yIE1WcwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIGVBY2N1cmFjeTsKLSAgICBPTVhfQk9PTCBiVW5yZXN0cmljdGVkTVZzOwotICAgIE9NWF9CT09MIGJGb3VyTVY7Ci0gICAgT01YX1MzMiBzWFNlYXJjaFJhbmdlOwotICAgIE9NWF9TMzIgc1lTZWFyY2hSYW5nZTsKLX0gT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEU7Ci0KLQotLyoqIAotICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgbWV0aG9kcyB0byB1c2UgZm9yIEludHJhIFJlZnJlc2ggCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSB7Ci0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYywKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQWRhcHRpdmUsCi0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEJvdGgsCi0gICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRTsKLQotCi0vKioKLSAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgaW50cmEgcmVmcmVzaCBtb2RlIAotICogCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlUmVmcmVzaE1vZGUgOiBDeWNsaWMsIEFkYXB0aXZlLCBvciBCb3RoCi0gKiAgbkFpck1CcyAgICAgIDogTnVtYmVyIG9mIGludHJhIG1hY3JvYmxvY2tzIHRvIHJlZnJlc2ggaW4gYSBmcmFtZSB3aGVuIAotICogICAgICAgICAgICAgICAgIEFJUiBpcyBlbmFibGVkCi0gKiAgbkFpclJlZiAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgbW90aW9uIG1hcmtlZCBtYWNyb2Jsb2NrIGhhcyB0byBiZSAgCi0gKiAgICAgICAgICAgICAgICAgaW50cmEgY29kZWQKLSAqICBuQ2lyTUJzICAgICAgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWFjcm9ibG9ja3MgdG8gYmUgY29kZWQgYXMgImludHJhIiAgCi0gKiAgICAgICAgICAgICAgICAgd2hlbiBDSVIgaXMgZW5hYmxlZAotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIGVSZWZyZXNoTW9kZTsKLSAgICBPTVhfVTMyIG5BaXJNQnM7Ci0gICAgT01YX1UzMiBuQWlyUmVmOwotICAgIE9NWF9VMzIgbkNpck1CczsKLX0gT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEU7Ci0KLQotLyoqCi0gKiBTdHJ1Y3R1cmUgZm9yIGVuYWJsaW5nIHZhcmlvdXMgZXJyb3IgY29ycmVjdGlvbiBtZXRob2RzIGZvciB2aWRlbyAKLSAqIGNvbXByZXNzaW9uLgotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgYkVuYWJsZUhFQyAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBoZWFkZXIgZXh0ZW5zaW9uIGNvZGVzIChIRUMpCi0gKiAgYkVuYWJsZVJlc3luYyAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXN5bmNocm9uaXphdGlvbiBtYXJrZXJzCi0gKiAgblJlc3luY2hNYXJrZXJTcGFjaW5nICAgOiBSZXN5bmNoIG1hcmtlcnMgaW50ZXJ2YWwgKGluIGJpdHMpIHRvIGJlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBpbiB0aGUgc3RyZWFtIAotICogIGJFbmFibGVEYXRhUGFydGl0aW9uaW5nIDogRW5hYmxlL2Rpc2FibGUgZGF0YSBwYXJ0aXRpb25pbmcgCi0gKiAgYkVuYWJsZVJWTEMgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9CT09MIGJFbmFibGVIRUM7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVJlc3luYzsKLSAgICBPTVhfVTMyICBuUmVzeW5jaE1hcmtlclNwYWNpbmc7Ci0gICAgT01YX0JPT0wgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVJWTEM7Ci19IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFOwotCi0KLS8qKiAKLSAqIENvbmZpZ3VyYXRpb24gb2YgdmFyaWFibGUgYmxvY2stc2l6ZSBtb3Rpb24gY29tcGVuc2F0aW9uIChWQlNNQykgCi0gKiAKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBiMTZ4MTYgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCAxNngxNgotICogIGIxNng4ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDgKLSAqICBiOHgxNiAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDE2Ci0gKiAgYjh4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg4Ci0gKiAgYjh4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg0Ci0gKiAgYjR4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg4Ci0gKiAgYjR4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7IAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfQk9PTCBiMTZ4MTY7IAotICAgIE9NWF9CT09MIGIxNng4OyAKLSAgICBPTVhfQk9PTCBiOHgxNjsKLSAgICBPTVhfQk9PTCBiOHg4OwotICAgIE9NWF9CT09MIGI4eDQ7Ci0gICAgT01YX0JPT0wgYjR4ODsKLSAgICBPTVhfQk9PTCBiNHg0OwotfSBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFOwotCi0KLS8qKiAKLSAqIEguMjYzIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKLSAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCi0gKgotICogRU5VTVM6Ci0gKiAgQmFzZWxpbmUgICAgICAgICAgIDogQmFzZWxpbmUgUHJvZmlsZTogSC4yNjMgKFYxKSwgbm8gb3B0aW9uYWwgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSDMyMCBDb2RpbmcgICAgICAgIDogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAKLSAqICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlOiBILjI2MysgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBMLjQKLSAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgVAotICogIEJhY2t3YXJkQ29tcGF0aWJsZSA6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgUHJvZmlsZTogSC4yNjMgKFYxKSwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYW5uZXggRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogIElTV1YyICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBLIGFuZCBUICAgICAgICAgICAgICAgICAKLSAqICBJU1dWMyAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrKyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZSAzIGFuZCBhbm5leGVzIFYgYW5kIFcuNi4zLjggICAKLSAqICBIaWdoQ29tcHJlc3Npb24gICAgOiBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIFByb2ZpbGU6IEguMjYzKysgIAotICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGVzIDEgJiAyIGFuZCBhbm5leGVzIEQgYW5kIFUgICAKLSAqICBJbnRlcm5ldCAgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCBQcm9maWxlOiBILjI2MysrIChWMyksICAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IEsgICAgICAgICAgICAgICAgICAgICAgIAotICogIEludGVybGFjZSAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlOiBILjI2MysrIChWMyksICAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IFcuNi4zLjExICAgICAgICAgICAgICAgCi0gKiAgSGlnaExhdGVuY3kgICAgICAgIDogSGlnaCBMYXRlbmN5IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgaW5jbHVkZXMgIAotICogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgNiBhbmQgYW5uZXhlcyBPLjEgYW5kIFAuNSAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgID0gMHgwMSwgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcgICAgICAgICAgPSAweDAyLCAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgID0gMHgwNCwgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyICAgICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzICAgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiAgICAgPSAweDIwLCAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQgICAgICAgICAgICA9IDB4NDAsICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICA9IDB4ODAsICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgID0gMHgxMDAsICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlTWF4ICAgICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIEguMjYzIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKLSAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgID0gMHgwMSwgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwyMCAgPSAweDAyLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwzMCAgPSAweDA0LCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0MCAgPSAweDA4LCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0NSAgPSAweDEwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw1MCAgPSAweDIwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw2MCAgPSAweDQwLCAgICAgIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWw3MCAgPSAweDgwLCAKLSAgICBPTVhfVklERU9fSDI2M0xldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU7Ci0KLQotLyoqIAotICogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGUuIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgT1InZCB0byBzaWduYWwgYWxsIAotICogcGljdHVyZXMgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQuCi0gKgotICogRU5VTVM6Ci0gKiAgR2VuZXJpYyBQaWN0dXJlIFR5cGVzOiAgICAgICAgICBJLCBQIGFuZCBCCi0gKiAgSC4yNjMgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogICBTSSBhbmQgU1AKLSAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIEVJIGFuZCBFUAotICogIE1QRUctNCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgUwotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFIHsKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJICAgPSAweDAxLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVAgICA9IDB4MDIsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlQiAgID0gMHgwNCwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTSSAgPSAweDA4LAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNQICA9IDB4MTAsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRUkgID0gMHgxMSwKLSAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFUCAgPSAweDEyLAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVMgICA9IDB4MTQsCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlTWF4ID0gMHg3RkZGRkZGRgotfSBPTVhfVklERU9fUElDVFVSRVRZUEU7Ci0KLQotLyoqIAotICogSC4yNjMgUGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCi0gKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBlUHJvZmlsZSAgICAgICAgICAgICAgICAgOiBILjI2MyBwcm9maWxlKHMpIHRvIHVzZQotICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICA6IEguMjYzIGxldmVsKHMpIHRvIHVzZQotICogIGJQTFVTUFRZUEVBbGxvd2VkICAgICAgICA6IEluZGljYXRpbmcgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZSBQTFVTUFRZUEUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBpbiB0aGUgMTk5OCB2ZXJzaW9uIG9mIEguMjYzKSB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jayAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyAKLSAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiAgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvIDogdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCAoYml0IDYgb2YgTVBQVFlQRSkgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgZm9yIGVhY2ggcmVmZXJlbmNlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaW4gZXJyb3ItZnJlZSBjb21tdW5pY2F0aW9uCi0gKiAgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uIDogU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgb2YgcGljdHVyZSBoZWFkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbgotICogIG5HT0JIZWFkZXJJbnRlcnZhbCAgICAgICA6IFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgb2Ygbm9uLWVtcHR5IEdPQiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyBpbiB1bml0cyBvZiBHT0JzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblBGcmFtZXM7Ci0gICAgT01YX1UzMiBuQkZyYW1lczsKLSAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19IMjYzTEVWRUxUWVBFIGVMZXZlbDsKLSAgICBPTVhfQk9PTCBiUExVU1BUWVBFQWxsb3dlZDsKLSAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOwotICAgIE9NWF9CT09MIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybzsKLSAgICBPTVhfVTMyIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbjsKLSAgICBPTVhfVTMyIG5HT0JIZWFkZXJJbnRlcnZhbDsKLX0gT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCi0gKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgewotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUgPSAwLCAgLyoqPCBTaW1wbGUgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluLCAgICAgICAgLyoqPCBNYWluIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCAgICAgICAgIC8qKjwgNDoyOjIgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTTlIsICAgICAgICAgLyoqPCBTTlIgUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTcGF0aWFsLCAgICAgLyoqPCBTcGF0aWFsIFByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCwgICAgICAgIC8qKjwgSGlnaCBQcm9maWxlICovCi0gICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWF4ID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKLSAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAotICovCi10eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsTUwsICAgICAgLyoqPCBNYWluIExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsSDE0LCAgICAgLyoqPCBIaWdoIDE0NDAgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctMiBwYXJhbXMgCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblBGcmFtZXMgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIG5CRnJhbWVzICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBlUHJvZmlsZSAgIDogTVBFRy0yIHByb2ZpbGUocykgdG8gdXNlCi0gKiAgZUxldmVsICAgICA6IE1QRUctMiBsZXZlbHMocykgdG8gdXNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgIAotICAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAgICAKLSAgICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgZVByb2ZpbGU7Ci0JT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGVMZXZlbDsgICAKLX0gT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqIAotICogRU5VTVM6Ci0gKiAgLSBTaW1wbGUgUHJvZmlsZSwgTGV2ZWxzIDEtMwotICogIC0gU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gTWFpbiBQcm9maWxlLCBMZXZlbHMgMi00Ci0gKiAgLSBOLWJpdCBQcm9maWxlLCBMZXZlbCAyCi0gKiAgLSBTY2FsYWJsZSBUZXh0dXJlIFByb2ZpbGUsIExldmVsIDEKLSAqICAtIFNpbXBsZSBGYWNlIEFuaW1hdGlvbiBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBTaW1wbGUgRmFjZSBhbmQgQm9keSBBbmltYXRpb24gKEZCQSkgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQmFzaWMgQW5pbWF0ZWQgVGV4dHVyZSBQcm9maWxlLCBMZXZlbHMgMS0yCi0gKiAgLSBIeWJyaWQgUHJvZmlsZSwgTGV2ZWxzIDEtMgotICogIC0gQWR2YW5jZWQgUmVhbCBUaW1lIFNpbXBsZSBQcm9maWxlcywgTGV2ZWxzIDEtNAotICogIC0gQ29yZSBTY2FsYWJsZSBQcm9maWxlLCBMZXZlbHMgMS0zCi0gKiAgLSBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeSBQcm9maWxlLCBMZXZlbHMgMS00Ci0gKiAgLSBBZHZhbmNlZCBDb3JlIFByb2ZpbGUsIExldmVscyAxLTIKLSAqICAtIEFkdmFuY2VkIFNjYWxhYmxlIFRleHR1cmUsIExldmVscyAyLTMKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICA9IDB4MDEsICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICA9IDB4MDIsICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlICAgICAgICAgICAgID0gMHgwNCwgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgPSAweDIwLCAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlICAgICAgID0gMHg0MCwgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEgICAgICAgID0gMHg4MCwgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCAgICA9IDB4MTAwLCAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCAgICAgICAgICAgPSAweDIwMCwgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSA9IDB4NDAwLCAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgPSAweDgwMCwgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgICA9IDB4MTAwMCwgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSAgICAgPSAweDIwMDAsICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgPSAweDQwMDAsCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlICAgPSAweDgwMDAsCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWF4ICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAotfSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBNUEVHLTQgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCi0gKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICA9IDB4MDEsICAgLyoqPCBMZXZlbCAwICovICAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiA9IDB4MDIsICAgLyoqPCBMZXZlbCAwYiAqLyAgIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgPSAweDA0LCAgIC8qKjwgTGV2ZWwgMSAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgID0gMHgwOCwgICAvKio8IExldmVsIDIgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICA9IDB4MTAsICAgLyoqPCBMZXZlbCAzICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgPSAweDIwLCAgIC8qKjwgTGV2ZWwgNCAqLyAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0YSA9IDB4NDAsICAgLyoqPCBMZXZlbCA0YSAqLyAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICA9IDB4ODAsICAgLyoqPCBMZXZlbCA1ICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOwotCi0KLS8qKiAKLSAqIE1QRUctNCBjb25maWd1cmF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaGFuZGxlcyBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSAqIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBNUEVHNCBhbGdvcml0aG1zCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4ICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIgKEgyNjMrIAotICogICAgICAgICAgICAgICAgICAgICAgICAgQW5uZXggSykuIFB1dCB6ZXJvIGlmIG5vdCB1c2VkCi0gKiAgYlNWSCAgICAgICAgICAgICAgICAgOiBFbmFibGUgU2hvcnQgVmlkZW8gSGVhZGVyIG1vZGUKLSAqICBiR292ICAgICAgICAgICAgICAgICA6IEZsYWcgdG8gZW5hYmxlIEdPVgotICogIG5QRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lIChhbHNvIGNhbGxlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEdPViBwZXJpb2QpCi0gKiAgbkJGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKLSAqICBuSURDVkxDVGhyZXNob2xkICAgICA6IFZhbHVlIG9mIGludHJhIERDIFZMQyB0aHJlc2hvbGQKLSAqICBiQUNQcmVkICAgICAgICAgICAgICA6IEZsYWcgdG8gdXNlIGFjIHByZWRpY3Rpb24KLSAqICBuTWF4UGFja2V0U2l6ZSAgICAgICA6IE1heGltdW0gc2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMuCi0gKiAgblRpbWVJbmNSZXMgICAgICAgICAgOiBVc2VkIHRvIHBhc3MgVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gZm9yIE1QRUc0LiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGVkIGFzIGRlc2NyaWJlZCBpbiBNUEVHNCBzdGFuZGFyZC4KLSAqICBlUHJvZmlsZSAgICAgICAgICAgICA6IE1QRUctNCBwcm9maWxlKHMpIHRvIHVzZS4KLSAqICBlTGV2ZWwgICAgICAgICAgICAgICA6IE1QRUctNCBsZXZlbChzKSB0byB1c2UuCi0gKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgYml0c3RyZWFtCi0gKiAgbkhlYWRlckV4dGVuc2lvbiAgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2aWRlbyBwYWNrZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgd2l0aGluIGEgVk9QCi0gKiAgYlJldmVyc2libGVWTEMgICAgICAgOiBTcGVjaWZpZXMgd2hldGhlciByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCBjb2RpbmcgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiB1c2UKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsKLSAgICBPTVhfQk9PTCBiU1ZIOwotICAgIE9NWF9CT09MIGJHb3Y7Ci0gICAgT01YX1UzMiBuUEZyYW1lczsKLSAgICBPTVhfVTMyIG5CRnJhbWVzOwotICAgIE9NWF9VMzIgbklEQ1ZMQ1RocmVzaG9sZDsKLSAgICBPTVhfQk9PTCBiQUNQcmVkOwotICAgIE9NWF9VMzIgbk1heFBhY2tldFNpemU7Ci0gICAgT01YX1UzMiBuVGltZUluY1JlczsKLSAgICBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLSAgICBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgZUxldmVsOwotICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7Ci0gICAgT01YX1UzMiBuSGVhZGVyRXh0ZW5zaW9uOwotICAgIE9NWF9CT09MIGJSZXZlcnNpYmxlVkxDOwotfSBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFOwotCi0KLS8qKiAKLSAqIFdNViBWZXJzaW9ucyAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIHsKLSAgICBPTVhfVklERU9fV01WRm9ybWF0VW51c2VkID0gMHgwMSwgICAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ3ICAgICAgPSAweDAyLCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgNyAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ4ICAgICAgPSAweDA0LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOCAqLwotICAgIE9NWF9WSURFT19XTVZGb3JtYXQ5ICAgICAgPSAweDA4LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOSAqLwotICAgIE9NWF9WSURFT19XTUZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1dNRkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX1dNVkZvcm1hdE1heCAgICA9IDB4N0ZGRkZGRkYKLX0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogV01WIFBhcmFtcyAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBlRm9ybWF0ICAgIDogVmVyc2lvbiBvZiBXTVYgc3RyZWFtIC8gZGF0YQotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fV01WVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVklERU9fV01WRk9STUFUVFlQRSBlRm9ybWF0OwotfSBPTVhfVklERU9fUEFSQU1fV01WVFlQRTsKLQotCi0vKiogCi0gKiBSZWFsIFZpZGVvIFZlcnNpb24gCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fUlZGT1JNQVRUWVBFIHsKLSAgICBPTVhfVklERU9fUlZGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdDgsICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOCAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdDksICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOSAqLwotICAgIE9NWF9WSURFT19SVkZvcm1hdEcyLCAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBGb3JtYXQgRzIgKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fUlZGb3JtYXRNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19SVkZPUk1BVFRZUEU7Ci0KLQotLyoqIAotICogUmVhbCBWaWRlbyBQYXJhbXMgCi0gKgotICogU1RVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgZUZvcm1hdCAgICAgICAgICAgIDogVmVyc2lvbiBvZiBSViBzdHJlYW0gLyBkYXRhCi0gKiAgbkJpdHNQZXJQaXhlbCAgICAgIDogQml0cyBwZXIgcGl4ZWwgY29kZWQgaW4gdGhlIGZyYW1lCi0gKiAgblBhZGRlZFdpZHRoICAgICAgIDogUGFkZGVkIHdpZHRoIGluIHBpeGVsIG9mIGEgdmlkZW8gZnJhbWUKLSAqICBuUGFkZGVkSGVpZ2h0ICAgICAgOiBQYWRkZWQgSGVpZ2h0IGluIHBpeGVscyBvZiBhIHZpZGVvIGZyYW1lCi0gKiAgbkZyYW1lUmF0ZSAgICAgICAgIDogUmF0ZSBvZiB2aWRlbyBpbiBmcmFtZXMgcGVyIHNlY29uZAotICogIG5CaXRzdHJlYW1GbGFncyAgICA6IEZsYWdzIHdoaWNoIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRzdHJlYW0KLSAqICBuQml0c3RyZWFtVmVyc2lvbiAgOiBCaXRzdHJlYW0gdmVyc2lvbgotICogIG5NYXhFbmNvZGVGcmFtZVNpemU6IE1heCBlbmNvZGVkIGZyYW1lIHNpemUKLSAqICBiRW5hYmxlUG9zdEZpbHRlciAgOiBUdXJuIG9uL29mZiBwb3N0IGZpbHRlcgotICogIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb24gOiBUdXJuIG9uL29mZiB0ZW1wb3JhbCBpbnRlcnBvbGF0aW9uCi0gKiAgYkVuYWJsZUxhdGVuY3lNb2RlIDogV2hlbiBlbmFibGVkLCB0aGUgZGVjb2RlciBkb2VzIG5vdCBkaXNwbGF5IGEgZGVjb2RlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB1bnRpbCBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCBubyBlbmhhbmNlbWVudCBsYXllciAKLSAqICAJCQkJCSBmcmFtZXMgb3IgZGVwZW5kZW50IEIgZnJhbWVzIHdpbGwgYmUgY29taW5nLiBUaGlzIAotICogIAkJCQkJIGRldGVjdGlvbiB1c3VhbGx5IG9jY3VycyB3aGVuIGEgc3Vic2VxdWVudCBub24tQiAKLSAqICAJCQkJCSBmcmFtZSBpcyBlbmNvdW50ZXJlZCAKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1JWVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgZUZvcm1hdDsKLSAgICBPTVhfVTE2IG5CaXRzUGVyUGl4ZWw7Ci0gICAgT01YX1UxNiBuUGFkZGVkV2lkdGg7Ci0gICAgT01YX1UxNiBuUGFkZGVkSGVpZ2h0OwotICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKLSAgICBPTVhfVTMyIG5CaXRzdHJlYW1GbGFnczsKLSAgICBPTVhfVTMyIG5CaXRzdHJlYW1WZXJzaW9uOwotICAgIE9NWF9VMzIgbk1heEVuY29kZUZyYW1lU2l6ZTsKLSAgICBPTVhfQk9PTCBiRW5hYmxlUG9zdEZpbHRlcjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlVGVtcG9yYWxJbnRlcnBvbGF0aW9uOwotICAgIE9NWF9CT09MIGJFbmFibGVMYXRlbmN5TW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX1JWVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAotICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSA9IDB4MDEsICAgLyoqPCBCYXNlbGluZSBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICA9IDB4MDIsICAgLyoqPCBNYWluIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkID0gMHgwNCwgICAvKio8IEV4dGVuZGVkIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgID0gMHgwOCwgICAvKio8IEhpZ2ggcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICAgPSAweDEwLCAgIC8qKjwgSGlnaCAxMCBwcm9maWxlICovCi0gICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjAsICAgLyoqPCBIaWdoIDQ6MjoyIHByb2ZpbGUgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MCwgICAvKio8IEhpZ2ggNDo0OjQgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAotICAgIE9NWF9WSURFT19BVkNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRiAgCi19IE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAotICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKLSAqLwotdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19BVkNMZXZlbDEgICA9IDB4MDEsICAgICAvKio8IExldmVsIDEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiAgPSAweDAyLCAgICAgLyoqPCBMZXZlbCAxYiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDExICA9IDB4MDQsICAgICAvKio8IExldmVsIDEuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDEyICA9IDB4MDgsICAgICAvKio8IExldmVsIDEuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDEzICA9IDB4MTAsICAgICAvKio8IExldmVsIDEuMyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDIgICA9IDB4MjAsICAgICAvKio8IExldmVsIDIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwyMSAgPSAweDQwLCAgICAgLyoqPCBMZXZlbCAyLjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiAgPSAweDgwLCAgICAgLyoqPCBMZXZlbCAyLjIgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWwzICAgPSAweDEwMCwgICAgLyoqPCBMZXZlbCAzICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMzEgID0gMHgyMDAsICAgIC8qKjwgTGV2ZWwgMy4xICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsMzIgID0gMHg0MDAsICAgIC8qKjwgTGV2ZWwgMy4yICovCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgID0gMHg4MDAsICAgIC8qKjwgTGV2ZWwgNCAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDQxICA9IDB4MTAwMCwgICAvKio8IExldmVsIDQuMSAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDQyICA9IDB4MjAwMCwgICAvKio8IExldmVsIDQuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbDUgICA9IDB4NDAwMCwgICAvKio8IExldmVsIDUgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWw1MSAgPSAweDgwMDAsICAgLyoqPCBMZXZlbCA1LjEgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX0FWQ0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKLX0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgbG9vcCBmaWx0ZXIgbW9kZXMgCi0gKgotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZQotICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlICAgICAgICAgICAgICA6IERpc2FibGUKLSAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZVNsaWNlQm91bmRhcnkgOiBEaXNhYmxlZCBvbiBzbGljZSBib3VuZGFyaWVzCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgewotICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlID0gMCwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUsCi0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRTsKLQotCi0vKiogCi0gKiBBVkMgcGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TbGljZUhlYWRlclNwYWNpbmcgICAgICAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIsIHB1dCAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gaWYgbm90IHVzZWQKLSAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCi0gKiAgbkJGcmFtZXMgICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQotICogIGJVc2VIYWRhbWFyZCAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBIYWRhbWFyZCB0cmFuc2Zvcm0KLSAqICBuUmVmRnJhbWVzICAgICAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIHRvIHVzZSBmb3IgaW50ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHNlYXJjaCAoMS0xNikKLSAqICBuUmVmSWR4VHJhaWxpbmcgICAgICAgICAgIDogUGljIHBhcmFtIHNldCByZWYgZnJhbWUgaW5kZXggKGluZGV4IGludG8gcmVmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGJ1ZmZlciBvZiB0cmFpbGluZyBmcmFtZXMgbGlzdCksIEIgZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICogIG5SZWZJZHhGb3J3YXJkICAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIGZvcndhcmQgZnJhbWVzIGxpc3QpLCBCIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKLSAqICBiRW5hYmxlVUVQICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgdW5lcXVhbCBlcnJvciBwcm90ZWN0aW9uLiBUaGlzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHZhbGlkIG9mIGRhdGEgcGFydGl0aW9uaW5nIGlzIGVuYWJsZWQuCi0gKiAgYkVuYWJsZUZNTyAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcKLSAqICBiRW5hYmxlQVNPICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgYXJiaXRyYXJ5IHNsaWNlIG9yZGVyaW5nCi0gKiAgYkVuYWJsZVJTICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHNlbmRpbmcgb2YgcmVkdW5kYW50IHNsaWNlcwotICogIGVQcm9maWxlICAgICAgICAgICAgICAgICAgOiBBVkMgcHJvZmlsZShzKSB0byB1c2UKLSAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgIDogQVZDIGxldmVsKHMpIHRvIHVzZQotICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogIGJGcmFtZU1Cc09ubHkgICAgICAgICAgICAgOiBzcGVjaWZpZXMgdGhhdCBldmVyeSBjb2RlZCBwaWN0dXJlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgdmlkZW8gc2VxdWVuY2UgaXMgYSBjb2RlZCBmcmFtZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBvbmx5IGZyYW1lIG1hY3JvYmxvY2tzCi0gKiAgYk1CQUZGICAgICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHN3aXRjaGluZyBiZXR3ZWVuIGZyYW1lIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbWFjcm9ibG9ja3Mgd2l0aGluIGEgcGljdHVyZQotICogIGJFbnRyb3B5Q29kaW5nQ0FCQUMgICAgICAgOiBFbnRyb3B5IGRlY29kaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkIGZvciB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCBlbGVtZW50cyBmb3Igd2hpY2ggdHdvIGRlc2NyaXB0b3JzIGFwcGVhciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN5bnRheCB0YWJsZXMKLSAqICBiV2VpZ2h0ZWRQUHJlZGljdGlvbiAgICAgIDogRW5hYmxlL2Rpc2FibGUgd2VpZ2h0ZWQgcHJlZGljdGlvbiBzaGFsbCBub3QgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gUCBhbmQgU1Agc2xpY2VzCi0gKiAgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZSA6IERlZmF1bHQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBpcyBhcHBsaWVkIHRvIEIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyAKLSAqICBiY29uc3RJcHJlZCAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaW50cmEgcHJlZGljdGlvbgotICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGZvciBsdW1hIG1vdGlvbiB2ZWN0b3JzIGZvciBCX1NraXAsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX0RpcmVjdF8xNngxNiBhbmQgQl9EaXJlY3RfOHg4IGFzIHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjIAotICogIGJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgICAgOiBGbGFnIGluZGljYXRpbmcgc3BhdGlhbCBvciB0ZW1wb3JhbCBkaXJlY3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB1c2VkIGluIEIgc2xpY2UgY29kaW5nIChyZWxhdGVkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlyZWN0OHg4SW5mZXJlbmNlKSAuIFNwYXRpYWwgZGlyZWN0IG1vZGUgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgY29tbW9uIGFuZCBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCi0gKiAgbkNhYmFjSW5pdElkeCAgICAgICAgICAgICA6IEluZGV4IHVzZWQgdG8gaW5pdCBDQUJBQyBjb250ZXh0cwotICogIGVMb29wRmlsdGVyTW9kZSAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBsb29wIGZpbHRlcgotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOyAgCi0gICAgT01YX1UzMiBuUEZyYW1lczsgICAgIAotICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAKLSAgICBPTVhfQk9PTCBiVXNlSGFkYW1hcmQ7Ci0gICAgT01YX1UzMiBuUmVmRnJhbWVzOyAgCi0JT01YX1UzMiBuUmVmSWR4MTBBY3RpdmVNaW51czE7Ci0JT01YX1UzMiBuUmVmSWR4MTFBY3RpdmVNaW51czE7Ci0gICAgT01YX0JPT0wgYkVuYWJsZVVFUDsgIAotICAgIE9NWF9CT09MIGJFbmFibGVGTU87ICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlQVNPOyAgCi0gICAgT01YX0JPT0wgYkVuYWJsZVJTOyAgIAotICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fQVZDTEVWRUxUWVBFIGVMZXZlbDsgCi0gICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsgIAotCU9NWF9CT09MIGJGcmFtZU1Cc09ubHk7ICAgICAgICAJCQkJCQkJCQkKLSAgICBPTVhfQk9PTCBiTUJBRkY7ICAgICAgICAgICAgICAgCi0gICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsgIAotICAgIE9NWF9CT09MIGJXZWlnaHRlZFBQcmVkaWN0aW9uOyAKLSAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7IAotICAgIE9NWF9CT09MIGJjb25zdElwcmVkIDsKLSAgICBPTVhfQk9PTCBiRGlyZWN0OHg4SW5mZXJlbmNlOyAgCi0JT01YX0JPT0wgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbDsKLQlPTVhfVTMyIG5DYWJhY0luaXRJZGM7Ci0JT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGVMb29wRmlsdGVyTW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKLSAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKLSAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKLSAgIE9NWF9VMzIgZVByb2ZpbGU7ICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLwotICAgT01YX1UzMiBlTGV2ZWw7ICAgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KLSAgIE9NWF9VMzIgblByb2ZpbGVJbmRleDsgLyoqPCBVc2VkIHRvIHF1ZXJ5IGZvciBpbmRpdmlkdWFsIHByb2ZpbGUgc3VwcG9ydCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGFsbCBvdGhlciBpbmRpY2VzIHRoaXMgcGFyYW1ldGVyIGlzIHRvIGJlIGlnbm9yZWQuICovCi19IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFOwotCi0vKiogCi0gKiBTdHJ1Y3R1cmUgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyaW5nIGJpdHJhdGUgbW9kZSBvZiBhIGNvZGVjLiAKLSAqCi0gKiBTVFJVQ1QgTUVNQkVSUzoKLSAqICBuU2l6ZSAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdCBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCi0gKiAgblBvcnRJbmRleCAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0bwotICogIG5FbmNvZGVCaXRyYXRlIDogVGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB0byBiZSBnZW5lcmF0ZWQgaW4gYnBzCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbkVuY29kZUJpdHJhdGU7ICAgICAgICAgICAgICAgICAKLX0gT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRTsKLQotLyoqIAotICogRGVmaW5lcyBFbmNvZGVyIEZyYW1lIFJhdGUgc2V0dGluZwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICB4RW5jb2RlRnJhbWVyYXRlIDogRW5jb2RpbmcgZnJhbWVyYXRlIHJlcHJlc2VudGVkIGluIFExNiBmb3JtYXQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX1UzMiB4RW5jb2RlRnJhbWVyYXRlOyAvKiBRMTYgZm9ybWF0ICovCi19IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRTsKLQotdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgSW50cmFSZWZyZXNoVk9QOwotfSBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbkVyck1hcFNpemU7ICAgICAgICAgICAvKiBTaXplIG9mIHRoZSBFcnJvciBNYXAgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTggIEVyck1hcFsxXTsgICAgICAgICAgICAgLyogRXJyb3IgbWFwIGhpbnQgKi8KLX0gT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFOwotCi10eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOwotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Ci0gICAgT01YX0JPT0wgYkVuYWJsZWQ7Ci19IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTMyIG5NYWNyb2Jsb2NrczsKLX0gT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRTsKLQotLyoqIAotICogQVZDIFNsaWNlIE1vZGUgbW9kZXMgCi0gKgotICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ICAgOiBOb3JtYWwgZnJhbWUgZW5jb2RpbmcsIG9uZSBzbGljZSBwZXIgZnJhbWUKLSAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSAgIDogTkFMIG1vZGUsIG51bWJlciBvZiBNQnMgcGVyIGZyYW1lCi0gKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSA6IE5BTCBtb2RlLCBudW1iZXIgb2YgYnl0ZXMgcGVyIGZyYW1lCi0gKi8KLXR5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSB7Ci0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ID0gMCwKLSAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ01CU2xpY2UsCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNCeXRlU2xpY2UsCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCi0gICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCi19IE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFOwotCi0vKiogCi0gKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zIAotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5OdW1TbGljZUdyb3VwcyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcwotICogIG5TbGljZUdyb3VwTWFwVHlwZSA6IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBzbGljZSBncm91cHMKLSAqICBlU2xpY2VNb2RlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsKLSAgICBPTVhfVTggbk51bVNsaWNlR3JvdXBzOwotICAgIE9NWF9VOCBuU2xpY2VHcm91cE1hcFR5cGU7Ci0gICAgT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEUgZVNsaWNlTW9kZTsKLX0gT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1POwotCi0vKiogCi0gKiBBVkMgSURSIFBlcmlvZCBDb25maWdzCi0gKgotICogU1RSVUNUIE1FTUJFUlM6Ci0gKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCi0gKiAgbklEUlBlcmlvZCA6IFNwZWNpZmllcyBwZXJpb2RpY2l0eSBvZiBJRFIgZnJhbWVzCi0gKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgaW50ZXJuYWwgb2YgY29kaW5nIEludHJhIGZyYW1lcwotICovCi10eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbklEUlBlcmlvZDsKLSAgICBPTVhfVTMyIG5QRnJhbWVzOwotfSBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EOwotCi0vKiogCi0gKiBBVkMgTkFMIFNpemUgQ29uZmlncwotICoKLSAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgotICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5OYWx1Qnl0ZXMgOiBTcGVjaWZpZXMgdGhlIE5BTCB1bml0IHNpemUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247Ci0gICAgT01YX1UzMiBuUG9ydEluZGV4OwotICAgIE9NWF9VMzIgbk5hbHVCeXRlczsKLX0gT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFOwotCi0vKiogQH0gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmCi0vKiBGaWxlIEVPRiAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCAzYWZmMGM2Li4wZWNjMzQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gQSBzaW1wbGUgYnVmZmVyIHRvIGhvbGQgYmluYXJ5IGRhdGEKLWNsYXNzIE1lZGlhQWxidW1BcnQgCitjbGFzcyBNZWRpYUFsYnVtQXJ0CiB7CiBwdWJsaWM6CiAgICAgTWVkaWFBbGJ1bUFydCgpOiBtU2l6ZSgwKSwgbURhdGEoMCkge30KQEAgLTU3LDkgKzU3LDkgQEAKICAgICAgICAgZmNsb3NlKGluKTsKICAgICB9CiAKLSAgICBNZWRpYUFsYnVtQXJ0KGNvbnN0IE1lZGlhQWxidW1BcnQmIGNvcHkpIHsgCi0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsgCi0gICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QgCisgICAgTWVkaWFBbGJ1bUFydChjb25zdCBNZWRpYUFsYnVtQXJ0JiBjb3B5KSB7CisgICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKKyAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAogICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewogICAgICAgICAgICBtRGF0YSA9IG5ldyB1aW50OF90W2NvcHkubVNpemVdOwogICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewpAQCAtODksNyArODksNyBAQAogewogcHVibGljOgogICAgIFZpZGVvRnJhbWUoKTogbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRGlzcGxheVdpZHRoKDApLCBtRGlzcGxheUhlaWdodCgwKSwgbVNpemUoMCksIG1EYXRhKDApIHt9Ci0gCisKICAgICBWaWRlb0ZyYW1lKGNvbnN0IFZpZGVvRnJhbWUmIGNvcHkpIHsKICAgICAgICAgbVdpZHRoID0gY29weS5tV2lkdGg7CiAgICAgICAgIG1IZWlnaHQgPSBjb3B5Lm1IZWlnaHQ7CmRpZmYgLS1naXQgYS9saWJzL2FuZHJvaWRmdy9JbnB1dC5jcHAgYi9saWJzL2FuZHJvaWRmdy9JbnB1dC5jcHAKaW5kZXggY2EwOWNhZi4uZGE1NzgzOSAxMDA2NDQKLS0tIGEvbGlicy9hbmRyb2lkZncvSW5wdXQuY3BwCisrKyBiL2xpYnMvYW5kcm9pZGZ3L0lucHV0LmNwcApAQCAtNjgzLDYgKzY4Myw1OCBAQAogfQogCiAKKy8vIC0tLSBQb29sZWRJbnB1dEV2ZW50RmFjdG9yeSAtLS0KKworUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OlBvb2xlZElucHV0RXZlbnRGYWN0b3J5KHNpemVfdCBtYXhQb29sU2l6ZSkgOgorICAgICAgICBtTWF4UG9vbFNpemUobWF4UG9vbFNpemUpIHsKK30KKworUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6On5Qb29sZWRJbnB1dEV2ZW50RmFjdG9yeSgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1LZXlFdmVudFBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1LZXlFdmVudFBvb2wuaXRlbUF0KGkpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb3Rpb25FdmVudFBvb2wuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1Nb3Rpb25FdmVudFBvb2wuaXRlbUF0KGkpOworICAgIH0KK30KKworS2V5RXZlbnQqIFBvb2xlZElucHV0RXZlbnRGYWN0b3J5OjpjcmVhdGVLZXlFdmVudCgpIHsKKyAgICBpZiAoIW1LZXlFdmVudFBvb2wuaXNFbXB0eSgpKSB7CisgICAgICAgIEtleUV2ZW50KiBldmVudCA9IG1LZXlFdmVudFBvb2wudG9wKCk7CisgICAgICAgIG1LZXlFdmVudFBvb2wucG9wKCk7CisgICAgICAgIHJldHVybiBldmVudDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBLZXlFdmVudCgpOworfQorCitNb3Rpb25FdmVudCogUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OmNyZWF0ZU1vdGlvbkV2ZW50KCkgeworICAgIGlmICghbU1vdGlvbkV2ZW50UG9vbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgTW90aW9uRXZlbnQqIGV2ZW50ID0gbU1vdGlvbkV2ZW50UG9vbC50b3AoKTsKKyAgICAgICAgbU1vdGlvbkV2ZW50UG9vbC5wb3AoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50OworICAgIH0KKyAgICByZXR1cm4gbmV3IE1vdGlvbkV2ZW50KCk7Cit9CisKK3ZvaWQgUG9vbGVkSW5wdXRFdmVudEZhY3Rvcnk6OnJlY3ljbGUoSW5wdXRFdmVudCogZXZlbnQpIHsKKyAgICBzd2l0Y2ggKGV2ZW50LT5nZXRUeXBlKCkpIHsKKyAgICBjYXNlIEFJTlBVVF9FVkVOVF9UWVBFX0tFWToKKyAgICAgICAgaWYgKG1LZXlFdmVudFBvb2wuc2l6ZSgpIDwgbU1heFBvb2xTaXplKSB7CisgICAgICAgICAgICBtS2V5RXZlbnRQb29sLnB1c2goc3RhdGljX2Nhc3Q8S2V5RXZlbnQqPihldmVudCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUlOUFVUX0VWRU5UX1RZUEVfTU9USU9OOgorICAgICAgICBpZiAobU1vdGlvbkV2ZW50UG9vbC5zaXplKCkgPCBtTWF4UG9vbFNpemUpIHsKKyAgICAgICAgICAgIG1Nb3Rpb25FdmVudFBvb2wucHVzaChzdGF0aWNfY2FzdDxNb3Rpb25FdmVudCo+KGV2ZW50KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlbGV0ZSBldmVudDsKK30KKworCiAvLyAtLS0gVmVsb2NpdHlUcmFja2VyIC0tLQogCiBjb25zdCB1aW50MzJfdCBWZWxvY2l0eVRyYWNrZXI6OkRFRkFVTFRfREVHUkVFOwpkaWZmIC0tZ2l0IGEvbGlicy9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuY3BwIGIvbGlicy9hbmRyb2lkZncvSW5wdXRUcmFuc3BvcnQuY3BwCmluZGV4IDFlYmQ3NWMuLjI5NDIzNmYgMTAwNjQ0Ci0tLSBhL2xpYnMvYW5kcm9pZGZ3L0lucHV0VHJhbnNwb3J0LmNwcAorKysgYi9saWJzL2FuZHJvaWRmdy9JbnB1dFRyYW5zcG9ydC5jcHAKQEAgLTUyNyw2ICs1MjcsMTAgQEAKICAgICByZXR1cm4gbUNoYW5uZWwtPnNlbmRNZXNzYWdlKCZtc2cpOwogfQogCitib29sIElucHV0Q29uc3VtZXI6Omhhc0RlZmVycmVkRXZlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nc2dEZWZlcnJlZDsKK30KKwogYm9vbCBJbnB1dENvbnN1bWVyOjpoYXNQZW5kaW5nQmF0Y2goKSBjb25zdCB7CiAgICAgcmV0dXJuICFtQmF0Y2hlcy5pc0VtcHR5KCk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAKaW5kZXggMjRmNGYxYy4uYTg4NGQ4ZSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCisrKyBiL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcApAQCAtMTYsMTEgKzE2LDExIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiT3BlbkdMUmVuZGVyZXIiCiAKKyNpbmNsdWRlIDxTa0NhbWVyYS5oPgogCiAjaW5jbHVkZSAiRGlzcGxheUxpc3RMb2dCdWZmZXIuaCIKICNpbmNsdWRlICJEaXNwbGF5TGlzdFJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiQ2FjaGVzLmgiCi0jaW5jbHVkZSAiU2tDYW1lcmEuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHVpcmVuZGVyZXIgewpAQCAtOTEsNyArOTEsOSBAQAogICAgIGZmbHVzaChmaWxlKTsKIH0KIAotRGlzcGxheUxpc3Q6OkRpc3BsYXlMaXN0KGNvbnN0IERpc3BsYXlMaXN0UmVuZGVyZXImIHJlY29yZGVyKSB7CitEaXNwbGF5TGlzdDo6RGlzcGxheUxpc3QoY29uc3QgRGlzcGxheUxpc3RSZW5kZXJlciYgcmVjb3JkZXIpIDoKKyAgICBtVHJhbnNmb3JtTWF0cml4KE5VTEwpLCBtVHJhbnNmb3JtQ2FtZXJhKE5VTEwpLCBtVHJhbnNmb3JtTWF0cml4M0QoTlVMTCkgeworCiAgICAgaW5pdEZyb21EaXNwbGF5TGlzdFJlbmRlcmVyKHJlY29yZGVyKTsKIH0KIApAQCAtMTI0LDkgKzEyNiw2IEBACiAgICAgbVdpZHRoID0gMDsKICAgICBtSGVpZ2h0ID0gMDsKICAgICBtUGl2b3RFeHBsaWNpdGx5U2V0ID0gZmFsc2U7Ci0gICAgbVRyYW5zZm9ybU1hdHJpeCA9IE5VTEw7Ci0gICAgbVRyYW5zZm9ybUNhbWVyYSA9IE5VTEw7Ci0gICAgbVRyYW5zZm9ybU1hdHJpeDNEID0gTlVMTDsKICAgICBtQ2FjaGluZyA9IGZhbHNlOwogfQogCkBAIC0xNDAsMTcgKzEzOSwxOSBAQAogdm9pZCBEaXNwbGF5TGlzdDo6Y2xlYXJSZXNvdXJjZXMoKSB7CiAgICAgc2tfZnJlZSgodm9pZCopIG1SZWFkZXIuYmFzZSgpKTsKIAotICAgIGlmIChtVHJhbnNmb3JtTWF0cml4KSB7Ci0gICAgICAgIGRlbGV0ZSBtVHJhbnNmb3JtTWF0cml4OwotICAgICAgICBtVHJhbnNmb3JtTWF0cml4ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1UcmFuc2Zvcm1DYW1lcmEpIHsKLSAgICAgICAgZGVsZXRlIG1UcmFuc2Zvcm1DYW1lcmE7Ci0gICAgICAgIG1UcmFuc2Zvcm1DYW1lcmEgPSBOVUxMOwotICAgIH0KLSAgICBpZiAobVRyYW5zZm9ybU1hdHJpeDNEKSB7Ci0gICAgICAgIGRlbGV0ZSBtVHJhbnNmb3JtTWF0cml4M0Q7Ci0gICAgICAgIG1UcmFuc2Zvcm1NYXRyaXgzRCA9IE5VTEw7CisgICAgaWYgKFVTRV9ESVNQTEFZX0xJU1RfUFJPUEVSVElFUykgeworICAgICAgICBpZiAobVRyYW5zZm9ybU1hdHJpeCkgeworICAgICAgICAgICAgZGVsZXRlIG1UcmFuc2Zvcm1NYXRyaXg7CisgICAgICAgICAgICBtVHJhbnNmb3JtTWF0cml4ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRyYW5zZm9ybUNhbWVyYSkgeworICAgICAgICAgICAgZGVsZXRlIG1UcmFuc2Zvcm1DYW1lcmE7CisgICAgICAgICAgICBtVHJhbnNmb3JtQ2FtZXJhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobVRyYW5zZm9ybU1hdHJpeDNEKSB7CisgICAgICAgICAgICBkZWxldGUgbVRyYW5zZm9ybU1hdHJpeDNEOworICAgICAgICAgICAgbVRyYW5zZm9ybU1hdHJpeDNEID0gTlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIENhY2hlcyYgY2FjaGVzID0gQ2FjaGVzOjpnZXRJbnN0YW5jZSgpOwpAQCAtODI1LDcgKzgyNiw3IEBACiAgICAgd2hpbGUgKCFtUmVhZGVyLmVvZigpKSB7CiAgICAgICAgIGludCBvcCA9IG1SZWFkZXIucmVhZEludCgpOwogICAgICAgICBpZiAob3AgJiBPUF9NQVlfQkVfU0tJUFBFRF9NQVNLKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHNraXAgPSBtUmVhZGVyLnJlYWRJbnQoKSAqIDQ7CisgICAgICAgICAgICBpbnQzMl90IHNraXAgPSBtUmVhZGVyLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkoZmxhZ3MgJiBrUmVwbGF5RmxhZ19DbGlwQ2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICAgbVJlYWRlci5za2lwKHNraXApOwogICAgICAgICAgICAgICAgIERJU1BMQVlfTElTVF9MT0dEKCIlcyVzIHNraXBwaW5nICVkIGJ5dGVzIiwgKGNoYXIqKSBpbmRlbnQsCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5oIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuaAppbmRleCBhYmU4YjgyLi40MzYxN2U3IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5oCisrKyBiL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmgKQEAgLTY1Niw5ICs2NTYsOCBAQAogICAgICAgICBpZiAocmVqZWN0KSB7CiAgICAgICAgICAgICBtV3JpdGVyLndyaXRlSW50KE9QX01BWV9CRV9TS0lQUEVEX01BU0sgfCBkcmF3T3ApOwogICAgICAgICAgICAgbVdyaXRlci53cml0ZUludCgweGRlYWRkZWFkKTsKLSAgICAgICAgICAgIHVpbnQzMl90KiBsb2NhdGlvbiA9IHJlamVjdCA/Ci0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIucGVlazMyKG1Xcml0ZXIuc2l6ZSgpIC0gc2l6ZW9mKGludDMyX3QpKSA6IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgICAgICAgICBtQnVmZmVyU2l6ZSA9IG1Xcml0ZXIuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1Xcml0ZXIucGVlazMyKG1CdWZmZXJTaXplIC0gc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgfQogICAgICAgICBtV3JpdGVyLndyaXRlSW50KGRyYXdPcCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjY2LDggKzY2NSw3IEBACiAKICAgICBpbmxpbmUgdm9pZCBhZGRTa2lwKHVpbnQzMl90KiBsb2NhdGlvbikgewogICAgICAgICBpZiAobG9jYXRpb24pIHsKLSAgICAgICAgICAgICpsb2NhdGlvbiA9IChpbnQzMl90KSAobVdyaXRlci5wZWVrMzIoCi0gICAgICAgICAgICAgICAgICAgIG1Xcml0ZXIuc2l6ZSgpIC0gc2l6ZW9mKGludDMyX3QpKSAtIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICpsb2NhdGlvbiA9IChpbnQzMl90KSAobVdyaXRlci5zaXplKCkgLSBtQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgyMiw2ICs4MjAsNyBAQAogICAgIFZlY3RvcjxTa01hdHJpeCo+IG1NYXRyaWNlczsKIAogICAgIFNrV3JpdGVyMzIgbVdyaXRlcjsKKyAgICB1aW50MzJfdCBtQnVmZmVyU2l6ZTsKIAogICAgIGludCBtUmVzdG9yZVNhdmVDb3VudDsKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy90ZXN0cy9BbmRyb2lkLm1rIGIvbGlicy9ycy90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDE5N2U4NjIuLjYyN2ZmNzIgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvdGVzdHMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIyLDkgKzIyLDE1IEBACiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gIC4uIFwKLQlmcmFtZXdvcmtzL2Jhc2UvbGlicy9ycyBcCi0Jb3V0L3RhcmdldC9wcm9kdWN0L3N0aW5ncmF5L29iai9TSEFSRURfTElCUkFSSUVTL2xpYlJTX2ludGVybWVkaWF0ZXMJCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxUQVJHRVQsKQorbGlicnNfZ2VuZXJhdGVkX2hlYWRlcnMgOj0gXAorICAgICQoaW50ZXJtZWRpYXRlcykvcnNnQXBpU3RydWN0cy5oIFwKKyAgICAkKGludGVybWVkaWF0ZXMpL3JzZ0FwaUZ1bmNEZWNsLmgKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTIDo9ICQobGlicnNfZ2VuZXJhdGVkX2hlYWRlcnMpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9iYXNlL2xpYnMvcnMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChpbnRlcm1lZGlhdGVzKQorCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIuamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllci5qYXZhCmluZGV4IDEzOWZmMDEuLjRlNmMxNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllci5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllci5qYXZhCkBAIC0xMTU1LDYgKzExNTUsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgdGhlIE1lZGlhUGxheWVyIHRvIHN0YXJ0IHdoZW4gdGhpcyBNZWRpYVBsYXllciBmaW5pc2hlcyBwbGF5YmFjaworICAgICAqIChpLmUuIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtKS4KKyAgICAgKiBUaGUgbWVkaWEgZnJhbWV3b3JrIHdpbGwgYXR0ZW1wdCB0byB0cmFuc2l0aW9uIGZyb20gdGhpcyBwbGF5ZXIgdG8KKyAgICAgKiB0aGUgbmV4dCBhcyBzZWFtbGVzc2x5IGFzIHBvc3NpYmxlLiBUaGUgbmV4dCBwbGF5ZXIgY2FuIGJlIHNldCBhdAorICAgICAqIGFueSB0aW1lIGJlZm9yZSBjb21wbGV0aW9uLiBUaGUgbmV4dCBwbGF5ZXIgbXVzdCBiZSBwcmVwYXJlZCBieSB0aGUKKyAgICAgKiBhcHAsIGFuZCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBjYWxsIHN0YXJ0KCkgb24gaXQuCisgICAgICogVGhlIG5leHQgTWVkaWFQbGF5ZXIgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSAndGhpcycuIEFuIGV4Y2VwdGlvbgorICAgICAqIHdpbGwgYmUgdGhyb3duIGlmIG5leHQgPT0gdGhpcy4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGNhbGwgc2V0TmV4dE1lZGlhUGxheWVyKG51bGwpIHRvIGluZGljYXRlIG5vCisgICAgICogbmV4dCBwbGF5ZXIgc2hvdWxkIGJlIHN0YXJ0ZWQgYXQgdGhlIGVuZCBvZiBwbGF5YmFjay4KKyAgICAgKiBJZiB0aGUgY3VycmVudCBwbGF5ZXIgaXMgbG9vcGluZywgaXQgd2lsbCBrZWVwIGxvb3BpbmcgYW5kIHRoZSBuZXh0CisgICAgICogcGxheWVyIHdpbGwgbm90IGJlIHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dCB0aGUgcGxheWVyIHRvIHN0YXJ0IGFmdGVyIHRoaXMgb25lIGNvbXBsZXRlcyBwbGF5YmFjay4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIG5hdGl2ZSB2b2lkIHNldE5leHRNZWRpYVBsYXllcihNZWRpYVBsYXllciBuZXh0KTsKKworICAgIC8qKgogICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNZWRpYVBsYXllciBvYmplY3QuCiAgICAgICogSXQgaXMgY29uc2lkZXJlZCBnb29kIHByYWN0aWNlIHRvIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB5b3UncmUKICAgICAgKiBkb25lIHVzaW5nIHRoZSBNZWRpYVBsYXllci4gSW4gcGFydGljdWxhciwgd2hlbmV2ZXIgYW4gQWN0aXZpdHkKQEAgLTE2NTksNiArMTY3OSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHdoYXQgPT0gTUVESUFfSU5GTyAmJiBhcmcxID09IE1FRElBX0lORk9fU1RBUlRFRF9BU19ORVhUKSB7CisgICAgICAgICAgICAvLyB0aGlzIGFjcXVpcmVzIHRoZSB3YWtlbG9jayBpZiBuZWVkZWQsIGFuZCBzZXRzIHRoZSBjbGllbnQgc2lkZSBzdGF0ZQorICAgICAgICAgICAgbXAuc3RhcnQoKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobXAubUV2ZW50SGFuZGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBNZXNzYWdlIG0gPSBtcC5tRXZlbnRIYW5kbGVyLm9idGFpbk1lc3NhZ2Uod2hhdCwgYXJnMSwgYXJnMiwgb2JqKTsKICAgICAgICAgICAgIG1wLm1FdmVudEhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7CkBAIC0xOTEzLDYgKzE5MzcsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRURJQV9JTkZPX1VOS05PV04gPSAxOwogCisgICAgLyoqIFRoZSBwbGF5ZXIgd2FzIHN0YXJ0ZWQgYmVjYXVzZSBpdCB3YXMgdXNlZCBhcyB0aGUgbmV4dCBwbGF5ZXIgZm9yIGFub3RoZXIKKyAgICAgKiBwbGF5ZXIsIHdoaWNoIGp1c3QgY29tcGxldGVkIHBsYXliYWNrLgorICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllci5PbkluZm9MaXN0ZW5lcgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyOworCiAgICAgLyoqIFRoZSB2aWRlbyBpcyB0b28gY29tcGxleCBmb3IgdGhlIGRlY29kZXI6IGl0IGNhbid0IGRlY29kZSBmcmFtZXMgZmFzdAogICAgICAqICBlbm91Z2guIFBvc3NpYmx5IG9ubHkgdGhlIGF1ZGlvIHBsYXlzIGZpbmUgYXQgdGhpcyBzdGFnZS4KICAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIuT25JbmZvTGlzdGVuZXIKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKaW5kZXggMDcwZDJkOS4uYTk4Mjc1YSAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvam5pL0FuZHJvaWQubWsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbiBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL210cCBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAkKFBWX0lOQ0xVREVTKSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykKZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcAppbmRleCBmNTcyZjcxLi43NDVlMjUzIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCkBAIC03OTUsNiArNzk1LDMzIEBACiAgICAgcHJvY2Vzc19tZWRpYV9wbGF5ZXJfY2FsbChlbnYsIHRoaXosIG1wLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSksIE5VTEwsIE5VTEwgKTsKIH0KIAorc3RhdGljIHZvaWQKK2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXJfc2V0TmV4dE1lZGlhUGxheWVyKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgamF2YV9wbGF5ZXIpCit7CisgICAgQUxPR1YoInNldE5leHRNZWRpYVBsYXllciIpOworICAgIHNwPE1lZGlhUGxheWVyPiB0aGlzcGxheWVyID0gZ2V0TWVkaWFQbGF5ZXIoZW52LCB0aGl6KTsKKyAgICBpZiAodGhpc3BsYXllciA9PSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLCAiVGhpcyBwbGF5ZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8TWVkaWFQbGF5ZXI+IG5leHRwbGF5ZXIgPSAoamF2YV9wbGF5ZXIgPT0gTlVMTCkgPyBOVUxMIDogZ2V0TWVkaWFQbGF5ZXIoZW52LCBqYXZhX3BsYXllcik7CisgICAgaWYgKG5leHRwbGF5ZXIgPT0gTlVMTCAmJiBqYXZhX3BsYXllciAhPSBOVUxMKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb24iLCAiVGhhdCBwbGF5ZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobmV4dHBsYXllciA9PSB0aGlzcGxheWVyKSB7CisgICAgICAgIGpuaVRocm93RXhjZXB0aW9uKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCAiTmV4dCBwbGF5ZXIgY2FuJ3QgYmUgc2VsZiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIHRpZSB0aGUgdHdvIHBsYXllcnMgdG9nZXRoZXIKKyAgICBwcm9jZXNzX21lZGlhX3BsYXllcl9jYWxsKAorICAgICAgICAgICAgZW52LCB0aGl6LCB0aGlzcGxheWVyLT5zZXROZXh0TWVkaWFQbGF5ZXIobmV4dHBsYXllciksCisgICAgICAgICAgICAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAic2V0TmV4dE1lZGlhUGxheWVyIGZhaWxlZC4iICk7CisgICAgOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKQEAgLTg0MCw2ICs4NjcsNyBAQAogICAgIHsic2V0UGFyYW1ldGVyIiwgICAgICAgICIoSUxhbmRyb2lkL29zL1BhcmNlbDspWiIsICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9zZXRQYXJhbWV0ZXJ9LAogICAgIHsiZ2V0UGFyYW1ldGVyIiwgICAgICAgICIoSUxhbmRyb2lkL29zL1BhcmNlbDspViIsICAgICAgICAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9nZXRQYXJhbWV0ZXJ9LAogICAgIHsibmF0aXZlX3NldFJldHJhbnNtaXRFbmRwb2ludCIsICIoTGphdmEvbGFuZy9TdHJpbmc7SSlJIiwgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9zZXRSZXRyYW5zbWl0RW5kcG9pbnR9LAorICAgIHsic2V0TmV4dE1lZGlhUGxheWVyIiwgICIoTGFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXI7KVYiLCAgICh2b2lkICopYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllcl9zZXROZXh0TWVkaWFQbGF5ZXJ9LAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL21lZGlhZWRpdG9yL0FuZHJvaWQubWsgYi9tZWRpYS9qbmkvbWVkaWFlZGl0b3IvQW5kcm9pZC5tawppbmRleCA2MDAzNjA4Li42ODhlMTgwIDEwMDc1NQotLS0gYS9tZWRpYS9qbmkvbWVkaWFlZGl0b3IvQW5kcm9pZC5taworKysgYi9tZWRpYS9qbmkvbWVkaWFlZGl0b3IvQW5kcm9pZC5tawpAQCAtMzYsMTQgKzM2LDE1IEBACiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKICAgICAkKEpOSV9IX0lOQ0xVREUpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2VkaXRvciBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaS9tZWRpYWVkaXRvciBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvbWVkaWEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci9sdnBwIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9tZWRpYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYworICAgICQoVE9QKS9mcmFtZXdvcmtzL21lZGlhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvdXRpbHMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWFoX3J0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWFoX3J0cC9BbmRyb2lkLm1rCmluZGV4IDU0ZmQ5ZWMuLjFlODdjZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhaF9ydHAvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhYWhfcnRwL0FuZHJvaWQubWsKQEAgLTIxLDkgKzIxLDkgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYSBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0CisgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCmluZGV4IDIzNjcwZGYuLjVlY2M4ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawpAQCAtNTcsNyArNTcsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChKTklfSF9JTkNMVURFKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICBleHRlcm5hbC9pY3U0Yy9jb21tb24gXAogICAgIGV4dGVybmFsL2V4cGF0L2xpYiBcCiAgICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKaW5kZXggNjgwOGFhMi4uMzQ0NTFjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAgICAgICBtSUVmZmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgbUlFZmZlY3QtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwogICAgICAgICB9Ci0gICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9CiAgICAgbUlFZmZlY3QuY2xlYXIoKTsKICAgICBtSUVmZmVjdENsaWVudC5jbGVhcigpOwpAQCAtNDgwLDQgKzQ4MCwzIEBACiAKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDIyYzNhMTguLjA1YWRlNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTI5MywxMyArMjkzLDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgIH0KKyAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgLy8gYWNxdWlyZSBhIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeSBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIGRlc3Ryb3llZAogICAgIC8vIHdoaWxlIHdlIGFyZSBhY2Nlc3NpbmcgdGhlIGNibGsKLSAgICBzcCA8SUF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZCA9IG1BdWRpb1JlY29yZDsKLSAgICBzcCA8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OworICAgIHNwPElBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQgPSBtQXVkaW9SZWNvcmQ7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGlmIChtQWN0aXZlID09IDApIHsKICAgICAgICAgbUFjdGl2ZSA9IDE7CkBAIC02MzgsOCArNjM4LDggQEAKICAgICBtTG9jay5sb2NrKCk7CiAgICAgLy8gYWNxdWlyZSBhIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeSBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIGRlc3Ryb3llZAogICAgIC8vIHdoaWxlIHdlIGFyZSBhY2Nlc3NpbmcgdGhlIGNibGsKLSAgICBzcCA8SUF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZCA9IG1BdWRpb1JlY29yZDsKLSAgICBzcCA8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OworICAgIHNwPElBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQgPSBtQXVkaW9SZWNvcmQ7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OwogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgZG8gewpAQCAtNjg0LDggKzY4NCw4IEBACiAgICAgbUxvY2subG9jaygpOwogICAgIC8vIGFjcXVpcmUgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBJQXVkaW9SZWNvcmQgYW5kIElNZW1vcnkgc28gdGhhdCB0aGV5IGNhbm5vdCBiZSBkZXN0cm95ZWQKICAgICAvLyB3aGlsZSB3ZSBhcmUgYWNjZXNzaW5nIHRoZSBjYmxrCi0gICAgc3AgPElBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQgPSBtQXVkaW9SZWNvcmQ7Ci0gICAgc3AgPElNZW1vcnk+IGlNZW0gPSBtQ2Jsa01lbW9yeTsKKyAgICBzcDxJQXVkaW9SZWNvcmQ+IGF1ZGlvUmVjb3JkID0gbUF1ZGlvUmVjb3JkOworICAgIHNwPElNZW1vcnk+IGlNZW0gPSBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICBtTG9jay51bmxvY2soKTsKIApAQCAtODA2LDcgKzgwNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQUxPR1YoInJlc3RvcmVSZWNvcmRfbCgpIHN0YXR1cyAlZCBtQWN0aXZlICVkIGNibGsgJXAsIG9sZCBjYmxrICVwIGZsYWdzICUwOHggb2xkIGZsYWdzICUwOHgiLAotICAgICAgICAgcmVzdWx0LCBtQWN0aXZlLCBtQ2JsaywgY2JsaywgbUNibGstPmZsYWdzLCBjYmxrLT5mbGFncyk7CisgICAgICAgIHJlc3VsdCwgbUFjdGl2ZSwgbUNibGssIGNibGssIG1DYmxrLT5mbGFncywgY2Jsay0+ZmxhZ3MpOwogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBmcm9tIG5vdyBvbiB3ZSBzd2l0Y2ggdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY2JsawpAQCAtODQzLDQgKzg0MywzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCBhMWNiZjBmLi4zM2M3ZDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC01OSwxNCArNTksMTQgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0ZsaW5nZXIgbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwogICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7IC8vIDAuNSBzCi0gICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOwogICAgICAgICBpZiAoZ0F1ZGlvRmxpbmdlckNsaWVudCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBnQXVkaW9GbGluZ2VyQ2xpZW50ID0gbmV3IEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGdBdWRpb0Vycm9yQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBnQXVkaW9FcnJvckNhbGxiYWNrKE5PX0VSUk9SKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdBdWRpb0ZsaW5nZXJDbGllbnQpOwogICAgICAgICBnQXVkaW9GbGluZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvRmxpbmdlcj4oYmluZGVyKTsKICAgICAgICAgZ0F1ZGlvRmxpbmdlci0+cmVnaXN0ZXJDbGllbnQoZ0F1ZGlvRmxpbmdlckNsaWVudCk7CkBAIC00ODIsNyArNDgyLDcgQEAKIH0KIAogYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIHN3aXRjaChzdHJlYW1UeXBlKSB7CisgICAgc3dpdGNoIChzdHJlYW1UeXBlKSB7CiAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CiAgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKICAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgpAQCAtNTEyLDcgKzUxMiw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBBTE9HVygiQXVkaW9Qb2xpY3lTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKICAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyAwLjUgcwotICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCA9IG5ldyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoKTsKICAgICAgICAgfQpAQCAtNzY4LDQgKzc2OCwzIEBACiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggMzQ1NjNjYS4uMDQ4YmUxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBpZiAobWluQnVmQ291bnQgPCAyKSBtaW5CdWZDb3VudCA9IDI7CiAKICAgICAqZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlID09IDApID8gYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgOgotICAgICAgICAgICAgICBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCAqIHNhbXBsZVJhdGUgLyBhZlNhbXBsZVJhdGU7CisgICAgICAgICAgICBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCAqIHNhbXBsZVJhdGUgLyBhZlNhbXBsZVJhdGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0zNTIsMTMgKzM1MiwxMyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICB9CisgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIC8vIGFjcXVpcmUgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBJTWVtb3J5IGFuZCBJQXVkaW9UcmFjayBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIGRlc3Ryb3llZAogICAgIC8vIHdoaWxlIHdlIGFyZSBhY2Nlc3NpbmcgdGhlIGNibGsKLSAgICBzcCA8SUF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICBzcCA8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OworICAgIHNwPElBdWRpb1RyYWNrPiBhdWRpb1RyYWNrID0gbUF1ZGlvVHJhY2s7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogCiAgICAgaWYgKCFtQWN0aXZlKSB7CkBAIC03NDMsOCArNzQzLDggQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOwotICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCiAgICAgaW50IGFmU2FtcGxlUmF0ZTsKQEAgLTgzMCw3ICs4MzAsNyBAQAogICAgICAgICBtQ2Jsay0+YnVmZmVycyA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrLT5idWZmZXJzID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7Ci0gICAgICAgICAvLyBGb3JjZSBidWZmZXIgZnVsbCBjb25kaXRpb24gYXMgZGF0YSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gc2hhcmVkIG1lbW9yeQorICAgICAgICAvLyBGb3JjZSBidWZmZXIgZnVsbCBjb25kaXRpb24gYXMgZGF0YSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gc2hhcmVkIG1lbW9yeQogICAgICAgICBtQ2Jsay0+c3RlcFVzZXIobUNibGstPmZyYW1lQ291bnQpOwogICAgIH0KIApAQCAtOTkxLDggKzk5MSw4IEBACiAgICAgLy8gYWNxdWlyZSBhIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIElNZW1vcnkgYW5kIElBdWRpb1RyYWNrIHNvIHRoYXQgdGhleSBjYW5ub3QgYmUgZGVzdHJveWVkCiAgICAgLy8gd2hpbGUgd2UgYXJlIGFjY2Vzc2luZyB0aGUgY2JsawogICAgIG1Mb2NrLmxvY2soKTsKLSAgICBzcCA8SUF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICBzcCA8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OworICAgIHNwPElBdWRpb1RyYWNrPiBhdWRpb1RyYWNrID0gbUF1ZGlvVHJhY2s7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OwogICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgc3NpemVfdCB3cml0dGVuID0gMDsKQEAgLTEwOTUsOCArMTA5NSw4IEBACiAgICAgbUxvY2subG9jaygpOwogICAgIC8vIGFjcXVpcmUgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBJTWVtb3J5IGFuZCBJQXVkaW9UcmFjayBzbyB0aGF0IHRoZXkgY2Fubm90IGJlIGRlc3Ryb3llZAogICAgIC8vIHdoaWxlIHdlIGFyZSBhY2Nlc3NpbmcgdGhlIGNibGsKLSAgICBzcCA8SUF1ZGlvVHJhY2s+IGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICBzcCA8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OworICAgIHNwPElBdWRpb1RyYWNrPiBhdWRpb1RyYWNrID0gbUF1ZGlvVHJhY2s7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZTsKICAgICBtTG9jay51bmxvY2soKTsKQEAgLTEyMjQsNyArMTIyNCw3IEBACiAKICAgICBpZiAoIShhbmRyb2lkX2F0b21pY19vcihDQkxLX1JFU1RPUklOR19PTiwgJmNibGstPmZsYWdzKSAmIENCTEtfUkVTVE9SSU5HX01TSykpIHsKICAgICAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzIFRJRCAlZCIsCi0gICAgICAgICAgICAgZnJvbVN0YXJ0ID8gInN0YXJ0KCkiIDogIm9idGFpbkJ1ZmZlcigpIiwgZ2V0dGlkKCkpOworICAgICAgICAgICAgZnJvbVN0YXJ0ID8gInN0YXJ0KCkiIDogIm9idGFpbkJ1ZmZlcigpIiwgZ2V0dGlkKCkpOwogCiAgICAgICAgIC8vIHNpZ25hbCBvbGQgY2JsayBjb25kaXRpb24gc28gdGhhdCBvdGhlciB0aHJlYWRzIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBidWZmZXJzIHN0b3AKICAgICAgICAgLy8gd2FpdGluZyBub3cKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgQUxPR1YoInJlc3RvcmVUcmFja19sKCkgc3RhdHVzICVkIG1BY3RpdmUgJWQgY2JsayAlcCwgb2xkIGNibGsgJXAgZmxhZ3MgJTA4eCBvbGQgZmxhZ3MgJTA4eCIsCi0gICAgICAgICByZXN1bHQsIG1BY3RpdmUsIG1DYmxrLCBjYmxrLCBtQ2Jsay0+ZmxhZ3MsIGNibGstPmZsYWdzKTsKKyAgICAgICAgcmVzdWx0LCBtQWN0aXZlLCBtQ2JsaywgY2JsaywgbUNibGstPmZsYWdzLCBjYmxrLT5mbGFncyk7CiAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIGZyb20gbm93IG9uIHdlIHN3aXRjaCB0byB0aGUgbmV3bHkgY3JlYXRlZCBjYmxrCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDQ3YzI2MWRhLi4wN2IxMmU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcApAQCAtNjIyLDExICs2MjIsMTEgQEAKICAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0OwogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKKyAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwpAQCAtNjc5LDcgKzY3OSw3IEBACiBzdGF0dXNfdCBCbkF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewotICAgIHN3aXRjaChjb2RlKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcGlkX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTc0NSw3ICs3NDUsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGxhdGVuY3koKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICAgY2FzZSBTRVRfTUFTVEVSX1ZPTFVNRTogeworICAgICAgICBjYXNlIFNFVF9NQVNURVJfVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1hc3RlclZvbHVtZShkYXRhLnJlYWRGbG9hdCgpKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODE1LDE0ICs4MTUsMTQgQEAKICAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyhkYXRhLnJlYWRTdHJpbmc4KCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhpb0hhbmRsZSwga2V5VmFsdWVQYWlycykpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBHRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgU3RyaW5nOCBrZXlzKGRhdGEucmVhZFN0cmluZzgoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGdldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleXMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUdJU1RFUl9DTElFTlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IDFkYjM5YTMuLjQxNzhiMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC02OCw3ICs2OCw3IEBACiBzdGF0dXNfdCBCbkF1ZGlvRmxpbmdlckNsaWVudDo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewotICAgIHN3aXRjaChjb2RlKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgY2FzZSBJT19DT05GSUdfQ0hBTkdFRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBldmVudCA9IGRhdGEucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGRhN2MxMjQuLjUwNDBiZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0zNjUsNyArMzY1LDcgQEAKIHN0YXR1c190IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCmluZGV4IDZiNDczYzkuLjM3N2I5YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcApAQCAtMiwxNiArMiwxNiBAQAogKioKICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAqKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvUmVjb3JkPihpbXBsKQogICAgIHsKICAgICB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KHBpZF90IHRpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTU1LDE0ICs1NSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIAorCiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUmVjb3JkOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUCwgZGF0YSwgJnJlcGx5KTsKICAgICB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNibGs7Ci0gICAgfSAgICAKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQsICJhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZCIpOwpAQCAtODMsOCArODMsOCBAQAogc3RhdHVzX3QgQm5BdWRpb1JlY29yZDo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgY2FzZSBHRVRfQ0JMSzogeworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIEdFVF9DQkxLOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUmVjb3JkLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoZ2V0Q2JsaygpLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTEwNSw0ICsxMDUsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggMjhlYmJiZmMuLjA5ZjMxYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb1RyYWNrPihpbXBsKQogICAgIHsKICAgICB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzQsMTQgKzc0LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgCisKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1AsIGRhdGEsICZyZXBseSk7CiAgICAgfQotICAgIAorCiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTk2LDE0ICs5NiwxNCBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNVVRFLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KLSAgICAKKwogICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBBVVNFLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KLSAgICAKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTE3Miw4ICsxNzIsOCBAQAogc3RhdHVzX3QgQm5BdWRpb1RyYWNrOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICBjYXNlIEdFVF9DQkxLOiB7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCmluZGV4IDVkNDBjYzguLmEzMDNhOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCkBAIC0xMjksNyArMTI5LDcgQEAKIHN0YXR1c190IEJuRWZmZWN0OjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBFTkFCTEU6IHsKICAgICAgICAgICAgIEFMT0dWKCJFTkFCTEUiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CkBAIC0xODYsMTAgKzE4NiwxMCBAQAogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKLSAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihnZXRDYmxrKCktPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0xOTksNCArMTk5LDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcAppbmRleCA0NjkzYjQ1Li5hZWY0MzcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcApAQCAtOTQsNyArOTQsNyBAQAogc3RhdHVzX3QgQm5FZmZlY3RDbGllbnQ6Om9uVHJhbnNhY3QoCiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKLSAgICBzd2l0Y2goY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENPTlRST0xfU1RBVFVTX0NIQU5HRUQ6IHsKICAgICAgICAgICAgIEFMT0dWKCJDT05UUk9MX1NUQVRVU19DSEFOR0VEIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOwpAQCAtMTQyLDQgKzE0MiwzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKaW5kZXggYWViMzVhNS4uOTE5OWRiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAKQEAgLTQzLDEwICs0MywxMCBAQAogICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBBTE9HVygiTWVkaWEgcGxheWVyIHNlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOwotICAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyAwLjUgcwotICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1coIk1lZGlhIHBsYXllciBzZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyAwLjUgcworICAgICAgICB9IHdoaWxlICh0cnVlKTsKIAogICAgICAgICBpZiAoc0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgewogICAgICAgICBzRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBjNDdmYTQxLi4wYmIyMzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTU1LDYgKzU1LDcgQEAKICAgICBTRVRfUEFSQU1FVEVSLAogICAgIEdFVF9QQVJBTUVURVIsCiAgICAgU0VUX1JFVFJBTlNNSVRfRU5EUE9JTlQsCisgICAgU0VUX05FWFRfUExBWUVSLAogfTsKIAogY2xhc3MgQnBNZWRpYVBsYXllcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllcj4KQEAgLTMwNyw3ICszMDgsMTUgQEAKICAgICAgICAgaWYgKE9LICE9IGVycikgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBwbGF5ZXIpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzcDxJQmluZGVyPiBiKHBsYXllci0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYik7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTkVYVF9QTEFZRVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiB9OwpAQCAtMzE5LDcgKzMyOCw3IEBACiBzdGF0dXNfdCBCbk1lZGlhUGxheWVyOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7Ci0gICAgc3dpdGNoKGNvZGUpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBESVNDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC00ODksNyArNDk4LDExIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFJldHJhbnNtaXRFbmRwb2ludChOVUxMKSk7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfTkVYVF9QTEFZRVI6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE5leHRQbGF5ZXIoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwCmluZGV4IDFmMTM1YzQuLmE2NzBjOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcApAQCAtNTYsNyArNTYsNyBAQAogc3RhdHVzX3QgQm5NZWRpYVBsYXllckNsaWVudDo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogewotICAgIHN3aXRjaChjb2RlKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgTk9USUZZOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgbXNnID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZjViNWNiZC4uZjVmY2NlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTEzMiw3ICsxMzIsNyBAQAogc3RhdHVzX3QgQm5NZWRpYVBsYXllclNlcnZpY2U6Om9uVHJhbnNhY3QoCiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKLSAgICBzd2l0Y2goY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENSRUFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggMmY0ZTMxYS4uYTcxMGZkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtMjg5LDcgKzI4OSw3IEBACiBzdGF0dXNfdCBCbk1lZGlhUmVjb3JkZXI6Om9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKLSAgICBzd2l0Y2goY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFJFTEVBU0U6IHsKICAgICAgICAgICAgIEFMT0dWKCJSRUxFQVNFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCBmZjIzNWM5Li5lNzkwN2UzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC01Myw3ICs1Myw3IEBACiBzdGF0dXNfdCBCbk1lZGlhUmVjb3JkZXJDbGllbnQ6Om9uVHJhbnNhY3QoCiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKLSAgICBzd2l0Y2goY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIE5PVElGWTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgbXNnID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCmluZGV4IGE4NTk1NmMuLjMxMmE0OTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcApAQCAtNzQsMTQgKzc0LDE0IEBACiAKICAgICAvLyBpbml0IHRoZSBFQVMgbGlicmFyeQogICAgIHJlc3VsdCA9IEVBU19Jbml0KCZtRWFzRGF0YSk7Ci0gICAgaWYoIHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgeworICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKICAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBFcnJvciBpbml0aWFsaXppbmcgU29uaXZveCBFQVMgbGlicmFyeSwgYWJvcnRpbmcuIik7CiAgICAgICAgIG1TdGF0ZSA9IEVBU19TVEFURV9FUlJPUjsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgLy8gaW5pdCB0aGUgSkVUIGxpYnJhcnkgd2l0aCB0aGUgZGVmYXVsdCBhcHAgZXZlbnQgY29udHJvbGxlciByYW5nZQogICAgIHJlc3VsdCA9IEpFVF9Jbml0KG1FYXNEYXRhLCBOVUxMLCBzaXplb2YoU19KRVRfQ09ORklHKSk7Ci0gICAgaWYoIHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgeworICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKICAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBFcnJvciBpbml0aWFsaXppbmcgSkVUIGxpYnJhcnksIGFib3J0aW5nLiIpOwogICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfRVJST1I7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKICAgICB9CiAgICAgbUVhc0RhdGEgPSBOVUxMOwotICAgIAorCiAgICAgcmV0dXJuIEVBU19TVUNDRVNTOwogfQogCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICBBTE9HVigiSmV0UGxheWVyOjpyZW5kZXIoKTogZW50ZXJpbmciKTsKIAogICAgIC8vIGFsbG9jYXRlIHJlbmRlciBidWZmZXIKLSAgICBtQXVkaW9CdWZmZXIgPSAKKyAgICBtQXVkaW9CdWZmZXIgPQogICAgICAgICBuZXcgRUFTX1BDTVtwTGliQ29uZmlnLT5taXhCdWZmZXJTaXplICogcExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMgKiBNSVhfTlVNX0JVRkZFUlNdOwogCiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZApAQCAtMTc3LDggKzE3Nyw4IEBACiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQogCi0gICB3aGlsZSAoMSkgewotICAgIAorICAgIHdoaWxlICgxKSB7CisKICAgICAgICAgbU11dGV4LmxvY2soKTsgLy8gW1tbW1tbW1sgTE9DSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgICAgICBpZiAobUVhc0RhdGEgPT0gTlVMTCkgewpAQCAtMTg2LDIwICsxODYsMjAgQEAKICAgICAgICAgICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiBOVUxMIEVBUyBkYXRhLCBleGl0aW5nIHJlbmRlci4iKTsKICAgICAgICAgICAgIGdvdG8gdGhyZWFkRXhpdDsKICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgLy8gbm90aGluZyB0byByZW5kZXIsIHdhaXQgZm9yIGNsaWVudCB0aHJlYWQgdG8gd2FrZSB1cyB1cAogICAgICAgICB3aGlsZSAoIW1SZW5kZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiBzaWduYWwgd2FpdCIpOwotICAgICAgICAgICAgaWYgKGF1ZGlvU3RhcnRlZCkgeyAKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsgCisgICAgICAgICAgICBpZiAoYXVkaW9TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byByZXN0YXJ0IHRoZSBwbGF5YmFjayBvbmNlIHdlIHN0YXJ0IHJlbmRlcmluZyBhZ2FpbgogICAgICAgICAgICAgICAgIGF1ZGlvU3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CiAgICAgICAgICAgICBBTE9HVigiSmV0UGxheWVyOjpyZW5kZXIoKTogc2lnbmFsIHJ4J2QiKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvLyByZW5kZXIgbWlkaSBkYXRhIGludG8gdGhlIGlucHV0IGJ1ZmZlcgogICAgICAgICBpbnQgbnVtX291dHB1dCA9IDA7CiAgICAgICAgIEVBU19QQ00qIHAgPSBtQXVkaW9CdWZmZXI7CkBAIC0yMTAsOCArMjEwLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHAgKz0gY291bnQgKiBwTGliQ29uZmlnLT5udW1DaGFubmVsczsKICAgICAgICAgICAgIG51bV9vdXRwdXQgKz0gY291bnQgKiBwTGliQ29uZmlnLT5udW1DaGFubmVscyAqIHNpemVvZihFQVNfUENNKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgIC8vIHNlbmQgZXZlbnRzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgKGlmIGFueSkgdG8gdGhlIGV2ZW50IGNhbGxiYWNrCisKKyAgICAgICAgICAgIC8vIHNlbmQgZXZlbnRzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgKGlmIGFueSkgdG8gdGhlIGV2ZW50IGNhbGxiYWNrCiAgICAgICAgICAgICBmaXJlRXZlbnRzRnJvbUpldFF1ZXVlKCk7CiAgICAgICAgIH0KIApAQCAtMjY1LDkgKzI2NSw5IEBACiAvLyBwcmVjb25kaXRpb246IG1NdXRleCBsb2NrZWQKIHZvaWQgSmV0UGxheWVyOjpmaXJlVXBkYXRlT25TdGF0dXNDaGFuZ2UoKQogewotICAgIGlmKCAgKG1KZXRTdGF0dXMuY3VycmVudFVzZXJJRCAgICAgICE9IG1QcmV2aW91c0pldFN0YXR1cy5jdXJyZW50VXNlcklEKQorICAgIGlmICggKG1KZXRTdGF0dXMuY3VycmVudFVzZXJJRCAgICAgICE9IG1QcmV2aW91c0pldFN0YXR1cy5jdXJyZW50VXNlcklEKQogICAgICAgIHx8KG1KZXRTdGF0dXMuc2VnbWVudFJlcGVhdENvdW50ICE9IG1QcmV2aW91c0pldFN0YXR1cy5zZWdtZW50UmVwZWF0Q291bnQpICkgewotICAgICAgICBpZihtRXZlbnRDYWxsYmFjaykgIHsKKyAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrKSAgewogICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2soCiAgICAgICAgICAgICAgICAgSmV0UGxheWVyOjpKRVRfVVNFUklEX1VQREFURSwKICAgICAgICAgICAgICAgICBtSmV0U3RhdHVzLmN1cnJlbnRVc2VySUQsCkBAIC0yNzgsOCArMjc4LDggQEAKICAgICAgICAgbVByZXZpb3VzSmV0U3RhdHVzLnNlZ21lbnRSZXBlYXRDb3VudCA9IG1KZXRTdGF0dXMuc2VnbWVudFJlcGVhdENvdW50OwogICAgIH0KIAotICAgIGlmKG1KZXRTdGF0dXMubnVtUXVldWVkU2VnbWVudHMgIT0gbVByZXZpb3VzSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzKSB7Ci0gICAgICAgIGlmKG1FdmVudENhbGxiYWNrKSAgeworICAgIGlmIChtSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzICE9IG1QcmV2aW91c0pldFN0YXR1cy5udW1RdWV1ZWRTZWdtZW50cykgeworICAgICAgICBpZiAobUV2ZW50Q2FsbGJhY2spICB7CiAgICAgICAgICAgICBtRXZlbnRDYWxsYmFjaygKICAgICAgICAgICAgICAgICBKZXRQbGF5ZXI6OkpFVF9OVU1RVUVVRURTRUdNRU5UX1VQREFURSwKICAgICAgICAgICAgICAgICBtSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzLApAQCAtMjg5LDggKzI4OSw4IEBACiAgICAgICAgIG1QcmV2aW91c0pldFN0YXR1cy5udW1RdWV1ZWRTZWdtZW50cyAgPSBtSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzOwogICAgIH0KIAotICAgIGlmKG1KZXRTdGF0dXMucGF1c2VkICE9IG1QcmV2aW91c0pldFN0YXR1cy5wYXVzZWQpIHsKLSAgICAgICAgaWYobUV2ZW50Q2FsbGJhY2spICB7CisgICAgaWYgKG1KZXRTdGF0dXMucGF1c2VkICE9IG1QcmV2aW91c0pldFN0YXR1cy5wYXVzZWQpIHsKKyAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrKSAgewogICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2soSmV0UGxheWVyOjpKRVRfUEFVU0VfVVBEQVRFLAogICAgICAgICAgICAgICAgIG1KZXRTdGF0dXMucGF1c2VkLAogICAgICAgICAgICAgICAgIC0xLApAQCAtMzA3LDcgKzMwNyw3IEBACiAvLyBwcmVjb25kaXRpb246IG1NdXRleCBsb2NrZWQKIHZvaWQgSmV0UGxheWVyOjpmaXJlRXZlbnRzRnJvbUpldFF1ZXVlKCkKIHsKLSAgICBpZighbUV2ZW50Q2FsbGJhY2spIHsKKyAgICBpZiAoIW1FdmVudENhbGxiYWNrKSB7CiAgICAgICAgIC8vIG5vIGNhbGxiYWNrLCBqdXN0IGVtcHR5IHRoZSBldmVudCBxdWV1ZQogICAgICAgICB3aGlsZSAoSkVUX0dldEV2ZW50KG1FYXNEYXRhLCBOVUxMLCBOVUxMKSkgeyB9CiAgICAgICAgIHJldHVybjsKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgIG1FYXNKZXRGaWxlTG9jLT5vZmZzZXQgPSAwOwogCiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1FYXNKZXRGaWxlTG9jKTsKLSAgICBpZihyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpCisgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKICAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwogICAgIGVsc2UKICAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX09QRU47CkBAIC0zNTMsNyArMzUzLDcgQEAKIGludCBKZXRQbGF5ZXI6OmxvYWRGcm9tRkQoY29uc3QgaW50IGZkLCBjb25zdCBsb25nIGxvbmcgb2Zmc2V0LCBjb25zdCBsb25nIGxvbmcgbGVuZ3RoKQogewogICAgIEFMT0dWKCJKZXRQbGF5ZXI6OmxvYWRGcm9tRkQoKTogZmQ9JWQgb2Zmc2V0PSVsbGQgbGVuZ3RoPSVsbGQiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIAorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIG1FYXNKZXRGaWxlTG9jID0gKEVBU19GSUxFX0xPQ0FUT1IpIG1hbGxvYyhzaXplb2YoRUFTX0ZJTEUpKTsKQEAgLTM2MSw5ICszNjEsOSBAQAogICAgIG1FYXNKZXRGaWxlTG9jLT5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUVhc0pldEZpbGVMb2MtPmxlbmd0aCA9IGxlbmd0aDsKICAgICBtRWFzSmV0RmlsZUxvYy0+cGF0aCA9IE5VTEw7Ci0gICAgCisKICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEpFVF9PcGVuRmlsZShtRWFzRGF0YSwgbUVhc0pldEZpbGVMb2MpOwotICAgIGlmKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKKyAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKQogICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfRVJST1I7CiAgICAgZWxzZQogICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfT1BFTjsKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAgICAgSkVUX1N0YXR1cyhtRWFzRGF0YSwgJm1KZXRTdGF0dXMpOwogICAgIHRoaXMtPmR1bXBKZXRTdGF0dXMoJm1KZXRTdGF0dXMpOwotICAgIAorCiAgICAgZmlyZVVwZGF0ZU9uU3RhdHVzQ2hhbmdlKCk7CiAKICAgICAvLyB3YWtlIHVwIHJlbmRlciB0aHJlYWQKQEAgLTQ2OCw3ICs0NjgsNyBAQAogCiB2b2lkIEpldFBsYXllcjo6ZHVtcEpldFN0YXR1cyhTX0pFVF9TVEFUVVMqIHBKZXRTdGF0dXMpCiB7Ci0gICAgaWYocEpldFN0YXR1cyE9TlVMTCkKKyAgICBpZiAocEpldFN0YXR1cyE9TlVMTCkKICAgICAgICAgQUxPR1YoIj4+IGN1cnJlbnQgSkVUIHBsYXllciBzdGF0dXM6IHVzZXJJRD0lZCBzZWdtZW50UmVwZWF0Q291bnQ9JWQgbnVtUXVldWVkU2VnbWVudHM9JWQgcGF1c2VkPSVkIiwKICAgICAgICAgICAgICAgICBwSmV0U3RhdHVzLT5jdXJyZW50VXNlcklELCBwSmV0U3RhdHVzLT5zZWdtZW50UmVwZWF0Q291bnQsCiAgICAgICAgICAgICAgICAgcEpldFN0YXR1cy0+bnVtUXVldWVkU2VnbWVudHMsIHBKZXRTdGF0dXMtPnBhdXNlZCk7CkBAIC00NzgsNCArNDc4LDMgQEAKIAogCiB9IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDkzZGRjYTguLmMyMjRmMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8ZXhwYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTEwOTksMTIgKzEwOTksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKIHsKICAgICBBTE9HVigiZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lOiAlcyBmb3IgY2FtZXJhICVkLCBxdWFsaXR5ICVkIiwKLSAgICAgICAgIG5hbWUsIGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwogCiAgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgQUxPR0UoIlRoZSBnaXZlbiBjYW1jb3JkZXIgcHJvZmlsZSBjYW1lcmEgJWQgcXVhbGl0eSAlZCBpcyBub3QgZm91bmQiLAotICAgICAgICAgICAgIGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIGNhbWVyYUlkLCBxdWFsaXR5KTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggNzNkNDUxOS4uMjhiNWFhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC01NCw3ICs1NCw3IEBACiB2b2lkIE1lZGlhU2Nhbm5lcjo6bG9hZFNraXBMaXN0KCkgewogICAgIG1Ta2lwTGlzdCA9IChjaGFyICopbWFsbG9jKFBST1BFUlRZX1ZBTFVFX01BWCAqIHNpemVvZihjaGFyKSk7CiAgICAgaWYgKG1Ta2lwTGlzdCkgewotICAgICAgcHJvcGVydHlfZ2V0KCJ0ZXN0aW5nLm1lZGlhc2Nhbm5lci5za2lwbGlzdCIsIG1Ta2lwTGlzdCwgIiIpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInRlc3RpbmcubWVkaWFzY2FubmVyLnNraXBsaXN0IiwgbVNraXBMaXN0LCAiIik7CiAgICAgfQogICAgIGlmICghbVNraXBMaXN0IHx8IChzdHJsZW4obVNraXBMaXN0KSA9PSAwKSkgewogICAgICAgICBmcmVlKG1Ta2lwTGlzdCk7CkBAIC0xMzUsOCArMTM1LDggQEAKICAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKIAogICAgIGlmIChzaG91bGRTa2lwRGlyZWN0b3J5KHBhdGgpKSB7Ci0gICAgICBBTE9HRCgiU2tpcHBpbmc6ICVzIiwgcGF0aCk7Ci0gICAgICByZXR1cm4gTUVESUFfU0NBTl9SRVNVTFRfT0s7CisgICAgICAgIEFMT0dEKCJTa2lwcGluZzogJXMiLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogICAgIH0KIAogICAgIC8vIFRyZWF0IGFsbCBmaWxlcyBhcyBub24tbWVkaWEgaW4gZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGEgICIubm9tZWRpYSIgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggY2RmZDQ3Ny4uZTFlMzM0ODM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKQEAgLTIyOCw0ICsyMjgsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZXRhZGF0YS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZXRhZGF0YS5jcHAKaW5kZXggNTQ2YTliMC4uZWY4YTllZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWV0YWRhdGEuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01ldGFkYXRhLmNwcApAQCAtNTcsNyArNTcsNyBAQAogCiBNZXRhZGF0YTo6TWV0YWRhdGEoUGFyY2VsICpwKQogICAgIDptRGF0YShwKSwKLSAgICAgbUJlZ2luKHAtPmRhdGFQb3NpdGlvbigpKSB7IH0KKyAgICAgIG1CZWdpbihwLT5kYXRhUG9zaXRpb24oKSkgeyB9CiAKIE1ldGFkYXRhOjp+TWV0YWRhdGEoKSB7IH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA5YzMxNzBjLi43MTdkMzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjY4LDggKzI2OCw4IEBACiAgICAgICAgICAgcmVwZWF0Q250OiAwLAogICAgICAgICAgIHJlcGVhdFNlZ21lbnQ6IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9DRE1BX0NBTExfU0lHTkFMX0lTRE5fU1BfUFJJCiAgICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMCwgIHdhdmVGcmVxOiB7IDAgfSwgMCwgMH0gfSwKLSAgICAgICAgICAgcmVwZWF0Q250OiAwLAotICAgICAgICAgICByZXBlYXRTZWdtZW50OiAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQ0RNQV9DQUxMX1NJR05BTF9JU0ROX1BBVDMKKyAgICAgICAgICByZXBlYXRDbnQ6IDAsCisgICAgICAgICAgcmVwZWF0U2VnbWVudDogMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0NETUFfQ0FMTF9TSUdOQUxfSVNETl9QQVQzCiAgICAgICAgIHsgc2VnbWVudHM6IHsgeyBkdXJhdGlvbjogMzIsIHdhdmVGcmVxOiB7IDIwOTEsIDAgfSwgMCwgMCB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDY0LCB3YXZlRnJlcTogeyAyNTU2LCAwIH0sIDQsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiAyMCwgd2F2ZUZyZXE6IHsgMjA5MSwgMCB9LCAwLCAwIH0sCkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogICAgICAgICBtcEF1ZGlvVHJhY2sgPSBOVUxMOwogICAgIH0KIAotICAgLy8gT3BlbiBhdWRpbyB0cmFjayBpbiBtb25vLCBQQ00gMTZiaXQsIGRlZmF1bHQgc2FtcGxpbmcgcmF0ZSwgZGVmYXVsdCBidWZmZXIgc2l6ZQorICAgIC8vIE9wZW4gYXVkaW8gdHJhY2sgaW4gbW9ubywgUENNIDE2Yml0LCBkZWZhdWx0IHNhbXBsaW5nIHJhdGUsIGRlZmF1bHQgYnVmZmVyIHNpemUKICAgICBtcEF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwogICAgIEFMT0dWKCJDcmVhdGUgVHJhY2s6ICVwIiwgbXBBdWRpb1RyYWNrKTsKIApAQCAtMTI4NCw5ICsxMjg0LDkgQEAKICAgICAgICAgICAgIEFMT0dWKCJDYmsgc3RhcnRpbmcgdHJhY2siKTsKICAgICAgICAgICAgIGxwVG9uZUdlbi0+bVN0YXRlID0gVE9ORV9QTEFZSU5HOwogICAgICAgICAgICAgbFNpZ25hbCA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVE9ORV9QTEFZSU5HOgotICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gRm9yY2UgbG9vcCBleGl0CiAgICAgICAgICAgICBsTnVtU21wID0gMDsKQEAgLTE1NzgsNCArMTU3OCwzIEBACiB9CiAKIH0gIC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCmluZGV4IDcwZjhjMGMuLmJjZDZhZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdC0+bUxvY2subG9jaygpOwotICAgICB9CisgICAgfQogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9FZmZlY3Q6OnNldEVuYWJsZWQoZW5hYmxlZCk7CiAKQEAgLTMyMCw0ICszMjAsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCmluZGV4IDhkNTMzNTcuLmIwMjQxYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVygiTWVkaWFQbGF5ZXJTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKICAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyAwLjUgcwotICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICAgaWYgKHNEZWF0aE5vdGlmaWVyID09IE5VTEwpIHsKICAgICAgICAgICAgIHNEZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDRmZjE4NjIuLmI1MmEzN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTE5NSw4ICsxOTUsOCBAQAogICAgICAgICAgICAgKG1DdXJyZW50U3RhdGUgIT0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX0lETEUpICE9IE1FRElBX1BMQVlFUl9JRExFKTsKICAgICBpZiAoKG1QbGF5ZXIgIT0gTlVMTCkgJiYgaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgICBBTE9HVigiaW52b2tlICVkIiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKLSAgICAgICAgIHJldHVybiAgbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKKyAgICAgICAgQUxPR1YoImludm9rZSAlZCIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIHJldHVybiAgbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKICAgICB9CiAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNTU2LDkgKzU1Niw5IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7Ci0gICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQpOworICAgICAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTYxMCw3ICs2MTAsNyBAQAogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICByZXR1cm4gIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKKyAgICAgICAgcmV0dXJuICBtUGxheWVyLT5nZXRQYXJhbWV0ZXIoa2V5LCByZXBseSk7CiAgICAgfQogICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC02NTgsNyArNjU4LDcgQEAKICAgICAvLyBhbmQgc2Vla1RvIHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgogICAgIC8vIEZJWE1FOiBSZW1lbWJlciwgdGhpcyBpcyBhIGhhY2ssIGl0J3Mgbm90IGV2ZW4gYSBoYWNrIHRoYXQgaXMgYXBwbGllZAogICAgIC8vIGNvbnNpc3RlbnRseSBmb3IgYWxsIHVzZS1jYXNlcywgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQuCi0gICAgIGlmIChtTG9ja1RocmVhZElkICE9IGdldFRocmVhZElkKCkpIHsKKyAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICB9CkBAIC03ODgsNCArNzg4LDExIEBACiAKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIG5leHQpIHsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+c2V0TmV4dFBsYXllcihuZXh0ID09IE5VTEwgPyBOVUxMIDogbmV4dC0+bVBsYXllcik7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IGNjNzMwMTQuLjk1NDEwMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHkpCiB7CiAgICAgQUxPR1YoInNldENhbWVyYSglcCwlcCkiLCBjYW1lcmEuZ2V0KCksIHByb3h5LmdldCgpKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTUyLDcgKzUyLDcgQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKQogewogICAgIEFMT0dWKCJzZXRQcmV2aWV3U3VyZmFjZSglcCkiLCBzdXJmYWNlLmdldCgpKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTc3LDcgKzc3LDcgQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OmluaXQoKQogewogICAgIEFMT0dWKCJpbml0Iik7Ci0gICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0xMDcsNyArMTA3LDcgQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFZpZGVvU291cmNlKGludCB2cykKIHsKICAgICBBTE9HVigic2V0VmlkZW9Tb3VyY2UoJWQpIiwgdnMpOwotICAgIGlmKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMTQyLDcgKzE0Miw3IEBACiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRBdWRpb1NvdXJjZShpbnQgYXMpCiB7CiAgICAgQUxPR1YoInNldEF1ZGlvU291cmNlKCVkKSIsIGFzKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTE3NSw3ICsxNzUsNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0Rm9ybWF0KGludCBvZikKIHsKICAgICBBTE9HVigic2V0T3V0cHV0Rm9ybWF0KCVkKSIsIG9mKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTIwMSw3ICsyMDEsNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0VmlkZW9FbmNvZGVyKGludCB2ZSkKIHsKICAgICBBTE9HVigic2V0VmlkZW9FbmNvZGVyKCVkKSIsIHZlKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTIzMSw3ICsyMzEsNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0QXVkaW9FbmNvZGVyKGludCBhZSkKIHsKICAgICBBTE9HVigic2V0QXVkaW9FbmNvZGVyKCVkKSIsIGFlKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTI2MSw3ICsyNjEsNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKQogewogICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVzKSIsIHBhdGgpOwotICAgIGlmKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMjg3LDcgKzI4Nyw3IEBACiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewogICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMjQsNyArMzI0LDcgQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgQUxPR1YoInNldFZpZGVvU2l6ZSglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zNjcsNyArMzY3LDcgQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkKIHsKICAgICBBTE9HVigic2V0VmlkZW9GcmFtZVJhdGUoJWQpIiwgZnJhbWVzX3Blcl9zZWNvbmQpOwotICAgIGlmKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzkxLDcgKzM5MSw3IEBACiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoJXMpIiwgcGFyYW1zLnN0cmluZygpKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQxOSw3ICs0MTksNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6cHJlcGFyZSgpCiB7CiAgICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQ1OCw3ICs0NTgsNyBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0TWF4QW1wbGl0dWRlKGludCogbWF4KQogewogICAgIEFMT0dWKCJnZXRNYXhBbXBsaXR1ZGUiKTsKLSAgICBpZihtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTUzNiw3ICs1MzYsNyBAQAogCiAgICAgZG9DbGVhblVwKCk7CiAgICAgc3RhdHVzX3QgcmV0ID0gVU5LTk9XTl9FUlJPUjsKLSAgICBzd2l0Y2gobUN1cnJlbnRTdGF0ZSkgeworICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgewogICAgICAgICBjYXNlIE1FRElBX1JFQ09SREVSX0lETEU6CiAgICAgICAgICAgICByZXQgPSBPSzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgICAgIGNhc2UgTUVESUFfUkVDT1JERVJfRVJST1I6IHsKICAgICAgICAgICAgIHJldCA9IGRvUmVzZXQoKTsKICAgICAgICAgICAgIGlmIChPSyAhPSByZXQpIHsKLSAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAvLyBObyBuZWVkIHRvIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgIC8vIE5vIG5lZWQgdG8gY29udGludWUKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgLy8gSW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoCiAgICAgICAgIGNhc2UgTUVESUFfUkVDT1JERVJfSU5JVElBTElaRUQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGU1MjE2NDguLjQxYmNhYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0zNiwxMyArMzYsMTMgQEAKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCAgICAgICAgICAgICAgICAgICAgIFwKIAotTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitMT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJJChKTklfSF9JTkNMVURFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvL1RyZW1vbG8gXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggICAgICAgICAgICAgICAgICBcCisJJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbwogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBiYmM1M2YzLi4xY2MxMjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMTA2OCw2ICsxMDY4LDIwIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldE5leHRQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKSB7CisgICAgQUxPR1YoInNldE5leHRQbGF5ZXIiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3A8Q2xpZW50PiBjID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4ocGxheWVyLmdldCgpKTsKKyAgICBtTmV4dENsaWVudCA9IGM7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMICYmIGMgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldE5leHRPdXRwdXQoYy0+bUF1ZGlvT3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgibm8gY3VycmVudCBhdWRpbyBvdXRwdXQiKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZWVrVG8oaW50IG1zZWMpCiB7CiAgICAgQUxPR1YoIlslZF0gc2Vla1RvKCVkKSIsIG1Db25uSWQsIG1zZWMpOwpAQCAtMTE4OSw2ICsxMjAzLDE1IEBACiB7CiAgICAgQ2xpZW50KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihjb29raWUpOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChjbGllbnQtPm1Mb2NrKTsKKyAgICAgICAgaWYgKG1zZyA9PSBNRURJQV9QTEFZQkFDS19DT01QTEVURSAmJiBjbGllbnQtPm1OZXh0Q2xpZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsaWVudC0+bUF1ZGlvT3V0cHV0LT5zd2l0Y2hUb05leHRPdXRwdXQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+bU5leHRDbGllbnQtPnN0YXJ0KCk7CisgICAgICAgICAgICBjbGllbnQtPm1OZXh0Q2xpZW50LT5tQ2xpZW50LT5ub3RpZnkoTUVESUFfSU5GTywgTUVESUFfSU5GT19TVEFSVEVEX0FTX05FWFQsIDAsIG9iaik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoTUVESUFfSU5GTyA9PSBtc2cgJiYKICAgICAgICAgTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUgPT0gZXh0MSkgewogICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSA9IGV4dDI7CkBAIC0xMzc2LDkgKzEzOTksMTEgQEAKIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQpCiAgICAgOiBtQ2FsbGJhY2soTlVMTCksCiAgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCisgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtVHJhY2sgPSAwOworICAgIG1SZWN5Y2xlZFRyYWNrID0gMDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICBtTGVmdFZvbHVtZSA9IDEuMDsKICAgICBtUmlnaHRWb2x1bWUgPSAxLjA7CkBAIC0xMzkzLDYgKzE0MTgsOCBAQAogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6fkF1ZGlvT3V0cHV0KCkKIHsKICAgICBjbG9zZSgpOworICAgIGRlbGV0ZSBtUmVjeWNsZWRUcmFjazsKKyAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRNaW5CdWZmZXJDb3VudCgpCkBAIC0xNDczLDcgKzE1MDAsNiBAQAogICAgIH0KICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCwgJWQpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQpOwotICAgIGlmIChtVHJhY2spIGNsb3NlKCk7CiAgICAgaW50IGFmU2FtcGxlUmF0ZTsKICAgICBpbnQgYWZGcmFtZUNvdW50OwogICAgIGludCBmcmFtZUNvdW50OwpAQCAtMTQ5NCw5ICsxNTIwLDQ4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAobVJlY3ljbGVkVHJhY2spIHsKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGV4aXN0aW5nIHRyYWNrIGNhbiBiZSByZXVzZWQgYXMtaXMsIG9yIGlmIGEgbmV3IHRyYWNrIG5lZWRzIHRvIGJlIGNyZWF0ZWQuCisKKyAgICAgICAgYm9vbCByZXVzZSA9IHRydWU7CisgICAgICAgIGlmICgobUNhbGxiYWNrRGF0YSA9PSBOVUxMICYmIG1DYWxsYmFjayAhPSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwgJiYgbUNhbGxiYWNrID09IE5VTEwpKSB7CisgICAgICAgICAgICAvLyByZWN5Y2xlZCB0cmFjayB1c2VzIGNhbGxiYWNrcyBidXQgdGhlIGNhbGxlciB3YW50cyB0byB1c2Ugd3JpdGVzLCBvciB2aWNlIHZlcnNhCisgICAgICAgICAgICBBTE9HVigiY2FuJ3QgY2hhaW4gY2FsbGJhY2sgYW5kIHdyaXRlIik7CisgICAgICAgICAgICByZXVzZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKChtUmVjeWNsZWRUcmFjay0+Z2V0U2FtcGxlUmF0ZSgpICE9IHNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgKG1SZWN5Y2xlZFRyYWNrLT5jaGFubmVsQ291bnQoKSAhPSBjaGFubmVsQ291bnQpIHx8CisgICAgICAgICAgICAgICAgKG1SZWN5Y2xlZFRyYWNrLT5mcmFtZUNvdW50KCkgIT0gZnJhbWVDb3VudCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVyYXRlLCBjaGFubmVsY291bnQgb3IgZnJhbWVjb3VudCBkaWZmZXIiKTsKKyAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldXNlKSB7CisgICAgICAgICAgICBBTE9HVigiY2hhaW5pbmcgdG8gbmV4dCBvdXRwdXQiKTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBtVHJhY2sgPSBtUmVjeWNsZWRUcmFjazsKKyAgICAgICAgICAgIG1SZWN5Y2xlZFRyYWNrID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5zZXRPdXRwdXQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gcmV1c2UgdGhlIHRyYWNrLCB1bmJsb2NrIGFuZCBmbHVzaCBpdAorICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5zZXRPdXRwdXQoTlVMTCk7CisgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOworICAgICAgICB9CisgICAgICAgIG1SZWN5Y2xlZFRyYWNrLT5mbHVzaCgpOworICAgICAgICBkZWxldGUgbVJlY3ljbGVkVHJhY2s7CisgICAgICAgIG1SZWN5Y2xlZFRyYWNrID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIG1DYWxsYmFja0RhdGE7CisgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOworICAgICAgICBjbG9zZSgpOworICAgIH0KIAogICAgIEF1ZGlvVHJhY2sgKnQ7CiAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIG1DYWxsYmFja0RhdGEgPSBuZXcgQ2FsbGJhY2tEYXRhKHRoaXMpOwogICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKQEAgLTE1MDUsNyArMTU3MCw3IEBACiAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLAogICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgfSBlbHNlIHsKQEAgLTE1NDYsNiArMTYxMSw5IEBACiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigic3RhcnQiKTsKKyAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CisgICAgfQogICAgIGlmIChtVHJhY2spIHsKICAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CiAgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwpAQCAtMTU1Myw4ICsxNjIxLDI3IEBACiAgICAgfQogfQogCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldE5leHRPdXRwdXQoY29uc3Qgc3A8QXVkaW9PdXRwdXQ+JiBuZXh0T3V0cHV0KSB7CisgICAgbU5leHRPdXRwdXQgPSBuZXh0T3V0cHV0OworfQogCiAKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3dpdGNoVG9OZXh0T3V0cHV0KCkgeworICAgIEFMT0dWKCJzd2l0Y2hUb05leHRPdXRwdXQiKTsKKyAgICBpZiAobU5leHRPdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5iZWdpblRyYWNrU3dpdGNoKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG1OZXh0T3V0cHV0LT5tQ2FsbGJhY2tEYXRhOworICAgICAgICBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YSA9IG1DYWxsYmFja0RhdGE7CisgICAgICAgIG1DYWxsYmFja0RhdGEgPSBOVUxMOworICAgICAgICBtTmV4dE91dHB1dC0+bVJlY3ljbGVkVHJhY2sgPSBtVHJhY2s7CisgICAgICAgIG1UcmFjayA9IE5VTEw7CisgICAgICAgIG1OZXh0T3V0cHV0LT5tU2FtcGxlUmF0ZUh6ID0gbVNhbXBsZVJhdGVIejsKKyAgICAgICAgbU5leHRPdXRwdXQtPm1Nc2Vjc1BlckZyYW1lID0gbU1zZWNzUGVyRnJhbWU7CisgICAgfQorfQorCiBzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgICAgTE9HX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKQEAgLTE2NDYsMTMgKzE3MzMsMjIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEF1ZGlvT3V0cHV0ICptZSA9IChBdWRpb091dHB1dCAqKWNvb2tpZTsKKyAgICBDYWxsYmFja0RhdGEgKmRhdGEgPSAoQ2FsbGJhY2tEYXRhKiljb29raWU7CisgICAgZGF0YS0+bG9jaygpOworICAgIEF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwogICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCisgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KKyAgICAgICAgZGF0YS0+dW5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCiAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSk7CiAKLSAgICBpZiAoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDApIHsKKyAgICBpZiAoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAgJiYgbWUtPm1OZXh0T3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCBFT1MgYnV0IHRoZSBhdWRpbyB0cmFjayBpcyBub3Qgc3RvcHBlZCB5ZXQsCiAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCkBAIC0xNjYxLDYgKzE3NTcsNyBAQAogICAgIH0KIAogICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CisgICAgZGF0YS0+dW5sb2NrKCk7CiB9CiAKIGludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDg1Y2VjMjIuLmQ0ZTBlYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCkBAIC02OSw3ICs3MCw5IEBACiAKICAgICBjbGFzcyBBdWRpb091dHB1dCA6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawogICAgIHsKLSAgICBwdWJsaWM6CisgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKKworICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QXVkaW9PdXRwdXQoKTsKIApAQCAtMTA0LDE0ICsxMDcsMjEgQEAKIAogICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBpc09uRW11bGF0b3IoKTsKICAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgZ2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0TmV4dE91dHB1dChjb25zdCBzcDxBdWRpb091dHB1dD4mIG5leHRPdXRwdXQpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzd2l0Y2hUb05leHRPdXRwdXQoKTsKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7IHJldHVybiBtTmV4dE91dHB1dCA9PSBOVUxMOyB9CisKICAgICBwcml2YXRlOgogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwogICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIoCiAgICAgICAgICAgICAgICAgaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7CiAKICAgICAgICAgQXVkaW9UcmFjayogICAgICAgICAgICAgbVRyYWNrOworICAgICAgICBBdWRpb1RyYWNrKiAgICAgICAgICAgICBtUmVjeWNsZWRUcmFjazsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXQ+ICAgICAgICAgbU5leHRPdXRwdXQ7CiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKICAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOworICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKQEAgLTEyNCw3ICsxMzQsMzggQEAKICAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKICAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAogCi0gICAgfTsKKyAgICAgICAgLy8gQ2FsbGJhY2tEYXRhIGlzIHdoYXQgaXMgcGFzc2VkIHRvIHRoZSBBdWRpb1RyYWNrIGFzIHRoZSAidXNlciIgZGF0YS4KKyAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHRhcmdldCB0aGlzIHRvIGEgZGlmZmVyZW50IE91dHB1dCBvbiB0aGUgZmx5LAorICAgICAgICAvLyBzbyB3ZSBjYW4ndCB1c2UgdGhlIE91dHB1dCBpdHNlbGYgZm9yIHRoaXMuCisgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIENhbGxiYWNrRGF0YShBdWRpb091dHB1dCAqY29va2llKSB7CisgICAgICAgICAgICAgICAgbURhdGEgPSBjb29raWU7CisgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIGdldE91dHB1dCgpIHsgcmV0dXJuIG1EYXRhO30KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRPdXRwdXQoQXVkaW9PdXRwdXQqIG5ld2Nvb2tpZSkgeyBtRGF0YSA9IG5ld2Nvb2tpZTsgfQorICAgICAgICAgICAgLy8gbG9jay91bmxvY2sgYXJlIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIHBheWxvYWQgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2NrKCkgeyBtTG9jay5sb2NrKCk7IH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1bmxvY2soKSB7IG1Mb2NrLnVubG9jaygpOyB9CisgICAgICAgICAgICAvLyBiZWdpblRyYWNrU3dpdGNoL2VuZFRyYWNrU3dpdGNoIGFyZSB1c2VkIHdoZW4gdGhpcyBvYmplY3QgaXMgYmVpbmcgaGFuZGVkIG92ZXIKKyAgICAgICAgICAgIC8vIHRvIHRoZSBuZXh0IHNpbmsuCisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgYmVnaW5UcmFja1N3aXRjaCgpIHsgbUxvY2subG9jaygpOyBtU3dpdGNoaW5nID0gdHJ1ZTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGVuZFRyYWNrU3dpdGNoKCkgeworICAgICAgICAgICAgICAgIGlmIChtU3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBBdWRpb091dHB1dCAqICAgbURhdGE7CisgICAgICAgICAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgbVN3aXRjaGluZzsKKyAgICAgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YSk7CisgICAgICAgIH07CisKKyAgICB9OyAvLyBBdWRpb091dHB1dAorCiAKICAgICBjbGFzcyBBdWRpb0NhY2hlIDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewpAQCAtMTg0LDcgKzIyNSw3IEBACiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUNvbW1hbmRDb21wbGV0ZTsKIAogICAgICAgICBzcDxUaHJlYWQ+ICAgICAgICAgIG1DYWxsYmFja1RocmVhZDsKLSAgICB9OworICAgIH07IC8vIEF1ZGlvQ2FjaGUKIAogcHVibGljOgogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSgpOwpAQCAtMjc4LDYgKzMxOSw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgIGNyZWF0ZVBsYXllcihwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKIApAQCAtMzUwLDYgKzM5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludDsKICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZDsKKyAgICAgICAgICAgICAgICAgICAgc3A8Q2xpZW50PiAgICAgICAgICAgICAgICAgIG1OZXh0Q2xpZW50OwogCiAgICAgICAgIC8vIE1ldGFkYXRhIGZpbHRlcnMuCiAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCkBAIC0zNjQsNyArNDA3LDcgQEAKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgICAgICAgICAgICAgICAgICBBbnRhZ29uaXplciogICAgICAgICAgICAgICAgbUFudGFnb25pemVyOwogI2VuZGlmCi0gICAgfTsKKyAgICB9OyAvLyBDbGllbnQKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCmluZGV4IDMzZTJmOTMuLjliNDg1ZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCkBAIC0xMiwxMSArMTIsMTEgQEAKICAgICAgICAgU3RyZWFtaW5nU291cmNlLmNwcCAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzICAgICAgICAgICAgIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSAgICAgICAgICAgIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMgICAgICAgICAgICAgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9udXBsYXllcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA1YWVhOGQwLi4wNDdiNGNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTU3LDggKzU3LDkgQEAKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2V4cGF0L2xpYiBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9mbGFjL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKaW5kZXggMjNjM2M3NC4uOWRiM2M5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtNDE5LDcgKzQxOSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUb0NvbXBsZXRpb25VcywgdGltZVRvQ29tcGxldGlvblVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSB0aW1lVG9Db21wbGV0aW9uVXMgKyBtTGF0ZW5jeVVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSB0aW1lVG9Db21wbGV0aW9uVXMgKyBtTGF0ZW5jeVVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSAwOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IDk2NjQxNmUuLjI3OGUzYTIgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAppbmRleCBhYjJjZmYwLi43NDgxZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+CisjaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KQEAgLTU0LDYgKzU0LDkgQEAKICAgICBBTE9HVigiU3VyZmFjZU1lZGlhU291cmNlOjpTdXJmYWNlTWVkaWFTb3VyY2UiKTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKICAgICBtR3JhcGhpY0J1ZmZlckFsbG9jID0gY29tcG9zZXItPmNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpOworICAgIGlmIChtR3JhcGhpY0J1ZmZlckFsbG9jID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpIGZhaWxlZCBpbiBTdXJmYWNlTWVkaWFTb3VyY2UoKSIpOworICAgIH0KIH0KIAogU3VyZmFjZU1lZGlhU291cmNlOjp+U3VyZmFjZU1lZGlhU291cmNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCmluZGV4IDYzNzc1ZjEuLmUzN2I0YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKQEAgLTEwLDcgKzEwLDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9jaHJvbWl1bSBcCiAgICAgICAgIGV4dGVybmFsL2Nocm9taXVtL2FuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCmluZGV4IDIwYzdiYzAuLmZkNmRlNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDUwOTE5M2MuLmI0N2NiMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTk0LDkgKzk0LDkgQEAKICAgICAgICAgU29mdEFBQ0VuY29kZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKaW5kZXggMjNhMjJlZi4uYjgxMzA2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawpAQCAtNjEsMTIgKzYxLDEyIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbgogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0lNUE9SVF9SRUY9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawppbmRleCA5NGU4NzI2Li4yMTkzN2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCkBAIC04NCw3ICs4NCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawppbmRleCA2Y2U2MTcxLi4zYTQ2ZWM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpAQCAtMTI1LDkgKzEyNSw5IEBACiAgICAgICAgIFNvZnRBTVJXQkVuY29kZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawppbmRleCBlYjJlMzIwLi41NGNjOWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTI1LDggKzI1LDggQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKICAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgLURfX2FybV9fIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKaW5kZXggNjY5MjUzMy4uNDI3MDZhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKQEAgLTYsNyArNiw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAorICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggMmZmYTVmMi4uOGMyNDVkMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKQEAgLTQyLDcgKzQyLDcgQEAKIAkkKExPQ0FMX1BBVEgpL3NyYyBcCiAJJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4CisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCkBAIC01OSw3ICs1OSw3IEBACiAJJChMT0NBTF9QQVRIKS9zcmMgXAogCSQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCiAgICAgICAgIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKaW5kZXggNDMzMThlOS4uMmI3YzkzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpAQCAtMzEsNyArMzEsNyBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAogICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKaW5kZXggYTA4YzlmMC4uZWQ1MWFhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5tawpAQCAtNjUsNyArNjUsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9zcmMgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKaW5kZXggMzJiYmQ2Yi4uMjk5NzIyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCkBAIC05LDcgKzksNyBAQAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9jb2RlYyBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvdnB4X3BvcnRzIFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnZweApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawppbmRleCA1YjNjODc2Li40M2MyMGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpAQCAtMzUsNyArMzUsNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi9pbmMgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCiBNWV9BU00gOj0gXAogCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCmluZGV4IGYzM2YzYWMuLmZjYTcwYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawpAQCAtNyw3ICs3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgICBleHRlcm5hbC90cmVtb2xvIFwKICAgICAgICAgZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnZvcmJpc2lkZWMgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKaW5kZXggNjJiYTQwZi4uNTlhNjRiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsKQEAgLTYsNyArNiw3IEBACiAgICAgICAgIFNvZnR3YXJlUmVuZGVyZXIuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKaW5kZXggOTIyNWU0MS4uYTU5OTBjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCkBAIC05LDkgKzksOSBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKwkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCmluZGV4IDFmMWM2OGIuLmU2N2RhNGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tawpAQCAtNyw3ICs3LDcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L21rdnBhcnNlciBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKaW5kZXggNTc4YzY2OS4uYWM0YzJhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMTEsOCArMTEsOCBAQAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCmluZGV4IGQ4NDRmM2QuLmY1ODdhOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLm1rCkBAIC0xNCw3ICsxNCw4IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXAogICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICAgICAgICAgIFwKICAgICAgICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKaW5kZXggZmVlZTFmOS4uNjA2OTc0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIE9NWF9NQVNURVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxPTVhQbHVnaW5CYXNlLmg+CiAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggMDk5YzRmNS4uYmZmM2RlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTI0LDggKzI0LDggQEAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oCmluZGV4IGY5M2MzMjMuLmM4OWNkODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaApAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBTT0ZUX09NWF9QTFVHSU5fSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhQbHVnaW5CYXNlLmg+CisjaW5jbHVkZSA8T01YUGx1Z2luQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggMGMwYTcwYy4uMDdkNDdhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEwLDcgKzEwLDcgQEAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRSA6PSBvbXhfdGVzdHMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCmluZGV4IDgyMzAzNDcuLmIzYmMzN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKQEAgLTE5LDkgKzE5LDkgQEAKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKLQkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heCBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfcnRzcAogCkBAIC00Nyw3ICs0Nyw3IEBACiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogCSQoSk5JX0hfSU5DTFVERSkgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawppbmRleCAzNTdmZWIxLi42NTZhNjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTM4LDcgKzM4LDcgQEAKICAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAogCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAppbmRleCAzZGNkOWZjLi5mZTc3Y2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJObyBhY3R1YWwgZGlzcGxheS4gQ2hvb3NpbmcgRUdMU3VyZmFjZSBiYXNlZCBvbiBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICAgICAgICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gc21zID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZSgKKyAgICAgICAgICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gc21zID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZSgKICAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSk7CiAgICAgICAgICAgICBzcDxTdXJmYWNlVGV4dHVyZUNsaWVudD4gc3RjID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHNtcyk7CiAgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cgPSBzdGM7CkBAIC0zNjAsNyArMzYwLDggQEAKICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwogICAgICAgICBtU01TLT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQobVNNUyk7CisgICAgICAgIC8vIE1hbnVhbCBjYXN0IGlzIHJlcXVpcmVkIHRvIGF2b2lkIGNvbnN0cnVjdG9yIGFtYmlndWl0eQorICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN0YXRpY19jYXN0PHNwPElTdXJmYWNlVGV4dHVyZT4gPiggbVNNUykpOwogICAgICAgICBtQU5XID0gbVNUQzsKICAgICB9CiAKQEAgLTM5NSw3ICszOTYsNyBAQAogICAgICAgICBBTE9HVigiU01TLUdMVGVzdDo6U2V0VXAoKSIpOwogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQobVNNUyk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3RhdGljX2Nhc3Q8c3A8SVN1cmZhY2VUZXh0dXJlPiA+KCBtU01TKSk7CiAgICAgICAgIG1BTlcgPSBtU1RDOwogCiAgICAgICAgIC8vIERvaW5nIHRoZSBzZXR1cCByZWxhdGVkIHRvIHRoZSBHTCBTaWRlCkBAIC03NzMsNyArNzc0LDcgQEAKICAgICBBTE9HVigiVmVyaWZ5IGNyZWF0aW5nIGEgc3VyZmFjZSB3LyByaWdodCBjb25maWcgKyBkdW1teSB3cml0ZXIqKioqKioqKioiKTsKIAogICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChtU01TKTsKKyAgICBtU1RDID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN0YXRpY19jYXN0PHNwPElTdXJmYWNlVGV4dHVyZT4gPiggbVNNUykpOwogICAgIG1BTlcgPSBtU1RDOwogCiAgICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0M0dQUFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dDNHUFBTb3VyY2UuaAppbmRleCBjYjdlNDdjLi5kZmM2NDE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0M0dQUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHQzR1BQU291cmNlLmgKQEAgLTI4LDI2ICsyOCwyNiBAQAogY2xhc3MgUGFyY2VsOwogCiBjbGFzcyBUaW1lZFRleHQzR1BQU291cmNlIDogcHVibGljIFRpbWVkVGV4dFNvdXJjZSB7Ci0gcHVibGljOgotICBUaW1lZFRleHQzR1BQU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgbWVkaWFTb3VyY2UpOwotICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgeyByZXR1cm4gbVNvdXJjZS0+c3RhcnQoKTsgfQotICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSB7IHJldHVybiBtU291cmNlLT5zdG9wKCk7IH0KLSAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgIGludDY0X3QgKnRpbWVVcywKLSAgICAgICAgICBQYXJjZWwgKnBhcmNlbCwKLSAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgdmlydHVhbCBzdGF0dXNfdCBleHRyYWN0R2xvYmFsRGVzY3JpcHRpb25zKFBhcmNlbCAqcGFyY2VsKTsKK3B1YmxpYzoKKyAgICBUaW1lZFRleHQzR1BQU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgbWVkaWFTb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSB7IHJldHVybiBtU291cmNlLT5zdGFydCgpOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgaW50NjRfdCAqdGltZVVzLAorICAgICAgICAgICAgUGFyY2VsICpwYXJjZWwsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGV4dHJhY3RHbG9iYWxEZXNjcmlwdGlvbnMoUGFyY2VsICpwYXJjZWwpOwogCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5UaW1lZFRleHQzR1BQU291cmNlKCk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGltZWRUZXh0M0dQUFNvdXJjZSgpOwogCi0gcHJpdmF0ZToKLSAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Citwcml2YXRlOgorICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogCi0gIHN0YXR1c190IGV4dHJhY3RBbmRBcHBlbmRMb2NhbERlc2NyaXB0aW9ucygKLSAgICAgICAgaW50NjRfdCB0aW1lVXMsIGNvbnN0IE1lZGlhQnVmZmVyICp0ZXh0QnVmZmVyLCBQYXJjZWwgKnBhcmNlbCk7CisgICAgc3RhdHVzX3QgZXh0cmFjdEFuZEFwcGVuZExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGNvbnN0IE1lZGlhQnVmZmVyICp0ZXh0QnVmZmVyLCBQYXJjZWwgKnBhcmNlbCk7CiAKLSAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0M0dQUFNvdXJjZSk7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0M0dQUFNvdXJjZSk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNSVFNvdXJjZS5oCmluZGV4IGEwNzM0ZDkuLmFjYzAxZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTUlRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U1JUU291cmNlLmgKQEAgLTMxLDQzICszMSw0MyBAQAogY2xhc3MgUGFyY2VsOwogCiBjbGFzcyBUaW1lZFRleHRTUlRTb3VyY2UgOiBwdWJsaWMgVGltZWRUZXh0U291cmNlIHsKLSBwdWJsaWM6Ci0gIFRpbWVkVGV4dFNSVFNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7Ci0gIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICBpbnQ2NF90ICp0aW1lVXMsCi0gICAgICAgICAgUGFyY2VsICpwYXJjZWwsCi0gICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CitwdWJsaWM6CisgICAgVGltZWRUZXh0U1JUU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgaW50NjRfdCAqdGltZVVzLAorICAgICAgICAgICAgUGFyY2VsICpwYXJjZWwsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+VGltZWRUZXh0U1JUU291cmNlKCk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGltZWRUZXh0U1JUU291cmNlKCk7CiAKLSBwcml2YXRlOgotICBzcDxEYXRhU291cmNlPiBtU291cmNlOworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogCi0gIHN0cnVjdCBUZXh0SW5mbyB7Ci0gICAgICBpbnQ2NF90IGVuZFRpbWVVczsKLSAgICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIHRleHQgaW4gdGhlIG9yaWdpbmFsIGZpbGUuCi0gICAgICBvZmY2NF90IG9mZnNldDsKLSAgICAgIGludCB0ZXh0TGVuOwotICB9OworICAgIHN0cnVjdCBUZXh0SW5mbyB7CisgICAgICAgIGludDY0X3QgZW5kVGltZVVzOworICAgICAgICAvLyBUaGUgb2Zmc2V0IG9mIHRoZSB0ZXh0IGluIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgaW50IHRleHRMZW47CisgICAgfTsKIAotICBpbnQgbUluZGV4OwotICBLZXllZFZlY3RvcjxpbnQ2NF90LCBUZXh0SW5mbz4gbVRleHRWZWN0b3I7CisgICAgaW50IG1JbmRleDsKKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBUZXh0SW5mbz4gbVRleHRWZWN0b3I7CiAKLSAgdm9pZCByZXNldCgpOwotICBzdGF0dXNfdCBzY2FuRmlsZSgpOwotICBzdGF0dXNfdCBnZXROZXh0U3VidGl0bGVJbmZvKAotICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgaW50NjRfdCAqc3RhcnRUaW1lVXMsIFRleHRJbmZvICppbmZvKTsKLSAgc3RhdHVzX3QgcmVhZE5leHRMaW5lKG9mZjY0X3QgKm9mZnNldCwgQVN0cmluZyAqZGF0YSk7Ci0gIHN0YXR1c190IGdldFRleHQoCi0gICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zLAotICAgICAgICAgIEFTdHJpbmcgKnRleHQsIGludDY0X3QgKnN0YXJ0VGltZVVzLCBpbnQ2NF90ICplbmRUaW1lVXMpOwotICBzdGF0dXNfdCBleHRyYWN0QW5kQXBwZW5kTG9jYWxEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGNvbnN0IEFTdHJpbmcgJnRleHQsIFBhcmNlbCAqcGFyY2VsKTsKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgc3RhdHVzX3Qgc2NhbkZpbGUoKTsKKyAgICBzdGF0dXNfdCBnZXROZXh0U3VidGl0bGVJbmZvKAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBpbnQ2NF90ICpzdGFydFRpbWVVcywgVGV4dEluZm8gKmluZm8pOworICAgIHN0YXR1c190IHJlYWROZXh0TGluZShvZmY2NF90ICpvZmZzZXQsIEFTdHJpbmcgKmRhdGEpOworICAgIHN0YXR1c190IGdldFRleHQoCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMsCisgICAgICAgICAgICBBU3RyaW5nICp0ZXh0LCBpbnQ2NF90ICpzdGFydFRpbWVVcywgaW50NjRfdCAqZW5kVGltZVVzKTsKKyAgICBzdGF0dXNfdCBleHRyYWN0QW5kQXBwZW5kTG9jYWxEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgY29uc3QgQVN0cmluZyAmdGV4dCwgUGFyY2VsICpwYXJjZWwpOwogCi0gIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRpbWVkVGV4dFNSVFNvdXJjZSk7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGltZWRUZXh0U1JUU291cmNlKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rIGIvbWVkaWEvdGVzdHMvb214anBlZ2RlY29kZXIvQW5kcm9pZC5tawppbmRleCAwMjVhMTMxLi4zZTA5YTVmIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9vbXhqcGVnZGVjb2Rlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL3Rlc3RzL29teGpwZWdkZWNvZGVyL0FuZHJvaWQubWsKQEAgLTQwLDkgKzQwLDkgQEAKICAgICAkKFRPUCkvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL3V0aWxzIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2VmZmVjdHMgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlLworICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKIExPQ0FMX01PRFVMRSA6PSBqcGVnX2JlbmNoCiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmluZGV4IDkzZDg2NzUuLjJhY2Y1NTQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtNTYsOCArNTYsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0idXNiX2FjY2Vzc29yeV91cmlfcHJvbXB0IiBtc2dpZD0iNTEzNDUwNjIxNDEzNzMzMzQzIj4iVGlkYWsgYWRhIGFwbCB0ZXJwYXNhbmcgeWFuZyBiZWtlcmphIGRlbmdhbiBha3Nlc29yaSBVU0IgaW5pLiBQZWxhamFyaSBsZWJpaCBsYW5qdXQgdGVudGFuZyBha3Nlc29yaSBpbmkgZGkgPHhsaWZmOmcgaWQ9IlVSTCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV91c2JfYWNjZXNzb3J5IiBtc2dpZD0iNDk2NjI2NTI2MzQ2NTE4MTM3MiI+IkFrc2Vzb3JpIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhYmVsX3ZpZXciIG1zZ2lkPSI2MzA0NTY1NTUzMjE4MTkyOTkwIj4iTGloYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhbHdheXNfdXNlX2RldmljZSIgbXNnaWQ9IjE0NTAyODc0MzcwMTczMTU5MDYiPiJHdW5ha2FuIHNlY2FyYSBiYXdhYW4gdW50dWsgcGVyYW5na2F0IFVTQiBpbmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhbHdheXNfdXNlX2FjY2Vzc29yeSIgbXNnaWQ9IjEyMTA5NTQ1NzY5Nzk2MjE1OTYiPiJHdW5ha2FuIHNlY2FyYSBiYXdhYW4gdW50dWsgYWtzZXNvcmkgVVNCIGluaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c191c2VfZGV2aWNlIiBtc2dpZD0iMTQ1MDI4NzQzNzAxNzMxNTkwNiI+Ikd1bmFrYW4gc2VjYXJhIGRlZmF1bHQgdW50dWsgcGVyYW5na2F0IFVTQiBpbmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhbHdheXNfdXNlX2FjY2Vzc29yeSIgbXNnaWQ9IjEyMTA5NTQ1NzY5Nzk2MjE1OTYiPiJHdW5ha2FuIHNlY2FyYSBkZWZhdWx0IHVudHVrIGFrc2Vzb3JpIFVTQiBpbmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjb21wYXRfbW9kZV9vbiIgbXNnaWQ9IjY2MjM4MzkyNDQ4NDA2MzgyMTMiPiJQZXJiZXNhciB1dGsgbWVuZ2lzaSBsYXlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvbXBhdF9tb2RlX29mZiIgbXNnaWQ9IjQ0MzQ0Njc1NzI0NjEzMjc4OTgiPiJSZW50YW5na24gdXRrIG1uZ2lzaSBsYXlhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvbXBhdF9tb2RlX2hlbHBfaGVhZGVyIiBtc2dpZD0iNzk2OTQ5Mzk4OTM5NzUyOTkxMCI+IlBlcmJlc2FyL3BlcmtlY2lsIHVudHVrIGtvbXBhdGliaWxpdGFzIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCA4MWI5NDY0Li5iZmE0YTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMTkwLDEzICsxOTAsMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIEFMT0dJKCJMb2FkZWQgJXMgYXVkaW8gaW50ZXJmYWNlIGZyb20gJXMgKCVzKSIsIGF1ZGlvX2ludGVyZmFjZXNbaV0sCi0gICAgICAgICAgICAgbW9kLT5uYW1lLCBtb2QtPmlkKTsKKyAgICAgICAgICAgIG1vZC0+bmFtZSwgbW9kLT5pZCk7CiAgICAgICAgIG1BdWRpb0h3RGV2cy5wdXNoKGRldik7CiAKICAgICAgICAgaWYgKG1QcmltYXJ5SGFyZHdhcmVEZXYgPT0gTlVMTCkgewogICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldiA9IGRldjsKICAgICAgICAgICAgIEFMT0dJKCJVc2luZyAnJXMnICglcy4lcykgYXMgdGhlIHByaW1hcnkgYXVkaW8gaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgbW9kLT5uYW1lLCBtb2QtPmlkLCBhdWRpb19pbnRlcmZhY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBtb2QtPm5hbWUsIG1vZC0+aWQsIGF1ZGlvX2ludGVyZmFjZXNbaV0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MTUsNyArNTE1LDcgQEAKICAgICB9CiAKIEV4aXQ6Ci0gICAgaWYoc3RhdHVzKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIH0KICAgICByZXR1cm4gdHJhY2tIYW5kbGU7CkBAIC02MTAsNyArNjEwLDcgQEAKICAgICBtTWFzdGVyVm9sdW1lICAgPSB2YWx1ZTsKICAgICBtTWFzdGVyVm9sdW1lU1cgPSBzd212OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykKLSAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1hc3RlclZvbHVtZShzd212KTsKKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRNYXN0ZXJWb2x1bWUoc3dtdik7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02NDIsNyArNjQyLDcgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgbU1vZGUgPSBtb2RlOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TW9kZShtb2RlKTsKKyAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TW9kZShtb2RlKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtNjkzLDcgKzY5Myw3IEBACiAgICAgLy8gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24sIHNvIFBsYXliYWNrVGhyZWFkIGRvZXNuJ3QgaGF2ZSB0byBsb29rIGF0IHRoZSBvbmUgZnJvbSBBdWRpb0ZsaW5nZXIKICAgICBtTWFzdGVyTXV0ZSA9IG11dGVkOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykKLSAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1hc3Rlck11dGUobXV0ZWQpOworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1hc3Rlck11dGUobXV0ZWQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzIzLDggKzcyMyw5IEBACiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0dFVF9NQVNURVJfVk9MVU1FOwotICAgICAgICBhc3NlcnQoTlVMTCAhPSBtUHJpbWFyeUhhcmR3YXJlRGV2KTsKLSAgICAgICAgYXNzZXJ0KE5VTEwgIT0gbVByaW1hcnlIYXJkd2FyZURldi0+Z2V0X21hc3Rlcl92b2x1bWUpOworICAgICAgICBBTE9HX0FTU0VSVCgoTlVMTCAhPSBtUHJpbWFyeUhhcmR3YXJlRGV2KSAmJgorICAgICAgICAgICAgICAgICAgICAoTlVMTCAhPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSksCisgICAgICAgICAgICAgICAgImNhbid0IGdldCBtYXN0ZXIgdm9sdW1lIik7CiAKICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldi0+Z2V0X21hc3Rlcl92b2x1bWUobVByaW1hcnlIYXJkd2FyZURldiwgJnJldF92YWwpOwogICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwpAQCAtNzYwLDcgKzc2MSw3IEBACiAKICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdmFsdWUpOworICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICB0aHJlYWQtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZhbHVlKTsKQEAgLTc4NSw3ICs3ODYsNyBAQAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS5tdXRlID0gbXV0ZWQ7CiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspCi0gICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRTdHJlYW1NdXRlKHN0cmVhbSwgbXV0ZWQpOworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldFN0cmVhbU11dGUoc3RyZWFtLCBtdXRlZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xMTYwLDcgKzExNjEsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHMoKQogewogICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSghbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICB3aGlsZSAoIW1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dWKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKICAgICAgICAgQ29uZmlnRXZlbnQgY29uZmlnRXZlbnQgPSBtQ29uZmlnRXZlbnRzWzBdOwogICAgICAgICBtQ29uZmlnRXZlbnRzLnJlbW92ZUF0KDApOwpAQCAtMTM0NCwxMyArMTM0NSwxMyBAQAogICAgICAgICAgICAgbVN1c3BlbmRlZFNlc3Npb25zLmVkaXRWYWx1ZUF0KGluZGV4KTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbkVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3AgPFN1c3BlbmRlZFNlc3Npb25EZXNjPiBkZXNjID0gc2Vzc2lvbkVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgc3A8U3VzcGVuZGVkU2Vzc2lvbkRlc2M+IGRlc2MgPSBzZXNzaW9uRWZmZWN0cy52YWx1ZUF0KGkpOwogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2MtPm1SZWZDb3VudDsgaisrKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbkVmZmVjdHMua2V5QXQoaSkgPT0gRWZmZWN0Q2hhaW46OmtLZXlGb3JTdXNwZW5kQWxsKSB7CiAgICAgICAgICAgICAgICAgY2hhaW4tPnNldEVmZmVjdFN1c3BlbmRlZEFsbF9sKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKCkgc3VzcGVuZGluZyBlZmZlY3RzICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVR5cGUudGltZUxvdyk7CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1UeXBlLnRpbWVMb3cpOwogICAgICAgICAgICAgICAgIGNoYWluLT5zZXRFZmZlY3RTdXNwZW5kZWRfbCgmZGVzYy0+bVR5cGUsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzg1LDcgKzEzODYsNyBAQAogICAgIH0KICAgICBpbmRleCA9IHNlc3Npb25FZmZlY3RzLmluZGV4T2ZLZXkoa2V5KTsKIAotICAgIHNwIDxTdXNwZW5kZWRTZXNzaW9uRGVzYz4gZGVzYzsKKyAgICBzcDxTdXNwZW5kZWRTZXNzaW9uRGVzYz4gZGVzYzsKICAgICBpZiAoc3VzcGVuZCkgewogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgZGVzYyA9IHNlc3Npb25FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOwpAQCAtMTY1OCwxNCArMTY1OSwxNCBAQAogICAgICAgICAvLyBjcmVhdGVUcmFjaygpIHdhcyBjYWxsZWQgYnkgdGhlIGNsaWVudCBwcm9jZXNzLgogICAgICAgICBpZiAoIW1TdHJlYW1UeXBlc1tzdHJlYW1UeXBlXS52YWxpZCkgewogICAgICAgICAgICAgQUxPR1coImNyZWF0ZVRyYWNrX2woKSBvbiB0aHJlYWQgJXA6IGludmFsaWRhdGluZyB0cmFjayBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICB0aGlzLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICB0aGlzLCBzdHJlYW1UeXBlKTsKICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRF9PTiwgJnRyYWNrLT5tQ2Jsay0+ZmxhZ3MpOwogICAgICAgICB9CiAgICAgfQogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzKSB7CiAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIH0KICAgICByZXR1cm4gdHJhY2s7CkBAIC0yNjQ0LDEwICsyNjQ1LDEwIEBACiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewpAQCAtMjg1NSw3ICsyODU2LDcgQEAKICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFja1RvUmVtb3ZlKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2tUb1JlbW92ZSk7CiAgICAgICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLCBlZmZlY3RDaGFpbnNbMF0uZ2V0KCksCisgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgbUVmZmVjdENoYWluc1swXS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgdHJhY2tUb1JlbW92ZS0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgbUVmZmVjdENoYWluc1swXS0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKICAgICAgICAgfQpAQCAtMjkwMSw3ICsyOTAyLDcgQEAKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKW1NaXhCdWZmZXIgKyBjb3VudC0xOwogICAgICAgICBpbnQxNl90ICpkc3QgPSBtTWl4QnVmZmVyICsgY291bnQtMTsKLSAgICAgICAgd2hpbGUoY291bnQtLSkgeworICAgICAgICB3aGlsZSAoY291bnQtLSkgewogICAgICAgICAgICAgKmRzdC0tID0gKGludDE2X3QpKCpzcmMtLV4weDgwKSA8PCA4OwogICAgICAgICB9CiAgICAgfQpAQCAtMjk1NCw3ICsyOTU1LDcgQEAKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICBpbnQxNl90ICpzcmMgPSBtTWl4QnVmZmVyOwogICAgICAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW1NaXhCdWZmZXI7Ci0gICAgICAgIHdoaWxlKGNvdW50LS0pIHsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKICAgICAgICAgICAgICpkc3QrKyA9ICh1aW50OF90KSgoKGludDMyX3QpKnNyYysrICsgKDE8PDcpKSA+PiA4KV4weDgwOwogICAgICAgICB9CiAgICAgfQpAQCAtMzAxMywxMCArMzAxNCwxMCBAQAogICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOwotICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKQEAgLTMyMDcsNyArMzIwOCw3IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6Om91dHB1dHNSZWFkeShjb25zdCBTb3J0ZWRWZWN0b3I8IHNwPE91dHB1dFRyYWNrPiA+ICZvdXRwdXRUcmFja3MpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3AgPFRocmVhZEJhc2U+IHRocmVhZCA9IG91dHB1dFRyYWNrc1tpXS0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvdXRwdXRUcmFja3NbaV0tPnRocmVhZCgpLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiRHVwbGljYXRpbmdUaHJlYWQ6Om91dHB1dHNSZWFkeSgpIGNvdWxkIG5vdCBwcm9tb3RlIHRocmVhZCBvbiBvdXRwdXQgdHJhY2sgJXAiLCBvdXRwdXRUcmFja3NbaV0uZ2V0KCkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzI2MywxNCArMzI2NCwxNCBAQAogICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCiAgICAgLy8gQUxPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwotICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKLSAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwotICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7Ci0gICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7Ci0gICB9CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICB1aW50OF90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KTsKKyAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOworICAgIH0KIAotICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7CisgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7CiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwogICAgICAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgewogICAgICAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7CkBAIC0zMjk3LDIyICszMjk4LDIyIEBACiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICB9IGVsc2UgewotICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKShuZXcgdWludDhfdFtzaXplXSk7Ci0gICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHN0cnVjdHVyZSBpbi1wbGFjZS4KLSAgICAgICAgICAgbmV3KG1DYmxrKSBhdWRpb190cmFja19jYmxrX3QoKTsKLSAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKLSAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gICAgICAgICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7Ci0gICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwotICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlciAob3RoZXIgZmxhZ3MgYXJlIGNsZWFyZWQpCi0gICAgICAgICAgIG1DYmxrLT5mbGFncyA9IENCTEtfVU5ERVJSVU5fT047Ci0gICAgICAgICAgIG1CdWZmZXJFbmQgPSAodWludDhfdCAqKW1CdWZmZXIgKyBidWZmZXJTaXplOwotICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1DYmxrID0gKGF1ZGlvX3RyYWNrX2NibGtfdCAqKShuZXcgdWludDhfdFtzaXplXSk7CisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCBzdHJ1Y3R1cmUgaW4tcGxhY2UuCisgICAgICAgICAgICBuZXcobUNibGspIGF1ZGlvX3RyYWNrX2NibGtfdCgpOworICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgLy8gRm9yY2UgdW5kZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIHVuZGVycnVuIGNhbGxiYWNrIHVudGlsIGZpcnN0IGRhdGEgaXMKKyAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gYnVmZmVyIChvdGhlciBmbGFncyBhcmUgY2xlYXJlZCkKKyAgICAgICAgICAgIG1DYmxrLT5mbGFncyA9IENCTEtfVU5ERVJSVU5fT047CisgICAgICAgICAgICBtQnVmZmVyRW5kID0gKHVpbnQ4X3QgKiltQnVmZmVyICsgYnVmZmVyU2l6ZTsKKyAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKQEAgLTM0OTAsMjIgKzM0OTEsMjIgQEAKIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKAotICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQogewotICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0aGlzLT5jYmxrKCk7Ci0gICAgIHVpbnQzMl90IGZyYW1lc1JlYWR5OwotICAgICB1aW50MzJfdCBmcmFtZXNSZXEgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdGhpcy0+Y2JsaygpOworICAgIHVpbnQzMl90IGZyYW1lc1JlYWR5OworICAgIHVpbnQzMl90IGZyYW1lc1JlcSA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKIAotICAgICAvLyBDaGVjayBpZiBsYXN0IHN0ZXBTZXJ2ZXIgZmFpbGVkLCB0cnkgdG8gc3RlcCBub3cKLSAgICAgaWYgKG1TdGVwU2VydmVyRmFpbGVkKSB7Ci0gICAgICAgICBpZiAoIXN0ZXAoKSkgIGdvdG8gZ2V0TmV4dEJ1ZmZlcl9leGl0OwotICAgICAgICAgQUxPR1YoInN0ZXBTZXJ2ZXIgcmVjb3ZlcmVkIik7Ci0gICAgICAgICBtU3RlcFNlcnZlckZhaWxlZCA9IGZhbHNlOwotICAgICB9CisgICAgLy8gQ2hlY2sgaWYgbGFzdCBzdGVwU2VydmVyIGZhaWxlZCwgdHJ5IHRvIHN0ZXAgbm93CisgICAgaWYgKG1TdGVwU2VydmVyRmFpbGVkKSB7CisgICAgICAgIGlmICghc3RlcCgpKSAgZ290byBnZXROZXh0QnVmZmVyX2V4aXQ7CisgICAgICAgIEFMT0dWKCJzdGVwU2VydmVyIHJlY292ZXJlZCIpOworICAgICAgICBtU3RlcFNlcnZlckZhaWxlZCA9IGZhbHNlOworICAgIH0KIAotICAgICBmcmFtZXNSZWFkeSA9IGNibGstPmZyYW1lc1JlYWR5KCk7CisgICAgZnJhbWVzUmVhZHkgPSBjYmxrLT5mcmFtZXNSZWFkeSgpOwogCi0gICAgIGlmIChDQ19MSUtFTFkoZnJhbWVzUmVhZHkpKSB7CisgICAgaWYgKENDX0xJS0VMWShmcmFtZXNSZWFkeSkpIHsKICAgICAgICAgdWludDMyX3QgcyA9IGNibGstPnNlcnZlcjsKICAgICAgICAgdWludDMyX3QgYnVmZmVyRW5kID0gY2Jsay0+c2VydmVyQmFzZSArIGNibGstPmZyYW1lQ291bnQ7CiAKQEAgLTM1MTcsMjEgKzM1MTgsMjEgQEAKICAgICAgICAgICAgIGZyYW1lc1JlcSA9IGJ1ZmZlckVuZCAtIHM7CiAgICAgICAgIH0KIAotICAgICAgICAgYnVmZmVyLT5yYXcgPSBnZXRCdWZmZXIocywgZnJhbWVzUmVxKTsKLSAgICAgICAgIGlmIChidWZmZXItPnJhdyA9PSBOVUxMKSBnb3RvIGdldE5leHRCdWZmZXJfZXhpdDsKKyAgICAgICAgYnVmZmVyLT5yYXcgPSBnZXRCdWZmZXIocywgZnJhbWVzUmVxKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmF3ID09IE5VTEwpIGdvdG8gZ2V0TmV4dEJ1ZmZlcl9leGl0OwogCi0gICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyYW1lc1JlcTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICB9CisgICAgfQogCiBnZXROZXh0QnVmZmVyX2V4aXQ6Ci0gICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgQUxPR1YoImdldE5leHRCdWZmZXIoKSBubyBtb3JlIGRhdGEgZm9yIHRyYWNrICVkIG9uIHRocmVhZCAlcCIsIG1OYW1lLCBtVGhyZWFkLnVuc2FmZV9nZXQoKSk7Ci0gICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgQUxPR1YoImdldE5leHRCdWZmZXIoKSBubyBtb3JlIGRhdGEgZm9yIHRyYWNrICVkIG9uIHRocmVhZCAlcCIsIG1OYW1lLCBtVGhyZWFkLnVuc2FmZV9nZXQoKSk7CisgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKIH0KIAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmZyYW1lc1JlYWR5KCkgY29uc3R7Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZnJhbWVzUmVhZHkoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1DYmxrLT5mcmFtZXNSZWFkeSgpOwogfQogCkBAIC0zNjgzLDggKzM2ODQsOCBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERFQURfT0JKRUNUOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTM4ODQsNyArMzg4NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBtdHRMb2NrKG1NZWRpYVRpbWVUcmFuc2Zvcm1Mb2NrKTsKIAotICAgICAgICAgICAgYXNzZXJ0KG1NZWRpYVRpbWVUcmFuc2Zvcm1WYWxpZCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChtTWVkaWFUaW1lVHJhbnNmb3JtVmFsaWQsICJtZWRpYSB0aW1lIHRyYW5zZm9ybSBpbnZhbGlkIik7CiAKICAgICAgICAgICAgIGlmIChtTWVkaWFUaW1lVHJhbnNmb3JtLmFfdG9fYl9kZW5vbSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gdGhlIHRyYW5zZm9ybSByZXByZXNlbnRzIGEgcGF1c2UsIHNvIHlpZWxkIHNpbGVuY2UKQEAgLTQxMDMsMTQgKzQxMDQsMTQgQEAKICAgICAgICAgbU92ZXJmbG93KGZhbHNlKQogewogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgQUxPR1YoIlJlY29yZFRyYWNrIGNvbnN0cnVjdG9yLCBzaXplICVkIiwgKGludCltQnVmZmVyRW5kIC0gKGludCltQnVmZmVyKTsKLSAgICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpIHsKLSAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gc2l6ZW9mKGludDhfdCk7Ci0gICAgICAgfQorICAgICAgICBBTE9HVigiUmVjb3JkVHJhY2sgY29uc3RydWN0b3IsIHNpemUgJWQiLCAoaW50KW1CdWZmZXJFbmQgLSAoaW50KW1CdWZmZXIpOworICAgICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCkgeworICAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBzaXplb2YoaW50OF90KTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtNDEyOSw3ICs0MTMwLDcgQEAKICAgICB1aW50MzJfdCBmcmFtZXNBdmFpbDsKICAgICB1aW50MzJfdCBmcmFtZXNSZXEgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAKLSAgICAgLy8gQ2hlY2sgaWYgbGFzdCBzdGVwU2VydmVyIGZhaWxlZCwgdHJ5IHRvIHN0ZXAgbm93CisgICAgLy8gQ2hlY2sgaWYgbGFzdCBzdGVwU2VydmVyIGZhaWxlZCwgdHJ5IHRvIHN0ZXAgbm93CiAgICAgaWYgKG1TdGVwU2VydmVyRmFpbGVkKSB7CiAgICAgICAgIGlmICghc3RlcCgpKSBnb3RvIGdldE5leHRCdWZmZXJfZXhpdDsKICAgICAgICAgQUxPR1YoInN0ZXBTZXJ2ZXIgcmVjb3ZlcmVkIik7CkBAIC00OTc1LDcgKzQ5NzYsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0YXJ0KFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrLCBwaWRfdCB0aWQpCiB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgdGlkPSVkIiwgdGlkKTsKLSAgICBzcCA8VGhyZWFkQmFzZT4gc3Ryb25nTWUgPSB0aGlzOworICAgIHNwPFRocmVhZEJhc2U+IHN0cm9uZ01lID0gdGhpczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB7CiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTUwMjgsNyArNTAyOSw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdG9wIik7Ci0gICAgc3AgPFRocmVhZEJhc2U+IHN0cm9uZ01lID0gdGhpczsKKyAgICBzcDxUaHJlYWRCYXNlPiBzdHJvbmdNZSA9IHRoaXM7CiAgICAgewogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCAmJiByZWNvcmRUcmFjayA9PSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKQEAgLTUxOTUsOCArNTE5Niw5IEBACiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKQEAgLTUyODQsOCArNTI4Niw4IEBACiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IG1SZXFTYW1wbGVSYXRlICYmIG1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYgbVJlcUNoYW5uZWxDb3VudCA8PSBGQ0NfMikKICAgICB7CiAgICAgICAgIGludCBjaGFubmVsQ291bnQ7Ci0gICAgICAgICAvLyBvcHRtaXphdGlvbjogaWYgbW9ubyB0byBtb25vLCB1c2UgdGhlIHJlc2FtcGxlciBpbiBzdGVyZW8gdG8gc3RlcmVvIG1vZGUgdG8gYXZvaWQKLSAgICAgICAgIC8vIHN0ZXJlbyB0byBtb25vIHBvc3QgcHJvY2VzcyBhcyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlby4KKyAgICAgICAgLy8gb3B0aW1pemF0aW9uOiBpZiBtb25vIHRvIG1vbm8sIHVzZSB0aGUgcmVzYW1wbGVyIGluIHN0ZXJlbyB0byBzdGVyZW8gbW9kZSB0byBhdm9pZAorICAgICAgICAvLyBzdGVyZW8gdG8gbW9ubyBwb3N0IHByb2Nlc3MgYXMgdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8uCiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAyKSB7CiAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwogICAgICAgICB9IGVsc2UgewpAQCAtNTQ1OSw3ICs1NDYxLDcgQEAKIHsKICAgICAvLyBrZWVwIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHBsYXliYWNrIHRocmVhZCBzbyB0aGF0CiAgICAgLy8gaXQgaXMgbm90IGRlc3Ryb3llZCB3aGlsZSBleGl0KCkgaXMgZXhlY3V0ZWQKLSAgICBzcCA8UGxheWJhY2tUaHJlYWQ+IHRocmVhZDsKKyAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CkBAIC01NDg2LDcgKzU0ODgsNyBAQAogCiAgICAgaWYgKHRocmVhZC0+dHlwZSgpICE9IFRocmVhZEJhc2U6OkRVUExJQ0FUSU5HKSB7CiAgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXQgPSB0aHJlYWQtPmNsZWFyT3V0cHV0KCk7Ci0gICAgICAgIGFzc2VydChvdXQgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKG91dCAhPSBOVUxMLCAib3V0IHNob3VsZG4ndCBiZSBOVUxMIik7CiAgICAgICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bU91dHB1dCBpcyBOVUxMCiAgICAgICAgIG91dC0+aHdEZXYtPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0Rldiwgb3V0LT5zdHJlYW0pOwogICAgICAgICBkZWxldGUgb3V0OwpAQCAtNTYxMiw3ICs1NjE0LDcgQEAKIHsKICAgICAvLyBrZWVwIHN0cm9uZyByZWZlcmVuY2Ugb24gdGhlIHJlY29yZCB0aHJlYWQgc28gdGhhdAogICAgIC8vIGl0IGlzIG5vdCBkZXN0cm95ZWQgd2hpbGUgZXhpdCgpIGlzIGV4ZWN1dGVkCi0gICAgc3AgPFJlY29yZFRocmVhZD4gdGhyZWFkOworICAgIHNwPFJlY29yZFRocmVhZD4gdGhyZWFkOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChpbnB1dCk7CkBAIC01NjI5LDcgKzU2MzEsNyBAQAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgogCiAgICAgQXVkaW9TdHJlYW1JbiAqaW4gPSB0aHJlYWQtPmNsZWFySW5wdXQoKTsKLSAgICBhc3NlcnQoaW4gIT0gTlVMTCk7CisgICAgQUxPR19BU1NFUlQoaW4gIT0gTlVMTCwgImluIHNob3VsZG4ndCBiZSBOVUxMIik7CiAgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tSW5wdXQgaXMgTlVMTAogICAgIGluLT5od0Rldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKGluLT5od0RldiwgaW4tPnN0cmVhbSk7CiAgICAgZGVsZXRlIGluOwpAQCAtNTc0NSw3ICs1NzQ3LDcgQEAKICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGspOwogICAgICAgICAgICAgaWYgKHJlZi0+bVNlc3Npb25pZCA9PSBzZXNzaW9uaWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiIHNlc3Npb24gJWQgc3RpbGwgZXhpc3RzIGZvciAlZCB3aXRoICVkIHJlZnMiLAotICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbmlkLCByZWYtPm1QaWQsIHJlZi0+bUNudCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25pZCwgcmVmLT5tUGlkLCByZWYtPm1DbnQpOwogICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTU5NzgsNyArNTk4MCw3IEBACiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCiAgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKICAgICAgICAgaWYgKGlvID09IDApIHsKLSAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CisgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKQEAgLTU5ODYsMTIgKzU5ODgsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaW8gPT0gMCkgewotICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlvID0gbVJlY29yZFRocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbyA9IG1SZWNvcmRUaHJlYWRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiBubyBvdXRwdXQgdGhyZWFkIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCwgZGVmYXVsdCB0bwogICAgICAgICAgICAgLy8gZmlyc3Qgb3V0cHV0LiBUaGUgZWZmZWN0IGNoYWluIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0CkBAIC02MDIyLDcgKzYwMjQsNyBAQAogICAgIH0KIAogRXhpdDoKLSAgICBpZihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CkBAIC02MjI1LDcgKzYyMjcsNyBAQAogICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKLSAgICBpZihzdGF0dXMpIHsKKyAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CkBAIC02Mjk1LDcgKzYyOTcsNyBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6bG9ja0VmZmVjdENoYWluc19sKAotICAgICAgICBWZWN0b3I8c3AgPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+ID4mIGVmZmVjdENoYWlucykKKyAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpCiB7CiAgICAgZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTYzMDQsNyArNjMwNiw3IEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp1bmxvY2tFZmZlY3RDaGFpbnMoCi0gICAgICAgIGNvbnN0IFZlY3RvcjxzcCA8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKQorICAgICAgICBjb25zdCBWZWN0b3I8IHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+ID4mIGVmZmVjdENoYWlucykKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnVubG9jaygpOwpAQCAtNjQ4MCw3ICs2NDgyLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpCiB7Ci0gICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAodHJhY2stPmF1eEVmZmVjdElkKCkgPT0gZWZmZWN0SWQpIHsKICAgICAgICAgICAgIGF0dGFjaEF1eEVmZmVjdF9sKHRyYWNrLCAwKTsKQEAgLTcyNjQsNyArNzI2Niw3IEBACiAgICAgICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CiAgICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwotICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBFZmZlY3Qgc2l6ZT0ldSIsIEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSk7CiAgICAgICAgIHJldHVybjsKQEAgLTgwMzEsNyArODAzMyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoImNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCgpIGVuYWJsZSBzdXNwZW5kaW5nIGZ4ICUwOHgiLAotICAgICAgICAgICAgIGVmZmVjdC0+ZGVzYygpLnR5cGUudGltZUxvdyk7CisgICAgICAgICAgICBlZmZlY3QtPmRlc2MoKS50eXBlLnRpbWVMb3cpOwogICAgICAgICBzcDxTdXNwZW5kZWRFZmZlY3REZXNjPiBkZXNjID0gbVN1c3BlbmRlZEVmZmVjdHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIC8vIGlmIGVmZmVjdCBpcyByZXF1ZXN0ZWQgdG8gc3VzcGVuZGVkIGJ1dCB3YXMgbm90IHlldCBlbmFibGVkLCBzdXBlbmQgaXQgbm93LgogICAgICAgICBpZiAoZGVzYy0+bUVmZmVjdCA9PSAwKSB7CkBAIC04MDQ0LDcgKzgwNDYsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoKSBkaXNhYmxlIHJlc3RvcmluZyBmeCAlMDh4IiwKLSAgICAgICAgICAgICBlZmZlY3QtPmRlc2MoKS50eXBlLnRpbWVMb3cpOworICAgICAgICAgICAgZWZmZWN0LT5kZXNjKCkudHlwZS50aW1lTG93KTsKICAgICAgICAgc3A8U3VzcGVuZGVkRWZmZWN0RGVzYz4gZGVzYyA9IG1TdXNwZW5kZWRFZmZlY3RzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBkZXNjLT5tRWZmZWN0LmNsZWFyKCk7CiAgICAgICAgIGVmZmVjdC0+c2V0U3VzcGVuZGVkKGZhbHNlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCBmM2M4ZGQyLi4wZTRiMjRhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtNDY1LDkgKzQ2NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIFRocmVhZEJhc2UgbXV0ZXggYmVmb3JlIHByb2Nlc3NpbmcgdGhlIG1peGVyIGFuZCBlZmZlY3RzLiBUaGlzIGd1YXJhbnRlZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGludGVncml0eSBvZiB0aGUgY2hhaW5zIGR1cmluZyB0aGUgcHJvY2Vzcy4KICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBzZXRzIHRoZSBwYXJhbWV0ZXIgJ2VmZmVjdENoYWlucycgdG8gY3VycmVudCB2YWx1ZSBvZiBtRWZmZWN0Q2hhaW5zLgotICAgICAgICAgICAgICAgICAgICB2b2lkIGxvY2tFZmZlY3RDaGFpbnNfbChWZWN0b3I8c3AgPEVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpOworICAgICAgICAgICAgICAgICAgICB2b2lkIGxvY2tFZmZlY3RDaGFpbnNfbChWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+JiBlZmZlY3RDaGFpbnMpOwogICAgICAgICAgICAgICAgICAgICAvLyB1bmxvY2sgZWZmZWN0IGNoYWlucyBhZnRlciBwcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgdW5sb2NrRWZmZWN0Q2hhaW5zKGNvbnN0IFZlY3RvcjxzcDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCB1bmxvY2tFZmZlY3RDaGFpbnMoY29uc3QgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGF1ZGlvIG1vZGUgdG8gYWxsIGVmZmVjdCBjaGFpbnMKICAgICAgICAgICAgICAgICAgICAgdm9pZCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGVmZmVjdCBtb2R1bGUgd2l0aCBjb3JyZXNwb25kaW5nIElEIG9uIHNwZWNpZmllZCBhdWRpbyBzZXNzaW9uCkBAIC0xMDU2LDcgKzEwNTYsNyBAQAogICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgb3V0cHV0c1JlYWR5KGNvbnN0IFNvcnRlZFZlY3RvcjxzcDxPdXRwdXRUcmFjaz4gPiAmb3V0cHV0VHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgb3V0cHV0c1JlYWR5KGNvbnN0IFNvcnRlZFZlY3Rvcjwgc3A8T3V0cHV0VHJhY2s+ID4gJm91dHB1dFRyYWNrcyk7CiAgICAgcHJvdGVjdGVkOgogICAgICAgICAvLyB0aHJlYWRMb29wIHNuaXBwZXRzCiAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfbWl4KCk7CkBAIC0xNTA0LDcgKzE1MDQsNyBAQAogCiAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5KCkgY29uc3QgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CiAgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3kodWludDMyX3Qgc3RyYXRlZ3kpCi0gICAgICAgICAgICAgICAgIHsgbVN0cmF0ZWd5ID0gc3RyYXRlZ3k7IH0KKyAgICAgICAgICAgICAgICB7IG1TdHJhdGVneSA9IHN0cmF0ZWd5OyB9CiAKICAgICAgICAgLy8gc3VzcGVuZCBlZmZlY3Qgb2YgdGhlIGdpdmVuIHR5cGUKICAgICAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWRfbChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLApAQCAtMTU0NCw3ICsxNTQ0LDcgQEAKIAogICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAogICAgICAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAotICAgICAgICBWZWN0b3I8c3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCiAgICAgICAgIGludCBtU2Vzc2lvbklkOyAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECiAgICAgICAgIGludDE2X3QgKm1JbkJ1ZmZlcjsgICAgICAgICAvLyBjaGFpbiBpbnB1dCBidWZmZXIKICAgICAgICAgaW50MTZfdCAqbU91dEJ1ZmZlcjsgICAgICAgIC8vIGNoYWluIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCAyY2VjNTI1Li4xZWMyMzhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvTWl4ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTI5LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICA6ICAgbVRyYWNrTmFtZXMoMCksIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCiB7CiAgICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBiZXlvbmQgc3RlcmVvCi0gICAgYXNzZXJ0KDIgPT0gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRSgyID09IE1BWF9OVU1fQ0hBTk5FTFMpOwogICAgIAogICAgIExvY2FsQ2xvY2sgbGM7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogdm9pZCBBdWRpb01peGVyOjpkZWxldGVUcmFja05hbWUoaW50IG5hbWUpCiB7CiAgICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgYXNzZXJ0KHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MpOworICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOwogICAgIEFMT0dWKCJkZWxldGVUcmFja05hbWUoJWQpIiwgbmFtZSk7CiAgICAgdHJhY2tfdCYgdHJhY2sobVN0YXRlLnRyYWNrc1sgbmFtZSBdKTsKICAgICBpZiAodHJhY2suZW5hYmxlZCkgewpAQCAtMTQ2LDcgKzE0Niw3IEBACiB2b2lkIEF1ZGlvTWl4ZXI6OmVuYWJsZShpbnQgbmFtZSkKIHsKICAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBhc3NlcnQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUyk7CisgICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CiAgICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOwogCiAgICAgaWYgKCF0cmFjay5lbmFibGVkKSB7CkBAIC0xNTksNyArMTU5LDcgQEAKIHZvaWQgQXVkaW9NaXhlcjo6ZGlzYWJsZShpbnQgbmFtZSkKIHsKICAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBhc3NlcnQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUyk7CisgICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CiAgICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOwogCiAgICAgaWYgKHRyYWNrLmVuYWJsZWQpIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogdm9pZCBBdWRpb01peGVyOjpzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB0YXJnZXQsIGludCBwYXJhbSwgdm9pZCAqdmFsdWUpCiB7CiAgICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgYXNzZXJ0KHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MpOworICAgIEFMT0dfQVNTRVJUKHVpbnQzMl90KG5hbWUpIDwgTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOwogICAgIHRyYWNrX3QmIHRyYWNrID0gbVN0YXRlLnRyYWNrc1tuYW1lXTsKIAogICAgIGludCB2YWx1ZUludCA9IChpbnQpdmFsdWU7CkBAIC0xODUsOCArMTg1LDkgQEAKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAodWludDMyX3QpdmFsdWU7CiAgICAgICAgICAgICBpZiAodHJhY2suY2hhbm5lbE1hc2sgIT0gbWFzaykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKGNoYW5uZWxDb3VudCkpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKGNoYW5uZWxDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNoYW5uZWwgY291bnQgJXUiLCBjaGFubmVsQ291bnQpOwogICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxNYXNrID0gbWFzazsKICAgICAgICAgICAgICAgICB0cmFjay5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCBtYXNrKTsKQEAgLTIwOCwxNSArMjA5LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIGJhZCBwYXJhbQotICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFJFU0FNUExFOgogICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgICAgIGNhc2UgU0FNUExFX1JBVEU6Ci0gICAgICAgICAgICBhc3NlcnQodmFsdWVJbnQgPiAwKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID4gMCwgImJhZCBzYW1wbGUgcmF0ZSAlZCIsIHZhbHVlSW50KTsKICAgICAgICAgICAgIGlmICh0cmFjay5zZXRSZXNhbXBsZXIodWludDMyX3QodmFsdWVJbnQpLCBtU2FtcGxlUmF0ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFJFU0FNUExFLCBTQU1QTEVfUkFURSwgJXUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KHZhbHVlSW50KSk7CkBAIC0yMjgsOCArMjI4LDcgQEAKICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBiYWQgcGFyYW0KLSAgICAgICAgICAgIGFzc2VydChmYWxzZSk7CisgICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVWExFVkVMOgotICAgICAgICAgICAgLy9hc3NlcnQoMCA8PSB2YWx1ZUludCAmJiB2YWx1ZUludCA8PSBNQVhfR0FJTl9JTlQpOworICAgICAgICAgICAgLy9BTE9HX0FTU0VSVCgwIDw9IHZhbHVlSW50ICYmIHZhbHVlSW50IDw9IE1BWF9HQUlOX0lOVCwgImJhZCBhdXggbGV2ZWwgJWQiLCB2YWx1ZUludCk7CiAgICAgICAgICAgICBpZiAodHJhY2suYXV4TGV2ZWwgIT0gdmFsdWVJbnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFZPTFVNRSwgQVVYTEVWRUw6ICUwNHgpIiwgdmFsdWVJbnQpOwogICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHRyYWNrLmF1eExldmVsIDw8IDE2OwpAQCAtMjc3LDE0ICsyNzYsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gYmFkIHBhcmFtCi0gICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIGJhZCB0YXJnZXQKLSAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgTE9HX0ZBVEFMKCJiYWQgdGFyZ2V0Iik7CiAgICAgfQogfQogCkBAIC0zMzUsNyArMzMyLDcgQEAKIHZvaWQgQXVkaW9NaXhlcjo6c2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKQogewogICAgIG5hbWUgLT0gVFJBQ0swOwotICAgIGFzc2VydCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTKTsKKyAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CiB9CiAKQEAgLTk3OSw5ICs5NzYsOSBAQAogICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gc3RhdGUtPmVuYWJsZWRUcmFja3MgaGFzIGV4YWN0bHkKICAgICAvLyBvbmUgYml0IHNldC4gIFRoZSBhc3NlcnRzIGJlbG93IHdvdWxkIHZlcmlmeSB0aGlzLCBidXQgYXJlIGNvbW1lbnRlZCBvdXQKICAgICAvLyBzaW5jZSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QgaXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuCi0gICAgLy9hc3NlcnQoMCAhPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgLy9BTE9HX0FTU0VSVCgwICE9IHN0YXRlLT5lbmFibGVkVHJhY2tzLCAibm8gdHJhY2tzIGVuYWJsZWQiKTsKICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7Ci0gICAgLy9hc3NlcnQoKDEgPDwgaSkgPT0gc3RhdGUtPmVuYWJsZWRUcmFja3MpOworICAgIC8vQUxPR19BU1NFUlQoKDEgPDwgaSkgPT0gc3RhdGUtPmVuYWJsZWRUcmFja3MsICJtb3JlIHRoYW4gMSB0cmFjayBlbmFibGVkIik7CiAgICAgY29uc3QgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBkNTczMjZiLi5jMjNlYjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtNjQ5LDcgKzY0OSw3IEBACiAgICAgbUxvY2subG9jaygpOwogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7Ci0gICAgICAgIHdoaWxlKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgd2hpbGUgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIG5zZWNzX3QgY3VyVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBleGVjdXRlIHRoZW0gZnJvbSBpbmRleCAwIGFuZCB1cAogICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSA8PSBjdXJUaW1lKSB7CkBAIC02OTMsMTYgKzY5MywxNiBAQAogICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW07CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCkBAIC05MTYsMTkgKzkxNiwxOSBAQAogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkYXRhLT5tS2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTIgPSBBdWRpb1BhcmFtZXRlcihkYXRhMi0+bUtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXJhbS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlOwotICAgICAgICAgICAgICAgcGFyYW0uZ2V0QXQoaiwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkyOwotICAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKLSAgICAgICAgICAgICAgICAgIGlmIChrZXkyID09IGtleSkgewotICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMi5yZW1vdmUoa2V5Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbS5nZXRBdChqLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUyOworICAgICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0ga2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIucmVtb3ZlKGtleTIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGlmIGFsbCBrZXlzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQsIHJlbW92ZSB0aGUgY29tbWFuZC4KICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgcGFpcnMKQEAgLTEwMjAsNyArMTAyMCw3IEBACiAgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwogICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpCiAgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgIHRvbmUpOworICAgICAgICAgICAgdG9uZSk7CiAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjpUT05FX1NVUF9DQUxMX1dBSVRJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggNzExOWI5MC4uOWVkOTA1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMzExLDggKzMxMSw4IEBACiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCi0gICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCi0gICAgc3AgPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgSW5wdXRTb3VyY2VEZXNjKiA+IG1JbnB1dFNvdXJjZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCAzOThiYTBiLi5mYmI1NGNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICAgICAgbVgwTCA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTJdOwogICAgICAgICAgICAgbVgwUiA9IG1CdWZmZXIuaTE2W21CdWZmZXIuZnJhbWVDb3VudCoyLTFdOwogICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwotICAgICAgICAgICAgIC8vIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwIG5vdyBzbyB3ZSByZWxvYWQgYSBuZXcgYnVmZmVyCisgICAgICAgICAgICAvLyBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCBub3cgc28gd2UgcmVsb2FkIGEgbmV3IGJ1ZmZlcgogICAgICAgICB9CiAKICAgICAgICAgaW50MTZfdCAqaW4gPSBtQnVmZmVyLmkxNjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKaW5kZXggOWRlYjc5Ni4uMTYxMGUwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAvLyAgSElHSF9RVUFMSVRZOiBmaXhlZCBtdWx0aS10YXAgRklSIChlLmcuIDQ4S0h6LT40NC4xS0h6KQogICAgIC8vIE5PVEU6IGhpZ2ggcXVhbGl0eSBTUkMgd2lsbCBvbmx5IGJlIHN1cHBvcnRlZCBmb3IKICAgICAvLyBjZXJ0YWluIGZpeGVkIHJhdGUgY29udmVyc2lvbnMuIFNhbXBsZSByYXRlIGNhbm5vdCBiZQotICAgIC8vIGNoYW5nZWQgZHluYW1pY2FsbHkuIAorICAgIC8vIGNoYW5nZWQgZHluYW1pY2FsbHkuCiAgICAgZW51bSBzcmNfcXVhbGl0eSB7CiAgICAgICAgIERFRkFVTFQ9MCwKICAgICAgICAgTE9XX1FVQUxJVFk9MSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCmluZGV4IGI3MmI2MmEuLjg5Mjc4NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICBwLT55MSA9IHAtPnkyOwogICAgICAgICBwLT55MiA9IHAtPnkzOwogICAgICAgICBwLT55MyA9IGluOwotICAgICAgICBwLT5hID0gKDMgKiAocC0+eTEgLSBwLT55MikgLSBwLT55MCArIHAtPnkzKSA+PiAxOyAgICAgICAgICAgIAorICAgICAgICBwLT5hID0gKDMgKiAocC0+eTEgLSBwLT55MikgLSBwLT55MCArIHAtPnkzKSA+PiAxOwogICAgICAgICBwLT5iID0gKHAtPnkyIDw8IDEpICsgcC0+eTAgLSAoKCg1ICogcC0+eTEgKyBwLT55MykpID4+IDEpOwogICAgICAgICBwLT5jID0gKHAtPnkyIC0gcC0+eTApID4+IDE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCBkMzczYzA4Li43NjY2MmQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmVhZDxDSEFOTkVMUz4oaW1wdWxzZSwgcGhhc2VGcmFjdGlvbiwgbUJ1ZmZlci5pMTYsIGlucHV0SW5kZXgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CiAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gbUJ1ZmZlci5mcmFtZUNvdW50OwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gZnJhbWVDb3VudCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBuZWVkIGEgbmV3IGJ1ZmZlcgogICAgICAgICAgICAgICAgIHJlYWQ8Q0hBTk5FTFM+KGltcHVsc2UsIHBoYXNlRnJhY3Rpb24sIGluLCBpbnB1dEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihwaGFzZUluZGV4ID09IDIpIHsgICAgLy8gbWF4aW11bSB2YWx1ZQorICAgICAgICAgICAgfSBlbHNlIGlmIChwaGFzZUluZGV4ID09IDIpIHsgICAgLy8gbWF4aW11bSB2YWx1ZQogICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKICAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KQogICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIDAgZnJhbWUgYXZhaWxhYmxlLCAyIGZyYW1lcyBuZWVkZWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05hdGl2ZURhZW1vbkNvbm5lY3Rvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKaW5kZXggNjU5M2EwZi4uMGI1ZWFmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmF0aXZlRGFlbW9uQ29ubmVjdG9yLmphdmEKQEAgLTIwMCwxNyArMjAwLDE1IEBACiAKICAgICAvKioKICAgICAgKiBNYWtlIGNvbW1hbmQgZm9yIGRhZW1vbiwgZXNjYXBpbmcgYXJndW1lbnRzIGFzIG5lZWRlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZpbmFsIGNvbW1hbmQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1ha2VDb21tYW5kKFN0cmluZyBjbWQsIE9iamVjdC4uLiBhcmdzKQorICAgIHByaXZhdGUgdm9pZCBtYWtlQ29tbWFuZChTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIFN0cmluZyBjbWQsIE9iamVjdC4uLiBhcmdzKQogICAgICAgICAgICAgdGhyb3dzIE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IGV2ZW50dWFsbHkgZW5mb3JjZSB0aGF0IGNtZCBkb2Vzbid0IGNvbnRhaW4gYXJndW1lbnRzCiAgICAgICAgIGlmIChjbWQuaW5kZXhPZignXDAnKSA+PSAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGNvbW1hbmQ6ICIgKyBjbWQpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoY21kKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoY21kKTsKICAgICAgICAgZm9yIChPYmplY3QgYXJnIDogYXJncykgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZ1N0cmluZyA9IFN0cmluZy52YWx1ZU9mKGFyZyk7CiAgICAgICAgICAgICBpZiAoYXJnU3RyaW5nLmluZGV4T2YoJ1wwJykgPj0gMCkgewpAQCAtMjIwLDM0ICsyMTgsNiBAQAogICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKICAgICAgICAgICAgIGFwcGVuZEVzY2FwZWQoYnVpbGRlciwgYXJnU3RyaW5nKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNlbmRDb21tYW5kKFN0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHRocm93cyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24gewotCi0gICAgICAgIGludCBzZXF1ZW5jZU51bWJlciA9IG1TZXF1ZW5jZU51bWJlci5pbmNyZW1lbnRBbmRHZXQoKTsKLQotICAgICAgICBidWlsZGVyLmluc2VydCgwLCBJbnRlZ2VyLnRvU3RyaW5nKHNlcXVlbmNlTnVtYmVyKSArICIgIik7Ci0KLSAgICAgICAgbG9nKCJTTkQgLT4geyIgKyBidWlsZGVyLnRvU3RyaW5nKCkgKyAifSIpOwotCi0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCdcMCcpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobURhZW1vbkxvY2spIHsKLSAgICAgICAgICAgIGlmIChtT3V0cHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uKCJtaXNzaW5nIG91dHB1dCBzdHJlYW0iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24oInByb2JsZW0gc2VuZGluZyBjb21tYW5kIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlcXVlbmNlTnVtYmVyOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI1LDI1ICsyOTUsNDYgQEAKICAgICBwdWJsaWMgTmF0aXZlRGFlbW9uRXZlbnRbXSBleGVjdXRlKGludCB0aW1lb3V0LCBTdHJpbmcgY21kLCBPYmplY3QuLi4gYXJncykKICAgICAgICAgICAgIHRocm93cyBOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8TmF0aXZlRGFlbW9uRXZlbnQ+IGV2ZW50cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNlbnRDb21tYW5kID0gbWFrZUNvbW1hbmQoY21kLCBhcmdzKTsKLSAgICAgICAgZmluYWwgaW50IGNtZE51bWJlciA9IHNlbmRDb21tYW5kKHNlbnRDb21tYW5kKTsKKworICAgICAgICBmaW5hbCBpbnQgc2VxdWVuY2VOdW1iZXIgPSBtU2VxdWVuY2VOdW1iZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgY21kQnVpbGRlciA9CisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoSW50ZWdlci50b1N0cmluZyhzZXF1ZW5jZU51bWJlcikpLmFwcGVuZCgnICcpOworCisgICAgICAgIG1ha2VDb21tYW5kKGNtZEJ1aWxkZXIsIGNtZCwgYXJncyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvZ0NtZCA9IGNtZEJ1aWxkZXIudG9TdHJpbmcoKTsgLyogaW5jbHVkZXMgY21kTnVtLCBjbWQsIGFyZ3MgKi8KKyAgICAgICAgbG9nKCJTTkQgLT4geyIgKyBsb2dDbWQgKyAifSIpOworCisgICAgICAgIGNtZEJ1aWxkZXIuYXBwZW5kKCdcMCcpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VudENtZCA9IGNtZEJ1aWxkZXIudG9TdHJpbmcoKTsgLyogbG9nQ21kICsgXDAgKi8KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1EYWVtb25Mb2NrKSB7CisgICAgICAgICAgICBpZiAobU91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbigibWlzc2luZyBvdXRwdXQgc3RyZWFtIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW0ud3JpdGUoc2VudENtZC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hdGl2ZURhZW1vbkNvbm5lY3RvckV4Y2VwdGlvbigicHJvYmxlbSBzZW5kaW5nIGNvbW1hbmQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBOYXRpdmVEYWVtb25FdmVudCBldmVudCA9IG51bGw7Ci0gICAgICAgIGNtZCA9IHNlbnRDb21tYW5kLnRvU3RyaW5nKCk7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGV2ZW50ID0gbVJlc3BvbnNlUXVldWUucmVtb3ZlKGNtZE51bWJlciwgdGltZW91dCwgY21kKTsKKyAgICAgICAgICAgIGV2ZW50ID0gbVJlc3BvbnNlUXVldWUucmVtb3ZlKHNlcXVlbmNlTnVtYmVyLCB0aW1lb3V0LCBzZW50Q21kKTsKICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nZSgidGltZWQtb3V0IHdhaXRpbmcgZm9yIHJlc3BvbnNlIHRvICIgKyBjbWROdW1iZXIgKyAiICIgKyBjbWQpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25GYWlsdXJlRXhjZXB0aW9uKGNtZCwgZXZlbnQpOworICAgICAgICAgICAgICAgIGxvZ2UoInRpbWVkLW91dCB3YWl0aW5nIGZvciByZXNwb25zZSB0byAiICsgbG9nQ21kKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uRmFpbHVyZUV4Y2VwdGlvbihsb2dDbWQsIGV2ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnQpOwogICAgICAgICB9IHdoaWxlIChldmVudC5pc0NsYXNzQ29udGludWUoKSk7CiAKICAgICAgICAgaWYgKGV2ZW50LmlzQ2xhc3NDbGllbnRFcnJvcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQXJndW1lbnRFeGNlcHRpb24oY21kLCBldmVudCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uQXJndW1lbnRFeGNlcHRpb24obG9nQ21kLCBldmVudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGV2ZW50LmlzQ2xhc3NTZXJ2ZXJFcnJvcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTmF0aXZlRGFlbW9uRmFpbHVyZUV4Y2VwdGlvbihjbWQsIGV2ZW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBOYXRpdmVEYWVtb25GYWlsdXJlRXhjZXB0aW9uKGxvZ0NtZCwgZXZlbnQpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGV2ZW50cy50b0FycmF5KG5ldyBOYXRpdmVEYWVtb25FdmVudFtldmVudHMuc2l6ZSgpXSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKaW5kZXggNjM0MThkYi4uNTJhNDExMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTg1OCw2ICsxODU4LDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGxpZ2h0cyAqYmVmb3JlKiB0YWtpbmcgY2FyZSBvZiB0dXJuaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyBzY3JlZW4gb2ZmLCBzbyB3ZSBjYW4gaW5pdGlhdGUgYW55IGFuaW1hdGlvbnMgdGhhdCBhcmUgZGVzaXJlZC4KKyAgICAgICAgICAgICAgICAgICAgbVNjcmVlbk9mZlJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGlnaHRzTG9ja2VkKG5ld1N0YXRlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTg3Niw3ICsxODc3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtUG93ZXJTdGF0ZSAmPSB+U0NSRUVOX09OX0JJVDsKLSAgICAgICAgICAgICAgICAgICAgbVNjcmVlbk9mZlJlYXNvbiA9IHJlYXNvbjsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2NyZWVuQnJpZ2h0bmVzc0FuaW1hdG9yLmlzQW5pbWF0aW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNjcmVlbk9mZkZpbmlzaGVkQW5pbWF0aW5nTG9ja2VkKHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQppbmRleCBmZTgwZmRmLi45NjViYWZhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKQEAgLTE4NiwxMCArMTg2LDEyIEBACiAgICAgICAgIGlmIChwaG9uZS5tQ00uZ2V0THRlT25DZG1hTW9kZSgpID09IFBob25lLkxURV9PTl9DRE1BX1RSVUUKICAgICAgICAgICAgICAgICAmJiBwaG9uZSBpbnN0YW5jZW9mIENETUFMVEVQaG9uZSkgewogICAgICAgICAgICAgbUljY1JlY29yZHMgPSBuZXcgQ2RtYUx0ZVVpY2NSZWNvcmRzKHBob25lKTsKLSAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IG5ldyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyKChDRE1BTFRFUGhvbmUpcGhvbmUpOworICAgICAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gbmV3IENkbWFMdGVVaWNjRmlsZUhhbmRsZXIodGhpcywgIiIsIG1QaG9uZS5tQ00pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUljY1JlY29yZHMgPSBpczNncHAgPyBuZXcgU0lNUmVjb3JkcyhwaG9uZSkgOiBuZXcgUnVpbVJlY29yZHMocGhvbmUpOwotICAgICAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gaXMzZ3BwID8gbmV3IFNJTUZpbGVIYW5kbGVyKHBob25lKSA6IG5ldyBSdWltRmlsZUhhbmRsZXIocGhvbmUpOworICAgICAgICAgICAgLy8gQ29ycmVjdCBhaWQgd2lsbCBiZSBzZXQgbGF0ZXIgKHdoZW4gR0VUX1NJTV9TVEFUVVMgcmV0dXJucykKKyAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IGlzM2dwcCA/IG5ldyBTSU1GaWxlSGFuZGxlcih0aGlzLCAiIiwgbVBob25lLm1DTSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJ1aW1GaWxlSGFuZGxlcih0aGlzLCAiIiwgbVBob25lLm1DTSk7CiAgICAgICAgIH0KICAgICAgICAgbVBob25lLm1DTS5yZWdpc3RlckZvck9mZk9yTm90QXZhaWxhYmxlKG1IYW5kbGVyLCBFVkVOVF9SQURJT19PRkZfT1JfTk9UX0FWQUlMQUJMRSwgbnVsbCk7CiAgICAgICAgIG1QaG9uZS5tQ00ucmVnaXN0ZXJGb3JPbihtSGFuZGxlciwgRVZFTlRfUkFESU9fT04sIG51bGwpOwpAQCAtNTcyLDYgKzU3NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAob2xkU3RhdGUgIT0gU3RhdGUuUkVBRFkgJiYgbmV3U3RhdGUgPT0gU3RhdGUuUkVBRFkpIHsKKyAgICAgICAgICAgIG1JY2NGaWxlSGFuZGxlci5zZXRBaWQoZ2V0QWlkKCkpOwogICAgICAgICAgICAgbUljY1JlY29yZHMub25SZWFkeSgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQppbmRleCAzODBiZmQxLi43MGQ4ZjdhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjRmlsZUhhbmRsZXIuamF2YQpAQCAtOTAsNyArOTAsOSBAQAogICAgIHN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgaW50IEVWRU5UX1JFQURfSUNPTl9ET05FID0gMTA7CiAKICAgICAgLy8gbWVtYmVyIHZhcmlhYmxlcwotICAgIHByb3RlY3RlZCBQaG9uZUJhc2UgcGhvbmU7CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbW1hbmRzSW50ZXJmYWNlIG1DaTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSWNjQ2FyZCBtUGFyZW50Q2FyZDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1BaWQ7CiAKICAgICBzdGF0aWMgY2xhc3MgTG9hZExpbmVhckZpeGVkQ29udGV4dCB7CiAKQEAgLTEyMCw5ICsxMjIsMTAgQEAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEljY0ZpbGVIYW5kbGVyKFBob25lQmFzZSBwaG9uZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CisgICAgcHJvdGVjdGVkIEljY0ZpbGVIYW5kbGVyKEljY0NhcmQgY2FyZCwgU3RyaW5nIGFpZCwgQ29tbWFuZHNJbnRlcmZhY2UgY2kpIHsKKyAgICAgICAgbVBhcmVudENhcmQgPSBjYXJkOworICAgICAgICBtQWlkID0gYWlkOworICAgICAgICBtQ2kgPSBjaTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewpAQCAtMTQ1LDkgKzE0OCw4IEBACiAgICAgICAgICAgICA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX1JFQ09SRF9TSVpFX0RPTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9hZExpbmVhckZpeGVkQ29udGV4dChmaWxlaWQsIHJlY29yZE51bSwgb25Mb2FkZWQpKTsKIAotICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1LDEwICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgb25Mb2FkZWQpKTsKIAogICAgICAgICAvLyBUT0RPKCk6IFZlcmlmeSB3aGVuIHBhdGggY2hhbmdlcyBhcmUgZG9uZS4KLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBJY2NDb25zdGFudHMuRUZfSU1HLCAiaW1nIiwKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBJY2NDb25zdGFudHMuRUZfSU1HLCAiaW1nIiwKICAgICAgICAgICAgICAgICByZWNvcmROdW0sIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgR0VUX1JFU1BPTlNFX0VGX0lNR19TSVpFX0JZVEVTLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIEdFVF9SRVNQT05TRV9FRl9JTUdfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg0LDkgKzE4NSw4IEBACiAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UKICAgICAgICAgICAgICAgICA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0VGX0xJTkVBUl9SRUNPUkRfU0laRV9ET05FLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvYWRMaW5lYXJGaXhlZENvbnRleHQoZmlsZWlkLCBvbkxvYWRlZCkpOwotICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCi0gICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLCBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAwLCAwLCBHRVRfUkVTUE9OU0VfRUZfU0laRV9CWVRFUywgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjAyLDkgKzIwMiw4IEBACiAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9SRUNPUkRfU0laRV9ET05FLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvYWRMaW5lYXJGaXhlZENvbnRleHQoZmlsZWlkLG9uTG9hZGVkKSk7CiAKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgR0VUX1JFU1BPTlNFX0VGX1NJWkVfQllURVMsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksIHJlc3BvbnNlKTsKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgR0VUX1JFU1BPTlNFX0VGX1NJWkVfQllURVMsIG51bGwsIG51bGwsIG1BaWQsIHJlc3BvbnNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMSw5ICsyMjAsOCBAQAogICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQklOQVJZX1NJWkVfRE9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpZCwgMCwgb25Mb2FkZWQpOwogCi0gICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX0dFVF9SRVNQT05TRSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLCByZXNwb25zZSk7CisgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX0dFVF9SRVNQT05TRSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEdFVF9SRVNQT05TRV9FRl9TSVpFX0JZVEVTLCBudWxsLCBudWxsLCBtQWlkLCByZXNwb25zZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDEsOCArMjM5LDggQEAKICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVBRF9JQ09OX0RPTkUsIGZpbGVpZCwgMCwKICAgICAgICAgICAgICAgICBvbkxvYWRlZCk7CiAKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfUkVBRF9CSU5BUlksIGZpbGVpZCwgImltZyIsIGhpZ2hPZmZzZXQsIGxvd09mZnNldCwKLSAgICAgICAgICAgICAgICBsZW5ndGgsIG51bGwsIG51bGwsIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCAiaW1nIiwgaGlnaE9mZnNldCwgbG93T2Zmc2V0LAorICAgICAgICAgICAgICAgIGxlbmd0aCwgbnVsbCwgbnVsbCwgbUFpZCwgcmVzcG9uc2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU2LDEwICsyNTQsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVGTGluZWFyRml4ZWQoaW50IGZpbGVpZCwgaW50IHJlY29yZE51bSwgYnl0ZVtdIGRhdGEsCiAgICAgICAgICAgICBTdHJpbmcgcGluMiwgTWVzc2FnZSBvbkNvbXBsZXRlKSB7Ci0gICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1VQREFURV9SRUNPUkQsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCisgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1VQREFURV9SRUNPUkQsIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmROdW0sIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsIGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSwgcGluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgb25Db21wbGV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKGRhdGEpLCBwaW4yLCBtQWlkLCBvbkNvbXBsZXRlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2OCwxMCArMjY1LDkgQEAKICAgICAgKiBAcGFyYW0gZGF0YSBtdXN0IGJlIGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgRUYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB1cGRhdGVFRlRyYW5zcGFyZW50KGludCBmaWxlaWQsIGJ5dGVbXSBkYXRhLCBNZXNzYWdlIG9uQ29tcGxldGUpIHsKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfVVBEQVRFX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfVVBEQVRFX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgb25Db21wbGV0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBJY2NVdGlscy5ieXRlc1RvSGV4U3RyaW5nKGRhdGEpLCBudWxsLCBtQWlkLCBvbkNvbXBsZXRlKTsKICAgICB9CiAKIApAQCAtNDAyLDExICszOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIGxjLnJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PGJ5dGVbXT4obGMuY291bnRSZWNvcmRzKTsKICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCisgICAgICAgICAgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfUkVDT1JEX01PREVfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkU2l6ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkU2l6ZSwgbnVsbCwgbnVsbCwgbUFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX1JFQURfUkVDT1JEX0RPTkUsIGxjKSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfQklOQVJZX1NJWkVfRE9ORToKQEAgLTQ0MSw5ICs0MzYsOCBAQAogICAgICAgICAgICAgICAgIHNpemUgPSAoKGRhdGFbUkVTUE9OU0VfREFUQV9GSUxFX1NJWkVfMV0gJiAweGZmKSA8PCA4KQogICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhW1JFU1BPTlNFX0RBVEFfRklMRV9TSVpFXzJdICYgMHhmZik7CiAKLSAgICAgICAgICAgICAgICBwaG9uZS5tQ00uaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgc2l6ZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLAorICAgICAgICAgICAgICAgIG1DaS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfQklOQVJZLCBmaWxlaWQsIGdldEVGUGF0aChmaWxlaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBzaXplLCBudWxsLCBudWxsLCBtQWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX1JFQURfQklOQVJZX0RPTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWlkLCAwLCByZXNwb25zZSkpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NzcsMTEgKzQ3MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobGMucmVjb3JkTnVtID4gbGMuY291bnRSZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVzdWx0KHJlc3BvbnNlLCBsYy5yZXN1bHRzLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBob25lLm1DTS5pY2NJT0ZvckFwcChDT01NQU5EX1JFQURfUkVDT1JELCBsYy5lZmlkLCBnZXRFRlBhdGgobGMuZWZpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9SRUFEX1JFQ09SRCwgbGMuZWZpZCwgZ2V0RUZQYXRoKGxjLmVmaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMucmVjb3JkTnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9SRUNPUkRfTU9ERV9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLnJlY29yZFNpemUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZS5nZXRJY2NDYXJkKCkuZ2V0QWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYy5yZWNvcmRTaXplLCBudWxsLCBudWxsLCBtQWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShFVkVOVF9SRUFEX1JFQ09SRF9ET05FLCBsYykpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTUxLDUgKzU0NCw4IEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9nZChTdHJpbmcgcyk7CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsb2dlKFN0cmluZyBzKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBaWQoU3RyaW5nIGFpZCkgeworICAgICAgICBtQWlkID0gYWlkOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlci5qYXZhCmluZGV4IGUxOTVmZjIuLjkzYTYyOTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlVWljY0ZpbGVIYW5kbGVyLmphdmEKQEAgLTE3LDYgKzE3LDkgQEAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWE7CiAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkNvbW1hbmRzSW50ZXJmYWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDb25zdGFudHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0ZpbGVIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKQEAgLTI3LDggKzMwLDggQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyIGV4dGVuZHMgSWNjRmlsZUhhbmRsZXIgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJDRE1BIjsKIAotICAgIHB1YmxpYyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyKENETUFMVEVQaG9uZSBwaG9uZSkgewotICAgICAgICBzdXBlcihwaG9uZSk7CisgICAgcHVibGljIENkbWFMdGVVaWNjRmlsZUhhbmRsZXIoSWNjQ2FyZCBjYXJkLCBTdHJpbmcgYWlkLCBDb21tYW5kc0ludGVyZmFjZSBjaSkgeworICAgICAgICBzdXBlcihjYXJkLCBhaWQsIGNpKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVGUGF0aChpbnQgZWZpZCkgewpAQCAtNTUsOCArNTgsOCBAQAogICAgICAgICBpZiAoZmlsZWlkID09IEVGX0NTSU1fRVBSTCkgewogICAgICAgICAgICAgLy8gRW50aXJlIFBSTCBjb3VsZCBiZSBodWdlLiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluCiAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgcmVjb3JkLgotICAgICAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfUkVBRF9CSU5BUlksIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgNCwgbnVsbCwgbnVsbCwgcGhvbmUuZ2V0SWNjQ2FyZCgpLmdldEFpZCgpLAorICAgICAgICAgICAgbUNpLmljY0lPRm9yQXBwKENPTU1BTkRfUkVBRF9CSU5BUlksIGZpbGVpZCwgZ2V0RUZQYXRoKGZpbGVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgNCwgbnVsbCwgbnVsbCwgbUFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKEVWRU5UX1JFQURfQklOQVJZX0RPTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaWQsIDAsIG9uTG9hZGVkKSk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1GaWxlSGFuZGxlci5qYXZhCmluZGV4IGU4NTRkN2YuLjlmMzBkMzYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1GaWxlSGFuZGxlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1GaWxlSGFuZGxlci5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBpbXBvcnQgYW5kcm9pZC5vcy4qOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NGaWxlSGFuZGxlcjsKQEAgLTM5LDggKzQxLDggQEAKICAgICAvLyoqKioqIEluc3RhbmNlIFZhcmlhYmxlcwogCiAgICAgLy8qKioqKiBDb25zdHJ1Y3RvcgotICAgIHB1YmxpYyBSdWltRmlsZUhhbmRsZXIoUGhvbmVCYXNlIHBob25lKSB7Ci0gICAgICAgIHN1cGVyKHBob25lKTsKKyAgICBwdWJsaWMgUnVpbUZpbGVIYW5kbGVyKEljY0NhcmQgY2FyZCwgU3RyaW5nIGFpZCwgQ29tbWFuZHNJbnRlcmZhY2UgY2kpIHsKKyAgICAgICAgc3VwZXIoY2FyZCwgYWlkLCBjaSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKQEAgLTU4LDkgKzYwLDkgQEAKICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVBRF9JQ09OX0RPTkUsIGZpbGVpZCwgMCwKICAgICAgICAgICAgICAgICBvbkxvYWRlZCk7CiAKLSAgICAgICAgcGhvbmUubUNNLmljY0lPRm9yQXBwKENPTU1BTkRfR0VUX1JFU1BPTlNFLCBmaWxlaWQsICJpbWciLCAwLCAwLAorICAgICAgICBtQ2kuaWNjSU9Gb3JBcHAoQ09NTUFORF9HRVRfUkVTUE9OU0UsIGZpbGVpZCwgImltZyIsIDAsIDAsCiAgICAgICAgICAgICAgICAgR0VUX1JFU1BPTlNFX0VGX0lNR19TSVpFX0JZVEVTLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5nZXRBaWQoKSwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIG1BaWQsIHJlc3BvbnNlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU0lNRmlsZUhhbmRsZXIuamF2YQppbmRleCA4YzNiYzBlLi40NTVlZTc0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTUZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1GaWxlSGFuZGxlci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuQ29tbWFuZHNJbnRlcmZhY2U7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmQ7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NhcmRBcHBsaWNhdGlvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOwpAQCAtMzUsOCArMzYsOCBAQAogCiAgICAgLy8qKioqKiBDb25zdHJ1Y3RvcgogCi0gICAgcHVibGljIFNJTUZpbGVIYW5kbGVyKFBob25lQmFzZSBwaG9uZSkgewotICAgICAgICBzdXBlcihwaG9uZSk7CisgICAgcHVibGljIFNJTUZpbGVIYW5kbGVyKEljY0NhcmQgY2FyZCwgU3RyaW5nIGFpZCwgQ29tbWFuZHNJbnRlcmZhY2UgY2kpIHsKKyAgICAgICAgc3VwZXIoY2FyZCwgYWlkLCBjaSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKQEAgLTkxLDggKzkyLDggQEAKICAgICAgICAgICAgIC8vIFRoZSBFRmlkcyBpbiBVU0lNIHBob25lIGJvb2sgZW50cmllcyBhcmUgZGVjaWRlZCBieSB0aGUgY2FyZCBtYW51ZmFjdHVyZXIuCiAgICAgICAgICAgICAvLyBTbyBpZiB3ZSBkb24ndCBtYXRjaCBhbnkgb2YgdGhlIGNhc2VzIGFib3ZlIGFuZCBpZiBpdHMgYSBVU0lNIHJldHVybgogICAgICAgICAgICAgLy8gdGhlIHBob25lIGJvb2sgcGF0aC4KLSAgICAgICAgICAgIEljY0NhcmQgY2FyZCA9IHBob25lLmdldEljY0NhcmQoKTsKLSAgICAgICAgICAgIGlmIChjYXJkICE9IG51bGwgJiYgY2FyZC5pc0FwcGxpY2F0aW9uT25JY2MoSWNjQ2FyZEFwcGxpY2F0aW9uLkFwcFR5cGUuQVBQVFlQRV9VU0lNKSkgeworICAgICAgICAgICAgaWYgKG1QYXJlbnRDYXJkICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhcmVudENhcmQuaXNBcHBsaWNhdGlvbk9uSWNjKEljY0NhcmRBcHBsaWNhdGlvbi5BcHBUeXBlLkFQUFRZUEVfVVNJTSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTUZfU0lNICsgREZfVEVMRUNPTSArIERGX1BIT05FQk9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvcjogRUYgUGF0aCBiZWluZyByZXR1cm5lZCBpbiBudWxsIik7CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TYW1wbGVUZXN0L3NyYy9jb20vYW5kcm9pZC9ycy9zYW1wbGUvc2FtcGxlLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2FtcGxlVGVzdC9zcmMvY29tL2FuZHJvaWQvcnMvc2FtcGxlL3NhbXBsZS5ycwppbmRleCAwZjNjMGE3Li5lMmJmNDNkIDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TYW1wbGVUZXN0L3NyYy9jb20vYW5kcm9pZC9ycy9zYW1wbGUvc2FtcGxlLnJzCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NhbXBsZVRlc3Qvc3JjL2NvbS9hbmRyb2lkL3JzL3NhbXBsZS9zYW1wbGUucnMKQEAgLTI4LDE3NiArMjgsNiBAQAogICAgIGFsbG9jU2FtcGxlciA9IHNhbXBsZXI7CiB9CiAKLXN0YXRpYyBpbnQzMl90IHdyYXBJKHJzX3NhbXBsZXJfdmFsdWUgd3JhcCwgaW50MzJfdCBjb29yZCwgaW50MzJfdCBzaXplKSB7Ci0gICAgaWYgKHdyYXAgPT0gUlNfU0FNUExFUl9XUkFQKSB7Ci0gICAgICAgIGNvb3JkID0gY29vcmQgJSBzaXplOwotICAgICAgICBpZiAoY29vcmQgPCAwKSB7Ci0gICAgICAgICAgICBjb29yZCArPSBzaXplOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXgoMCwgbWluKGNvb3JkLCBzaXplIC0gMSkpOwotfQotCi0jZGVmaW5lIGNvbnZlcnRfZmxvYXQodikgKGZsb2F0KXYKLSNkZWZpbmUgU0FNUExFXzFEX0ZVTkModmVjc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhdGljIGZsb2F0IyN2ZWNzaXplIGdldDFEU2FtcGxlIyN2ZWNzaXplKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQyIHdlaWdodHMsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVBpeGVsLCBpbnQgbmV4dCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVjaGFyIyN2ZWNzaXplICpwMGMgPSAodWNoYXIjI3ZlY3NpemUqKXJzR2V0RWxlbWVudEF0KGEsIGlQaXhlbCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVjaGFyIyN2ZWNzaXplICpwMWMgPSAodWNoYXIjI3ZlY3NpemUqKXJzR2V0RWxlbWVudEF0KGEsIG5leHQpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZsb2F0IyN2ZWNzaXplIHAwID0gY29udmVydF9mbG9hdCMjdmVjc2l6ZSgqcDBjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZsb2F0IyN2ZWNzaXplIHAxID0gY29udmVydF9mbG9hdCMjdmVjc2l6ZSgqcDFjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJldHVybiBwMCAqIHdlaWdodHMueCArIHAxICogd2VpZ2h0cy55OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQotI2RlZmluZSBTQU1QTEVfMkRfRlVOQyh2ZWNzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgZmxvYXQjI3ZlY3NpemUgZ2V0MkRTYW1wbGUjI3ZlY3NpemUocnNfYWxsb2NhdGlvbiBhLCBmbG9hdDQgd2VpZ2h0cywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDIgaVBpeGVsLCBpbnQgbmV4dFgsIGludCBuZXh0WSkgeyAgICAgICAgICAgXAotICAgICAgICAgICAgdWNoYXIjI3ZlY3NpemUgKnAwYyA9ICh1Y2hhciMjdmVjc2l6ZSopcnNHZXRFbGVtZW50QXQoYSwgaVBpeGVsLngsIGlQaXhlbC55KTsgICAgICAgXAotICAgICAgICAgICAgdWNoYXIjI3ZlY3NpemUgKnAxYyA9ICh1Y2hhciMjdmVjc2l6ZSopcnNHZXRFbGVtZW50QXQoYSwgbmV4dFgsIGlQaXhlbC55KTsgICAgICAgICAgXAotICAgICAgICAgICAgdWNoYXIjI3ZlY3NpemUgKnAyYyA9ICh1Y2hhciMjdmVjc2l6ZSopcnNHZXRFbGVtZW50QXQoYSwgaVBpeGVsLngsIG5leHRZKTsgICAgICAgICAgXAotICAgICAgICAgICAgdWNoYXIjI3ZlY3NpemUgKnAzYyA9ICh1Y2hhciMjdmVjc2l6ZSopcnNHZXRFbGVtZW50QXQoYSwgbmV4dFgsIG5leHRZKTsgICAgICAgICAgICAgXAotICAgICAgICAgICAgZmxvYXQjI3ZlY3NpemUgcDAgPSBjb252ZXJ0X2Zsb2F0IyN2ZWNzaXplKCpwMGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZmxvYXQjI3ZlY3NpemUgcDEgPSBjb252ZXJ0X2Zsb2F0IyN2ZWNzaXplKCpwMWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZmxvYXQjI3ZlY3NpemUgcDIgPSBjb252ZXJ0X2Zsb2F0IyN2ZWNzaXplKCpwMmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZmxvYXQjI3ZlY3NpemUgcDMgPSBjb252ZXJ0X2Zsb2F0IyN2ZWNzaXplKCpwM2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmV0dXJuIHAwICogd2VpZ2h0cy54ICsgcDEgKiB3ZWlnaHRzLnkgKyBwMiAqIHdlaWdodHMueiArIHAzICogd2VpZ2h0cy53OyAgICAgICAgICAgXAotICAgICAgICB9Ci0KLVNBTVBMRV8xRF9GVU5DKCkKLVNBTVBMRV8xRF9GVU5DKDIpCi1TQU1QTEVfMURfRlVOQygzKQotU0FNUExFXzFEX0ZVTkMoNCkKLQotU0FNUExFXzJEX0ZVTkMoKQotU0FNUExFXzJEX0ZVTkMoMikKLVNBTVBMRV8yRF9GVU5DKDMpCi1TQU1QTEVfMkRfRlVOQyg0KQotCi1zdGF0aWMgZmxvYXQ0IGdldEJpbGluZWFyU2FtcGxlNTY1KHJzX2FsbG9jYXRpb24gYSwgZmxvYXQ0IHdlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDIgaVBpeGVsLCBpbnQgbmV4dFgsIGludCBuZXh0WSkgewotICAgIGZsb2F0NCB6ZXJvID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwotICAgIHJldHVybiB6ZXJvOwotfQotCi1zdGF0aWMgZmxvYXQ0IGdldEJpbGluZWFyU2FtcGxlKHJzX2FsbG9jYXRpb24gYSwgZmxvYXQ0IHdlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDIgaVBpeGVsLCBpbnQgbmV4dFgsIGludCBuZXh0WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmVjU2l6ZSwgcnNfZGF0YV90eXBlIGR0KSB7Ci0gICAgaWYgKGR0ID09IFJTX1RZUEVfVU5TSUdORURfNV82XzUpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbGluZWFyU2FtcGxlNTY1KGEsIHdlaWdodHMsIGlQaXhlbCwgbmV4dFgsIG5leHRZKTsKLSAgICB9Ci0KLSAgICBmbG9hdDQgcmVzdWx0OwotICAgIHN3aXRjaCh2ZWNTaXplKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXN1bHQueCA9IGdldDJEU2FtcGxlKGEsIHdlaWdodHMsIGlQaXhlbCwgbmV4dFgsIG5leHRZKTsKLSAgICAgICAgcmVzdWx0Lnl6dyA9IDAuMGY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgcmVzdWx0Lnh5ID0gZ2V0MkRTYW1wbGUyKGEsIHdlaWdodHMsIGlQaXhlbCwgbmV4dFgsIG5leHRZKTsKLSAgICAgICAgcmVzdWx0Lnp3ID0gMC4wZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICByZXN1bHQueHl6ID0gZ2V0MkRTYW1wbGUzKGEsIHdlaWdodHMsIGlQaXhlbCwgbmV4dFgsIG5leHRZKTsKLSAgICAgICAgcmVzdWx0LncgPSAwLjBmOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIHJlc3VsdCA9IGdldDJEU2FtcGxlNChhLCB3ZWlnaHRzLCBpUGl4ZWwsIG5leHRYLCBuZXh0WSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBmbG9hdDQgZ2V0TmVhcmVzdFNhbXBsZShyc19hbGxvY2F0aW9uIGEsIGludDIgaVBpeGVsLCB1aW50MzJfdCB2ZWNTaXplLCByc19kYXRhX3R5cGUgZHQpIHsKLSAgICBpZiAoZHQgPT0gUlNfVFlQRV9VTlNJR05FRF81XzZfNSkgewotICAgICAgICBmbG9hdDQgemVybyA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKLSAgICAgICAgcmV0dXJuIHplcm87Ci0gICAgfQotCi0gICAgZmxvYXQ0IHJlc3VsdDsKLSAgICBzd2l0Y2godmVjU2l6ZSkgewotICAgIGNhc2UgMToKLSAgICAgICAgcmVzdWx0LnggPSBjb252ZXJ0X2Zsb2F0KCooKHVjaGFyKilyc0dldEVsZW1lbnRBdChhLCBpUGl4ZWwueCwgaVBpeGVsLnkpKSk7Ci0gICAgICAgIHJlc3VsdC55encgPSAwLjBmOwotICAgIGNhc2UgMjoKLSAgICAgICAgcmVzdWx0Lnh5ID0gY29udmVydF9mbG9hdDIoKigodWNoYXIyKilyc0dldEVsZW1lbnRBdChhLCBpUGl4ZWwueCwgaVBpeGVsLnkpKSk7Ci0gICAgICAgIHJlc3VsdC56dyA9IDAuMGY7Ci0gICAgY2FzZSAzOgotICAgICAgICByZXN1bHQueHl6ID0gY29udmVydF9mbG9hdDMoKigodWNoYXIzKilyc0dldEVsZW1lbnRBdChhLCBpUGl4ZWwueCwgaVBpeGVsLnkpKSk7Ci0gICAgICAgIHJlc3VsdC53ID0gMC4wZjsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIHJlc3VsdCA9IGNvbnZlcnRfZmxvYXQ0KCooKHVjaGFyNCopcnNHZXRFbGVtZW50QXQoYSwgaVBpeGVsLngsIGlQaXhlbC55KSkpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLy8gTmFpdmUgaW1wbGVtZW50YXRpb24gb2YgdGV4dHVyZSBmaWx0ZXJpbmcgZm9yIHByb3RvdHlwaW5nIHB1cnBvc2VzCi1zdGF0aWMgZmxvYXQ0IHNhbXBsZShyc19hbGxvY2F0aW9uIGEsIHJzX3NhbXBsZXIgcywgZmxvYXQyIHV2KSB7Ci0KLSAgICAvLyBGaW5kIG91dCB3aGF0IGtpbmQgb2YgaW5wdXQgZGF0YSB3ZSBhcmUgc2FtcGxpbmcKLSAgICByc19lbGVtZW50IGVsZW0gPSByc0FsbG9jYXRpb25HZXRFbGVtZW50KGEpOwotICAgIHVpbnQzMl90IHZlY1NpemUgPSByc0VsZW1lbnRHZXRWZWN0b3JTaXplKGVsZW0pOwotICAgIHJzX2RhdGFfa2luZCBkayA9IHJzRWxlbWVudEdldERhdGFLaW5kKGVsZW0pOwotICAgIHJzX2RhdGFfdHlwZSBkdCA9IHJzRWxlbWVudEdldERhdGFUeXBlKGVsZW0pOwotCi0gICAgaWYgKGRrID09IFJTX0tJTkRfVVNFUiB8fCAoZHQgIT0gUlNfVFlQRV9VTlNJR05FRF84ICYmIGR0ICE9IFJTX1RZUEVfVU5TSUdORURfNV82XzUpKSB7Ci0gICAgICAgIGZsb2F0NCB6ZXJvID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMGZ9OwotICAgICAgICByZXR1cm4gemVybzsKLSAgICB9Ci0gICAgLy9yc0RlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIsIDApOwotICAgIHJzX3NhbXBsZXJfdmFsdWUgd3JhcFMgPSByc2dTYW1wbGVyR2V0V3JhcFMocyk7Ci0gICAgcnNfc2FtcGxlcl92YWx1ZSB3cmFwVCA9IHJzZ1NhbXBsZXJHZXRXcmFwVChzKTsKLQotICAgIHJzX3NhbXBsZXJfdmFsdWUgc2FtcGxlTWluID0gcnNnU2FtcGxlckdldE1pbmlmaWNhdGlvbihzKTsKLSAgICByc19zYW1wbGVyX3ZhbHVlIHNhbXBsZU1hZyA9IHJzZ1NhbXBsZXJHZXRNYWduaWZpY2F0aW9uKHMpOwotCi0gICAgaW50MzJfdCBzb3VyY2VXID0gcnNBbGxvY2F0aW9uR2V0RGltWChhKTsKLSAgICBpbnQzMl90IHNvdXJjZUggPSByc0FsbG9jYXRpb25HZXREaW1ZKGEpOwotCi0gICAgZmxvYXQyIGRpbUY7Ci0gICAgZGltRi54ID0gKGZsb2F0KShzb3VyY2VXKTsKLSAgICBkaW1GLnkgPSAoZmxvYXQpKHNvdXJjZUgpOwotICAgIGZsb2F0MiBwaXhlbFVWID0gdXYgKiBkaW1GOwotICAgIGludDIgaVBpeGVsID0gY29udmVydF9pbnQyKHBpeGVsVVYpOwotCi0gICAgaWYgKHNhbXBsZU1pbiA9PSBSU19TQU1QTEVSX05FQVJFU1QgfHwKLSAgICAgICAgc2FtcGxlTWFnID09IFJTX1NBTVBMRVJfTkVBUkVTVCkgewotICAgICAgICBpUGl4ZWwueCA9IHdyYXBJKHdyYXBTLCBpUGl4ZWwueCwgc291cmNlVyk7Ci0gICAgICAgIGlQaXhlbC55ID0gd3JhcEkod3JhcFQsIGlQaXhlbC55LCBzb3VyY2VIKTsKLSAgICAgICAgcmV0dXJuIGdldE5lYXJlc3RTYW1wbGUoYSwgaVBpeGVsLCB2ZWNTaXplLCBkdCk7Ci0gICAgfQotCi0gICAgZmxvYXQyIGZyYWMgPSBwaXhlbFVWIC0gY29udmVydF9mbG9hdDIoaVBpeGVsKTsKLQotICAgIGlmIChmcmFjLnggPCAwLjVmKSB7Ci0gICAgICAgIGlQaXhlbC54IC09IDE7Ci0gICAgICAgIGZyYWMueCArPSAwLjVmOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYWMueCAtPSAwLjVmOwotICAgIH0KLSAgICBpZiAoZnJhYy55IDwgMC41ZikgewotICAgICAgICBpUGl4ZWwueSAtPSAxOwotICAgICAgICBmcmFjLnkgKz0gMC41ZjsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFjLnkgLT0gMC41ZjsKLSAgICB9Ci0gICAgZmxvYXQyIG9uZU1pbnVzRnJhYyA9IDEuMGYgLSBmcmFjOwotCi0gICAgZmxvYXQ0IHdlaWdodHM7Ci0gICAgd2VpZ2h0cy54ID0gb25lTWludXNGcmFjLnggKiBvbmVNaW51c0ZyYWMueTsKLSAgICB3ZWlnaHRzLnkgPSBmcmFjLnggKiBvbmVNaW51c0ZyYWMueTsKLSAgICB3ZWlnaHRzLnogPSBvbmVNaW51c0ZyYWMueCAqIGZyYWMueTsKLSAgICB3ZWlnaHRzLncgPSBmcmFjLnggKiBmcmFjLnk7Ci0KLSAgICBpbnQzMl90IG5leHRYID0gd3JhcEkod3JhcFMsIGlQaXhlbC54ICsgMSwgc291cmNlVyk7Ci0gICAgaW50MzJfdCBuZXh0WSA9IHdyYXBJKHdyYXBULCBpUGl4ZWwueSArIDEsIHNvdXJjZUgpOwotICAgIGlQaXhlbC54ID0gd3JhcEkod3JhcFMsIGlQaXhlbC54LCBzb3VyY2VXKTsKLSAgICBpUGl4ZWwueSA9IHdyYXBJKHdyYXBULCBpUGl4ZWwueSwgc291cmNlSCk7Ci0KLSAgICByZXR1cm4gZ2V0QmlsaW5lYXJTYW1wbGUoYSwgd2VpZ2h0cywgaVBpeGVsLCBuZXh0WCwgbmV4dFksIHZlY1NpemUsIGR0KTsKLX0KLQogdm9pZCByb290KHVjaGFyNCAqb3V0LCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CiAKICAgICBmbG9hdCBkZXN0WCA9IChmbG9hdClyc0FsbG9jYXRpb25HZXREaW1YKGRlc3RBbGxvYykgLSAxLjBmOwpAQCAtMjA3LDcgKzM3LDcgQEAKICAgICB1di54ID0gKGZsb2F0KXggLyBkZXN0WDsKICAgICB1di55ID0gKGZsb2F0KXkgLyBkZXN0WTsKIAotICAgIG91dC0+eHl6ID0gY29udmVydF91Y2hhcjMoc2FtcGxlKHNvdXJjZUFsbG9jLCBhbGxvY1NhbXBsZXIsIHV2KjIuMGYpLnh5eik7CisgICAgb3V0LT54eXogPSBjb252ZXJ0X3VjaGFyMyhyc1NhbXBsZShzb3VyY2VBbGxvYywgYWxsb2NTYW1wbGVyLCB1dioyLjBmKS54eXopOwogICAgIG91dC0+dyA9IDB4ZmY7CiB9CiAKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlXYXRjaGRvZ1N0YXRlTWFjaGluZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVdhdGNoZG9nU3RhdGVNYWNoaW5lLmphdmEKaW5kZXggNWM5YmVmOS4uZjMxZWU2OCAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVdhdGNoZG9nU3RhdGVNYWNoaW5lLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVdhdGNoZG9nU3RhdGVNYWNoaW5lLmphdmEKQEAgLTExMywxMSArMTEzLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJTU0lfTU9OSVRPUl9DT1VOVCA9IDU7CiAgICAgcHJpdmF0ZSBpbnQgbVJzc2lNb25pdG9yQ291bnQgPSAwOwogCi0gICAgLyogQXZvaWQgZmxhcHBpbmcgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0lOVEVSVkFMX0FWT0lEX0JTU0lEX01TID0gNjAgKiAxMDAwOwotICAgIHByaXZhdGUgU3RyaW5nIG1MYXN0QXZvaWRlZEJzc2lkOwotICAgIC8qIGEgLXZlIGludGVydmFsIHRvIGFsbG93IGF2b2lkYW5jZSBhdCBib290ICovCi0gICAgcHJpdmF0ZSBsb25nIG1MYXN0QnNzaWRBdm9pZGVkVGltZSA9IC1NSU5fSU5URVJWQUxfQVZPSURfQlNTSURfTVM7CisgICAgLyogQXZvaWQgZmxhcHBpbmcuIFRoZSBpbnRlcnZhbCBpcyBjaGFuZ2VkIG92ZXIgdGltZSBhcyBsb25nIGFzIHdlIGNvbnRpbnVlIHRvIGF2b2lkCisgICAgICogdW5kZXIgdGhlIG1heCBpbnRlcnZhbCBhZnRlciB3aGljaCB3ZSByZXNldCB0aGUgaW50ZXJ2YWwgYWdhaW4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0lOVEVSVkFMX0FWT0lEX0JTU0lEX01TW10gPSB7MCwgMzAgKiAxMDAwLCA2MCAqIDEwMDAsCisgICAgICAgICAgICA1ICogNjAgKiAxMDAwLCAzMCAqIDYwICogMTAwMH07CisgICAgLyogSW5kZXggaW50byB0aGUgaW50ZXJ2YWwgYXJyYXkgTUlOX0lOVEVSVkFMX0FWT0lEX0JTU0lEX01TICovCisgICAgcHJpdmF0ZSBpbnQgbU1pbkludGVydmFsQXJyYXlJbmRleCA9IDA7CisKKyAgICBwcml2YXRlIGxvbmcgbUxhc3RCc3NpZEF2b2lkZWRUaW1lOwogCiAgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTaWduYWxMZXZlbDsKIApAQCAtNzQ0LDExICs3NDcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTaWduYWxMZXZlbCA9IGNhbGN1bGF0ZVNpZ25hbExldmVsKG1zZy5hcmcxKTsKICAgICAgICAgICAgICAgICAgICAgLy9SZWFkeSB0byBhdm9pZCBic3NpZCBhZ2FpbiA/CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIC0gbUxhc3RCc3NpZEF2b2lkZWRUaW1lICA+IE1JTl9JTlRFUlZBTF9BVk9JRF9CU1NJRF9NUykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZSAtIG1MYXN0QnNzaWRBdm9pZGVkVGltZSAgPiBNSU5fSU5URVJWQUxfQVZPSURfQlNTSURfTVNbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pbkludGVydmFsQXJyYXlJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJzc2lDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRWFybHkgdG8gYXZvaWQgIiArIG1XaWZpSW5mbyArICIgdGltZTogIiArIHRpbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxhc3QgYXZvaWRlZDogIiArIG1MYXN0QnNzaWRBdm9pZGVkVGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbGFzdCBhdm9pZGVkOiAiICsgbUxhc3RCc3NpZEF2b2lkZWRUaW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtTWluSW50ZXJ2YWxBcnJheUluZGV4OiAiICsgbU1pbkludGVydmFsQXJyYXlJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTg5Miw3ICs4OTcsMjAgQEAKICAgICBwcml2YXRlIHZvaWQgc2VuZFBvb3JMaW5rRGV0ZWN0ZWQoKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygic2VuZCBQT09SX0xJTktfREVURUNURUQgIiArIG1XaWZpSW5mbyk7CiAgICAgICAgIG1Xc21DaGFubmVsLnNlbmRNZXNzYWdlKFBPT1JfTElOS19ERVRFQ1RFRCk7Ci0gICAgICAgIG1MYXN0QXZvaWRlZEJzc2lkID0gbVdpZmlJbmZvLmdldEJTU0lEKCk7CisKKyAgICAgICAgbG9uZyB0aW1lID0gYW5kcm9pZC5vcy5TeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKKyAgICAgICAgaWYgKHRpbWUgLSBtTGFzdEJzc2lkQXZvaWRlZFRpbWUgID4gTUlOX0lOVEVSVkFMX0FWT0lEX0JTU0lEX01TWworICAgICAgICAgICAgICAgIE1JTl9JTlRFUlZBTF9BVk9JRF9CU1NJRF9NUy5sZW5ndGggLSAxXSkgeworICAgICAgICAgICAgbU1pbkludGVydmFsQXJyYXlJbmRleCA9IDE7CisgICAgICAgICAgICBpZiAoREJHKSBsb2coInNldCBtTWluSW50ZXJ2YWxBcnJheUluZGV4IHRvIDEiKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKG1NaW5JbnRlcnZhbEFycmF5SW5kZXggPCBNSU5fSU5URVJWQUxfQVZPSURfQlNTSURfTVMubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgIG1NaW5JbnRlcnZhbEFycmF5SW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygibU1pbkludGVydmFsQXJyYXlJbmRleDogIiArIG1NaW5JbnRlcnZhbEFycmF5SW5kZXgpOworICAgICAgICB9CisKICAgICAgICAgbUxhc3RCc3NpZEF2b2lkZWRUaW1lID0gYW5kcm9pZC5vcy5TeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKICAgICB9CiAK