LyoqIEBmaWxlDQogIEVGSSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGRlZmluaXRpb25zLg0KDQogIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0KICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0ICAgICAgICANCiAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuICAgICAgICAgICAgIA0KDQogIE1vZHVsZSBOYW1lOiAgUHhlQmFzZUNvZGUuaA0KDQoqKi8NCiNpZm5kZWYgX19QWEVfQkFTRV9DT0RFX1BST1RPQ09MX0hfXw0KI2RlZmluZSBfX1BYRV9CQVNFX0NPREVfUFJPVE9DT0xfSF9fDQoNCi8vDQovLyBQWEUgQmFzZSBDb2RlIHByb3RvY29sDQovLw0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTF9HVUlEIFwNCiAgeyBcDQogICAgMHgwM2M0ZTYwMywgMHhhYzI4LCAweDExZDMsIHsweDlhLCAweDJkLCAweDAwLCAweDkwLCAweDI3LCAweDNmLCAweGMxLCAweDRkIH0gXA0KICB9DQoNCnR5cGVkZWYgc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTDsNCg0KLy8NCi8vIERlZmF1bHQgSVAgVFRMIGFuZCBUb1MuDQovLw0KI2RlZmluZSBERUZBVUxUX1RUTCAxNg0KI2RlZmluZSBERUZBVUxUX1RvUyAwDQoNCi8vDQovLyBJQ01QIGVycm9yIGZvcm1hdA0KLy8NCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDggICBUeXBlOw0KICBVSU5UOCAgIENvZGU7DQogIFVJTlQxNiAgQ2hlY2tzdW07DQogIHVuaW9uIHsNCiAgICBVSU5UMzIgIHJlc2VydmVkOw0KICAgIFVJTlQzMiAgTXR1Ow0KICAgIFVJTlQzMiAgUG9pbnRlcjsNCiAgICBzdHJ1Y3Qgew0KICAgICAgVUlOVDE2ICBJZGVudGlmaWVyOw0KICAgICAgVUlOVDE2ICBTZXF1ZW5jZTsNCiAgICB9IEVjaG87DQogIH0gdTsNCiAgVUlOVDggRGF0YVs0OTRdOw0KfSBFRklfUFhFX0JBU0VfQ09ERV9JQ01QX0VSUk9SOw0KDQovLw0KLy8gVEZUUCBlcnJvciBmb3JtYXQNCi8vDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQ4IEVycm9yQ29kZTsNCiAgQ0hBUjggRXJyb3JTdHJpbmdbMTI3XTsNCn0gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9FUlJPUjsNCg0KLy8NCi8vIElQIFJlY2VpdmUgRmlsdGVyIGRlZmluaXRpb25zDQovLw0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlQgOA0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQ4ICAgICAgICAgICBGaWx0ZXJzOw0KICBVSU5UOCAgICAgICAgICAgSXBDbnQ7DQogIFVJTlQxNiAgICAgICAgICByZXNlcnZlZDsNCiAgRUZJX0lQX0FERFJFU1MgIElwTGlzdFtFRklfUFhFX0JBU0VfQ09ERV9NQVhfSVBDTlRdOw0KfSBFRklfUFhFX0JBU0VfQ09ERV9JUF9GSUxURVI7DQoNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1NUQVRJT05fSVAgICAgICAgICAgICAweDAwMDENCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX0JST0FEQ0FTVCAgICAgICAgICAgICAweDAwMDINCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1BST01JU0NVT1VTICAgICAgICAgICAweDAwMDQNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSX1BST01JU0NVT1VTX01VTFRJQ0FTVCAweDAwMDgNCg0KLy8NCi8vIEFSUCBDYWNoZSBkZWZpbml0aW9ucw0KLy8NCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0lQX0FERFJFU1MgIElwQWRkcjsNCiAgRUZJX01BQ19BRERSRVNTIE1hY0FkZHI7DQp9IEVGSV9QWEVfQkFTRV9DT0RFX0FSUF9FTlRSWTsNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfSVBfQUREUkVTUyAgSXBBZGRyOw0KICBFRklfSVBfQUREUkVTUyAgU3VibmV0TWFzazsNCiAgRUZJX0lQX0FERFJFU1MgIEd3QWRkcjsNCn0gRUZJX1BYRV9CQVNFX0NPREVfUk9VVEVfRU5UUlk7DQoNCi8vDQovLyBVRFAgZGVmaW5pdGlvbnMNCi8vDQp0eXBlZGVmIFVJTlQxNiAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQ7DQoNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX1NSQ19JUCAgICAweDAwMDENCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX1NSQ19QT1JUICAweDAwMDINCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX0RFU1RfSVAgICAweDAwMDQNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfQU5ZX0RFU1RfUE9SVCAweDAwMDgNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfVVNFX0ZJTFRFUiAgICAweDAwMTANCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfVURQX09QRkxBR1NfTUFZX0ZSQUdNRU5UICAweDAwMjANCg0KLy8NCi8vIERpc2NvdmVyKCkgZGVmaW5pdGlvbnMNCi8vDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9CT09UU1RSQVAgICAgICAgICAwDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9NU19XSU5OVF9SSVMgICAgICAxDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9JTlRFTF9MQ00gICAgICAgICAyDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9ET1NVTkRJICAgICAgICAgICAzDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9ORUNfRVNNUFJPICAgICAgICA0DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9JQk1fV1NvRCAgICAgICAgICA1DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9JQk1fTENDTSAgICAgICAgICA2DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9DQV9VTklDRU5URVJfVE5HICA3DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9IUF9PUEVOVklFVyAgICAgICA4DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzkgICAgICAgICA5DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9BTFRJUklTXzEwICAgICAgICAxMA0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfQUxUSVJJU18xMSAgICAgICAgMTENCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX05PVF9VU0VEXzEyICAgICAgIDEyDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9SRURIQVRfSU5TVEFMTCAgICAxMw0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX1RZUEVfUkVESEFUX0JPT1QgICAgICAgMTQNCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfQk9PVF9UWVBFX1JFTUJPICAgICAgICAgICAgIDE1DQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9CRU9CT09UICAgICAgICAgICAxNg0KLy8NCi8vIDE3IHRocm91Z2ggMzI3NjcgYXJlIHJlc2VydmVkDQovLyAzMjc2OCB0aHJvdWdoIDY1Mjc5IGFyZSBmb3IgdmVuZG9yIHVzZQ0KLy8gNjUyODAgdGhyb3VnaCA2NTUzNCBhcmUgcmVzZXJ2ZWQNCi8vDQojZGVmaW5lIEVGSV9QWEVfQkFTRV9DT0RFX0JPT1RfVFlQRV9QWEVURVNUICAgNjU1MzUNCg0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX0xBWUVSX01BU0sgICAgIDB4N0ZGRg0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9CT09UX0xBWUVSX0lOSVRJQUwgIDB4MDAwMA0KDQovLw0KLy8gRGlzY292ZXIoKSBzZXJ2ZXIgbGlzdCBzdHJ1Y3R1cmUuDQovLw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UMTYgICAgICAgICAgVHlwZTsNCiAgQk9PTEVBTiAgICAgICAgIEFjY2VwdEFueVJlc3BvbnNlOw0KICBVSU5UOCAgICAgICAgICAgUmVzZXJ2ZWQ7DQogIEVGSV9JUF9BRERSRVNTICBJcEFkZHI7DQp9IEVGSV9QWEVfQkFTRV9DT0RFX1NSVkxJU1Q7DQoNCi8vDQovLyBEaXNjb3ZlcigpIGluZm9ybWF0aW9uIG92ZXJyaWRlIHN0cnVjdHVyZS4NCi8vDQp0eXBlZGVmIHN0cnVjdCB7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgVXNlTUNhc3Q7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgVXNlQkNhc3Q7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgVXNlVUNhc3Q7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgTXVzdFVzZUxpc3Q7DQogIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgU2VydmVyTUNhc3RJcDsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICBJcENudDsNCiAgRUZJX1BYRV9CQVNFX0NPREVfU1JWTElTVCBTcnZMaXN0WzFdOw0KfSBFRklfUFhFX0JBU0VfQ09ERV9ESVNDT1ZFUl9JTkZPOw0KDQovLw0KLy8gTXRmdHAoKSBkZWZpbml0aW9ucw0KLy8NCnR5cGVkZWYgZW51bSB7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRklSU1QsDQogIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfR0VUX0ZJTEVfU0laRSwNCiAgRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9SRUFEX0ZJTEUsDQogIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfV1JJVEVfRklMRSwNCiAgRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9SRUFEX0RJUkVDVE9SWSwNCiAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfR0VUX0ZJTEVfU0laRSwNCiAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfUkVBRF9GSUxFLA0KICBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9SRUFEX0RJUkVDVE9SWSwNCiAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFBfTEFTVA0KfSBFRklfUFhFX0JBU0VfQ09ERV9URlRQX09QQ09ERTsNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgTUNhc3RJcDsNCiAgRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgIENQb3J0Ow0KICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgU1BvcnQ7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW5UaW1lb3V0Ow0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXRUaW1lb3V0Ow0KfSBFRklfUFhFX0JBU0VfQ09ERV9NVEZUUF9JTkZPOw0KDQovLw0KLy8gUFhFIEJhc2UgQ29kZSBNb2RlIHN0cnVjdHVyZQ0KLy8NCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfTUFYX0FSUF9FTlRSSUVTICAgOA0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9NQVhfUk9VVEVfRU5UUklFUyA4DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgSXB2NkF2YWlsYWJsZTsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgSXB2NlN1cHBvcnRlZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmdJcHY2Ow0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBCaXNTdXBwb3J0ZWQ7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgIEJpc0RldGVjdGVkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBBdXRvQXJwOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBTZW5kR1VJRDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgRGhjcERpc2NvdmVyVmFsaWQ7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgIERoY3BBY2tSZWNlaXZlZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgUHJveHlPZmZlclJlY2VpdmVkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBQeGVEaXNjb3ZlclZhbGlkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBQeGVSZXBseVJlY2VpdmVkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBQeGVCaXNSZXBseVJlY2VpdmVkOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBJY21wRXJyb3JSZWNlaXZlZDsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgVGZ0cEVycm9yUmVjZWl2ZWQ7DQogIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgIE1ha2VDYWxsYmFja3M7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIFRUTDsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgVG9TOw0KICBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICBTdGF0aW9uSXA7DQogIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgIFN1Ym5ldE1hc2s7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgIERoY3BEaXNjb3ZlcjsNCiAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgRGhjcEFjazsNCiAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgUHJveHlPZmZlcjsNCiAgRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgUHhlRGlzY292ZXI7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1BBQ0tFVCAgICAgIFB4ZVJlcGx5Ow0KICBFRklfUFhFX0JBU0VfQ09ERV9QQUNLRVQgICAgICBQeGVCaXNSZXBseTsNCiAgRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSICAgSXBGaWx0ZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgIEFycENhY2hlRW50cmllczsNCiAgRUZJX1BYRV9CQVNFX0NPREVfQVJQX0VOVFJZICAgQXJwQ2FjaGVbRUZJX1BYRV9CQVNFX0NPREVfTUFYX0FSUF9FTlRSSUVTXTsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVUYWJsZUVudHJpZXM7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1JPVVRFX0VOVFJZIFJvdXRlVGFibGVbRUZJX1BYRV9CQVNFX0NPREVfTUFYX1JPVVRFX0VOVFJJRVNdOw0KICBFRklfUFhFX0JBU0VfQ09ERV9JQ01QX0VSUk9SICBJY21wRXJyb3I7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1RGVFBfRVJST1IgIFRmdHBFcnJvcjsNCn0gRUZJX1BYRV9CQVNFX0NPREVfTU9ERTsNCg0KLy8NCi8vIFBYRSBCYXNlIENvZGUgSW50ZXJmYWNlIEZ1bmN0aW9uIGRlZmluaXRpb25zDQovLw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBFbmFibGVzIHRoZSB1c2Ugb2YgdGhlIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgZnVuY3Rpb25zLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBVc2VJcHY2ICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIElQIGFkZHJlc3NlcyB0aGF0IGFyZSB0byBiZSB1c2VkIGR1cmluZyB0aGUgc2Vzc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGJlaW5nIHN0YXJ0ZWQuIFNldCB0byBUUlVFIGZvciBJUHY2IGFkZHJlc3NlcywgYW5kIEZBTFNFIGZvciAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjQgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgd2FzIHN0YXJ0ZWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBuZXR3b3JrIGRldmljZSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhpcyBvcGVyICANCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVXNlSXB2NiBpcyBUUlVFLCBidXQgdGhlIElwdjZTdXBwb3J0ZWQgZmllbGQgb2YgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9QWEVfQkFTRV9DT0RFX01PREUgc3RydWN0dXJlIGlzIEZBTFNFLiAgDQogIEByZXR2YWwgRUZJX0FMUkVBRFlfU1RBUlRFRCAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGFscmVhZHkgaW4gdGhlIHN0YXJ0ZWQgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgVGhlIFRoaXMgcGFyYW1ldGVyIGlzIE5VTEwgb3IgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBzdHJ1Y3R1cmUuICAgICAgDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIENvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IG9yIG90aGVyIHJlc291cmNlcyB0byBzdGFydCB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFhFIEJhc2UgQ29kZSBQcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TVEFSVCkgKA0KICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUlwdjYNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgRGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbCBmdW5jdGlvbnMuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIGluc3RhbmNlLg0KIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbCB3YXMgc3RvcHBlZC4NCiAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgaXMgYWxyZWFkeSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4gIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGUgVGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCBvciBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIG5ldHdvcmsgZGV2aWNlIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyB0aGlzIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TVE9QKSAoDQogIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MICAgICpUaGlzDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEF0dGVtcHRzIHRvIGNvbXBsZXRlIGEgREhDUHY0IEQuTy5SLkEuIChkaXNjb3ZlciAvIG9mZmVyIC8gcmVxdWVzdCAvIGFja25vd2xlZGdlKSBvciBESENQdjYNCiAgUy5BLlIuUiAoc29saWNpdCAvIGFkdmVydGlzZSAvIHJlcXVlc3QgLyByZXBseSkgc2VxdWVuY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIFNvcnRPZmZlcnMgICAgICAgICAgICBUUlVFIGlmIHRoZSBvZmZlcnMgcmVjZWl2ZWQgc2hvdWxkIGJlIHNvcnRlZC4gU2V0IHRvIEZBTFNFIHRvIHRyeSB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmZXJzIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlY2VpdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFZhbGlkIERIQ1AgaGFzIGNvbXBsZXRlZC4NCiAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgaXMgaW4gdGhlIHN0b3BwZWQgc3RhdGUuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFRoZSBUaGlzIHBhcmFtZXRlciBpcyBOVUxMIG9yIGRvZXMgbm90IHBvaW50IHRvIGEgdmFsaWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgbmV0d29yayBkZXZpY2UgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIENvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBESENQIFByb3RvY29sLg0KICBAcmV0dmFsIEVGSV9BQk9SVEVEICAgICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWJvcnRlZCB0aGUgREhDUCBQcm90b2NvbC4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIERIQ1AgUHJvdG9jb2wgdGltZWQgb3V0Lg0KICBAcmV0dmFsIEVGSV9JQ01QX0VSUk9SICAgICAgICBBbiBJQ01QIGVycm9yIHBhY2tldCB3YXMgcmVjZWl2ZWQgZHVyaW5nIHRoZSBESENQIHNlc3Npb24uDQogIEByZXR2YWwgRUZJX05PX1JFU1BPTlNFICAgICAgIFZhbGlkIFBYRSBvZmZlciB3YXMgbm90IHJlY2VpdmVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9ESENQKSAoDQogIElOIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MICAgICAgICAgICAgKlRoaXMsDQogIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydE9mZmVycw0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBBdHRlbXB0cyB0byBjb21wbGV0ZSB0aGUgUFhFIEJvb3QgU2VydmVyIGFuZC9vciBib290IGltYWdlIGRpc2NvdmVyeSBzZXF1ZW5jZS4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgVHlwZSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGJvb3RzdHJhcCB0byBwZXJmb3JtLg0KICBAcGFyYW0gIExheWVyICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBib290IHNlcnZlciBsYXllciBudW1iZXIgdG8gZGlzY292ZXIsIHdoaWNoIG11c3QgYmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFhFX0JPT1RfTEFZRVJfSU5JVElBTCB3aGVuIGEgbmV3IHNlcnZlciB0eXBlIGlzIGJlaW5nICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFVzZUJpcyAgICAgICAgICAgICAgICBUUlVFIGlmIEJvb3QgSW50ZWdyaXR5IFNlcnZpY2VzIGFyZSB0byBiZSB1c2VkLiBGQUxTRSBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBJbmZvICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBvZiBkaXNjb3Zlcnkgb3BlcmF0aW9uIHRoYXQgaXMgdG8gYmUgcGVyZm9ybWVkLiAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIERpc2NvdmVyeSBzZXF1ZW5jZSBoYXMgYmVlbiBjb21wbGV0ZWQuDQogIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBuZXR3b3JrIGRldmljZSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhpcyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgQ291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgRGlzY292ZXJ5Lg0KICBAcmV0dmFsIEVGSV9BQk9SVEVEICAgICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWJvcnRlZCB0aGUgRGlzY292ZXJ5IHNlcXVlbmNlLg0KICBAcmV0dmFsIEVGSV9USU1FT1VUICAgICAgICAgICBUaGUgRGlzY292ZXJ5IHNlcXVlbmNlIHRpbWVkIG91dC4NCiAgQHJldHZhbCBFRklfSUNNUF9FUlJPUiAgICAgICAgQW4gSUNNUCBlcnJvciBwYWNrZXQgd2FzIHJlY2VpdmVkIGR1cmluZyB0aGUgUFhFIGRpc2NvdmVyeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfRElTQ09WRVIpICgNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgICAgICAgICAgICpUaGlzLA0KICBJTiBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpMYXllciwNCiAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUJpcywNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfRElTQ09WRVJfSU5GTyAgICAgICpJbmZvICAgT1BUSU9OQUwNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVXNlZCB0byBwZXJmb3JtIFRGVFAgYW5kIE1URlRQIHNlcnZpY2VzLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBPcGVyYXRpb24gICAgICAgICAgICAgVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIHRvIHBlcmZvcm0uDQogIEBwYXJhbSAgQnVmZmVyUHRyICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgT3ZlcndyaXRlICAgICAgICAgICAgIE9ubHkgdXNlZCBvbiB3cml0ZSBmaWxlIG9wZXJhdGlvbnMuIFRSVUUgaWYgYSBmaWxlIG9uIGEgcmVtb3RlIHNlcnZlciBjYW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgb3ZlcndyaXR0ZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEJ1ZmZlclNpemUgICAgICAgICAgICBGb3IgZ2V0LWZpbGUtc2l6ZSBvcGVyYXRpb25zLCAqQnVmZmVyU2l6ZSByZXR1cm5zIHRoZSBzaXplIG9mIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEJsb2NrU2l6ZSAgICAgICAgICAgICBUaGUgcmVxdWVzdGVkIGJsb2NrIHNpemUgdG8gYmUgdXNlZCBkdXJpbmcgYSBURlRQIHRyYW5zZmVyLg0KICBAcGFyYW0gIFNlcnZlcklwICAgICAgICAgICAgICBUaGUgVEZUUCAvIE1URlRQIHNlcnZlciBJUCBhZGRyZXNzLg0KICBAcGFyYW0gIEZpbGVuYW1lICAgICAgICAgICAgICBBIE51bGwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgYSBkaXJlY3RvcnkgbmFtZSBvciBhIGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgSW5mbyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIE1URlRQIGluZm9ybWF0aW9uLg0KICBAcGFyYW0gIERvbnRVc2VCdWZmZXIgICAgICAgICBTZXQgdG8gRkFMU0UgZm9yIG5vcm1hbCBURlRQIGFuZCBNVEZUUCByZWFkIGZpbGUgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBURlRQL01URlRQIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkLg0KICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbCBpcyBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgbmV0d29yayBkZXZpY2UgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0JVRkZFUl9UT09fU01BTEwgIFRoZSBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCB0byBjb21wbGV0ZSB0aGUgcmVhZCBvcGVyYXRpb24uICAgDQogIEByZXR2YWwgRUZJX0FCT1JURUQgICAgICAgICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhYm9ydGVkIHRoZSBURlRQL01URlRQIG9wZXJhdGlvbi4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIFRGVFAvTVRGVFAgb3BlcmF0aW9uIHRpbWVkIG91dC4NCiAgQHJldHZhbCBFRklfSUNNUF9FUlJPUiAgICAgICAgQW4gSUNNUCBlcnJvciBwYWNrZXQgd2FzIHJlY2VpdmVkIGR1cmluZyB0aGUgTVRGVFAgc2Vzc2lvbi4NCiAgQHJldHZhbCBFRklfVEZUUF9FUlJPUiAgICAgICAgQSBURlRQIGVycm9yIHBhY2tldCB3YXMgcmVjZWl2ZWQgZHVyaW5nIHRoZSBNVEZUUCBzZXNzaW9uLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9NVEZUUCkgKA0KICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCAgICAgICAgICAgICAgICAqVGhpcywNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVEZUUF9PUENPREUgICAgICAgICAgICAgT3BlcmF0aW9uLA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyUHRyIE9QVElPTkFMLA0KICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyd3JpdGUsDQogIElOIE9VVCBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLA0KICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQmxvY2tTaXplIE9QVElPTkFMLA0KICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU2VydmVySXAsDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpGaWxlbmFtZSAgT1BUSU9OQUwsDQogIElOIEVGSV9QWEVfQkFTRV9DT0RFX01URlRQX0lORk8gICAgICAgICAgICAgICpJbmZvICAgICAgT1BUSU9OQUwsDQogIElOIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbnRVc2VCdWZmZXINCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgV3JpdGVzIGEgVURQIHBhY2tldCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIE9wRmxhZ3MgICAgICAgICAgICAgICBUaGUgVURQIG9wZXJhdGlvbiBmbGFncy4gDQogIEBwYXJhbSAgRGVzdElwICAgICAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBJUCBhZGRyZXNzLg0KICBAcGFyYW0gIERlc3RQb3J0ICAgICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gVURQIHBvcnQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBHYXRld2F5SXAgICAgICAgICAgICAgVGhlIGdhdGV3YXkgSVAgYWRkcmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgU3JjSXAgICAgICAgICAgICAgICAgIFRoZSBzb3VyY2UgSVAgYWRkcmVzcy4NCiAgQHBhcmFtICBTcmNQb3J0ICAgICAgICAgICAgICAgVGhlIHNvdXJjZSBVRFAgcG9ydCBudW1iZXIuDQogIEBwYXJhbSAgSGVhZGVyU2l6ZSAgICAgICAgICAgIEFuIG9wdGlvbmFsIGZpZWxkIHdoaWNoIG1heSBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiBhIGhlYWRlciBhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJQdHIgdG8gYmUgcHJlZml4ZWQgdG8gdGhlIGRhdGEgYXQgQnVmZmVyUHRyLiAgICAgICAgICAgICANCiAgQHBhcmFtICBIZWFkZXJQdHIgICAgICAgICAgICAgSWYgSGVhZGVyU2l6ZSBpcyBub3QgTlVMTCwgYSBwb2ludGVyIHRvIGEgaGVhZGVyIHRvIGJlIHByZWZpeGVkIHRvIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGF0IEJ1ZmZlclB0ci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQnVmZmVyU2l6ZSAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBhdCBCdWZmZXJQdHIuDQogIEBwYXJhbSAgQnVmZmVyUHRyICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgVURQIFdyaXRlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkLg0KICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbCBpcyBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9CQURfQlVGRkVSX1NJWkUgICBUaGUgYnVmZmVyIGlzIHRvbyBsb25nIHRvIGJlIHRyYW5zbWl0dGVkLiAgDQogIEByZXR2YWwgRUZJX0FCT1JURUQgICAgICAgICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhYm9ydGVkIHRoZSBVRFAgV3JpdGUgb3BlcmF0aW9uLg0KICBAcmV0dmFsIEVGSV9USU1FT1VUICAgICAgICAgICBUaGUgVURQIFdyaXRlIG9wZXJhdGlvbiB0aW1lZCBvdXQuDQogIEByZXR2YWwgRUZJX0lDTVBfRVJST1IgICAgICAgIEFuIElDTVAgZXJyb3IgcGFja2V0IHdhcyByZWNlaXZlZCBkdXJpbmcgdGhlIFVEUCB3cml0ZSBzZXNzaW9uLiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1VEUF9XUklURSkgKA0KICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCAgICAgICAgICAgICAgICAqVGhpcywNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BGbGFncywNCiAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkRlc3RJcCwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfVURQX1BPUlQgICAgICAgICAgICAgICAgKkRlc3RQb3J0LA0KICBJTiBFRklfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqR2F0ZXdheUlwLCAgT1BUSU9OQUwNCiAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNyY0lwLCAgICAgIE9QVElPTkFMDQogIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICAgICAgICAgICpTcmNQb3J0LCAgICBPUFRJT05BTA0KICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyU2l6ZSwgT1BUSU9OQUwNCiAgSU4gVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkhlYWRlclB0ciwgIE9QVElPTkFMDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJTaXplLA0KICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQnVmZmVyUHRyDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJlYWRzIGEgVURQIHBhY2tldCBmcm9tIHRoZSBuZXR3b3JrIGludGVyZmFjZS4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgT3BGbGFncyAgICAgICAgICAgICAgIFRoZSBVRFAgb3BlcmF0aW9uIGZsYWdzLiANCiAgQHBhcmFtICBEZXN0SXAgICAgICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIElQIGFkZHJlc3MuDQogIEBwYXJhbSAgRGVzdFBvcnQgICAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBVRFAgcG9ydCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEdhdGV3YXlJcCAgICAgICAgICAgICBUaGUgZ2F0ZXdheSBJUCBhZGRyZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBTcmNJcCAgICAgICAgICAgICAgICAgVGhlIHNvdXJjZSBJUCBhZGRyZXNzLg0KICBAcGFyYW0gIFNyY1BvcnQgICAgICAgICAgICAgICBUaGUgc291cmNlIFVEUCBwb3J0IG51bWJlci4NCiAgQHBhcmFtICBIZWFkZXJTaXplICAgICAgICAgICAgQW4gb3B0aW9uYWwgZmllbGQgd2hpY2ggbWF5IGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIGEgaGVhZGVyIGF0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlclB0ciB0byBiZSBwcmVmaXhlZCB0byB0aGUgZGF0YSBhdCBCdWZmZXJQdHIuICAgICAgICAgICAgIA0KICBAcGFyYW0gIEhlYWRlclB0ciAgICAgICAgICAgICBJZiBIZWFkZXJTaXplIGlzIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYSBoZWFkZXIgdG8gYmUgcHJlZml4ZWQgdG8gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYXQgQnVmZmVyUHRyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBCdWZmZXJTaXplICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBzaXplIG9mIHRoZSBkYXRhIGF0IEJ1ZmZlclB0ci4NCiAgQHBhcmFtICBCdWZmZXJQdHIgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHJlYWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBVRFAgV3JpdGUgb3BlcmF0aW9uIHdhcyBjb21wbGV0ZWQuDQogIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBuZXR3b3JrIGRldmljZSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhpcyBvcGVyYXRpb24uDQogIEByZXR2YWwgRUZJX0JVRkZFUl9UT09fU01BTEwgIFRoZSBwYWNrZXQgaXMgbGFyZ2VyIHRoYW4gQnVmZmVyIGNhbiBob2xkLg0KICBAcmV0dmFsIEVGSV9BQk9SVEVEICAgICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWJvcnRlZCB0aGUgVURQIFJlYWQgb3BlcmF0aW9uLg0KICBAcmV0dmFsIEVGSV9USU1FT1VUICAgICAgICAgICBUaGUgVURQIFJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dC4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9VRFBfUkVBRCkgKA0KICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCAgICAgICAgICAgICAgICAqVGhpcywNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BGbGFncywNCiAgSU4gT1VUIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgKkRlc3RJcCwgICAgIE9QVElPTkFMDQogIElOIE9VVCBFRklfUFhFX0JBU0VfQ09ERV9VRFBfUE9SVCAgICAgICAgICAgICpEZXN0UG9ydCwgICBPUFRJT05BTA0KICBJTiBPVVQgRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAqU3JjSXAsICAgICAgT1BUSU9OQUwNCiAgSU4gT1VUIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9QT1JUICAgICAgICAgICAgKlNyY1BvcnQsICAgIE9QVElPTkFMDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpIZWFkZXJTaXplLCBPUFRJT05BTA0KICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqSGVhZGVyUHRyLCAgT1BUSU9OQUwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlclNpemUsDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpCdWZmZXJQdHINCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVXBkYXRlcyB0aGUgSVAgcmVjZWl2ZSBmaWx0ZXJzIG9mIGEgbmV0d29yayBkZXZpY2UgYW5kIGVuYWJsZXMgc29mdHdhcmUgZmlsdGVyaW5nLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBOZXdGaWx0ZXIgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3IHNldCBvZiBJUCByZWNlaXZlIGZpbHRlcnMuDQogIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgSVAgcmVjZWl2ZSBmaWx0ZXIgc2V0dGluZ3Mgd2VyZSB1cGRhdGVkLg0KICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbCBpcyBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QWEVfQkFTRV9DT0RFX1NFVF9JUF9GSUxURVIpICgNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfSVBfRklMVEVSICAgICAgICAgICAqTmV3RmlsdGVyDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFVzZXMgdGhlIEFSUCBwcm90b2NvbCB0byByZXNvbHZlIGEgTUFDIGFkZHJlc3MuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIElwQWRkciAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJUCBhZGRyZXNzIHRoYXQgaXMgdXNlZCB0byByZXNvbHZlIGEgTUFDIGFkZHJlc3MuDQogIEBwYXJhbSAgTWFjQWRkciAgICAgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gdGhlIE1BQyBhZGRyZXNzIHRoYXQgd2FzIHJlc29sdmVkIHdpdGggdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUCBwcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBJUCBvciBNQUMgYWRkcmVzcyB3YXMgcmVzb2x2ZWQuDQogIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBuZXR3b3JrIGRldmljZSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhpcyBvcGVyYXRpb24uICANCiAgQHJldHZhbCBFRklfQUJPUlRFRCAgICAgICAgICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFib3J0ZWQgdGhlIEFSUCBQcm90b2NvbC4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIEFSUCBQcm90b2NvbCBlbmNvdW50ZXJlZCBhIHRpbWVvdXQgY29uZGl0aW9uLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9BUlApICgNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAqSXBBZGRyLA0KICBJTiBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICpNYWNBZGRyIE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFVwZGF0ZXMgdGhlIHBhcmFtZXRlcnMgdGhhdCBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgUFhFIEJhc2UgQ29kZSBQcm90b2NvbC4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgTmV3QXV0b0FycCAgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRvIHJlcGxhY2UgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdmFsdWUgb2YgQXV0b0FSUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3U2VuZEdVSUQgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRvIHJlcGxhY2UgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdmFsdWUgb2YgU2VuZEdVSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3VFRMICAgICAgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBvZiBUVEwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSChsHRpbWUgdG8gbGl2ZaGxIGZpZWxkIG9mIHRoZSBJUCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3VG9TICAgICAgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgY3VycmVudCB2YWx1ZSBvZiBUb1MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSChsHR5cGUgb2Ygc2VydmljZaGxIGZpZWxkIG9mIHRoZSBJUCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3TWFrZUNhbGxiYWNrICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRvIHJlcGxhY2UgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdmFsdWUgb2YgdGhlIE1ha2VDYWxsYmFjayBmaWVsZCBvZiB0aGUgTW9kZSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV3IHBhcmFtZXRlcnMgdmFsdWVzIHdlcmUgdXBkYXRlZC4NCiAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgaXMgaW4gdGhlIHN0b3BwZWQgc3RhdGUuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFSQU1FVEVSUykgKA0KICBJTiBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCAgICAgICAgICAgICpUaGlzLA0KICBJTiBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdBdXRvQXJwLCAgICAgT1BUSU9OQUwNCiAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3U2VuZEdVSUQsICAgIE9QVElPTkFMDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1RUTCwgICAgICAgICBPUFRJT05BTA0KICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpOZXdUb1MsICAgICAgICAgT1BUSU9OQUwNCiAgSU4gQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3TWFrZUNhbGxiYWNrIE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFVwZGF0ZXMgdGhlIHN0YXRpb24gSVAgYWRkcmVzcyBhbmQvb3Igc3VibmV0IG1hc2sgdmFsdWVzIG9mIGEgbmV0d29yayBkZXZpY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIE5ld1N0YXRpb25JcCAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXcgSVAgYWRkcmVzcyB0byBiZSB1c2VkIGJ5IHRoZSBuZXR3b3JrIGRldmljZS4gIA0KICBAcGFyYW0gIE5ld1N1Ym5ldE1hc2sgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXcgc3VibmV0IG1hc2sgdG8gYmUgdXNlZCBieSB0aGUgbmV0d29yayBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBuZXcgc3RhdGlvbiBJUCBhZGRyZXNzIGFuZC9vciBzdWJuZXQgbWFzayB3ZXJlIHVwZGF0ZWQuDQogIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfU0VUX1NUQVRJT05fSVApICgNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgSU4gRUZJX0lQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAqTmV3U3RhdGlvbklwLCAgIE9QVElPTkFMDQogIElOIEVGSV9JUF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgKk5ld1N1Ym5ldE1hc2sgICBPUFRJT05BTA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBVcGRhdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY2FjaGVkIERIQ1AgYW5kIERpc2NvdmVyIHBhY2tldHMuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBFRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBOZXdEaGNwRGlzY292ZXJWYWxpZCAgIFBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGhjcERpc2NvdmVyVmFsaWQgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3RGhjcEFja1JlY2VpdmVkICAgICBQb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERoY3BBY2tSZWNlaXZlZCBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE5ld1Byb3h5T2ZmZXJSZWNlaXZlZCAgUG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eU9mZmVyUmVjZWl2ZWQgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBOZXdQeGVEaXNjb3ZlclZhbGlkICAgIFBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eU9mZmVyUmVjZWl2ZWQgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBOZXdQeGVSZXBseVJlY2VpdmVkICAgIFBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHhlUmVwbHlSZWNlaXZlZCBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3UHhlQmlzUmVwbHlSZWNlaXZlZCBQb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB4ZUJpc1JlcGx5UmVjZWl2ZWQgZmllbGQuICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE5ld0RoY3BEaXNjb3ZlciAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3IGNhY2hlZCBESENQIERpc2NvdmVyIHBhY2tldCBjb250ZW50cy4gICANCiAgQHBhcmFtICBOZXdEaGNwQWNrICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG5ldyBjYWNoZWQgREhDUCBBY2sgcGFja2V0IGNvbnRlbnRzLg0KICBAcGFyYW0gIE5ld1Byb3h5T2ZmZXIgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3IGNhY2hlZCBQcm94eSBPZmZlciBwYWNrZXQgY29udGVudHMuDQogIEBwYXJhbSAgTmV3UHhlRGlzY292ZXIgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXcgY2FjaGVkIFBYRSBEaXNjb3ZlciBwYWNrZXQgY29udGVudHMuDQogIEBwYXJhbSAgTmV3UHhlUmVwbHkgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXcgY2FjaGVkIFBYRSBSZXBseSBwYWNrZXQgY29udGVudHMuDQogIEBwYXJhbSAgTmV3UHhlQmlzUmVwbHkgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXcgY2FjaGVkIFBYRSBCSVMgUmVwbHkgcGFja2V0IGNvbnRlbnRzLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgIFRoZSBjYWNoZWQgcGFja2V0IGNvbnRlbnRzIHdlcmUgdXBkYXRlZC4NCiAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgIFRoZSBQWEUgQmFzZSBDb2RlIFByb3RvY29sIGlzIGluIHRoZSBzdG9wcGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgVGhpcyBpcyBOVUxMIG9yIG5vdCBwb2ludCB0byBhIHZhbGlkIEVGSV9QWEVfQkFTRV9DT0RFX1BST1RPQ09MIHN0cnVjdHVyZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1BYRV9CQVNFX0NPREVfU0VUX1BBQ0tFVFMpICgNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0wgICAgICAgICAgICAqVGhpcywNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3RGhjcERpc2NvdmVyVmFsaWQsICAgT1BUSU9OQUwNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3RGhjcEFja1JlY2VpdmVkLCAgICAgT1BUSU9OQUwNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHJveHlPZmZlclJlY2VpdmVkLCAgT1BUSU9OQUwNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlRGlzY292ZXJWYWxpZCwgICAgT1BUSU9OQUwNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlUmVwbHlSZWNlaXZlZCwgICAgT1BUSU9OQUwNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV3UHhlQmlzUmVwbHlSZWNlaXZlZCwgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3RGhjcERpc2NvdmVyLCAgICAgICAgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3RGhjcEFjaywgICAgICAgICAgICAgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3UHJveHlPZmZlciwgICAgICAgICAgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3UHhlRGlzY292ZXIsICAgICAgICAgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3UHhlUmVwbHksICAgICAgICAgICAgT1BUSU9OQUwNCiAgSU4gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUICAgICAgICAgICAgICAqTmV3UHhlQmlzUmVwbHkgICAgICAgICAgT1BUSU9OQUwNCiAgKTsNCg0KLy8NCi8vIFBYRSBCYXNlIENvZGUgUHJvdG9jb2wgc3RydWN0dXJlDQovLw0KI2RlZmluZSBFRklfUFhFX0JBU0VfQ09ERV9JTlRFUkZBQ0VfUkVWSVNJT04gIDB4MDAwMTAwMDANCiNkZWZpbmUgRUZJX1BYRV9CQVNFX0NPREVfUFJPVE9DT0xfUkVWSVNJT04gICBFRklfUFhFX0JBU0VfQ09ERV9JTlRFUkZBQ0VfUkVWSVNJT04NCg0Kc3RydWN0IF9FRklfUFhFX0JBU0VfQ09ERV9QUk9UT0NPTCB7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbjsNCiAgRUZJX1BYRV9CQVNFX0NPREVfU1RBUlQgICAgICAgICAgIFN0YXJ0Ow0KICBFRklfUFhFX0JBU0VfQ09ERV9TVE9QICAgICAgICAgICAgU3RvcDsNCiAgRUZJX1BYRV9CQVNFX0NPREVfREhDUCAgICAgICAgICAgIERoY3A7DQogIEVGSV9QWEVfQkFTRV9DT0RFX0RJU0NPVkVSICAgICAgICBEaXNjb3ZlcjsNCiAgRUZJX1BYRV9CQVNFX0NPREVfTVRGVFAgICAgICAgICAgIE10ZnRwOw0KICBFRklfUFhFX0JBU0VfQ09ERV9VRFBfV1JJVEUgICAgICAgVWRwV3JpdGU7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1VEUF9SRUFEICAgICAgICBVZHBSZWFkOw0KICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfSVBfRklMVEVSICAgU2V0SXBGaWx0ZXI7DQogIEVGSV9QWEVfQkFTRV9DT0RFX0FSUCAgICAgICAgICAgICBBcnA7DQogIEVGSV9QWEVfQkFTRV9DT0RFX1NFVF9QQVJBTUVURVJTICBTZXRQYXJhbWV0ZXJzOw0KICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfU1RBVElPTl9JUCAgU2V0U3RhdGlvbklwOw0KICBFRklfUFhFX0JBU0VfQ09ERV9TRVRfUEFDS0VUUyAgICAgU2V0UGFja2V0czsNCiAgRUZJX1BYRV9CQVNFX0NPREVfTU9ERSAgICAgICAgICAgICpNb2RlOw0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlQeGVCYXNlQ29kZVByb3RvY29sR3VpZDsNCg0KI2VuZGlmIA0K