LyoNCiAgICBGcmVlUlRPUyBWNy42LjAgLSBDb3B5cmlnaHQgKEMpIDIwMTMgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuIA0KICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQNCg0KICAgIFZJU0lUIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIFRPIEVOU1VSRSBZT1UgQVJFIFVTSU5HIFRIRSBMQVRFU1QgVkVSU0lPTi4NCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgRnJlZVJUT1MgcHJvdmlkZXMgY29tcGxldGVseSBmcmVlIHlldCBwcm9mZXNzaW9uYWxseSBkZXZlbG9wZWQsICAgICoNCiAgICAgKiAgICByb2J1c3QsIHN0cmljdGx5IHF1YWxpdHkgY29udHJvbGxlZCwgc3VwcG9ydGVkLCBhbmQgY3Jvc3MgICAgICAgICAgKg0KICAgICAqICAgIHBsYXRmb3JtIHNvZnR3YXJlIHRoYXQgaGFzIGJlY29tZSBhIGRlIGZhY3RvIHN0YW5kYXJkLiAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIZWxwIHlvdXJzZWxmIGdldCBzdGFydGVkIHF1aWNrbHkgYW5kIHN1cHBvcnQgdGhlIEZyZWVSVE9TICAgICAgICAgKg0KICAgICAqICAgIHByb2plY3QgYnkgcHVyY2hhc2luZyBhIEZyZWVSVE9TIHR1dG9yaWFsIGJvb2ssIHJlZmVyZW5jZSAgICAgICAgICAqDQogICAgICogICAgbWFudWFsLCBvciBib3RoIGZyb206IGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL0RvY3VtZW50YXRpb24gICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIFRoYW5rIHlvdSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUyBkaXN0cmlidXRpb24uDQoNCiAgICBGcmVlUlRPUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQogICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uID4+IUFORCBNT0RJRklFRCBCWSE8PCB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQogICAgPj4hIE5PVEU6IFRoZSBtb2RpZmljYXRpb24gdG8gdGhlIEdQTCBpcyBpbmNsdWRlZCB0byBhbGxvdyB5b3UgdG8gZGlzdHJpYnV0ZQ0KICAgID4+ISBhIGNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUyB3aXRob3V0IGJlaW5nIG9ibGlnZWQgdG8gcHJvdmlkZQ0KICAgID4+ISB0aGUgc291cmNlIGNvZGUgZm9yIHByb3ByaWV0YXJ5IGNvbXBvbmVudHMgb3V0c2lkZSBvZiB0aGUgRnJlZVJUT1MNCiAgICA+PiEga2VybmVsLg0KDQogICAgRnJlZVJUT1MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZDQogICAgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUw0KICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIEZ1bGwgbGljZW5zZSB0ZXh0IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBmb2xsb3dpbmcNCiAgICBsaW5rOiBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTQuaHRtbA0KDQogICAgMSB0YWIgPT0gNCBzcGFjZXMhDQoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIEhhdmluZyBhIHByb2JsZW0/ICBTdGFydCBieSByZWFkaW5nIHRoZSBGQVEgIk15IGFwcGxpY2F0aW9uIGRvZXMgICAqDQogICAgICogICAgbm90IHJ1biwgd2hhdCBjb3VsZCBiZSB3cm9uZz8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL0ZBUUhlbHAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIC0gRG9jdW1lbnRhdGlvbiwgYm9va3MsIHRyYWluaW5nLCBsYXRlc3QgdmVyc2lvbnMsDQogICAgbGljZW5zZSBhbmQgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuIGNvbnRhY3QgZGV0YWlscy4NCg0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL3BsdXMgLSBBIHNlbGVjdGlvbiBvZiBGcmVlUlRPUyBlY29zeXN0ZW0gcHJvZHVjdHMsDQogICAgaW5jbHVkaW5nIEZyZWVSVE9TK1RyYWNlIC0gYW4gaW5kaXNwZW5zYWJsZSBwcm9kdWN0aXZpdHkgdG9vbCwgYSBET1MNCiAgICBjb21wYXRpYmxlIEZBVCBmaWxlIHN5c3RlbSwgYW5kIG91ciB0aW55IHRocmVhZCBhd2FyZSBVRFAvSVAgc3RhY2suDQoNCiAgICBodHRwOi8vd3d3Lk9wZW5SVE9TLmNvbSAtIFJlYWwgVGltZSBFbmdpbmVlcnMgbHRkIGxpY2Vuc2UgRnJlZVJUT1MgdG8gSGlnaA0KICAgIEludGVncml0eSBTeXN0ZW1zIHRvIHNlbGwgdW5kZXIgdGhlIE9wZW5SVE9TIGJyYW5kLiAgTG93IGNvc3QgT3BlblJUT1MNCiAgICBsaWNlbnNlcyBvZmZlciB0aWNrZXRlZCBzdXBwb3J0LCBpbmRlbW5pZmljYXRpb24gYW5kIG1pZGRsZXdhcmUuDQoNCiAgICBodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEhpZ2ggSW50ZWdyaXR5IFN5c3RlbXMgYWxzbyBwcm92aWRlIGEgc2FmZXR5DQogICAgZW5naW5lZXJlZCBhbmQgaW5kZXBlbmRlbnRseSBTSUwzIGNlcnRpZmllZCB2ZXJzaW9uIGZvciB1c2UgaW4gc2FmZXR5IGFuZA0KICAgIG1pc3Npb24gY3JpdGljYWwgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBwcm92YWJsZSBkZXBlbmRhYmlsaXR5Lg0KDQogICAgMSB0YWIgPT0gNCBzcGFjZXMhDQoqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAic2VtcGhyLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQovKiBEZW1vIGFwcGxpY2F0aW9uIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIlNBTTdfRU1BQy5oIg0KDQovKiB1SVAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAidWlwLmgiDQoNCi8qIEhhcmR3YXJlIHNwZWNpZmljIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkVtYWMuaCINCiNpbmNsdWRlICJtaWkuaCINCiNpbmNsdWRlICJBVDkxU0FNN1gyNTYuaCINCg0KDQovKiBVU0VfUk1JSV9JTlRFUkZBQ0UgbXVzdCBiZSBkZWZpbmVkIGFzIDEgdG8gdXNlIGFuIFJNSUkgaW50ZXJmYWNlLCBvciAwDQp0byB1c2UgYW4gTUlJIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgVVNFX1JNSUlfSU5URVJGQUNFIDANCg0KLyogVGhlIGJ1ZmZlciBhZGRyZXNzZXMgd3JpdHRlbiBpbnRvIHRoZSBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgc28gdGhlDQpsYXN0IGZldyBiaXRzIGFyZSB6ZXJvLiAgVGhlc2UgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIEVNQUMNCnBlcmlwaGVyYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuICovDQojZGVmaW5lIGVtYWNBRERSRVNTX01BU0sJCQkoICggdW5zaWduZWQgbG9uZyApIDB4RkZGRkZGRkMgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hcmsgdGhlIGxhc3QNCmRlc2NyaXB0b3IgaW4gdGhlIGFycmF5LiAqLw0KI2RlZmluZSBlbWFjUlhfV1JBUF9CSVQJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweDAyICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KZGVzY3JpcHRvciBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgRU1BQyBvciB0aGUgc29mdHdhcmUuICovDQojZGVmaW5lIGVtYWNUWF9CVUZfVVNFRAkJCQkoICggdW5zaWduZWQgbG9uZyApIDB4ODAwMDAwMDAgKQ0KDQovKiBBIHNob3J0IGRlbGF5IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSwgc2hvdWxkDQpvbmUgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB3aGVuIHRyeWluZyB0byB0cmFuc21pdCBhIGZyYW1lLiAqLw0KI2RlZmluZSBlbWFjQlVGRkVSX1dBSVRfREVMQVkJCSggMiApDQojZGVmaW5lIGVtYWNNQVhfV0FJVF9DWUNMRVMJCQkoIGNvbmZpZ1RJQ0tfUkFURV9IWiAvIDQwICkNCg0KLyogTWlzYyBkZWZpbmVzLiAqLw0KI2RlZmluZSBlbWFjSU5URVJSVVBUX0xFVkVMCQkJKCA1ICkNCiNkZWZpbmUgZW1hY05PX0RFTEFZCQkJCSggMCApDQojZGVmaW5lIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRQkoIDU0ICkNCiNkZWZpbmUgZW1hY1BIWV9JTklUX0RFTEFZCQkJKCA1MDAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQojZGVmaW5lIGVtYWNSRVNFVF9LRVkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweEE1MDAwMDAwICkNCiNkZWZpbmUgZW1hY1JFU0VUX0xFTkdUSAkJCSggKCB1bnNpZ25lZCBsb25nICkgKCAweDAxIDw8IDggKSApDQoNCi8qIFRoZSBBdG1lbCBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIFRYIGZyYW1lIGxlbmd0aCBtYXNrLiAqLw0KI2RlZmluZSBlbWFjUlhfTEVOR1RIX0ZSQU1FCQkJKCAweGZmZiApDQoNCi8qIFBlcmlwaGVyYWwgc2V0dXAgZm9yIHRoZSBFTUFDLiAqLw0KI2RlZmluZSBlbWFjUEVSSVBIRVJBTF9BX1NFVFVQIAkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjJfRVRYMAkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTJfRVRYRVIJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTZfRUNPTAkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTFfRVRYMwkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCNl9FUlgxCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxNV9FUlhEVgkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxM19FUlgyCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIzX0VUWDEJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjhfRU1EQwkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCNV9FUlgwCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxNF9FUlgzCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI0X0VDUlNfRUNSU0RWCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMV9FVFhFTgkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMTBfRVRYMgkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0sJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI5X0VNRElPCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI3X0VSWEVSCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxN19FUlhDSwkJKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qDQogKiBQcm90b3R5cGUgZm9yIHRoZSBFTUFDIGludGVycnVwdCBmdW5jdGlvbiAtIGNhbGxlZCBieSB0aGUgYXNtIHdyYXBwZXIuDQogKi8NCmV4dGVybiB2b2lkIHZFTUFDSVNSX1dyYXBwZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKChuYWtlZCkpOw0KDQovKg0KICogSW5pdGlhbGlzZSBib3RoIHRoZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgRU1BQy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKTsNCg0KLyoNCiAqIFdyaXRlIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAgVGhlIE1BQyBhZGRyZXNzIGlzIHNldCBhcyBvbmUgb2YgdGhlDQogKiB1aXAgb3B0aW9ucy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICk7DQoNCi8qDQogKiBDb25maWd1cmUgdGhlIEVNQUMgYW5kIEFJQyBmb3IgRU1BQyBpbnRlcnJ1cHRzLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKTsNCg0KLyoNCiAqIFNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHRha2VuIGZyb20gdGhlIEF0bWVsIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBjaGFyIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgY2hhciB1Y0FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnB1bFZhbHVlICk7DQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCglzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlKTsNCiNlbmRpZg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApOw0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEJ1ZmZlciB3cml0dGVuIHRvIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgdGhlDQpjb21tZW50IGFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyB2b2xhdGlsZSBjaGFyIHBjUnhCdWZmZXJbIE5CX1JYX0JVRkZFUlMgKiBFVEhfUlhfQlVGRkVSX1NJWkUgXTsNCg0KLyogQnVmZmVyIHJlYWQgYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSBoZSBjb21tZW50DQphYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgY2hhciBwY1R4QnVmZmVyWyBOQl9UWF9CVUZGRVJTICogRVRIX1RYX0JVRkZFUl9TSVpFIF07DQoNCi8qIERlc2NyaXB0b3JzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgcHJvZ3JhbSBhbmQgdGhlIEVNQUMgcGVyaXBoZXJhbC4NClRoZXNlIGRlc2NyaXB0b3JzIGhvbGQgdGhlIGxvY2F0aW9ucyBhbmQgc3RhdGUgb2YgdGhlIFJ4IGFuZCBUeCBidWZmZXJzLiAqLw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1R4VGREZXNjcmlwdG9yIHhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIF07DQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfUnhUZERlc2NyaXB0b3IgeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgXTsNCg0KLyogVGhlIElQIGFuZCBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSB0aGUgdUlQIHNldHVwLiAqLw0KY29uc3QgY2hhciBjTUFDQWRkcmVzc1sgNiBdID0geyB1aXBNQUNfQUREUjAsIHVpcE1BQ19BRERSMSwgdWlwTUFDX0FERFIyLCB1aXBNQUNfQUREUjMsIHVpcE1BQ19BRERSNCwgdWlwTUFDX0FERFI1IH07DQpjb25zdCB1bnNpZ25lZCBjaGFyIHVjSVBBZGRyZXNzWyA0IF0gID0geyB1aXBJUF9BRERSMCwgdWlwSVBfQUREUjEsIHVpcElQX0FERFIyLCB1aXBJUF9BRERSMyB9Ow0KDQovKiBUaGUgc2VtYXBob3JlIHVzZWQgYnkgdGhlIEVNQUMgSVNSIHRvIHdha2UgdGhlIEVNQUMgdGFzay4gKi8NCnN0YXRpYyB4U2VtYXBob3JlSGFuZGxlIHhTZW1hcGhvcmUgPSBOVUxMOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KeFNlbWFwaG9yZUhhbmRsZSB4RU1BQ0luaXQoIHZvaWQgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBEaXNhYmxlIHB1bGwgdXAgb24gUlhEViA9PiBQSFkgbm9ybWFsIG1vZGUgKG5vdCBpbiB0ZXN0IG1vZGUpLA0KCVBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCSAgCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogc2V0IE1JSSBtb2RlLiAqLw0KCSAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNjsNCgkjZW5kaWYNCg0KCS8qIENsZWFyIFBCMTggPD0+IFBIWSBwb3dlcmRvd24uICovDQogICAJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUEVSID0gMSA8PCAxODsNCglBVDkxQ19CQVNFX1BJT0ItPlBJT19PRVIgPSAxIDw8IDE4Ow0KCUFUOTFDX0JBU0VfUElPQi0+UElPX0NPRFIgPSAxIDw8IDE4Ow0KDQoJLyogQWZ0ZXIgUEhZIHBvd2VyIHVwLCBoYXJkd2FyZSByZXNldC4gKi8NCglBVDkxQ19CQVNFX1JTVEMtPlJTVENfUk1SID0gZW1hY1JFU0VUX0tFWSB8IGVtYWNSRVNFVF9MRU5HVEg7DQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JDUiA9IGVtYWNSRVNFVF9LRVkgfCBBVDkxQ19SU1RDX0VYVFJTVDsNCg0KCS8qIFdhaXQgZm9yIGhhcmR3YXJlIHJlc2V0IGVuZC4gKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JTUiAmIEFUOTFDX1JTVENfTlJTVEwgKSApDQoJew0KCQlfX2FzbSB2b2xhdGlsZSAoICJOT1AiICk7DQoJfQ0KICAgIF9fYXNtIHZvbGF0aWxlICggIk5PUCIgKTsNCg0KCS8qIFNldHVwIHRoZSBwaW5zLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX0FTUiA9IGVtYWNQRVJJUEhFUkFMX0FfU0VUVVA7DQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUERSID0gZW1hY1BFUklQSEVSQUxfQV9TRVRVUDsNCg0KCS8qIEVuYWJsZSBjb20gYmV0d2VlbiBFTUFDIFBIWS4NCg0KCUVuYWJsZSBtYW5hZ2VtZW50IHBvcnQuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBNREMgPSBNQ0svMzIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOwkNCg0KCS8qIFdhaXQgZm9yIFBIWSBhdXRvIGluaXQgZW5kIChyYXRoZXIgY3J1ZGUgZGVsYXkhKS4gKi8NCgl2VGFza0RlbGF5KCBlbWFjUEhZX0lOSVRfREVMQVkgKTsNCg0KCS8qIFBIWSBjb25maWd1cmF0aW9uLiAqLw0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCXsNCgkJdW5zaWduZWQgbG9uZyB1bENvbnRyb2w7DQoNCgkJLyogUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24gOiBkaXNhYmxlIE1JSSBpc29sYXRlLiAqLw0KCQl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxDb250cm9sICk7DQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdWxDb250cm9sICY9IH5CTUNSX0lTT0xBVEU7DQoJCXZXcml0ZVBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCB1bENvbnRyb2wgKTsNCgl9DQoJI2VuZGlmDQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCBhZ2Fpbi4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBNSUkgbW9kZSwgZW5hYmxlIGNsb2NrIEVSWENLIGFuZCBFVFhDSy4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2Vsc2UNCgkJLyogRW5hYmxlIEVNQUMgaW4gUk1JSSBtb2RlLCBlbmFibGUgUk1JSSBjbG9jayAoNTBNSHogZnJvbSBvc2NpbGxhdG9yDQoJCW9uIEVSRkNLKS4gKi8NCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1VTUklPID0gQVQ5MUNfRU1BQ19STUlJIHwgQVQ5MUNfRU1BQ19DTEtFTiA7DQoJI2VuZGlmDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogU2V0dXAgdGhlIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzLiAqLw0KCXBydlNldHVwRGVzY3JpcHRvcnMoKTsNCgkNCgkvKiBMb2FkIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAqLw0KCXBydlNldHVwTUFDQWRkcmVzcygpOw0KDQoJLyogQXJlIHdlIGNvbm5lY3RlZD8gKi8NCglpZiggcHJ2UHJvYmVQSFkoKSApDQoJew0KCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCEgKi8NCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCXBydlNldHVwRU1BQ0ludGVycnVwdCgpOw0KCQkJdlBhc3NFTUFDU2VtYXBob3JlKCB4U2VtYXBob3JlICk7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQoNCglyZXR1cm4geFNlbWFwaG9yZTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpsb25nIGxFTUFDU2VuZCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1eFR4QnVmZmVySW5kZXggPSAwOw0KcG9ydEJBU0VfVFlQRSB4V2FpdEN5Y2xlcyA9IDA7DQpsb25nIGxSZXR1cm4gPSBwZFBBU1M7DQpjaGFyICpwY0J1ZmZlcjsNCg0KCS8qIElzIGEgYnVmZmVyIGF2YWlsYWJsZT8gKi8NCgl3aGlsZSggISggeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1RSQU5TTUlUX09LICkgKQ0KCXsNCgkJLyogVGhlcmUgaXMgbm8gcm9vbSB0byB3cml0ZSB0aGUgVHggZGF0YSB0byB0aGUgVHggYnVmZmVyLiAgV2FpdCBhDQoJCXNob3J0IHdoaWxlLCB0aGVuIHRyeSBhZ2Fpbi4gKi8NCgkJeFdhaXRDeWNsZXMrKzsNCgkJaWYoIHhXYWl0Q3ljbGVzID4gZW1hY01BWF9XQUlUX0NZQ0xFUyApDQoJCXsNCgkJCS8qIEdpdmUgdXAuICovDQoJCQlsUmV0dXJuID0gcGRGQUlMOw0KCQkJYnJlYWs7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl2VGFza0RlbGF5KCBlbWFjQlVGRkVSX1dBSVRfREVMQVkgKTsNCgkJfQ0KCX0NCg0KCS8qIGxSZXR1cm4gd2lsbCBvbmx5IGJlIHBkUEFTUyBpZiBhIGJ1ZmZlciBpcyBhdmFpbGFibGUuICovDQoJaWYoIGxSZXR1cm4gPT0gcGRQQVNTICkNCgl7DQoJCS8qIENvcHkgdGhlIGhlYWRlcnMgaW50byB0aGUgVHggYnVmZmVyLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUgdUlQIGJ1ZmZlci4gKi8NCgkJcGNCdWZmZXIgPSAoIGNoYXIgKiApIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5hZGRyOw0KCQltZW1jcHkoICggdm9pZCAqICkgcGNCdWZmZXIsICggdm9pZCAqICkgdWlwX2J1ZiwgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICk7DQoNCgkJLyogSWYgdGhlcmUgaXMgcm9vbSwgYWxzbyBjb3B5IGluIHRoZSBhcHBsaWNhdGlvbiBkYXRhIGlmIGFueS4gKi8NCgkJaWYoICggdWlwX2xlbiA+IGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICYmICggdWlwX2xlbiA8PSAoIEVUSF9UWF9CVUZGRVJfU0laRSAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICkgKQ0KCQl7DQoJCQltZW1jcHkoICggdm9pZCAqICkgJiggcGNCdWZmZXJbIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSBdICksICggdm9pZCAqICkgdWlwX2FwcGRhdGEsICggdWlwX2xlbiAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICk7DQoJCX0NCg0KCQkvKiBTZW5kLiAqLwkNCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCWlmKCB1eFR4QnVmZmVySW5kZXggPj0gKCBOQl9UWF9CVUZGRVJTIC0gMSApICkNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfTEVOR1RIX0ZSQU1FICkNCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfTEFTVF9CVUZGRVINCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfVFJBTlNNSVRfV1JBUDsNCgkJCQl1eFR4QnVmZmVySW5kZXggPSAwOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8qIEZpbGwgb3V0IHRoZSBuZWNlc3NhcnkgaW4gdGhlIGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSBkYXRhIHNlbnQuICovDQoJCQkJeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyA9IAkoIHVpcF9sZW4gJiAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19MRU5HVEhfRlJBTUUgKQ0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19MQVNUX0JVRkZFUjsNCgkJCQl1eFR4QnVmZmVySW5kZXgrKzsNCgkJCX0NCgkNCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19UU1RBUlQ7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQoNCglyZXR1cm4gbFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp1bnNpZ25lZCBsb25nIHVsRU1BQ1BvbGwoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdWxOZXh0UnhCdWZmZXIgPSAwOw0KdW5zaWduZWQgbG9uZyB1bFNlY3Rpb25MZW5ndGggPSAwLCB1bExlbmd0aFNvRmFyID0gMCwgdWxFT0YgPSBwZEZBTFNFOw0KY2hhciAqcGNTb3VyY2U7DQoNCgkvKiBTa2lwIGFueSBmcmFnbWVudHMuICovDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19TT0YgKSApDQoJew0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7CQkNCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJcyB0aGVyZSBhIHBhY2tldCByZWFkeT8gKi8NCg0KCXdoaWxlKCAoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBBVDkxQ19PV05FUlNISVBfQklUICkgJiYgIXVsU2VjdGlvbkxlbmd0aCApDQoJew0KCQlwY1NvdXJjZSA9ICggY2hhciAqICkoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBlbWFjQUREUkVTU19NQVNLICk7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIGVtYWNSWF9MRU5HVEhfRlJBTUU7DQoNCgkJaWYoIHVsU2VjdGlvbkxlbmd0aCA9PSAwICkNCgkJew0KCQkJLyogVGhlIGZyYW1lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGlzDQoJCQlkZXNjcmlwdG9yIHNvIGNvcHkgdGhlIGVudGlyZSBidWZmZXIgdG8gdUlQIC0gdGhlbiBtb3ZlIG9udG8NCgkJCXRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZS4gKi8NCgkJCWlmKCAoIHVsTGVuZ3RoU29GYXIgKyBFVEhfUlhfQlVGRkVSX1NJWkUgKSA8PSBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsIEVUSF9SWF9CVUZGRVJfU0laRSApOw0KCQkJCXVsTGVuZ3RoU29GYXIgKz0gRVRIX1JYX0JVRkZFUl9TSVpFOw0KCQkJfQkJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBmcmFtZS4gIENvcHkgdGhlIHNlY3Rpb24gdG8NCgkJCXVJUC4gKi8NCgkJCWlmKCB1bFNlY3Rpb25MZW5ndGggPCBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJLyogVGhlIHNlY3Rpb24gbGVuZ3RoIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBmcmFtZS4NCgkJCQl1bExlbmd0aFNvRmFyIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHNlY3Rpb25zIGFscmVhZHkNCgkJCQljb3BpZWQgdG8gdUlQLCBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzZWN0aW9uIGlzDQoJCQkJdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhcjsgKi8NCgkJCQlpZiggdWxTZWN0aW9uTGVuZ3RoID4gdWxMZW5ndGhTb0ZhciApDQoJCQkJew0KCQkJCQltZW1jcHkoICYoIHVpcF9idWZbIHVsTGVuZ3RoU29GYXIgXSApLCBwY1NvdXJjZSwgKCB1bFNlY3Rpb25MZW5ndGggLSB1bExlbmd0aFNvRmFyICkgKTsNCgkJCQl9DQoJCQl9CQkJDQoNCgkJCS8qIElzIHRoaXMgdGhlIGxhc3QgYnVmZmVyIGZvciB0aGUgZnJhbWU/ICBJZiBub3Qgd2h5PyAqLw0KCQkJdWxFT0YgPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19FT0Y7DQoJCX0NCg0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7DQoNCgkJLyogSW5jcmVtZW50IHRvIHRoZSBuZXh0IGJ1ZmZlciwgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5LiAqLw0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElmIHdlIG9idGFpbmVkIGRhdGEgYnV0IGZvciBzb21lIHJlYXNvbiBkaWQgbm90IGZpbmQgdGhlIGVuZCBvZiB0aGUNCglmcmFtZSB0aGVuIGRpc2NhcmQgdGhlIGRhdGEgYXMgaXQgbXVzdCBjb250YWluIGFuIGVycm9yLiAqLw0KCWlmKCAhdWxFT0YgKQ0KCXsNCgkJdWxTZWN0aW9uTGVuZ3RoID0gMDsNCgl9DQoNCglyZXR1cm4gdWxTZWN0aW9uTGVuZ3RoOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwRGVzY3JpcHRvcnModm9pZCkNCnsNCnVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgeEluZGV4Ow0KdW5zaWduZWQgbG9uZyB1bEFkZHJlc3M7DQoNCgkvKiBJbml0aWFsaXNlIHhSeERlc2NyaXB0b3JzIGRlc2NyaXB0b3IuICovDQoJZm9yKCB4SW5kZXggPSAwOyB4SW5kZXggPCBOQl9SWF9CVUZGRVJTOyArK3hJbmRleCApDQoJew0KCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBidWZmZXIgd2l0aGluIHRoZSBhcnJheS4gKi8NCgkJdWxBZGRyZXNzID0gKCB1bnNpZ25lZCBsb25nICkoIHBjUnhCdWZmZXIgKyAoIHhJbmRleCAqIEVUSF9SWF9CVUZGRVJfU0laRSApICk7DQoNCgkJLyogV3JpdGUgdGhlIGJ1ZmZlciBhZGRyZXNzIGludG8gdGhlIGRlc2NyaXB0b3IuICBUaGUgRE1BIHdpbGwgcGxhY2UNCgkJdGhlIGRhdGEgYXQgdGhpcyBhZGRyZXNzIHdoZW4gdGhpcyBkZXNjcmlwdG9yIGlzIGJlaW5nIHVzZWQuICBNYXNrIG9mZg0KCQl0aGUgYm90dG9tIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXMgdGhlc2UgaGF2ZSBzcGVjaWFsIG1lYW5pbmcuICovDQoJCXhSeERlc2NyaXB0b3JzWyB4SW5kZXggXS5hZGRyID0gdWxBZGRyZXNzICYgZW1hY0FERFJFU1NfTUFTSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgLSAxIF0uYWRkciB8PSBlbWFjUlhfV1JBUF9CSVQ7DQoNCgkvKiBJbml0aWFsaXNlIHhUeERlc2NyaXB0b3JzLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfVFhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgbG9uZyApKCBwY1R4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfVFhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHJlYWQNCgkJZGF0YSBmcm9tIGhlcmUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAqLw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJCXhUeERlc2NyaXB0b3JzWyB4SW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSBBVDkxQ19UUkFOU01JVF9PSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgLSAxIF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfV1JBUCB8IEFUOTFDX1RSQU5TTUlUX09LOw0KDQoJLyogVGVsbCB0aGUgRU1BQyB3aGVyZSB0byBmaW5kIHRoZSBkZXNjcmlwdG9ycy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUkJRUCA9ICggdW5zaWduZWQgbG9uZyApIHhSeERlc2NyaXB0b3JzOw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19UQlFQID0gKCB1bnNpZ25lZCBsb25nICkgeFR4RGVzY3JpcHRvcnM7DQoJDQoJLyogQ2xlYXIgYWxsIHRoZSBiaXRzIGluIHRoZSByZWNlaXZlIHN0YXR1cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUlNSID0gKCBBVDkxQ19FTUFDX09WUiB8IEFUOTFDX0VNQUNfUkVDIHwgQVQ5MUNfRU1BQ19CTkEgKTsNCg0KCS8qIEVuYWJsZSB0aGUgY29weSBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlcnMsIGlnbm9yZSBicm9hZGNhc3RzLA0KCWFuZCBkb24ndCBjb3B5IEZDUy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCBBVDkxQ19FTUFDX0NBRiB8IEFUOTFDX0VNQUNfTkJDIHwgQVQ5MUNfRU1BQ19EUkZDUyk7DQoNCgkvKiBFbmFibGUgUnggYW5kIFR4LCBwbHVzIHRoZSBzdGF0cyByZWdpc3Rlci4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9ICggQVQ5MUNfRU1BQ19URSB8IEFUOTFDX0VNQUNfUkUgfCBBVDkxQ19FTUFDX1dFU1RBVCApOw0KfQkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cE1BQ0FkZHJlc3MoIHZvaWQgKQ0Kew0KCS8qIE11c3QgYmUgd3JpdHRlbiBTQTFMIHRoZW4gU0ExSC4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExTCA9CSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDMgXSA8PCAyNCApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDIgXSA8PCAxNiApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDEgXSA8PCA4ICApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyAwIF07DQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfU0ExSCA9CSggKCB1bnNpZ25lZCBsb25nICkgY01BQ0FkZHJlc3NbIDUgXSA8PCA4ICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDQgXTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKQ0Kew0KCS8qIENyZWF0ZSB0aGUgc2VtYXBob3JlIHVzZWQgdG8gdHJpZ2dlciB0aGUgRU1BQyB0YXNrLiAqLw0KCXZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoIHhTZW1hcGhvcmUgKTsNCglpZiggeFNlbWFwaG9yZSApDQoJew0KCQkvKiBXZSBzdGFydCBieSAndGFraW5nJyB0aGUgc2VtYXBob3JlIHNvIHRoZSBJU1IgY2FuICdnaXZlJyBpdCB3aGVuIHRoZQ0KCQlmaXJzdCBpbnRlcnJ1cHQgb2NjdXJzLiAqLw0KCQl4U2VtYXBob3JlVGFrZSggeFNlbWFwaG9yZSwgZW1hY05PX0RFTEFZICk7DQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQkvKiBXZSB3YW50IHRvIGludGVycnVwdCBvbiBSeCBldmVudHMuICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSUVSID0gQVQ5MUNfRU1BQ19SQ09NUDsNCg0KCQkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGluIHRoZSBBSUMuICovDQoJCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQoIEFUOTFDX0lEX0VNQUMsIGVtYWNJTlRFUlJVUFRfTEVWRUwsIEFUOTFDX0FJQ19TUkNUWVBFX0lOVF9ISUdIX0xFVkVMLCAoIHZvaWQgKCopKCB2b2lkICkgKSB2RU1BQ0lTUl9XcmFwcGVyICk7DQoJCQlBVDkxQ19CQVNFX0FJQy0+QUlDX0lFQ1IgPSAweDEgPDwgQVQ5MUNfSURfRU1BQzsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCg0KDQovKg0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbA0KICogRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApDQp7DQp1bnNpZ25lZCBsb25nIHVsUEhZSWQxLCB1bFBIWUlkMiwgdWxTdGF0dXM7DQpwb3J0QkFTRV9UWVBFIHhSZXR1cm4gPSBwZFBBU1M7DQoJDQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIEVuYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfTVBFOwkNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCAyICkgPDwgMTA7DQoNCgkvKiBSZWFkIHRoZSBQSFkgSUQuICovDQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMSwgJnVsUEhZSWQxICk7DQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMiwgJnVsUEhZSWQyICk7DQoNCgkvKiBBTUQgQU03OUM4NzU6DQoJCQlQSFlfSUQxID0gMHgwMDIyDQoJCQlQSFlfSUQyID0gMHg1NTQxDQoJCQlCaXRzIDM6MCBSZXZpc2lvbiBOdW1iZXIgRm91ciBiaXQgbWFudWZhY3R1cmVyknMgcmV2aXNpb24gbnVtYmVyLg0KCQkJCTAwMDEgc3RhbmRzIGZvciBSZXYuIEEsIGV0Yy4NCgkqLw0KCWlmKCAoICggdWxQSFlJZDEgPDwgMTYgKSB8ICggdWxQSFlJZDIgJiAweGZmZjAgKSApICE9IE1JSV9ETTkxNjFfSUQgKQ0KCXsNCgkJLyogRGlkIG5vdCBleHBlY3QgdGhpcyBJRC4gKi8NCgkJeFJldHVybiA9IHBkRkFJTDsNCgl9DQoJZWxzZQ0KCXsNCgkJdWxTdGF0dXMgPSB4R2V0TGlua1NwZWVkKCk7DQoNCgkJaWYoIHVsU3RhdHVzICE9IHBkUEFTUyApDQoJCXsNCgkJCXhSZXR1cm4gPSBwZEZBSUw7DQoJCX0NCgl9DQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4geFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCB2UmVhZFBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nICpwdWxWYWx1ZSApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX01BTiA9IAkoQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQkJfCAoMiA8PCAxNikgfCAoMiA8PCAyOCkNCgkJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCk7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQuICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9DQoNCgkqcHVsVmFsdWUgPSAoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gJiAweDAwMDBmZmZmICk7CQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCnN0YXRpYyB2b2lkIHZXcml0ZVBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nIHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAoKCBBVDkxQ19FTUFDX1NPRiAmICgweDAxPDwzMCkpDQoJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDEgPDwgMjgpDQoJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJfCAodWNBZGRyZXNzIDw8IDE4KSkNCgkJCQkJCQkJfCAodWxWYWx1ZSAmIDB4ZmZmZik7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05TUiAmIEFUOTFDX0VNQUNfSURMRSApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX07DQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KfQ0KI2VuZGlmDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApDQp7DQoJdW5zaWduZWQgbG9uZyB1bEJNU1IsIHVsQk1DUiwgdWxMUEEsIHVsTUFDQ2ZnLCB1bFNwZWVkLCB1bER1cGxleDsNCg0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBMaW5rIHN0YXR1cyBpcyBsYXRjaGVkLCBzbyByZWFkIHR3aWNlIHRvIGdldCBjdXJyZW50IHZhbHVlICovDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KDQoJaWYoICEoIHVsQk1TUiAmIEJNU1JfTFNUQVRVUyApICkNCgl7CQ0KCQkvKiBObyBMaW5rLiAqLw0KCQlyZXR1cm4gcGRGQUlMOw0KCX0NCg0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQk1DUik7DQoJaWYgKHVsQk1DUiAmIEJNQ1JfQU5FTkFCTEUpDQoJewkJCQkNCgkJLyogQXV0b05lZ290aWF0aW9uIGlzIGVuYWJsZWQuICovDQoJCWlmICghKHVsQk1TUiAmIEJNU1JfQU5FR0NPTVBMRVRFKSkNCgkJew0KCQkJLyogQXV0by1uZWdvdGlhdGlvbiBpbiBwcm9ncmVzcy4gKi8NCgkJCXJldHVybiBwZEZBSUw7CQkJCQ0KCQl9CQkNCg0KCQl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0xQQSwgJnVsTFBBKTsNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTAwSEFMRiApICkNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwMDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDsNCgkJfQ0KDQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwRlVMTCApICkNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfRlVMTDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0hBTEY7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdWxTcGVlZCA9ICggdWxCTUNSICYgQk1DUl9TUEVFRDEwMCApID8gU1BFRURfMTAwIDogU1BFRURfMTA7DQoJCXVsRHVwbGV4ID0gKCB1bEJNQ1IgJiBCTUNSX0ZVTExEUExYICkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOw0KCX0NCg0KCS8qIFVwZGF0ZSB0aGUgTUFDICovDQoJdWxNQUNDZmcgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgJiB+KCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQgKTsNCglpZiggdWxTcGVlZCA9PSBTUEVFRF8xMDAgKQ0KCXsNCgkJaWYoIHVsRHVwbGV4ID09IERVUExFWF9GVUxMICkNCgkJew0KCQkJLyogMTAwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsJCQkJCQ0KCQkJLyogMTAwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICh1bER1cGxleCA9PSBEVVBMRVhfRlVMTCkNCgkJew0KCQkJLyogMTAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIDEwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZzsNCgkJfQ0KCX0NCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4gcGRQQVNTOw0KfQ0K