LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydA0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogQ29weXJpZ2h0IChjKSAyMDA4LCBBdG1lbCBDb3Jwb3JhdGlvbg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAqDQogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZGlzY2xhaW1lciBiZWxvdy4NCiAqDQogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20NCiAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogKg0KICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUg0KICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVCBBUkUNCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsDQogKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwNCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQogKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsDQogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQoNCi8qKiBcZmlsZQ0KICogXGFkZHRvZ3JvdXAgdXNiZF9pbnRlcmZhY2UNCiAqQHsNCiAqLw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICBIZWFkZXJzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCiNpbmNsdWRlIDxVU0JMaWJfVHJhY2UuaD4NCg0KI2luY2x1ZGUgIlVTQkREcml2ZXIuaCINCiNpbmNsdWRlICJVU0JELmgiDQojaW5jbHVkZSAiVVNCRF9IQUwuaCINCg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICBMb2NhbCB2YXJpYWJsZXMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIERlZmF1bHQgZGV2aWNlIGRyaXZlciBpbnN0YW5jZSwgZm9yIGFsbCBjbGFzcyBkcml2ZXJzIGluIFVTQiBMaWIuICovDQpzdGF0aWMgVVNCRERyaXZlciB1c2JkRHJpdmVyOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICBMb2NhbCBmdW5jdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogKiBTZW5kIGEgTlVMTCBwYWNrZXQNCiAqLw0Kc3RhdGljIHZvaWQgVGVybWluYXRlQ3RybEluV2l0aE51bGwodm9pZCAqcEFyZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdHVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNmZXJyZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZW1haW5pbmcpDQp7DQogICAgcEFyZyA9IHBBcmc7IHN0YXR1cyA9IHN0YXR1czsNCiAgICB0cmFuc2ZlcnJlZCA9IHRyYW5zZmVycmVkOyByZW1haW5pbmcgPSByZW1haW5pbmc7DQogICAgVVNCRF9Xcml0ZSgwLCAvKiBFbmRwb2ludCAjMCAqLw0KICAgICAgICAgICAgICAgMCwgLyogTm8gZGF0YSBidWZmZXIgKi8NCiAgICAgICAgICAgICAgIDAsIC8qIE5vIGRhdGEgYnVmZmVyICovDQogICAgICAgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykgMCwNCiAgICAgICAgICAgICAgICh2b2lkICopICAwKTsNCn0NCg0KLyoqDQogKiBDb25maWd1cmVzIHRoZSBkZXZpY2UgYnkgc2V0dGluZyBpdCBpbnRvIHRoZSBDb25maWd1cmVkIHN0YXRlIGFuZA0KICogaW5pdGlhbGl6aW5nIGFsbCBlbmRwb2ludHMuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccGFyYW0gY2ZnbnVtICBDb25maWd1cmF0aW9uIG51bWJlciB0byBzZXQuDQogKi8NCnN0YXRpYyB2b2lkIFNldENvbmZpZ3VyYXRpb24oVVNCRERyaXZlciAqcERyaXZlciwgdWludDhfdCBjZmdudW0pDQp7DQogICAgVVNCRW5kcG9pbnREZXNjcmlwdG9yICpwRW5kcG9pbnRzWzE3XTsNCiAgICBjb25zdCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqcENvbmZpZ3VyYXRpb247DQoNCiAgICAvKiBVc2UgZGlmZmVyZW50IGRlc2NyaXB0b3IgZGVwZW5kaW5nIG9uIGRldmljZSBzcGVlZCAqLw0KICAgIGlmICggICBVU0JEX0hBTF9Jc0hpZ2hTcGVlZCgpDQogICAgICAgICYmIHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEhzQ29uZmlndXJhdGlvbikgew0KDQogICAgICAgIHBDb25maWd1cmF0aW9uID0gcERyaXZlci0+cERlc2NyaXB0b3JzLT5wSHNDb25maWd1cmF0aW9uOw0KICAgIH0NCiAgICBlbHNlIHsNCg0KICAgICAgICBwQ29uZmlndXJhdGlvbiA9IHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEZzQ29uZmlndXJhdGlvbjsNCiAgICB9DQoNCiAgICAvKiBTZXQgJiBzYXZlIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBVU0JEX1NldENvbmZpZ3VyYXRpb24oY2ZnbnVtKTsNCg0KICAgIHBEcml2ZXItPmNmZ251bSA9IGNmZ251bTsNCiAgICBwRHJpdmVyLT5pc1JlbW90ZVdha2VVcEVuYWJsZWQgPQ0KICAgICAgICAoKHBDb25maWd1cmF0aW9uLT5ibUF0dHJpYnV0ZXMgJiAweDIwKSA+IDApOw0KDQogICAgLyogSWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IDAsIGNvbmZpZ3VyZSBlbmRwb2ludHMgKi8NCiAgICBpZiAoY2ZnbnVtICE9IDApIHsNCg0KICAgICAgICAvKiBQYXJzZSBjb25maWd1cmF0aW9uIHRvIGdldCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLw0KICAgICAgICBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvcl9QYXJzZShwQ29uZmlndXJhdGlvbiwgMCwgcEVuZHBvaW50cywgMCk7DQoNCiAgICAgICAgLyogQ29uZmlndXJlIGVuZHBvaW50cyAqLw0KICAgICAgICBpbnQgaSA9IDA7DQogICAgICAgIHdoaWxlIChwRW5kcG9pbnRzW2ldICE9IDApIHsNCg0KICAgICAgICAgICAgVVNCRF9Db25maWd1cmVFbmRwb2ludChwRW5kcG9pbnRzW2ldKTsNCiAgICAgICAgICAgIGkrKzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICAvKiBTaG91bGQgYmUgZG9uZSBiZWZvcmUgc2VuZCB0aGUgWkxQICovDQogICAgaWYgKE5VTEwgIT0gVVNCRERyaXZlckNhbGxiYWNrc19Db25maWd1cmF0aW9uQ2hhbmdlZCkNCiAgICAgICAgVVNCRERyaXZlckNhbGxiYWNrc19Db25maWd1cmF0aW9uQ2hhbmdlZChjZmdudW0pOw0KDQogICAgLyogQWNrbm93bGVkZ2UgdGhlIHJlcXVlc3QgKi8NCiAgICBVU0JEX1dyaXRlKDAsIC8qIEVuZHBvaW50ICMwICovDQogICAgICAgICAgICAgICAwLCAvKiBObyBkYXRhIGJ1ZmZlciAqLw0KICAgICAgICAgICAgICAgMCwgLyogTm8gZGF0YSBidWZmZXIgKi8NCiAgICAgICAgICAgICAgIChUcmFuc2ZlckNhbGxiYWNrKSAwLA0KICAgICAgICAgICAgICAgKHZvaWQgKikgIDApOw0KfQ0KDQovKioNCiAqIFNlbmRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gbnVtYmVyIHRvIHRoZSBob3N0Lg0KICogXHBhcmFtIHBEcml2ZXIgIFBvaW50ZXIgdG8gYSBVU0JERHJpdmVyIGluc3RhbmNlLg0KICovDQpzdGF0aWMgdm9pZCBHZXRDb25maWd1cmF0aW9uKGNvbnN0IFVTQkREcml2ZXIgKnBEcml2ZXIpDQp7DQogICAgdW5zaWduZWQgbG9uZyB0bXA7ICAgLy8gQ291ZCBiZSB1bnNpZ25lZCBjaGFyIDogdW5zaWduZWQgbG9uZyBoYXMgYmVlbiBjaG9zZSB0byBhdm9pZCBhbnkgcG90ZW50aWFsIGFsaWdubWVudCBpc3N1ZSB3aXRoIERNQSANCiAgDQogICAgaWYoIFVTQkRfR2V0U3RhdGUoKSA8ICBVU0JEX1NUQVRFX0NPTkZJR1VSRUQpIA0KICAgICAgICB0bXAgPSAwOyAgICAvLyBJZiBkZXZpY2UgaXMgdW5jb25maWd1cmVkLCByZXR1cm5lZCBjb25maWd1cmF0aW9uIG11c3QgYmUgMCANCiAgICBlbHNlIA0KICAgICAgICB0bXAgPSBwRHJpdmVyLT5jZmdudW07IA0KDQogICAgVVNCRF9Xcml0ZSgwLCAmdG1wLCAxLCAwLCAwKTsgDQp9DQoNCi8qKg0KICogU2VuZHMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBkZXZpY2UgdG8gdGhlIGhvc3QuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKi8NCnN0YXRpYyB2b2lkIEdldERldmljZVN0YXR1cyhjb25zdCBVU0JERHJpdmVyICpwRHJpdmVyKQ0Kew0KICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkYXRhOw0KICAgIGNvbnN0IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yICpwQ29uZmlndXJhdGlvbjsNCg0KICAgIGRhdGEgPSAwOw0KICAgIC8qIFVzZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBkZXBlbmRpbmcgb24gZGV2aWNlIHNwZWVkICovDQoNCiAgICBpZiAoVVNCRF9Jc0hpZ2hTcGVlZCgpKSB7DQoNCiAgICAgICAgcENvbmZpZ3VyYXRpb24gPSBwRHJpdmVyLT5wRGVzY3JpcHRvcnMtPnBIc0NvbmZpZ3VyYXRpb247DQogICAgfQ0KICAgIGVsc2Ugew0KDQogICAgICAgIHBDb25maWd1cmF0aW9uID0gcERyaXZlci0+cERlc2NyaXB0b3JzLT5wRnNDb25maWd1cmF0aW9uOw0KICAgIH0NCg0KICAgIC8qIENoZWNrIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgcG93ZXIgbW9kZSAoaWYgZGV2aWNlIGlzIGNvbmZpZ3VyZWQpICovDQoNCiAgICBpZiAocERyaXZlci0+Y2ZnbnVtICE9IDApIHsNCg0KICAgICAgICBpZiAoVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfSXNTZWxmUG93ZXJlZChwQ29uZmlndXJhdGlvbikpIHsNCg0KICAgICAgICAgICAgZGF0YSB8PSAxOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyogQ2hlY2sgaWYgcmVtb3RlIHdha2UtdXAgaXMgZW5hYmxlZCAqLw0KDQogICAgaWYgKHBEcml2ZXItPmlzUmVtb3RlV2FrZVVwRW5hYmxlZCkgew0KDQogICAgICAgIGRhdGEgfD0gMjsNCiAgICB9DQoNCiAgICAvKiBTZW5kIHRoZSBkZXZpY2Ugc3RhdHVzICovDQoNCiAgICBVU0JEX1dyaXRlKDAsICZkYXRhLCAyLCAwLCAwKTsNCn0NCg0KLyoqDQogKiBTZW5kcyB0aGUgY3VycmVudCBzdGF0dXMgb2YgYW4gZW5kcG9pbnRzIHRvIHRoZSBVU0IgaG9zdC4NCiAqIFxwYXJhbSBiRW5kcG9pbnQgIEVuZHBvaW50IG51bWJlci4NCiAqLw0Kc3RhdGljIHZvaWQgR2V0RW5kcG9pbnRTdGF0dXModWludDhfdCBiRW5kcG9pbnQpDQp7DQogICAgc3RhdGljIHVuc2lnbmVkIHNob3J0IGRhdGE7DQoNCiAgICBkYXRhID0gMDsNCg0KICAgIHN3aXRjaCAoVVNCRF9IQUxfSGFsdChiRW5kcG9pbnQsIDB4RkYpKSB7DQoNCiAgICAgICAgY2FzZSBVU0JEX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUjogLyogdGhlIGVuZHBvaW50IG5vdCBleGlzdHMgKi8NCiAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICBkYXRhID0gMTsNCiAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgLyogU2VuZCB0aGUgZW5kcG9pbnQgc3RhdHVzICovDQogICAgICAgICAgICBVU0JEX1dyaXRlKDAsICZkYXRhLCAyLCAwLCAwKTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCn0NCg0KLyoqDQogKiBTZW5kcyB0aGUgcmVxdWVzdGVkIFVTQiBkZXNjcmlwdG9yIHRvIHRoZSBob3N0IGlmIGF2YWlsYWJsZSwgb3IgU1RBTExzICB0aGUNCiAqIHJlcXVlc3QuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccGFyYW0gdHlwZSAgVHlwZSBvZiB0aGUgcmVxdWVzdGVkIGRlc2NyaXB0b3INCiAqIFxwYXJhbSBpbmRleCAgSW5kZXggb2YgdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yLg0KICogXHBhcmFtIGxlbmd0aCAgTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0dXJuLg0KICovDQpzdGF0aWMgdm9pZCBHZXREZXNjcmlwdG9yKA0KICAgIGNvbnN0IFVTQkREcml2ZXIgKnBEcml2ZXIsDQogICAgdWludDhfdCB0eXBlLA0KICAgIHVpbnQ4X3QgaW5kZXhSRGVzYywNCiAgICB1aW50MzJfdCBsZW5ndGgpDQp7DQogICAgY29uc3QgVVNCRGV2aWNlRGVzY3JpcHRvciAqcERldmljZTsNCiAgICBjb25zdCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqcENvbmZpZ3VyYXRpb247DQogICAgY29uc3QgVVNCRGV2aWNlUXVhbGlmaWVyRGVzY3JpcHRvciAqcFF1YWxpZmllcjsNCiAgICBjb25zdCBVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqcE90aGVyU3BlZWQ7DQogICAgY29uc3QgVVNCR2VuZXJpY0Rlc2NyaXB0b3IgKipwU3RyaW5ncyA9DQogICAgICAgIChjb25zdCBVU0JHZW5lcmljRGVzY3JpcHRvciAqKikgcERyaXZlci0+cERlc2NyaXB0b3JzLT5wU3RyaW5nczsNCiAgICBjb25zdCBVU0JHZW5lcmljRGVzY3JpcHRvciAqcFN0cmluZzsNCiAgICB1aW50OF90IG51bVN0cmluZ3MgPSBwRHJpdmVyLT5wRGVzY3JpcHRvcnMtPm51bVN0cmluZ3M7DQogICAgdWludDhfdCB0ZXJtaW5hdGVXaXRoTnVsbCA9IDA7DQoNCiAgICAvKiBVc2UgZGlmZmVyZW50IHNldCBvZiBkZXNjcmlwdG9ycyBkZXBlbmRpbmcgb24gZGV2aWNlIHNwZWVkICovDQoNCiAgICAvKiBCeSBkZWZhdWx0LCB3ZSB1c2VzIGZ1bGwgc3BlZWQgdmFsdWVzICovDQogICAgcERldmljZSA9IHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEZzRGV2aWNlOw0KICAgIHBDb25maWd1cmF0aW9uID0gcERyaXZlci0+cERlc2NyaXB0b3JzLT5wRnNDb25maWd1cmF0aW9uOw0KDQogICAgLyogSFMsIHdlIHRyeSBIUyB2YWx1ZXMgKi8NCiAgICBpZiAoVVNCRF9IQUxfSXNIaWdoU3BlZWQoKSkgew0KDQogICAgICAgIFRSQUNFX0RFQlVHX1dQKCJIUyAiKTsNCiAgICAgICAgaWYgKHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEhzRGV2aWNlKQ0KICAgICAgICAgICAgcERldmljZSA9IHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEhzRGV2aWNlOw0KICAgICAgICBpZiAocERyaXZlci0+cERlc2NyaXB0b3JzLT5wSHNDb25maWd1cmF0aW9uKQ0KICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24gPSBwRHJpdmVyLT5wRGVzY3JpcHRvcnMtPnBIc0NvbmZpZ3VyYXRpb247DQogICAgICAgIHBRdWFsaWZpZXIgPSBwRHJpdmVyLT5wRGVzY3JpcHRvcnMtPnBIc1F1YWxpZmllcjsNCiAgICAgICAgcE90aGVyU3BlZWQgPSBwRHJpdmVyLT5wRGVzY3JpcHRvcnMtPnBIc090aGVyU3BlZWQ7DQogICAgfQ0KICAgIGVsc2Ugew0KDQogICAgICAgIFRSQUNFX0RFQlVHX1dQKCJGUyAiKTsNCiAgICAgICAgcFF1YWxpZmllciA9IHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEZzUXVhbGlmaWVyOw0KICAgICAgICBwT3RoZXJTcGVlZCA9IHBEcml2ZXItPnBEZXNjcmlwdG9ycy0+cEZzT3RoZXJTcGVlZDsNCiAgICB9DQoNCiAgICAvKiBDaGVjayB0aGUgZGVzY3JpcHRvciB0eXBlICovDQoNCiAgICBzd2l0Y2ggKHR5cGUpIHsNCg0KICAgICAgICBjYXNlIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0RFVklDRToNCiAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIkRldiAiKTsNCg0KICAgICAgICAgICAgLyogQWRqdXN0IGxlbmd0aCBhbmQgc2VuZCBkZXNjcmlwdG9yICovDQoNCiAgICAgICAgICAgIGlmIChsZW5ndGggPiBVU0JHZW5lcmljRGVzY3JpcHRvcl9HZXRMZW5ndGgoKFVTQkdlbmVyaWNEZXNjcmlwdG9yICopIHBEZXZpY2UpKSB7DQoNCiAgICAgICAgICAgICAgICBsZW5ndGggPSBVU0JHZW5lcmljRGVzY3JpcHRvcl9HZXRMZW5ndGgoKFVTQkdlbmVyaWNEZXNjcmlwdG9yICopIHBEZXZpY2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLCBwRGV2aWNlLCBsZW5ndGgsIDAsIDApOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9DT05GSUdVUkFUSU9OOg0KICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgiQ2ZnICIpOw0KDQogICAgICAgICAgICAvKiBBZGp1c3QgbGVuZ3RoIGFuZCBzZW5kIGRlc2NyaXB0b3IgKi8NCg0KICAgICAgICAgICAgaWYgKGxlbmd0aCA+IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yX0dldFRvdGFsTGVuZ3RoKHBDb25maWd1cmF0aW9uKSkgew0KDQogICAgICAgICAgICAgICAgbGVuZ3RoID0gVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfR2V0VG90YWxMZW5ndGgocENvbmZpZ3VyYXRpb24pOw0KICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVdpdGhOdWxsID0gKChsZW5ndGggJSBwRGV2aWNlLT5iTWF4UGFja2V0U2l6ZTApID09IDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLA0KICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXaXRoTnVsbCA/IFRlcm1pbmF0ZUN0cmxJbldpdGhOdWxsIDogMCwNCiAgICAgICAgICAgICAgICAgICAgICAgMCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFVTQkdlbmVyaWNEZXNjcmlwdG9yX0RFVklDRVFVQUxJRklFUjoNCiAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIlF1YSAiKTsNCg0KICAgICAgICAgICAgLyogQ2hlY2sgaWYgZGVzY3JpcHRvciBleGlzdHMgKi8NCg0KICAgICAgICAgICAgaWYgKCFwUXVhbGlmaWVyKSB7DQoNCiAgICAgICAgICAgICAgICBVU0JEX1N0YWxsKDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQoNCiAgICAgICAgICAgICAgICAvKiBBZGp1c3QgbGVuZ3RoIGFuZCBzZW5kIGRlc2NyaXB0b3IgKi8NCg0KICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiBVU0JHZW5lcmljRGVzY3JpcHRvcl9HZXRMZW5ndGgoKFVTQkdlbmVyaWNEZXNjcmlwdG9yICopIHBRdWFsaWZpZXIpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0TGVuZ3RoKChVU0JHZW5lcmljRGVzY3JpcHRvciAqKSBwUXVhbGlmaWVyKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLCBwUXVhbGlmaWVyLCBsZW5ndGgsIDAsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9PVEhFUlNQRUVEQ09ORklHVVJBVElPTjoNCiAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIk9TQyAiKTsNCg0KICAgICAgICAgICAgLyogQ2hlY2sgaWYgZGVzY3JpcHRvciBleGlzdHMgKi8NCg0KICAgICAgICAgICAgaWYgKCFwT3RoZXJTcGVlZCkgew0KDQogICAgICAgICAgICAgICAgVVNCRF9TdGFsbCgwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KDQogICAgICAgICAgICAgICAgLyogQWRqdXN0IGxlbmd0aCBhbmQgc2VuZCBkZXNjcmlwdG9yICovDQoNCiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfR2V0VG90YWxMZW5ndGgocE90aGVyU3BlZWQpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JfR2V0VG90YWxMZW5ndGgocE90aGVyU3BlZWQpOw0KICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXaXRoTnVsbCA9ICgobGVuZ3RoICUgcERldmljZS0+Yk1heFBhY2tldFNpemUwKSA9PSAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcE90aGVyU3BlZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXaXRoTnVsbCA/IFRlcm1pbmF0ZUN0cmxJbldpdGhOdWxsIDogMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljRGVzY3JpcHRvcl9TVFJJTkc6DQogICAgICAgICAgICBUUkFDRV9JTkZPX1dQKCJTdHIlZCAiLCBpbmRleFJEZXNjKTsNCg0KICAgICAgICAgICAgLyogQ2hlY2sgaWYgZGVzY3JpcHRvciBleGlzdHMgKi8NCg0KICAgICAgICAgICAgaWYgKGluZGV4UkRlc2MgPj0gbnVtU3RyaW5ncykgew0KDQogICAgICAgICAgICAgICAgVVNCRF9TdGFsbCgwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KDQogICAgICAgICAgICAgICAgcFN0cmluZyA9IHBTdHJpbmdzW2luZGV4UkRlc2NdOw0KDQogICAgICAgICAgICAgICAgLyogQWRqdXN0IGxlbmd0aCBhbmQgc2VuZCBkZXNjcmlwdG9yICovDQoNCiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0TGVuZ3RoKHBTdHJpbmcpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gVVNCR2VuZXJpY0Rlc2NyaXB0b3JfR2V0TGVuZ3RoKHBTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXaXRoTnVsbCA9ICgobGVuZ3RoICUgcERldmljZS0+Yk1heFBhY2tldFNpemUwKSA9PSAwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmluZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZVdpdGhOdWxsID8gVGVybWluYXRlQ3RybEluV2l0aE51bGwgOiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgVFJBQ0VfV0FSTklORygNCiAgICAgICAgICAgICAgICAgICAgICAiVVNCRERyaXZlcl9HZXREZXNjcmlwdG9yOiBVbmtub3duIGRlc2NyaXB0b3IgdHlwZSAoJWQpXG5cciIsDQogICAgICAgICAgICAgICAgICAgICAgdHlwZSk7DQogICAgICAgICAgICBVU0JEX1N0YWxsKDApOw0KICAgIH0NCn0NCg0KLyoqDQogKiBTZXRzIHRoZSBhY3RpdmUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlIGlmIHRoZSBjb25maWd1cmF0aW9uIHN1cHBvcnRzDQogKiBpdDsgb3RoZXJ3aXNlLCB0aGUgY29udHJvbCBwaXBlIGlzIFNUQUxMZWQuIElmIHRoZSBzZXR0aW5nIG9mIGFuIGludGVyZmFjZQ0KICogY2hhbmdlcy4NCiAqIFxwYXJtYSBwRHJpdmVyICBQb2ludGVyIHRvIGEgVVNCRERyaXZlciBpbnN0YW5jZS4NCiAqIFxwYXJtYSBpbmZudW0gIEludGVyZmFjZSBudW1iZXIuDQogKiBccGFybWEgc2V0dGluZyAgTmV3IGFjdGl2ZSBzZXR0aW5nIGZvciB0aGUgaW50ZXJmYWNlLg0KICovDQpzdGF0aWMgdm9pZCBTZXRJbnRlcmZhY2UoDQogICAgVVNCRERyaXZlciAqcERyaXZlciwNCiAgICB1aW50OF90IGluZm51bSwNCiAgICB1aW50OF90IHNldHRpbmcpDQp7DQogICAgLyogTWFrZSBzdXJlIGFsdGVybmF0ZSBzZXR0aW5ncyBhcmUgc3VwcG9ydGVkICovDQoNCiAgICBpZiAoIXBEcml2ZXItPnBJbnRlcmZhY2VzKSB7DQoNCiAgICAgICAgVVNCRF9TdGFsbCgwKTsNCiAgICB9DQogICAgZWxzZSB7DQoNCiAgICAgICAgLyogQ2hhbmdlIHRoZSBjdXJyZW50IHNldHRpbmcgb2YgdGhlIGludGVyZmFjZSBhbmQgdHJpZ2dlciB0aGUgY2FsbGJhY2sgKi8NCiAgICAgICAgLyogaWYgbmVjZXNzYXJ5ICovDQogICAgICAgIGlmIChwRHJpdmVyLT5wSW50ZXJmYWNlc1tpbmZudW1dICE9IHNldHRpbmcpIHsNCg0KICAgICAgICAgICAgcERyaXZlci0+cEludGVyZmFjZXNbaW5mbnVtXSA9IHNldHRpbmc7DQogICAgICAgICAgICBpZiAoTlVMTCAhPSBVU0JERHJpdmVyQ2FsbGJhY2tzX0ludGVyZmFjZVNldHRpbmdDaGFuZ2VkKQ0KICAgICAgICAgICAgICAgIFVTQkREcml2ZXJDYWxsYmFja3NfSW50ZXJmYWNlU2V0dGluZ0NoYW5nZWQoaW5mbnVtLCBzZXR0aW5nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIEFja25vd2xlZGdlIHRoZSByZXF1ZXN0ICovDQoNCiAgICAgICAgVVNCRF9Xcml0ZSgwLCAwLCAwLCAwLCAwKTsNCiAgICB9DQp9DQoNCi8qKg0KICogU2VuZHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gaW50ZXJmYWNlIHRvIHRoZSBVU0INCiAqIGhvc3QuIElmIGFsdGVybmF0ZSBzZXR0aW5ncyBhcmUgbm90IHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiBTVEFMTHMgdGhlDQogKiBjb250cm9sIHBpcGUuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccGFyYW0gaW5mbnVtICBJbnRlcmZhY2UgbnVtYmVyLg0KICovDQpzdGF0aWMgdm9pZCBHZXRJbnRlcmZhY2UoDQogICAgY29uc3QgVVNCRERyaXZlciAqcERyaXZlciwNCiAgICB1aW50OF90IGluZm51bSkNCnsNCiAgICAvKiBNYWtlIHN1cmUgYWx0ZXJuYXRlIHNldHRpbmdzIGFyZSBzdXBwb3J0ZWQsIG9yIFNUQUxMIHRoZSBjb250cm9sIHBpcGUgKi8NCg0KICAgIGlmICghcERyaXZlci0+cEludGVyZmFjZXMpIHsNCg0KICAgICAgICBVU0JEX1N0YWxsKDApOw0KICAgIH0NCiAgICBlbHNlIHsNCg0KICAgICAgICAvKiBTZW5kcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc2V0dGluZyB0byB0aGUgaG9zdCAqLw0KDQogICAgICAgIFVTQkRfV3JpdGUoMCwgJihwRHJpdmVyLT5wSW50ZXJmYWNlc1tpbmZudW1dKSwgMSwgMCwgMCk7DQogICAgfQ0KfQ0KDQovKioNCiAqIFBlcmZvcm1zIHRoZSBzZWxlY3RlZCB0ZXN0IG9uIHRoZSBVU0IgZGV2aWNlIChoaWdoLXNwZWVkIG9ubHkpLg0KICogXHBhcmFtIHRlc3QgIFRlc3Qgc2VsZWN0b3IgdmFsdWUuDQogKi8NCnN0YXRpYyB2b2lkIFVTQkREcml2ZXJfVGVzdChjb25zdCBVU0JERHJpdmVyICpwRHJpdmVyLCB1aW50OF90IHRlc3QpDQp7DQogICAgcERyaXZlciA9IHBEcml2ZXI7DQogICAgVFJBQ0VfREVCVUcoIlVEUEhTX1Rlc3RcblxyIik7DQoNCiAgICAvKiB0aGUgbG93ZXIgYnl0ZSBvZiB3SW5kZXggbXVzdCBiZSB6ZXJvDQogICAgICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiB3SW5kZXggaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBzcGVjaWZpYyB0ZXN0IG1vZGUgKi8NCg0KICAgIHN3aXRjaCAodGVzdCkgew0KICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X1RFU1RQQUNLRVQ6DQogICAgICAgICAgICAvKlRlc3QgbW9kZSBUZXN0X1BhY2tldDogKi8NCiAgICAgICAgICAgIC8qVXBvbiBjb21tYW5kLCBhIHBvcnQgbXVzdCByZXBldGl0aXZlbHkgdHJhbnNtaXQgdGhlIGZvbGxvd2luZyB0ZXN0IHBhY2tldCB1bnRpbCAqLw0KICAgICAgICAgICAgLyp0aGUgZXhpdCBhY3Rpb24gaXMgdGFrZW4uIFRoaXMgZW5hYmxlcyB0aGUgdGVzdGluZyBvZiByaXNlIGFuZCBmYWxsIHRpbWVzLCBleWUgKi8NCiAgICAgICAgICAgIC8qcGF0dGVybnMsIGppdHRlciwgYW5kIGFueSBvdGhlciBkeW5hbWljIHdhdmVmb3JtIHNwZWNpZmljYXRpb25zLiAqLw0KICAgICAgICAgICAgLypUaGUgdGVzdCBwYWNrZXQgaXMgbWFkZSB1cCBieSBjb25jYXRlbmF0aW5nIHRoZSBmb2xsb3dpbmcgc3RyaW5ncy4gKi8NCiAgICAgICAgICAgIC8qKE5vdGU6IEZvciBKL0sgTlJaSSBkYXRhLCBhbmQgZm9yIE5SWiBkYXRhLCB0aGUgYml0IG9uIHRoZSBsZWZ0IGlzIHRoZSBmaXJzdCBvbmUgKi8NCiAgICAgICAgICAgIC8qdHJhbnNtaXR0ZWQuIJNTP2luZGljYXRlcyB0aGF0IGEgYml0IHN0dWZmIG9jY3Vycywgd2hpY2ggaW5zZXJ0cyBhbiCTZXh0cmE/TlJaSSBkYXRhIGJpdC4gKi8NCiAgICAgICAgICAgIC8qPyBOP2lzIHVzZWQgdG8gaW5kaWNhdGUgTiBvY2N1cnJlbmNlcyBvZiBhIHN0cmluZyBvZiBiaXRzIG9yIHN5bWJvbHMuKSAqLw0KICAgICAgICAgICAgLypBIHBvcnQgaW4gVGVzdF9QYWNrZXQgbW9kZSBtdXN0IHNlbmQgdGhpcyBwYWNrZXQgcmVwZXRpdGl2ZWx5LiBUaGUgaW50ZXItcGFja2V0IHRpbWluZyAqLw0KICAgICAgICAgICAgLyptdXN0IGJlIG5vIGxlc3MgdGhhbiB0aGUgbWluaW11bSBhbGxvd2FibGUgaW50ZXItcGFja2V0IGdhcCBhcyBkZWZpbmVkIGluIFNlY3Rpb24gNy4xLjE4IGFuZCAqLw0KICAgICAgICAgICAgLypubyBncmVhdGVyIHRoYW4gMTI1IHVzLiAqLw0KDQogICAgICAgICAgICAvKiBTZW5kIFpMUCAqLw0KICAgICAgICAgICAgVVNCRF9UZXN0KFVTQkZlYXR1cmVSZXF1ZXN0X1RFU1RTRU5EWkxQKTsNCiAgICAgICAgICAgIC8qIFRzdCBQQUNLRVQgKi8NCiAgICAgICAgICAgIFVTQkRfVGVzdChVU0JGZWF0dXJlUmVxdWVzdF9URVNUUEFDS0VUKTsNCiAgICAgICAgICAgIHdoaWxlICgxKTsNCiAgICAgICAgICAgIC8qYnJlYWs7IG5vdCByZWFjaGVkICovDQoNCg0KICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X1RFU1RKOg0KICAgICAgICAgICAgLypUZXN0IG1vZGUgVGVzdF9KOiAqLw0KICAgICAgICAgICAgLypVcG9uIGNvbW1hbmQsIGEgcG9ydJJzIHRyYW5zY2VpdmVyIG11c3QgZW50ZXIgdGhlIGhpZ2gtc3BlZWQgSiBzdGF0ZSBhbmQgcmVtYWluIGluIHRoYXQgKi8NCiAgICAgICAgICAgIC8qc3RhdGUgdW50aWwgdGhlIGV4aXQgYWN0aW9uIGlzIHRha2VuLiBUaGlzIGVuYWJsZXMgdGhlIHRlc3Rpbmcgb2YgdGhlIGhpZ2ggb3V0cHV0IGRyaXZlICovDQogICAgICAgICAgICAvKmxldmVsIG9uIHRoZSBEKyBsaW5lLiAqLw0KDQogICAgICAgICAgICAvKiBTZW5kIFpMUCAqLw0KICAgICAgICAgICAgVVNCRF9UZXN0KFVTQkZlYXR1cmVSZXF1ZXN0X1RFU1RTRU5EWkxQKTsNCiAgICAgICAgICAgIC8qIFRzdCBKICovDQogICAgICAgICAgICBVU0JEX1Rlc3QoVVNCRmVhdHVyZVJlcXVlc3RfVEVTVEopOw0KICAgICAgICAgICAgd2hpbGUgKDEpOw0KICAgICAgICAgICAgLypicmVhazsgbm90IHJlYWNoZWQgKi8NCg0KDQogICAgICAgIGNhc2UgVVNCRmVhdHVyZVJlcXVlc3RfVEVTVEs6DQogICAgICAgICAgICAvKlRlc3QgbW9kZSBUZXN0X0s6ICovDQogICAgICAgICAgICAvKlVwb24gY29tbWFuZCwgYSBwb3J0knMgdHJhbnNjZWl2ZXIgbXVzdCBlbnRlciB0aGUgaGlnaC1zcGVlZCBLIHN0YXRlIGFuZCByZW1haW4gaW4gKi8NCiAgICAgICAgICAgIC8qdGhhdCBzdGF0ZSB1bnRpbCB0aGUgZXhpdCBhY3Rpb24gaXMgdGFrZW4uIFRoaXMgZW5hYmxlcyB0aGUgdGVzdGluZyBvZiB0aGUgaGlnaCBvdXRwdXQgZHJpdmUgKi8NCiAgICAgICAgICAgIC8qbGV2ZWwgb24gdGhlIEQtIGxpbmUuICovDQoNCiAgICAgICAgICAgIC8qIFNlbmQgYSBaTFAgKi8NCiAgICAgICAgICAgIFVTQkRfVGVzdChVU0JGZWF0dXJlUmVxdWVzdF9URVNUU0VORFpMUCk7DQogICAgICAgICAgICBVU0JEX1Rlc3QoVVNCRmVhdHVyZVJlcXVlc3RfVEVTVEspOw0KICAgICAgICAgICAgd2hpbGUgKDEpOw0KICAgICAgICAgICAgLypicmVhazsgbm90IHJlYWNoZWQgKi8NCg0KDQogICAgICAgIGNhc2UgVVNCRmVhdHVyZVJlcXVlc3RfVEVTVFNFME5BSzoNCiAgICAgICAgICAgIC8qVGVzdCBtb2RlIFRlc3RfU0UwX05BSzogKi8NCiAgICAgICAgICAgIC8qVXBvbiBjb21tYW5kLCBhIHBvcnSScyB0cmFuc2NlaXZlciBtdXN0IGVudGVyIHRoZSBoaWdoLXNwZWVkIHJlY2VpdmUgbW9kZSAqLw0KICAgICAgICAgICAgLyphbmQgcmVtYWluIGluIHRoYXQgbW9kZSB1bnRpbCB0aGUgZXhpdCBhY3Rpb24gaXMgdGFrZW4uIFRoaXMgZW5hYmxlcyB0aGUgdGVzdGluZyAqLw0KICAgICAgICAgICAgLypvZiBvdXRwdXQgaW1wZWRhbmNlLCBsb3cgbGV2ZWwgb3V0cHV0IHZvbHRhZ2UsIGFuZCBsb2FkaW5nIGNoYXJhY3RlcmlzdGljcy4gKi8NCiAgICAgICAgICAgIC8qSW4gYWRkaXRpb24sIHdoaWxlIGluIHRoaXMgbW9kZSwgdXBzdHJlYW0gZmFjaW5nIHBvcnRzIChhbmQgb25seSB1cHN0cmVhbSBmYWNpbmcgcG9ydHMpICovDQogICAgICAgICAgICAvKm11c3QgcmVzcG9uZCB0byBhbnkgSU4gdG9rZW4gcGFja2V0IHdpdGggYSBOQUsgaGFuZHNoYWtlIChvbmx5IGlmIHRoZSBwYWNrZXQgQ1JDIGlzICovDQogICAgICAgICAgICAvKmRldGVybWluZWQgdG8gYmUgY29ycmVjdCkgd2l0aGluIHRoZSBub3JtYWwgYWxsb3dlZCBkZXZpY2UgcmVzcG9uc2UgdGltZS4gVGhpcyBlbmFibGVzIHRlc3Rpbmcgb2YgKi8NCiAgICAgICAgICAgIC8qdGhlIGRldmljZSBzcXVlbGNoIGxldmVsIGNpcmN1aXRyeSBhbmQsIGFkZGl0aW9uYWxseSwgcHJvdmlkZXMgYSBnZW5lcmFsIHB1cnBvc2Ugc3RpbXVsdXMvcmVzcG9uc2UgKi8NCiAgICAgICAgICAgIC8qdGVzdCBmb3IgYmFzaWMgZnVuY3Rpb25hbCB0ZXN0aW5nLiAqLw0KDQogICAgICAgICAgICAvKiBTZW5kIGEgWkxQICovDQogICAgICAgICAgICBVU0JEX1Rlc3QoVVNCRmVhdHVyZVJlcXVlc3RfVEVTVFNFTkRaTFApOw0KICAgICAgICAgICAgLyogVGVzdCBTRTBfTkFLICovDQogICAgICAgICAgICBVU0JEX1Rlc3QoVVNCRmVhdHVyZVJlcXVlc3RfVEVTVFNFME5BSyk7DQogICAgICAgICAgICB3aGlsZSAoMSk7DQogICAgICAgICAgICAvKmJyZWFrOyBub3QgcmVhY2hlZCAqLw0KDQoNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgIH0NCiAgICAvKiBUaGUgZXhpdCBhY3Rpb24gaXMgdG8gcG93ZXIgY3ljbGUgdGhlIGRldmljZS4gKi8NCiAgICAvKiBUaGUgZGV2aWNlIG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGhvc3QgKi8NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqICAgICAgRXhwb3J0ZWQgZnVuY3Rpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICogUmV0dXJuIFVTQkREcml2ZXIgaW5zdGFuY2UgcG9pbnRlciBmb3IgZ2xvYmFsIHVzYWdlLg0KICovDQpVU0JERHJpdmVyICpVU0JEX0dldERyaXZlcih2b2lkKQ0Kew0KICAgIHJldHVybiAmdXNiZERyaXZlcjsNCn0NCg0KLyoqDQogKiBJbml0aWFsaXplcyBhIFVTQkREcml2ZXIgaW5zdGFuY2Ugd2l0aCBhIGxpc3Qgb2YgZGVzY3JpcHRvcnMuIElmDQogKiBpbnRlcmZhY2VzIGNhbiBoYXZlIG11bHRpcGxlIGFsdGVybmF0ZSBzZXR0aW5ncywgYW4gYXJyYXkgdG8gc3RvcmUgdGhlDQogKiBjdXJyZW50IHNldHRpbmcgZm9yIGVhY2ggaW50ZXJmYWNlIG11c3QgYmUgcHJvdmlkZWQuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccGFyYW0gcERlc2NyaXB0b3JzICBQb2ludGVyIHRvIGEgVVNCRERyaXZlckRlc2NyaXB0b3JzIGluc3RhbmNlLg0KICogXHBhcmFtIHBJbnRlcmZhY2VzICBQb2ludGVyIHRvIGFuIGFycmF5IGZvciBzdG9yaW5nIHRoZSBjdXJyZW50IGFsdGVybmF0ZQ0KICogICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIG9mIGVhY2ggaW50ZXJmYWNlIChvcHRpb25hbCkuDQogKi8NCnZvaWQgVVNCRERyaXZlcl9Jbml0aWFsaXplKA0KICAgIFVTQkREcml2ZXIgKnBEcml2ZXIsDQogICAgY29uc3QgVVNCRERyaXZlckRlc2NyaXB0b3JzICpwRGVzY3JpcHRvcnMsDQogICAgdWludDhfdCAqcEludGVyZmFjZXMpDQp7DQoNCiAgICBwRHJpdmVyLT5jZmdudW0gPSAwOw0KICAgIHBEcml2ZXItPmlzUmVtb3RlV2FrZVVwRW5hYmxlZCA9IDA7DQoNCiAgICBwRHJpdmVyLT5wRGVzY3JpcHRvcnMgPSBwRGVzY3JpcHRvcnM7DQogICAgcERyaXZlci0+cEludGVyZmFjZXMgPSBwSW50ZXJmYWNlczsNCg0KICAgIC8qIEluaXRpYWxpemUgaW50ZXJmYWNlcyBhcnJheSBpZiBub3QgbnVsbCAqLw0KDQogICAgaWYgKHBJbnRlcmZhY2VzICE9IDApIHsNCg0KICAgICAgICBtZW1zZXQocEludGVyZmFjZXMsIHNpemVvZihwSW50ZXJmYWNlcyksIDApOw0KICAgIH0NCn0NCg0KLyoqDQogKiBSZXR1cm5zIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBsaXN0Lg0KICogXHBhcmFtIHBEcml2ZXIgIFBvaW50ZXIgdG8gYSBVU0JERHJpdmVyIGluc3RhbmNlLg0KICogXHBhcmFtIGNmZ051bSAgIFJlc2VydmVkLg0KICovDQpVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqVVNCRERyaXZlcl9HZXRDZmdEZXNjcmlwdG9ycygNCiAgICBVU0JERHJpdmVyICpwRHJpdmVyLCB1aW50OF90IGNmZ051bSkNCnsNCiAgICBVU0JERHJpdmVyRGVzY3JpcHRvcnMgKnBEZXNjTGlzdCA9IChVU0JERHJpdmVyRGVzY3JpcHRvcnMgKilwRHJpdmVyLT5wRGVzY3JpcHRvcnM7DQogICAgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgKnBDZmc7DQoNCiAgICBjZmdOdW0gPSBjZmdOdW07DQogICAgaWYgKFVTQkRfSEFMX0lzSGlnaFNwZWVkKCkgJiYgcERlc2NMaXN0LT5wSHNDb25maWd1cmF0aW9uKQ0KICAgICAgICBwQ2ZnID0gKFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yICopcERlc2NMaXN0LT5wSHNDb25maWd1cmF0aW9uOw0KICAgIGVsc2UNCiAgICAgICAgcENmZyA9IChVU0JDb25maWd1cmF0aW9uRGVzY3JpcHRvciAqKXBEZXNjTGlzdC0+cEZzQ29uZmlndXJhdGlvbjsNCg0KICAgIHJldHVybiBwQ2ZnOw0KfQ0KDQovKioNCiAqIEhhbmRsZXMgdGhlIGdpdmVuIHJlcXVlc3QgaWYgaXQgaXMgc3RhbmRhcmQsIG90aGVyd2lzZSBTVEFMTHMgaXQuDQogKiBccGFyYW0gcERyaXZlciAgUG9pbnRlciB0byBhIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccGFyYW0gcFJlcXVlc3QgIFBvaW50ZXIgdG8gYSBVU0JHZW5lcmljUmVxdWVzdCBpbnN0YW5jZS4NCiAqLw0Kdm9pZCBVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyKA0KICAgIFVTQkREcml2ZXIgKnBEcml2ZXIsDQogICAgY29uc3QgVVNCR2VuZXJpY1JlcXVlc3QgKnBSZXF1ZXN0KQ0Kew0KICAgIHVpbnQ4X3QgY2ZnbnVtOw0KICAgIHVpbnQ4X3QgaW5mbnVtOw0KICAgIHVpbnQ4X3QgZXB0bnVtOw0KICAgIHVpbnQ4X3Qgc2V0dGluZzsNCiAgICB1aW50OF90IHR5cGU7DQogICAgdWludDhfdCBpbmRleERlc2M7DQogICAgdWludDMyX3QgbGVuZ3RoOw0KICAgIHVpbnQzMl90IGFkZHJlc3M7DQoNCiAgICBUUkFDRV9JTkZPX1dQKCJTdGQgIik7DQoNCiAgICAvKiBDaGVjayByZXF1ZXN0IGNvZGUgKi8NCiAgICBzd2l0Y2ggKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFJlcXVlc3QocFJlcXVlc3QpKSB7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljUmVxdWVzdF9HRVRERVNDUklQVE9SOg0KICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgiZ0Rlc2MgIik7DQoNCiAgICAgICAgICAgIC8qIFNlbmQgdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yICovDQogICAgICAgICAgICB0eXBlID0gVVNCR2V0RGVzY3JpcHRvclJlcXVlc3RfR2V0RGVzY3JpcHRvclR5cGUocFJlcXVlc3QpOw0KICAgICAgICAgICAgaW5kZXhEZXNjID0gVVNCR2V0RGVzY3JpcHRvclJlcXVlc3RfR2V0RGVzY3JpcHRvckluZGV4KHBSZXF1ZXN0KTsNCiAgICAgICAgICAgIGxlbmd0aCA9IFVTQkdlbmVyaWNSZXF1ZXN0X0dldExlbmd0aChwUmVxdWVzdCk7DQogICAgICAgICAgICBHZXREZXNjcmlwdG9yKHBEcml2ZXIsIHR5cGUsIGluZGV4RGVzYywgbGVuZ3RoKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgIGNhc2UgVVNCR2VuZXJpY1JlcXVlc3RfU0VUQUREUkVTUzoNCiAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoInNBZGRyICIpOw0KDQogICAgICAgICAgICAvKiBTZW5kcyBhIHplcm8tbGVuZ3RoIHBhY2tldCBhbmQgdGhlbiBzZXQgdGhlIGRldmljZSBhZGRyZXNzICovDQogICAgICAgICAgICBhZGRyZXNzID0gVVNCU2V0QWRkcmVzc1JlcXVlc3RfR2V0QWRkcmVzcyhwUmVxdWVzdCk7DQogICAgICAgICAgICBVU0JEX1dyaXRlKDAsIDAsIDAsIChUcmFuc2ZlckNhbGxiYWNrKSBVU0JEX1NldEFkZHJlc3MsICh2b2lkICopIGFkZHJlc3MpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljUmVxdWVzdF9TRVRDT05GSUdVUkFUSU9OOg0KICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgic0NmZyAiKTsNCg0KICAgICAgICAgICAgLyogU2V0IHRoZSByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiAqLw0KICAgICAgICAgICAgY2ZnbnVtID0gVVNCU2V0Q29uZmlndXJhdGlvblJlcXVlc3RfR2V0Q29uZmlndXJhdGlvbihwUmVxdWVzdCk7DQogICAgICAgICAgICBTZXRDb25maWd1cmF0aW9uKHBEcml2ZXIsIGNmZ251bSk7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFVTQkdlbmVyaWNSZXF1ZXN0X0dFVENPTkZJR1VSQVRJT046DQogICAgICAgICAgICBUUkFDRV9JTkZPX1dQKCJnQ2ZnICIpOw0KDQogICAgICAgICAgICAvKiBTZW5kIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gbnVtYmVyICovDQogICAgICAgICAgICBHZXRDb25maWd1cmF0aW9uKHBEcml2ZXIpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgY2FzZSBVU0JHZW5lcmljUmVxdWVzdF9HRVRTVEFUVVM6DQogICAgICAgICAgICBUUkFDRV9JTkZPX1dQKCJnU3RhICIpOw0KDQogICAgICAgICAgICAvKiBDaGVjayB3aG8gaXMgdGhlIHJlY2lwaWVudCAqLw0KICAgICAgICAgICAgc3dpdGNoIChVU0JHZW5lcmljUmVxdWVzdF9HZXRSZWNpcGllbnQocFJlcXVlc3QpKSB7DQoNCiAgICAgICAgICAgICAgICBjYXNlIFVTQkdlbmVyaWNSZXF1ZXN0X0RFVklDRToNCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgiRGV2ICIpOw0KDQogICAgICAgICAgICAgICAgICAgIC8qIFNlbmQgdGhlIGRldmljZSBzdGF0dXMgKi8NCiAgICAgICAgICAgICAgICAgICAgR2V0RGV2aWNlU3RhdHVzKHBEcml2ZXIpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGNhc2UgVVNCR2VuZXJpY1JlcXVlc3RfRU5EUE9JTlQ6DQogICAgICAgICAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIkVwdCAiKTsNCg0KICAgICAgICAgICAgICAgICAgICAvKiBTZW5kIHRoZSBlbmRwb2ludCBzdGF0dXMgKi8NCiAgICAgICAgICAgICAgICAgICAgZXB0bnVtID0gVVNCR2VuZXJpY1JlcXVlc3RfR2V0RW5kcG9pbnROdW1iZXIocFJlcXVlc3QpOw0KICAgICAgICAgICAgICAgICAgICBHZXRFbmRwb2ludFN0YXR1cyhlcHRudW0pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIFRSQUNFX1dBUk5JTkcoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVNCRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5rbm93biByZWNpcGllbnQgKCVkKVxuXHIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVjaXBpZW50KHBSZXF1ZXN0KSk7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICBjYXNlIFVTQkdlbmVyaWNSZXF1ZXN0X0NMRUFSRkVBVFVSRToNCiAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoImNGZWF0ICIpOw0KDQogICAgICAgICAgICAvKiBDaGVjayB3aGljaCBpcyB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgKi8NCiAgICAgICAgICAgIHN3aXRjaCAoVVNCRmVhdHVyZVJlcXVlc3RfR2V0RmVhdHVyZVNlbGVjdG9yKHBSZXF1ZXN0KSkgew0KDQogICAgICAgICAgICAgICAgY2FzZSBVU0JGZWF0dXJlUmVxdWVzdF9FTkRQT0lOVEhBTFQ6DQogICAgICAgICAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIkhsdCAiKTsNCg0KICAgICAgICAgICAgICAgICAgICAvKiBVbmhhbHQgZW5kcG9pbnQgYW5kIHNlbmQgYSB6ZXJvLWxlbmd0aCBwYWNrZXQgKi8NCiAgICAgICAgICAgICAgICAgICAgVVNCRF9VbmhhbHQoVVNCR2VuZXJpY1JlcXVlc3RfR2V0RW5kcG9pbnROdW1iZXIocFJlcXVlc3QpKTsNCiAgICAgICAgICAgICAgICAgICAgVVNCRF9Xcml0ZSgwLCAwLCAwLCAwLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X0RFVklDRVJFTU9URVdBS0VVUDoNCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgiUm1XVSAiKTsNCg0KICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHJlbW90ZSB3YWtlLXVwIGFuZCBzZW5kIGEgemVyby1sZW5ndGggcGFja2V0ICovDQogICAgICAgICAgICAgICAgICAgIHBEcml2ZXItPmlzUmVtb3RlV2FrZVVwRW5hYmxlZCA9IDA7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfV0FSTklORygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbmtub3duIGZlYXR1cmUgc2VsZWN0b3IgKCVkKVxuXHIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCRmVhdHVyZVJlcXVlc3RfR2V0RmVhdHVyZVNlbGVjdG9yKHBSZXF1ZXN0KSk7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgIGNhc2UgVVNCR2VuZXJpY1JlcXVlc3RfU0VURkVBVFVSRToNCiAgICAgICAgVFJBQ0VfSU5GT19XUCgic0ZlYXQgIik7DQoNCiAgICAgICAgLyogQ2hlY2sgd2hpY2ggaXMgdGhlIHNlbGVjdGVkIGZlYXR1cmUgKi8NCiAgICAgICAgc3dpdGNoIChVU0JGZWF0dXJlUmVxdWVzdF9HZXRGZWF0dXJlU2VsZWN0b3IocFJlcXVlc3QpKSB7DQoNCiAgICAgICAgICAgIGNhc2UgVVNCRmVhdHVyZVJlcXVlc3RfREVWSUNFUkVNT1RFV0FLRVVQOg0KICAgICAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIlJtV1UgIik7DQoNCiAgICAgICAgICAgICAgICAvKiBFbmFibGUgcmVtb3RlIHdha2UtdXAgYW5kIHNlbmQgYSBaTFAgKi8NCiAgICAgICAgICAgICAgICBwRHJpdmVyLT5pc1JlbW90ZVdha2VVcEVuYWJsZWQgPSAxOw0KICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgVVNCRmVhdHVyZVJlcXVlc3RfRU5EUE9JTlRIQUxUOg0KICAgICAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIkhhbHQgIik7DQogICAgICAgICAgICAgICAgLyogSGFsdCBlbmRwb2ludCAqLw0KICAgICAgICAgICAgICAgIFVTQkRfSGFsdChVU0JHZW5lcmljUmVxdWVzdF9HZXRFbmRwb2ludE51bWJlcihwUmVxdWVzdCkpOw0KICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgVVNCRmVhdHVyZVJlcXVlc3RfVEVTVE1PREU6DQogICAgICAgICAgICAgICAgLyogNy4xLjIwIFRlc3QgTW9kZSBTdXBwb3J0LCA5LjQuOSBTZXQgRmVhdHVyZSAqLw0KICAgICAgICAgICAgICAgIGlmICgoVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVjaXBpZW50KHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9ERVZJQ0UpDQogICAgICAgICAgICAgICAgICAgICYmICgoVVNCR2VuZXJpY1JlcXVlc3RfR2V0SW5kZXgocFJlcXVlc3QpICYgMHgwMDBGKSA9PSAwKSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8qIEhhbmRsZSB0ZXN0IHJlcXVlc3QgKi8NCiAgICAgICAgICAgICAgICAgICAgVVNCRERyaXZlcl9UZXN0KHBEcml2ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JGZWF0dXJlUmVxdWVzdF9HZXRUZXN0U2VsZWN0b3IocFJlcXVlc3QpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQoNCiAgICAgICAgICAgICAgICAgICAgVVNCRF9TdGFsbCgwKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnJlYWs7DQoNCiNpZiAwDQogICAgICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X09UR19CX0hOUF9FTkFCTEU6DQogICAgICAgICAgICAgICAgICAgIFRSQUNFX0lORk9fV1AoIk9UR19CX0hOUF9FTkFCTEUgIik7DQogICAgICAgICAgICAgICAgICAgIHBEcml2ZXItPm90Z19mZWF0dXJlc19zdXBwb3J0ZWQgfD0NCiAgICAgICAgICAgICAgICAgICAgICAgIDE8PFVTQkZlYXR1cmVSZXF1ZXN0X09UR19CX0hOUF9FTkFCTEU7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X09UR19BX0hOUF9TVVBQT1JUOg0KICAgICAgICAgICAgICAgICAgICBUUkFDRV9JTkZPX1dQKCJPVEdfQV9ITlBfU1VQUE9SVCAiKTsNCiAgICAgICAgICAgICAgICAgICAgcERyaXZlci0+b3RnX2ZlYXR1cmVzX3N1cHBvcnRlZCB8PQ0KICAgICAgICAgICAgICAgICAgICAgICAgMTw8VVNCRmVhdHVyZVJlcXVlc3RfT1RHX0FfSE5QX1NVUFBPUlQ7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIFVTQkZlYXR1cmVSZXF1ZXN0X09UR19BX0FMVF9ITlBfU1VQUE9SVDoNCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfSU5GT19XUCgiT1RHX0FfQUxUX0hOUF9TVVBQT1JUICIpOw0KICAgICAgICAgICAgICAgICAgICBwRHJpdmVyLT5vdGdfZmVhdHVyZXNfc3VwcG9ydGVkIHw9DQogICAgICAgICAgICAgICAgICAgICAgICAxPDxVU0JGZWF0dXJlUmVxdWVzdF9PVEdfQV9BTFRfSE5QX1NVUFBPUlQ7DQogICAgICAgICAgICAgICAgICAgIFVTQkRfV3JpdGUoMCwgMCwgMCwgMCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQojZW5kaWYNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgVFJBQ0VfV0FSTklORygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTQkREcml2ZXJfUmVxdWVzdEhhbmRsZXI6IFVua25vd24gZmVhdHVyZSBzZWxlY3RvciAoJWQpXG5cciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkZlYXR1cmVSZXF1ZXN0X0dldEZlYXR1cmVTZWxlY3RvcihwUmVxdWVzdCkpOw0KICAgICAgICAgICAgICAgIFVTQkRfU3RhbGwoMCk7DQogICAgICAgIH0NCiAgICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFVTQkdlbmVyaWNSZXF1ZXN0X1NFVElOVEVSRkFDRToNCiAgICAgICAgVFJBQ0VfSU5GT19XUCgic0ludGVyZmFjZSAiKTsNCg0KICAgICAgICBpbmZudW0gPSBVU0JJbnRlcmZhY2VSZXF1ZXN0X0dldEludGVyZmFjZShwUmVxdWVzdCk7DQogICAgICAgIHNldHRpbmcgPSBVU0JJbnRlcmZhY2VSZXF1ZXN0X0dldEFsdGVybmF0ZVNldHRpbmcocFJlcXVlc3QpOw0KICAgICAgICBTZXRJbnRlcmZhY2UocERyaXZlciwgaW5mbnVtLCBzZXR0aW5nKTsNCiAgICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFVTQkdlbmVyaWNSZXF1ZXN0X0dFVElOVEVSRkFDRToNCiAgICAgICAgVFJBQ0VfSU5GT19XUCgiZ0ludGVyZmFjZSAiKTsNCg0KICAgICAgICBpbmZudW0gPSBVU0JJbnRlcmZhY2VSZXF1ZXN0X0dldEludGVyZmFjZShwUmVxdWVzdCk7DQogICAgICAgIEdldEludGVyZmFjZShwRHJpdmVyLCBpbmZudW0pOw0KICAgICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICAgIFRSQUNFX1dBUk5JTkcoDQogICAgICAgICAgICAgICAgICAiVVNCRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5rbm93biByZXF1ZXN0IGNvZGUgKCVkKVxuXHIiLA0KICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpOw0KICAgICAgICBVU0JEX1N0YWxsKDApOw0KICAgIH0NCn0NCg0KDQovKioNCiAqIFRlc3QgaWYgUmVtb3RlV2FrZVVQIGZlYXR1cmUgaXMgZW5hYmxlZA0KICogXHBhcmFtIHBEcml2ZXIgIFBvaW50ZXIgdG8gYW4gVVNCRERyaXZlciBpbnN0YW5jZS4NCiAqIFxyZXR1cm4gMSBpZiByZW1vdGUgd2FrZSB1cCBoYXMgYmVlbiBlbmFibGVkIGJ5IHRoZSBob3N0OyBvdGhlcndpc2UsIHJldHVybnMNCiAqIDANCiAqLw0KdWludDhfdCBVU0JERHJpdmVyX0lzUmVtb3RlV2FrZVVwRW5hYmxlZChjb25zdCBVU0JERHJpdmVyICpwRHJpdmVyKQ0Kew0KICAgIHJldHVybiBwRHJpdmVyLT5pc1JlbW90ZVdha2VVcEVuYWJsZWQ7DQp9DQoNCi8qKg0KICogUmV0dXJuIE9URyBmZWF0dXJlcyBzdXBwb3J0ZWQNCiAqIFxwYXJhbSBwRHJpdmVyICBQb2ludGVyIHRvIGFuIFVTQkREcml2ZXIgaW5zdGFuY2UuDQogKiBccmV0dXJuIHRoZSBPVEcgZmVhdHVyZXMNCiAqLw0KdWludDhfdCBVU0JERHJpdmVyX3JldHVybk9UR0ZlYXR1cmVzKGNvbnN0IFVTQkREcml2ZXIgKnBEcml2ZXIpDQp7DQogICAgcmV0dXJuIHBEcml2ZXItPm90Z19mZWF0dXJlc19zdXBwb3J0ZWQ7DQp9DQoNCi8qKg0KICogQ2xlYXIgT1RHIGZlYXR1cmVzIHN1cHBvcnRlZA0KICogXHBhcmFtIHBEcml2ZXIgIFBvaW50ZXIgdG8gYW4gVVNCRERyaXZlciBpbnN0YW5jZS4NCiAqIFxyZXR1cm4gbm9uZQ0KICovDQp2b2lkIFVTQkREcml2ZXJfY2xlYXJPVEdGZWF0dXJlcyhVU0JERHJpdmVyICpwRHJpdmVyKQ0Kew0KICAgIHBEcml2ZXItPm90Z19mZWF0dXJlc19zdXBwb3J0ZWQgPSAwOw0KfQ0KDQovKipAfSovDQo=