LyoNCiAgICBGcmVlUlRPUyBWOC4yLjAgLSBDb3B5cmlnaHQgKEMpIDIwMTUgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQogICAgQWxsIHJpZ2h0cyByZXNlcnZlZA0KDQogICAgVklTSVQgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgVE8gRU5TVVJFIFlPVSBBUkUgVVNJTkcgVEhFIExBVEVTVCBWRVJTSU9OLg0KDQogICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVSVE9TIGRpc3RyaWJ1dGlvbi4NCg0KICAgIEZyZWVSVE9TIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXINCiAgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIpIGFzIHB1Ymxpc2hlZCBieSB0aGUNCiAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gPj4hQU5EIE1PRElGSUVEIEJZITw8IHRoZSBGcmVlUlRPUyBleGNlcHRpb24uDQoNCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICA+PiEgICBOT1RFOiBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvICAgICAhPDwNCiAgICA+PiEgICBkaXN0cmlidXRlIGEgY29tYmluZWQgd29yayB0aGF0IGluY2x1ZGVzIEZyZWVSVE9TIHdpdGhvdXQgYmVpbmcgICAhPDwNCiAgICA+PiEgICBvYmxpZ2VkIHRvIHByb3ZpZGUgdGhlIHNvdXJjZSBjb2RlIGZvciBwcm9wcmlldGFyeSBjb21wb25lbnRzICAgICAhPDwNCiAgICA+PiEgICBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUyBrZXJuZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPDwNCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBGdWxsIGxpY2Vuc2UgdGV4dCBpcyBhdmFpbGFibGUgb24gdGhlIGZvbGxvd2luZw0KICAgIGxpbms6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExNC5odG1sDQoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIEZyZWVSVE9TIHByb3ZpZGVzIGNvbXBsZXRlbHkgZnJlZSB5ZXQgcHJvZmVzc2lvbmFsbHkgZGV2ZWxvcGVkLCAgICAqDQogICAgICogICAgcm9idXN0LCBzdHJpY3RseSBxdWFsaXR5IGNvbnRyb2xsZWQsIHN1cHBvcnRlZCwgYW5kIGNyb3NzICAgICAgICAgICoNCiAgICAgKiAgICBwbGF0Zm9ybSBzb2Z0d2FyZSB0aGF0IGlzIG1vcmUgdGhhbiBqdXN0IHRoZSBtYXJrZXQgbGVhZGVyLCBpdCAgICAgKg0KICAgICAqICAgIGlzIHRoZSBpbmR1c3RyeSdzIGRlIGZhY3RvIHN0YW5kYXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIZWxwIHlvdXJzZWxmIGdldCBzdGFydGVkIHF1aWNrbHkgd2hpbGUgc2ltdWx0YW5lb3VzbHkgaGVscGluZyAgICAgKg0KICAgICAqICAgIHRvIHN1cHBvcnQgdGhlIEZyZWVSVE9TIHByb2plY3QgYnkgcHVyY2hhc2luZyBhIEZyZWVSVE9TICAgICAgICAgICAqDQogICAgICogICAgdHV0b3JpYWwgYm9vaywgcmVmZXJlbmNlIG1hbnVhbCwgb3IgYm90aDogICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9Eb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9GQVFIZWxwLmh0bWwgLSBIYXZpbmcgYSBwcm9ibGVtPyAgU3RhcnQgYnkgcmVhZGluZw0KCXRoZSBGQVEgcGFnZSAiTXkgYXBwbGljYXRpb24gZG9lcyBub3QgcnVuLCB3aGF0IGNvdWxkIGJlIHdyb25nPyIuICBIYXZlIHlvdQ0KCWRlZmluZWQgY29uZmlnQVNTRVJUKCk/DQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9zdXBwb3J0IC0gSW4gcmV0dXJuIGZvciByZWNlaXZpbmcgdGhpcyB0b3AgcXVhbGl0eQ0KCWVtYmVkZGVkIHNvZnR3YXJlIGZvciBmcmVlIHdlIHJlcXVlc3QgeW91IGFzc2lzdCBvdXIgZ2xvYmFsIGNvbW11bml0eSBieQ0KCXBhcnRpY2lwYXRpbmcgaW4gdGhlIHN1cHBvcnQgZm9ydW0uDQoNCglodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy90cmFpbmluZyAtIEludmVzdGluZyBpbiB0cmFpbmluZyBhbGxvd3MgeW91ciB0ZWFtIHRvDQoJYmUgYXMgcHJvZHVjdGl2ZSBhcyBwb3NzaWJsZSBhcyBlYXJseSBhcyBwb3NzaWJsZS4gIE5vdyB5b3UgY2FuIHJlY2VpdmUNCglGcmVlUlRPUyB0cmFpbmluZyBkaXJlY3RseSBmcm9tIFJpY2hhcmQgQmFycnksIENFTyBvZiBSZWFsIFRpbWUgRW5naW5lZXJzDQoJTHRkLCBhbmQgdGhlIHdvcmxkJ3MgbGVhZGluZyBhdXRob3JpdHkgb24gdGhlIHdvcmxkJ3MgbGVhZGluZyBSVE9TLg0KDQogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvcGx1cyAtIEEgc2VsZWN0aW9uIG9mIEZyZWVSVE9TIGVjb3N5c3RlbSBwcm9kdWN0cywNCiAgICBpbmNsdWRpbmcgRnJlZVJUT1MrVHJhY2UgLSBhbiBpbmRpc3BlbnNhYmxlIHByb2R1Y3Rpdml0eSB0b29sLCBhIERPUw0KICAgIGNvbXBhdGlibGUgRkFUIGZpbGUgc3lzdGVtLCBhbmQgb3VyIHRpbnkgdGhyZWFkIGF3YXJlIFVEUC9JUCBzdGFjay4NCg0KICAgIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL2xhYnMgLSBXaGVyZSBuZXcgRnJlZVJUT1MgcHJvZHVjdHMgZ28gdG8gaW5jdWJhdGUuDQogICAgQ29tZSBhbmQgdHJ5IEZyZWVSVE9TK1RDUCwgb3VyIG5ldyBvcGVuIHNvdXJjZSBUQ1AvSVAgc3RhY2sgZm9yIEZyZWVSVE9TLg0KDQogICAgaHR0cDovL3d3dy5PcGVuUlRPUy5jb20gLSBSZWFsIFRpbWUgRW5naW5lZXJzIGx0ZC4gbGljZW5zZSBGcmVlUlRPUyB0byBIaWdoDQogICAgSW50ZWdyaXR5IFN5c3RlbXMgbHRkLiB0byBzZWxsIHVuZGVyIHRoZSBPcGVuUlRPUyBicmFuZC4gIExvdyBjb3N0IE9wZW5SVE9TDQogICAgbGljZW5zZXMgb2ZmZXIgdGlja2V0ZWQgc3VwcG9ydCwgaW5kZW1uaWZpY2F0aW9uIGFuZCBjb21tZXJjaWFsIG1pZGRsZXdhcmUuDQoNCiAgICBodHRwOi8vd3d3LlNhZmVSVE9TLmNvbSAtIEhpZ2ggSW50ZWdyaXR5IFN5c3RlbXMgYWxzbyBwcm92aWRlIGEgc2FmZXR5DQogICAgZW5naW5lZXJlZCBhbmQgaW5kZXBlbmRlbnRseSBTSUwzIGNlcnRpZmllZCB2ZXJzaW9uIGZvciB1c2UgaW4gc2FmZXR5IGFuZA0KICAgIG1pc3Npb24gY3JpdGljYWwgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBwcm92YWJsZSBkZXBlbmRhYmlsaXR5Lg0KDQogICAgMSB0YWIgPT0gNCBzcGFjZXMhDQoqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAic2VtcGhyLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQovKiBEZW1vIGFwcGxpY2F0aW9uIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIlNBTTdfRU1BQy5oIg0KDQovKiB1SVAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAidWlwLmgiDQoNCi8qIEhhcmR3YXJlIHNwZWNpZmljIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkVtYWMuaCINCiNpbmNsdWRlICJtaWkuaCINCiNpbmNsdWRlICJBVDkxU0FNN1gyNTYuaCINCg0KDQovKiBVU0VfUk1JSV9JTlRFUkZBQ0UgbXVzdCBiZSBkZWZpbmVkIGFzIDEgdG8gdXNlIGFuIFJNSUkgaW50ZXJmYWNlLCBvciAwDQp0byB1c2UgYW4gTUlJIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgVVNFX1JNSUlfSU5URVJGQUNFIDANCg0KLyogVGhlIGJ1ZmZlciBhZGRyZXNzZXMgd3JpdHRlbiBpbnRvIHRoZSBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgc28gdGhlDQpsYXN0IGZldyBiaXRzIGFyZSB6ZXJvLiAgVGhlc2UgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIEVNQUMNCnBlcmlwaGVyYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuICovDQojZGVmaW5lIGVtYWNBRERSRVNTX01BU0sJCQkoICggdW5zaWduZWQgbG9uZyApIDB4RkZGRkZGRkMgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hcmsgdGhlIGxhc3QNCmRlc2NyaXB0b3IgaW4gdGhlIGFycmF5LiAqLw0KI2RlZmluZSBlbWFjUlhfV1JBUF9CSVQJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweDAyICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KZGVzY3JpcHRvciBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgRU1BQyBvciB0aGUgc29mdHdhcmUuICovDQojZGVmaW5lIGVtYWNUWF9CVUZfVVNFRAkJCQkoICggdW5zaWduZWQgbG9uZyApIDB4ODAwMDAwMDAgKQ0KDQovKiBBIHNob3J0IGRlbGF5IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSwgc2hvdWxkDQpvbmUgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB3aGVuIHRyeWluZyB0byB0cmFuc21pdCBhIGZyYW1lLiAqLw0KI2RlZmluZSBlbWFjQlVGRkVSX1dBSVRfREVMQVkJCSggMiApDQojZGVmaW5lIGVtYWNNQVhfV0FJVF9DWUNMRVMJCQkoIGNvbmZpZ1RJQ0tfUkFURV9IWiAvIDQwICkNCg0KLyogTWlzYyBkZWZpbmVzLiAqLw0KI2RlZmluZSBlbWFjSU5URVJSVVBUX0xFVkVMCQkJKCA1ICkNCiNkZWZpbmUgZW1hY05PX0RFTEFZCQkJCSggMCApDQojZGVmaW5lIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRQkoIDU0ICkNCiNkZWZpbmUgZW1hY1BIWV9JTklUX0RFTEFZCQkJKCA1MDAwIC8gcG9ydFRJQ0tfUEVSSU9EX01TICkNCiNkZWZpbmUgZW1hY1JFU0VUX0tFWQkJCQkoICggdW5zaWduZWQgbG9uZyApIDB4QTUwMDAwMDAgKQ0KI2RlZmluZSBlbWFjUkVTRVRfTEVOR1RICQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAoIDB4MDEgPDwgOCApICkNCg0KLyogVGhlIEF0bWVsIGhlYWRlciBmaWxlIG9ubHkgZGVmaW5lcyB0aGUgVFggZnJhbWUgbGVuZ3RoIG1hc2suICovDQojZGVmaW5lIGVtYWNSWF9MRU5HVEhfRlJBTUUJCQkoIDB4ZmZmICkNCg0KLyogUGVyaXBoZXJhbCBzZXR1cCBmb3IgdGhlIEVNQUMuICovDQojZGVmaW5lIGVtYWNQRVJJUEhFUkFMX0FfU0VUVVAgCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCMl9FVFgwCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxMl9FVFhFUgkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxNl9FQ09MCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxMV9FVFgzCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI2X0VSWDEJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjE1X0VSWERWCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjEzX0VSWDIJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjNfRVRYMQkJCSkgfCBcDQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIEFUOTFDX1BCOF9FTURDCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEI1X0VSWDAJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjE0X0VSWDMJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjRfRUNSU19FQ1JTRFYJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxX0VUWEVOCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIxMF9FVFgyCQkJKSB8IFwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfUEIwX0VUWENLX0VSRUZDSwkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjlfRU1ESU8JCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjdfRVJYRVIJCQkpIHwgXA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19QQjE3X0VSWENLCQkpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoNCiAqIFByb3RvdHlwZSBmb3IgdGhlIEVNQUMgaW50ZXJydXB0IGZ1bmN0aW9uIC0gY2FsbGVkIGJ5IHRoZSBhc20gd3JhcHBlci4NCiAqLw0KZXh0ZXJuIHZvaWQgdkVNQUNJU1JfV3JhcHBlciggdm9pZCApIF9fYXR0cmlidXRlX18oKG5ha2VkKSk7DQoNCi8qDQogKiBJbml0aWFsaXNlIGJvdGggdGhlIFR4IGFuZCBSeCBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBFTUFDLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cERlc2NyaXB0b3JzKHZvaWQpOw0KDQovKg0KICogV3JpdGUgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIEVNQUMuICBUaGUgTUFDIGFkZHJlc3MgaXMgc2V0IGFzIG9uZSBvZiB0aGUNCiAqIHVpcCBvcHRpb25zLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cE1BQ0FkZHJlc3MoIHZvaWQgKTsNCg0KLyoNCiAqIENvbmZpZ3VyZSB0aGUgRU1BQyBhbmQgQUlDIGZvciBFTUFDIGludGVycnVwdHMuDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwRU1BQ0ludGVycnVwdCggdm9pZCApOw0KDQovKg0KICogU29tZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgdGFrZW4gZnJvbSB0aGUgQXRtZWwgRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyAqcHVsVmFsdWUgKTsNCiNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCXN0YXRpYyB2b2lkIHZXcml0ZVBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nIHVsVmFsdWUpOw0KI2VuZGlmDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSB4R2V0TGlua1NwZWVkKCB2b2lkICk7DQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogQnVmZmVyIHdyaXR0ZW4gdG8gYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSB0aGUNCmNvbW1lbnQgYWJvdmUgdGhlIGVtYWNBRERSRVNTX01BU0sgZGVmaW5pdGlvbi4gKi8NCiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9OA0Kc3RhdGljIHZvbGF0aWxlIGNoYXIgcGNSeEJ1ZmZlclsgTkJfUlhfQlVGRkVSUyAqIEVUSF9SWF9CVUZGRVJfU0laRSBdOw0KDQovKiBCdWZmZXIgcmVhZCBieSB0aGUgRU1BQyBETUEuICBNdXN0IGJlIGFsaWduZWQgYXMgZGVzY3JpYmVkIGJ5IGhlIGNvbW1lbnQNCmFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyBjaGFyIHBjVHhCdWZmZXJbIE5CX1RYX0JVRkZFUlMgKiBFVEhfVFhfQlVGRkVSX1NJWkUgXTsNCg0KLyogRGVzY3JpcHRvcnMgdXNlZCB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIHRoZSBwcm9ncmFtIGFuZCB0aGUgRU1BQyBwZXJpcGhlcmFsLg0KVGhlc2UgZGVzY3JpcHRvcnMgaG9sZCB0aGUgbG9jYXRpb25zIGFuZCBzdGF0ZSBvZiB0aGUgUnggYW5kIFR4IGJ1ZmZlcnMuICovDQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfVHhUZERlc2NyaXB0b3IgeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgXTsNCnN0YXRpYyB2b2xhdGlsZSBBVDkxU19SeFRkRGVzY3JpcHRvciB4UnhEZXNjcmlwdG9yc1sgTkJfUlhfQlVGRkVSUyBdOw0KDQovKiBUaGUgSVAgYW5kIEV0aGVybmV0IGFkZHJlc3NlcyBhcmUgcmVhZCBmcm9tIHRoZSB1SVAgc2V0dXAuICovDQpjb25zdCBjaGFyIGNNQUNBZGRyZXNzWyA2IF0gPSB7IHVpcE1BQ19BRERSMCwgdWlwTUFDX0FERFIxLCB1aXBNQUNfQUREUjIsIHVpcE1BQ19BRERSMywgdWlwTUFDX0FERFI0LCB1aXBNQUNfQUREUjUgfTsNCmNvbnN0IHVuc2lnbmVkIGNoYXIgdWNJUEFkZHJlc3NbIDQgXSAgPSB7IHVpcElQX0FERFIwLCB1aXBJUF9BRERSMSwgdWlwSVBfQUREUjIsIHVpcElQX0FERFIzIH07DQoNCi8qIFRoZSBzZW1hcGhvcmUgdXNlZCBieSB0aGUgRU1BQyBJU1IgdG8gd2FrZSB0aGUgRU1BQyB0YXNrLiAqLw0Kc3RhdGljIFNlbWFwaG9yZUhhbmRsZV90IHhTZW1hcGhvcmUgPSBOVUxMOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KU2VtYXBob3JlSGFuZGxlX3QgeEVNQUNJbml0KCB2b2lkICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogRGlzYWJsZSBwdWxsIHVwIG9uIFJYRFYgPT4gUEhZIG5vcm1hbCBtb2RlIChub3QgaW4gdGVzdCBtb2RlKSwNCglQSFkgaGFzIGludGVybmFsIHB1bGwgZG93bi4gKi8NCglBVDkxQ19CQVNFX1BJT0ItPlBJT19QUFVEUiA9IDEgPDwgMTU7DQoNCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgkgIAkvKiBQSFkgaGFzIGludGVybmFsIHB1bGwgZG93biA6IHNldCBNSUkgbW9kZS4gKi8NCgkgIAlBVDkxQ19CQVNFX1BJT0ItPlBJT19QUFVEUiA9IDEgPDwgMTY7DQoJI2VuZGlmDQoNCgkvKiBDbGVhciBQQjE4IDw9PiBQSFkgcG93ZXJkb3duLiAqLw0KICAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BFUiA9IDEgPDwgMTg7DQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fT0VSID0gMSA8PCAxODsNCglBVDkxQ19CQVNFX1BJT0ItPlBJT19DT0RSID0gMSA8PCAxODsNCg0KCS8qIEFmdGVyIFBIWSBwb3dlciB1cCwgaGFyZHdhcmUgcmVzZXQuICovDQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JNUiA9IGVtYWNSRVNFVF9LRVkgfCBlbWFjUkVTRVRfTEVOR1RIOw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SQ1IgPSBlbWFjUkVTRVRfS0VZIHwgQVQ5MUNfUlNUQ19FWFRSU1Q7DQoNCgkvKiBXYWl0IGZvciBoYXJkd2FyZSByZXNldCBlbmQuICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SU1IgJiBBVDkxQ19SU1RDX05SU1RMICkgKQ0KCXsNCgkJX19hc20gdm9sYXRpbGUgKCAiTk9QIiApOw0KCX0NCiAgICBfX2FzbSB2b2xhdGlsZSAoICJOT1AiICk7DQoNCgkvKiBTZXR1cCB0aGUgcGlucy4gKi8NCglBVDkxQ19CQVNFX1BJT0ItPlBJT19BU1IgPSBlbWFjUEVSSVBIRVJBTF9BX1NFVFVQOw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BEUiA9IGVtYWNQRVJJUEhFUkFMX0FfU0VUVVA7DQoNCgkvKiBFbmFibGUgY29tIGJldHdlZW4gRU1BQyBQSFkuDQoNCglFbmFibGUgbWFuYWdlbWVudCBwb3J0LiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19NUEU7CQ0KDQoJLyogTURDID0gTUNLLzMyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIDIgKSA8PCAxMDsJDQoNCgkvKiBXYWl0IGZvciBQSFkgYXV0byBpbml0IGVuZCAocmF0aGVyIGNydWRlIGRlbGF5ISkuICovDQoJdlRhc2tEZWxheSggZW1hY1BIWV9JTklUX0RFTEFZICk7DQoNCgkvKiBQSFkgY29uZmlndXJhdGlvbi4gKi8NCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgl7DQoJCXVuc2lnbmVkIGxvbmcgdWxDb250cm9sOw0KDQoJCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogZGlzYWJsZSBNSUkgaXNvbGF0ZS4gKi8NCgkJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQ29udHJvbCApOw0KCQl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxDb250cm9sICk7DQoJCXVsQ29udHJvbCAmPSB+Qk1DUl9JU09MQVRFOw0KCQl2V3JpdGVQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgdWxDb250cm9sICk7DQoJfQ0KCSNlbmRpZg0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgYWdhaW4uICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiAmPSB+QVQ5MUNfRU1BQ19NUEU7DQoNCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgkJLyogRW5hYmxlIEVNQUMgaW4gTUlJIG1vZGUsIGVuYWJsZSBjbG9jayBFUlhDSyBhbmQgRVRYQ0suICovDQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19VU1JJTyA9IEFUOTFDX0VNQUNfQ0xLRU4gOw0KCSNlbHNlDQoJCS8qIEVuYWJsZSBFTUFDIGluIFJNSUkgbW9kZSwgZW5hYmxlIFJNSUkgY2xvY2sgKDUwTUh6IGZyb20gb3NjaWxsYXRvcg0KCQlvbiBFUkZDSykuICovDQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19VU1JJTyA9IEFUOTFDX0VNQUNfUk1JSSB8IEFUOTFDX0VNQUNfQ0xLRU4gOw0KCSNlbmRpZg0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIFNldHVwIHRoZSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycy4gKi8NCglwcnZTZXR1cERlc2NyaXB0b3JzKCk7DQoJDQoJLyogTG9hZCBvdXIgTUFDIGFkZHJlc3MgaW50byB0aGUgRU1BQy4gKi8NCglwcnZTZXR1cE1BQ0FkZHJlc3MoKTsNCg0KCS8qIEFyZSB3ZSBjb25uZWN0ZWQ/ICovDQoJaWYoIHBydlByb2JlUEhZKCkgKQ0KCXsNCgkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQhICovDQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQlwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoKTsNCgkJCXZQYXNzRU1BQ1NlbWFwaG9yZSggeFNlbWFwaG9yZSApOw0KCQl9DQoJCXBvcnRFWElUX0NSSVRJQ0FMKCk7DQoJfQ0KDQoJcmV0dXJuIHhTZW1hcGhvcmU7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KbG9uZyBsRU1BQ1NlbmQoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdXhUeEJ1ZmZlckluZGV4ID0gMDsNCnBvcnRCQVNFX1RZUEUgeFdhaXRDeWNsZXMgPSAwOw0KbG9uZyBsUmV0dXJuID0gcGRQQVNTOw0KY2hhciAqcGNCdWZmZXI7DQoNCgkvKiBJcyBhIGJ1ZmZlciBhdmFpbGFibGU/ICovDQoJd2hpbGUoICEoIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19UUkFOU01JVF9PSyApICkNCgl7DQoJCS8qIFRoZXJlIGlzIG5vIHJvb20gdG8gd3JpdGUgdGhlIFR4IGRhdGEgdG8gdGhlIFR4IGJ1ZmZlci4gIFdhaXQgYQ0KCQlzaG9ydCB3aGlsZSwgdGhlbiB0cnkgYWdhaW4uICovDQoJCXhXYWl0Q3ljbGVzKys7DQoJCWlmKCB4V2FpdEN5Y2xlcyA+IGVtYWNNQVhfV0FJVF9DWUNMRVMgKQ0KCQl7DQoJCQkvKiBHaXZlIHVwLiAqLw0KCQkJbFJldHVybiA9IHBkRkFJTDsNCgkJCWJyZWFrOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdlRhc2tEZWxheSggZW1hY0JVRkZFUl9XQUlUX0RFTEFZICk7DQoJCX0NCgl9DQoNCgkvKiBsUmV0dXJuIHdpbGwgb25seSBiZSBwZFBBU1MgaWYgYSBidWZmZXIgaXMgYXZhaWxhYmxlLiAqLw0KCWlmKCBsUmV0dXJuID09IHBkUEFTUyApDQoJew0KCQkvKiBDb3B5IHRoZSBoZWFkZXJzIGludG8gdGhlIFR4IGJ1ZmZlci4gIFRoZXNlIHdpbGwgYmUgaW4gdGhlIHVJUCBidWZmZXIuICovDQoJCXBjQnVmZmVyID0gKCBjaGFyICogKSB4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uYWRkcjsNCgkJbWVtY3B5KCAoIHZvaWQgKiApIHBjQnVmZmVyLCAoIHZvaWQgKiApIHVpcF9idWYsIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApOw0KDQoJCS8qIElmIHRoZXJlIGlzIHJvb20sIGFsc28gY29weSBpbiB0aGUgYXBwbGljYXRpb24gZGF0YSBpZiBhbnkuICovDQoJCWlmKCAoIHVpcF9sZW4gPiBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKSAmJiAoIHVpcF9sZW4gPD0gKCBFVEhfVFhfQlVGRkVSX1NJWkUgLSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKSApICkNCgkJew0KCQkJbWVtY3B5KCAoIHZvaWQgKiApICYoIHBjQnVmZmVyWyBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgXSApLCAoIHZvaWQgKiApIHVpcF9hcHBkYXRhLCAoIHVpcF9sZW4gLSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKSApOw0KCQl9DQoNCgkJLyogU2VuZC4gKi8JDQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQlpZiggdXhUeEJ1ZmZlckluZGV4ID49ICggTkJfVFhfQlVGRkVSUyAtIDEgKSApDQoJCQl7DQoJCQkJLyogRmlsbCBvdXQgdGhlIG5lY2Vzc2FyeSBpbiB0aGUgZGVzY3JpcHRvciB0byBnZXQgdGhlIGRhdGEgc2VudC4gKi8NCgkJCQl4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gCSggdWlwX2xlbiAmICggdW5zaWduZWQgbG9uZyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX1RSQU5TTUlUX1dSQVA7DQoJCQkJdXhUeEJ1ZmZlckluZGV4ID0gMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfTEVOR1RIX0ZSQU1FICkNCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfTEFTVF9CVUZGRVI7DQoJCQkJdXhUeEJ1ZmZlckluZGV4Kys7DQoJCQl9DQoJDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfVFNUQVJUOw0KCQl9DQoJCXBvcnRFWElUX0NSSVRJQ0FMKCk7DQoJfQ0KDQoJcmV0dXJuIGxSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KdW5zaWduZWQgbG9uZyB1bEVNQUNQb2xsKCB2b2lkICkNCnsNCnN0YXRpYyB1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHVsTmV4dFJ4QnVmZmVyID0gMDsNCnVuc2lnbmVkIGxvbmcgdWxTZWN0aW9uTGVuZ3RoID0gMCwgdWxMZW5ndGhTb0ZhciA9IDAsIHVsRU9GID0gcGRGQUxTRTsNCmNoYXIgKnBjU291cmNlOw0KDQoJLyogU2tpcCBhbnkgZnJhZ21lbnRzLiAqLw0KCXdoaWxlKCAoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBBVDkxQ19PV05FUlNISVBfQklUICkgJiYgISggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfU09GICkgKQ0KCXsNCgkJLyogTWFyayB0aGUgYnVmZmVyIGFzIGZyZWUgYWdhaW4uICovDQoJCXhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJj0gfiggQVQ5MUNfT1dORVJTSElQX0JJVCApOwkJDQoJCXVsTmV4dFJ4QnVmZmVyKys7DQoJCWlmKCB1bE5leHRSeEJ1ZmZlciA+PSBOQl9SWF9CVUZGRVJTICkNCgkJew0KCQkJdWxOZXh0UnhCdWZmZXIgPSAwOw0KCQl9DQoJfQ0KDQoJLyogSXMgdGhlcmUgYSBwYWNrZXQgcmVhZHk/ICovDQoNCgl3aGlsZSggKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgQVQ5MUNfT1dORVJTSElQX0JJVCApICYmICF1bFNlY3Rpb25MZW5ndGggKQ0KCXsNCgkJcGNTb3VyY2UgPSAoIGNoYXIgKiApKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgZW1hY0FERFJFU1NfTUFTSyApOw0KCQl1bFNlY3Rpb25MZW5ndGggPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBlbWFjUlhfTEVOR1RIX0ZSQU1FOw0KDQoJCWlmKCB1bFNlY3Rpb25MZW5ndGggPT0gMCApDQoJCXsNCgkJCS8qIFRoZSBmcmFtZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhpcw0KCQkJZGVzY3JpcHRvciBzbyBjb3B5IHRoZSBlbnRpcmUgYnVmZmVyIHRvIHVJUCAtIHRoZW4gbW92ZSBvbnRvDQoJCQl0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUuICovDQoJCQlpZiggKCB1bExlbmd0aFNvRmFyICsgRVRIX1JYX0JVRkZFUl9TSVpFICkgPD0gVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCW1lbWNweSggJiggdWlwX2J1ZlsgdWxMZW5ndGhTb0ZhciBdICksIHBjU291cmNlLCBFVEhfUlhfQlVGRkVSX1NJWkUgKTsNCgkJCQl1bExlbmd0aFNvRmFyICs9IEVUSF9SWF9CVUZGRVJfU0laRTsNCgkJCX0JCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIFRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgZnJhbWUuICBDb3B5IHRoZSBzZWN0aW9uIHRvDQoJCQl1SVAuICovDQoJCQlpZiggdWxTZWN0aW9uTGVuZ3RoIDwgVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCS8qIFRoZSBzZWN0aW9uIGxlbmd0aCBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgZnJhbWUuDQoJCQkJdWxMZW5ndGhTb0ZhciBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSBzZWN0aW9ucyBhbHJlYWR5DQoJCQkJY29waWVkIHRvIHVJUCwgc28gdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgc2VjdGlvbiBpcw0KCQkJCXVsU2VjdGlvbkxlbmd0aCAtIHVsTGVuZ3RoU29GYXI7ICovDQoJCQkJaWYoIHVsU2VjdGlvbkxlbmd0aCA+IHVsTGVuZ3RoU29GYXIgKQ0KCQkJCXsNCgkJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsICggdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhciApICk7DQoJCQkJfQ0KCQkJfQkJCQ0KDQoJCQkvKiBJcyB0aGlzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIGZyYW1lPyAgSWYgbm90IHdoeT8gKi8NCgkJCXVsRU9GID0geFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfRU9GOw0KCQl9DQoNCgkJLyogTWFyayB0aGUgYnVmZmVyIGFzIGZyZWUgYWdhaW4uICovDQoJCXhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJj0gfiggQVQ5MUNfT1dORVJTSElQX0JJVCApOw0KDQoJCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBidWZmZXIsIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeS4gKi8NCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJZiB3ZSBvYnRhaW5lZCBkYXRhIGJ1dCBmb3Igc29tZSByZWFzb24gZGlkIG5vdCBmaW5kIHRoZSBlbmQgb2YgdGhlDQoJZnJhbWUgdGhlbiBkaXNjYXJkIHRoZSBkYXRhIGFzIGl0IG11c3QgY29udGFpbiBhbiBlcnJvci4gKi8NCglpZiggIXVsRU9GICkNCgl7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IDA7DQoJfQ0KDQoJcmV0dXJuIHVsU2VjdGlvbkxlbmd0aDsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cERlc2NyaXB0b3JzKHZvaWQpDQp7DQp1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHhJbmRleDsNCnVuc2lnbmVkIGxvbmcgdWxBZGRyZXNzOw0KDQoJLyogSW5pdGlhbGlzZSB4UnhEZXNjcmlwdG9ycyBkZXNjcmlwdG9yLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfUlhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgbG9uZyApKCBwY1J4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfUlhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHBsYWNlDQoJCXRoZSBkYXRhIGF0IHRoaXMgYWRkcmVzcyB3aGVuIHRoaXMgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAgTWFzayBvZmYNCgkJdGhlIGJvdHRvbSBiaXRzIG9mIHRoZSBhZGRyZXNzIGFzIHRoZXNlIGhhdmUgc3BlY2lhbCBtZWFuaW5nLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJfQkNCg0KCS8qIFRoZSBsYXN0IGJ1ZmZlciBoYXMgdGhlIHdyYXAgYml0IHNldCBzbyB0aGUgRU1BQyBrbm93cyB0byB3cmFwIGJhY2sNCgl0byB0aGUgZmlyc3QgYnVmZmVyLiAqLw0KCXhSeERlc2NyaXB0b3JzWyBOQl9SWF9CVUZGRVJTIC0gMSBdLmFkZHIgfD0gZW1hY1JYX1dSQVBfQklUOw0KDQoJLyogSW5pdGlhbGlzZSB4VHhEZXNjcmlwdG9ycy4gKi8NCglmb3IoIHhJbmRleCA9IDA7IHhJbmRleCA8IE5CX1RYX0JVRkZFUlM7ICsreEluZGV4ICkNCgl7DQoJCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbnRoIGJ1ZmZlciB3aXRoaW4gdGhlIGFycmF5LiAqLw0KCQl1bEFkZHJlc3MgPSAoIHVuc2lnbmVkIGxvbmcgKSggcGNUeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1RYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCByZWFkDQoJCWRhdGEgZnJvbSBoZXJlIHdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gKi8NCgkJeFR4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfT0s7DQoJfQkNCg0KCS8qIFRoZSBsYXN0IGJ1ZmZlciBoYXMgdGhlIHdyYXAgYml0IHNldCBzbyB0aGUgRU1BQyBrbm93cyB0byB3cmFwIGJhY2sNCgl0byB0aGUgZmlyc3QgYnVmZmVyLiAqLw0KCXhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIC0gMSBdLlVfU3RhdHVzLnN0YXR1cyA9IEFUOTFDX1RSQU5TTUlUX1dSQVAgfCBBVDkxQ19UUkFOU01JVF9PSzsNCg0KCS8qIFRlbGwgdGhlIEVNQUMgd2hlcmUgdG8gZmluZCB0aGUgZGVzY3JpcHRvcnMuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JCUVAgPSAoIHVuc2lnbmVkIGxvbmcgKSB4UnhEZXNjcmlwdG9yczsNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVEJRUCA9ICggdW5zaWduZWQgbG9uZyApIHhUeERlc2NyaXB0b3JzOw0KCQ0KCS8qIENsZWFyIGFsbCB0aGUgYml0cyBpbiB0aGUgcmVjZWl2ZSBzdGF0dXMgcmVnaXN0ZXIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JTUiA9ICggQVQ5MUNfRU1BQ19PVlIgfCBBVDkxQ19FTUFDX1JFQyB8IEFUOTFDX0VNQUNfQk5BICk7DQoNCgkvKiBFbmFibGUgdGhlIGNvcHkgb2YgZGF0YSBpbnRvIHRoZSBidWZmZXJzLCBpZ25vcmUgYnJvYWRjYXN0cywNCglhbmQgZG9uJ3QgY29weSBGQ1MuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggQVQ5MUNfRU1BQ19DQUYgfCBBVDkxQ19FTUFDX05CQyB8IEFUOTFDX0VNQUNfRFJGQ1MpOw0KDQoJLyogRW5hYmxlIFJ4IGFuZCBUeCwgcGx1cyB0aGUgc3RhdHMgcmVnaXN0ZXIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSAoIEFUOTFDX0VNQUNfVEUgfCBBVDkxQ19FTUFDX1JFIHwgQVQ5MUNfRU1BQ19XRVNUQVQgKTsNCn0JDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICkNCnsNCgkvKiBNdXN0IGJlIHdyaXR0ZW4gU0ExTCB0aGVuIFNBMUguICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1NBMUwgPQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAzIF0gPDwgMjQgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAyIF0gPDwgMTYgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAxIF0gPDwgOCAgKSB8DQoJCQkJCQkJCQljTUFDQWRkcmVzc1sgMCBdOw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1NBMUggPQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyA1IF0gPDwgOCApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyA0IF07DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCB2b2lkICkNCnsNCgkvKiBDcmVhdGUgdGhlIHNlbWFwaG9yZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEVNQUMgdGFzay4gKi8NCgl2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCB4U2VtYXBob3JlICk7DQoJaWYoIHhTZW1hcGhvcmUgKQ0KCXsNCgkJLyogV2Ugc3RhcnQgYnkgJ3Rha2luZycgdGhlIHNlbWFwaG9yZSBzbyB0aGUgSVNSIGNhbiAnZ2l2ZScgaXQgd2hlbiB0aGUNCgkJZmlyc3QgaW50ZXJydXB0IG9jY3Vycy4gKi8NCgkJeFNlbWFwaG9yZVRha2UoIHhTZW1hcGhvcmUsIGVtYWNOT19ERUxBWSApOw0KCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsNCgkJew0KCQkJLyogV2Ugd2FudCB0byBpbnRlcnJ1cHQgb24gUnggZXZlbnRzLiAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX0lFUiA9IEFUOTFDX0VNQUNfUkNPTVA7DQoNCgkJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyBpbiB0aGUgQUlDLiAqLw0KCQkJQVQ5MUZfQUlDX0NvbmZpZ3VyZUl0KCBBVDkxQ19JRF9FTUFDLCBlbWFjSU5URVJSVVBUX0xFVkVMLCBBVDkxQ19BSUNfU1JDVFlQRV9JTlRfSElHSF9MRVZFTCwgKCB2b2lkICgqKSggdm9pZCApICkgdkVNQUNJU1JfV3JhcHBlciApOw0KCQkJQVQ5MUNfQkFTRV9BSUMtPkFJQ19JRUNSID0gMHgxIDw8IEFUOTFDX0lEX0VNQUM7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KDQoNCg0KLyoNCiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgdGFrZW4gZnJvbSB0aGUgQXRtZWwNCiAqIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKQ0Kew0KdW5zaWduZWQgbG9uZyB1bFBIWUlkMSwgdWxQSFlJZDIsIHVsU3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4UmV0dXJuID0gcGRQQVNTOw0KCQ0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBFbmFibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOw0KDQoJLyogUmVhZCB0aGUgUEhZIElELiAqLw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDEsICZ1bFBIWUlkMSApOw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDIsICZ1bFBIWUlkMiApOw0KDQoJLyogQU1EIEFNNzlDODc1Og0KCQkJUEhZX0lEMSA9IDB4MDAyMg0KCQkJUEhZX0lEMiA9IDB4NTU0MQ0KCQkJQml0cyAzOjAgUmV2aXNpb24gTnVtYmVyIEZvdXIgYml0IG1hbnVmYWN0dXJlcpJzIHJldmlzaW9uIG51bWJlci4NCgkJCQkwMDAxIHN0YW5kcyBmb3IgUmV2LiBBLCBldGMuDQoJKi8NCglpZiggKCAoIHVsUEhZSWQxIDw8IDE2ICkgfCAoIHVsUEhZSWQyICYgMHhmZmYwICkgKSAhPSBNSUlfRE05MTYxX0lEICkNCgl7DQoJCS8qIERpZCBub3QgZXhwZWN0IHRoaXMgSUQuICovDQoJCXhSZXR1cm4gPSBwZEZBSUw7DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3RhdHVzID0geEdldExpbmtTcGVlZCgpOw0KDQoJCWlmKCB1bFN0YXR1cyAhPSBwZFBBU1MgKQ0KCQl7DQoJCQl4UmV0dXJuID0gcGRGQUlMOw0KCQl9DQoJfQ0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHhSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyAqcHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAJKEFUOTFDX0VNQUNfU09GICYgKDB4MDE8PDMwKSkNCgkJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDIgPDwgMjgpDQoJCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCQl8ICh1Y0FkZHJlc3MgPDwgMTgpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTlNSICYgQVQ5MUNfRU1BQ19JRExFICkgKQ0KCXsNCgkJX19hc20oICJOT1AiICk7DQoJfQ0KDQoJKnB1bFZhbHVlID0gKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOICYgMHgwMDAwZmZmZiApOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQpzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOID0gKCggQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQl8ICgyIDw8IDE2KSB8ICgxIDw8IDI4KQ0KCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCkpDQoJCQkJCQkJCXwgKHVsVmFsdWUgJiAweGZmZmYpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9Ow0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCiNlbmRpZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHhHZXRMaW5rU3BlZWQoIHZvaWQgKQ0Kew0KCXVuc2lnbmVkIGxvbmcgdWxCTVNSLCB1bEJNQ1IsIHVsTFBBLCB1bE1BQ0NmZywgdWxTcGVlZCwgdWxEdXBsZXg7DQoNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogTGluayBzdGF0dXMgaXMgbGF0Y2hlZCwgc28gcmVhZCB0d2ljZSB0byBnZXQgY3VycmVudCB2YWx1ZSAqLw0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1TUiwgJnVsQk1TUik7DQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCg0KCWlmKCAhKCB1bEJNU1IgJiBCTVNSX0xTVEFUVVMgKSApDQoJewkNCgkJLyogTm8gTGluay4gKi8NCgkJcmV0dXJuIHBkRkFJTDsNCgl9DQoNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bEJNQ1IpOw0KCWlmICh1bEJNQ1IgJiBCTUNSX0FORU5BQkxFKQ0KCXsJCQkJDQoJCS8qIEF1dG9OZWdvdGlhdGlvbiBpcyBlbmFibGVkLiAqLw0KCQlpZiAoISh1bEJNU1IgJiBCTVNSX0FORUdDT01QTEVURSkpDQoJCXsNCgkJCS8qIEF1dG8tbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MuICovDQoJCQlyZXR1cm4gcGRGQUlMOwkJCQkNCgkJfQkJDQoNCgkJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9MUEEsICZ1bExQQSk7DQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwMEhBTEYgKSApDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDA7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl1bFNwZWVkID0gU1BFRURfMTA7DQoJCX0NCg0KCQlpZiggKCB1bExQQSAmIExQQV8xMDBGVUxMICkgfHwgKCB1bExQQSAmIExQQV8xMEZVTEwgKSApDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0ZVTEw7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl1bER1cGxleCA9IERVUExFWF9IQUxGOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3BlZWQgPSAoIHVsQk1DUiAmIEJNQ1JfU1BFRUQxMDAgKSA/IFNQRUVEXzEwMCA6IFNQRUVEXzEwOw0KCQl1bER1cGxleCA9ICggdWxCTUNSICYgQk1DUl9GVUxMRFBMWCApID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsNCgl9DQoNCgkvKiBVcGRhdGUgdGhlIE1BQyAqLw0KCXVsTUFDQ2ZnID0gQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSICYgfiggQVQ5MUNfRU1BQ19TUEQgfCBBVDkxQ19FTUFDX0ZEICk7DQoJaWYoIHVsU3BlZWQgPT0gU1BFRURfMTAwICkNCgl7DQoJCWlmKCB1bER1cGxleCA9PSBEVVBMRVhfRlVMTCApDQoJCXsNCgkJCS8qIDEwMCBGdWxsIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQ7DQoJCX0NCgkJZWxzZQ0KCQl7CQkJCQkNCgkJCS8qIDEwMCBIYWxmIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX1NQRDsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlpZiAodWxEdXBsZXggPT0gRFVQTEVYX0ZVTEwpDQoJCXsNCgkJCS8qIDEwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfRkQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkvKiAxMCBIYWxmIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmc7DQoJCX0NCgl9DQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHBkUEFTUzsNCn0NCg==