LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOC0yMDEzIE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQogKiAgU21hcnRGdXNpb24yIE1TUyBSVEMgYmFyZSBtZXRhbCBzb2Z0d2FyZSBkcml2ZXIgcHVibGljIEFQSS4NCiAqDQogKiBTVk4gJFJldmlzaW9uOiA1Mzk2ICQNCiAqIFNWTiAkRGF0ZTogMjAxMy0wMy0yNyAyMTo1Nzo1MCArMDAwMCAoV2VkLCAyNyBNYXIgMjAxMykgJA0KICovDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovLyoqDQogIEBtYWlucGFnZSBTbWFydEZ1c2lvbjIgTVNTIFJUQyBCYXJlIE1ldGFsIERyaXZlci4NCg0KICBAc2VjdGlvbiBpbnRyb19zZWMgSW50cm9kdWN0aW9uDQogIFRoZSBTbWFydEZ1c2lvbjIgbWljcm9jb250cm9sbGVyIHN1YnN5c3RlbSAoTVNTKSBpbmNsdWRlcyBhIHJlYWwgdGltZSBjb3VudGVyDQogIChSVEMpIHRoYXQgY2FuIGdlbmVyYXRlIGFsYXJtcyBhbmQgd2FrZXVwIGludGVycnVwdHMgaW4gcmVhbCB0aW1lLiBUaGlzDQogIHNvZnR3YXJlIGRyaXZlciBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBNU1MgUlRDIGFzDQogIHBhcnQgb2YgYSBiYXJlIG1ldGFsIHN5c3RlbSB3aGVyZSBubyBvcGVyYXRpbmcgc3lzdGVtIGlzIGF2YWlsYWJsZS4gVGhlIGRyaXZlcg0KICBjYW4gYmUgYWRhcHRlZCBmb3IgdXNlIGFzIHBhcnQgb2YgYW4gb3BlcmF0aW5nIHN5c3RlbSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbg0KICBvZiB0aGUgYWRhcHRhdGlvbiBsYXllciBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZHJpdmVyDQogIG1vZGVsIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBkcml2ZXIuDQogIA0KICBUaGUgTVNTIFJUQyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoNCiAgICAtIEluaXRpYWxpemF0aW9uIG9mIHRoZSBSVEMNCiAgICAtIENvbmZpZ3VyYXRpb24gb2YgdGhlIFJUQyB0aW1lYmFzZQ0KICAgIC0gQ29uZmlndXJhdGlvbiBhcyBhIGNhbGVuZGFyIG9yIGJpbmFyeSBtb2RlIGNvdW50ZXINCiAgICAtIFNldCB0aGUgY3VycmVudCBjYWxlbmRhciBvciBiaW5hcnkgbW9kZSBjb3VudA0KICAgIC0gR2V0IHRoZSBjdXJyZW50IGNhbGVuZGFyIG9yIGJpbmFyeSBtb2RlIGNvdW50DQogICAgLSBTdGFydCBhbmQgc3RvcCB0aGUgUlRDIGNvdW50aW5nDQogICAgLSBTZXQgYWxhcm0gY29uZGl0aW9ucw0KICAgIC0gRW5hYmxlLCBkaXNhYmxlIGFuZCBjbGVhciB0aGUgd2FrZXVwIGludGVycnVwdA0KICAgIA0KICBAc2VjdGlvbiBod19kZXBlbmRlbmNpZXMgSGFyZHdhcmUgRmxvdyBEZXBlbmRlbmNpZXMNCiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGZlYXR1cmVzIG9mIHRoZSBNU1MgUlRDIGlzIGNvdmVyZWQgYnkgdGhpcyBkcml2ZXINCiAgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBjbG9jayBzb3VyY2UgZHJpdmluZyB0aGUgTVNTIFJUQyBjbG9jayAoUlRDQ0xLKQ0KICBpbnB1dC4gVGhlIFNtYXJ0RnVzaW9uMiBNU1MgY2xvY2sgY29udHJvbGxlciBjYW4gc3VwcGx5IG9uZSBvZiB0aHJlZSBjbG9jaw0KICBzb3VyY2VzIHRvIHRoZSBNU1MgUlRDIGNsb2NrIGlucHV0Og0KICAgIC0gQ3J5c3RhbCBPc2NpbGxhdG9yIDMyLjc2OCBrSHoNCiAgICAtIDFNSHogT3NjaWxsYXRvcg0KICAgIC0gNTBNSHogT3NjaWxsYXRvci4gICgyNSBNSHogaW4gYSAxLjB2IHBhcnQpLg0KICBUaGUgU21hcnRGdXNpb24yIE1TUyBjb25maWd1cmF0b3IgdG9vbCBpbiB0aGUgaGFyZHdhcmUgZmxvdyBjb25maWd1cmVzIG9uZQ0KICBvZiB0aGVzZSBjbG9ja3MgYXMgdGhlIFJUQ0NMSyBpbnB1dCBzb3VyY2UuDQogIFRoZSBiYXNlIGFkZHJlc3MgYW5kIHJlZ2lzdGVyIGFkZHJlc3NlcyBhbmQgaW50ZXJydXB0IG51bWJlciBhc3NpZ25tZW50IGZvcg0KICB0aGUgTVNTIFJUQyBibG9jayBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgaW4gdGhlIFNtYXJ0RnVzaW9uMiBDTVNJUyBIQUwuIFlvdQ0KICBtdXN0IGVuc3VyZSB0aGF0IHRoZSBTbWFydEZ1c2lvbjIgQ01TSVMgSEFMIGlzIGVpdGhlciBpbmNsdWRlZCBpbiB0aGUgc29mdHdhcmUNCiAgdG9vbCBjaGFpbiB1c2VkIHRvIGJ1aWxkIHlvdXIgcHJvamVjdCBvciBpcyBpbmNsdWRlZCBpbiB5b3VyIHByb2plY3QuDQogIA0KICBAc2VjdGlvbiB0aGVvcnlfb3AgVGhlb3J5IG9mIE9wZXJhdGlvbg0KICBUaGUgTVNTIFJUQyBkcml2ZXIgZnVuY3Rpb25zIGFyZSBncm91cGVkIGludG8gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzOg0KICAgIC0gSW5pdGlhbGl6YXRpb24gb2YgdGhlIFJUQyBkcml2ZXIgYW5kIGhhcmR3YXJlDQogICAgLSBTZXR0aW5nIGFuZCByZWFkaW5nIHRoZSBSVEMgY291bnRlciBjdXJyZW50IHZhbHVlDQogICAgLSBTZXR0aW5nIFJUQyBhbGFybSB2YWx1ZXMNCiAgICAtIFN0YXJ0aW5nIGFuZCBzdG9wcGluZyB0aGUgUlRDDQogICAgLSBJbnRlcnJ1cHQgQ29udHJvbA0KICAgIA0KICBJbml0aWFsaXphdGlvbg0KICBUaGUgTVNTIFJUQyBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBhIGNhbGwgdG8gdGhlIE1TU19SVENfaW5pdCgpDQogIGZ1bmN0aW9uLiBUaGUgTVNTX1JUQ19pbml0KCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBNU1MgUlRDDQogIGRyaXZlciBmdW5jdGlvbnMgYXJlIGNhbGxlZC4NCiAgVGhlIE1TU19SVENfaW5pdCgpIGZ1bmN0aW9uOg0KICAgIC0gU3RvcHMgdGhlIFJUQyBjb3VudGVycyBhbmQgZGlzYWJsZXMgdGhlIFJUQyBhbGFybQ0KICAgIC0gRGlzYWJsZXMgdGhlIFJUQyB3YWtldXAgaW50ZXJydXB0IGluIHRoZSBSVEMgYW5kIGluIHRoZSBDb3J0ZXgtTTMNCiAgICAgIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKS4NCiAgICAtIENsZWFycyBhbnkgcGVuZGluZyBSVEMgd2FrZXVwIGludGVycnVwdCBpbiB0aGUgUlRDIGFuZCBpbiB0aGUgQ29ydGV4LU0zDQogICAgICBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykuDQogICAgLSBFbmFibGVzIHRoZSBSVENfV0FLRVVQX0NSWzBdIG1hc2sgYml0IGluIHRoZSBNU1MgU3lzdGVtIFJlZ2lzdGVyIHRvDQogICAgICBjb25uZWN0IHRoZSBSVEMgd2FrZXVwIGludGVycnVwdCB0byB0aGUgQ29ydGV4LU0zIGludGVycnVwdCBjb250cm9sbGVyLg0KICAgIC0gUmVzZXRzIHRoZSBSVEMgY291bnRlcnMgYW5kIHRoZSBhbGFybSBhbmQgY29tcGFyZSByZWdpc3RlcnMNCiAgICAtIFNldHMgdGhlIFJUQydzIG9wZXJhdGluZyBtb2RlIHRvIGJpbmFyeSBjb3VudGVyIG1vZGUgb3IgY2FsZW5kYXIgY291bnRlcg0KICAgICAgbW9kZSwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBtb2RlIHBhcmFtZXRlcg0KICAgIC0gU2V0cyB0aGUgUlRDJ3MgcHJlc2NhbGVyIHJlZ2lzdGVyIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHByZXNjYWxlcg0KICAgICAgcGFyYW1ldGVyLiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBjbG9jayBzb3VyY2UgZHJpdmluZyB0aGUgTVNTIFJUQyBjbG9jaw0KICAgICAgKFJUQ0NMSykgaW5wdXQgaXMgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHRoZSBwcmVzY2FsZXIgdmFsdWUuDQogICAgDQogIFNldHRpbmcgYW5kIFJlYWRpbmcgdGhlIFJUQyBDb3VudGVyIFZhbHVlDQogIFRoZSBNU1MgUlRDIHN1cHBvcnRzIHR3byBtb2RlIG9mIG9wZXJhdGlvbiCWIGJpbmFyeSBtb2RlIGFuZCBjYWxlbmRhciBtb2RlLg0KICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZXQgYW5kIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlDQogIGNvdW50ZXIgd2hlbiB0aGUgTVNTIFJUQyBpcyBjb25maWd1cmVkIHRvIG9wZXJhdGUgaW4gYmluYXJ5IG1vZGU6DQogICAgLSBNU1NfUlRDX3NldF9iaW5hcnlfY291bnQoKSCWIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGN1cnJlbnQNCiAgICAgIHZhbHVlIG9mIHRoZSBSVEMgYmluYXJ5IGNvdW50ZXIuDQogICAgLSBNU1NfUlRDX2dldF9iaW5hcnlfY291bnQoKSCWIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIHRoZSBjdXJyZW50DQogICAgICB2YWx1ZSBvZiB0aGUgUlRDIGJpbmFyeSBjb3VudGVyLg0KICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZXQgYW5kIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlDQogIGNvdW50ZXIgdGhlIE1TUyBSVEMgaXMgY29uZmlndXJlZCB0byBvcGVyYXRlIGluIGNhbGVuZGFyIG1vZGU6DQogICAgLSBNU1NfUlRDX3NldF9jYWxlbmRhcl9jb3VudCgpIJYgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgY3VycmVudA0KICAgICAgdmFsdWUgb2YgdGhlIFJUQyBjYWxlbmRhciBjb3VudGVyLg0KICAgIC0gTVNTX1JUQ19nZXRfY2FsZW5kYXJfY291bnQoKSCWIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIHRoZSBjdXJyZW50DQogICAgICB2YWx1ZSBvZiB0aGUgUlRDIGNhbGVuZGFyIGNvdW50ZXIuDQogDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJlc2V0cyB0aGUgUlRDIGNvdW50ZXIgaW4gZWl0aGVyIGJpbmFyeSBhbmQgY2FsZW5kYXINCiAgb3BlcmF0aW5nIG1vZGU6DQogICAgLSBNU1NfUlRDX3Jlc2V0X2NvdW50ZXIoKSCWIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBSVEMgY291bnRlci4NCiAgICANCiAgU2V0dGluZyBSVEMgQWxhcm1zDQogIFRoZSBNU1MgUlRDIGNhbiBnZW5lcmF0ZSBhbGFybXMgd2hlbiB0aGUgY291bnRlciBtYXRjaGVzIGEgc3BlY2lmaWVkIGNvdW50DQogIHZhbHVlIGluIGJpbmFyeSBtb2RlIG9yIGEgZGF0ZSBhbmQgdGltZSBpbiBjYWxlbmRhciBtb2RlLg0KICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZXQgdXAgYWxhcm1zOg0KICAgIC0gTVNTX1JUQ19zZXRfYmluYXJ5X2NvdW50X2FsYXJtKCkgliBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgb25lLXNob3Qgb3INCiAgICAgIHBlcmlvZGljIGFsYXJtcyB3aGVuIHRoZSBNU1MgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbiBiaW5hcnkgbW9kZS4NCiAgICAtIE1TU19SVENfc2V0X2NhbGVuZGFyX2NvdW50X2FsYXJtKCkgliBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgb25lLXNob3Qgb3INCiAgICAgIHBlcmlvZGljIGFsYXJtcyB3aGVuIHRoZSBNU1MgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbiBjYWxlbmRhcg0KICAgICAgbW9kZS4NCiAgTm90ZTogVGhlIGFsYXJtIGFzc2VydHMgYSB3YWtldXAgaW50ZXJydXB0IHRvIHRoZSBDb3J0ZXgtTTMuIFRoaXMgZnVuY3Rpb24NCiAgICAgICAgZW5hYmxlcyB0aGUgUlRDknMgd2FrZXVwIGludGVycnVwdCBvdXRwdXQsIGhvd2V2ZXIgdGhlIFJUQyB3YWtldXANCiAgICAgICAgaW50ZXJydXB0IGlucHV0IHRvIHRoZSBDb3J0ZXgtTTMgTlZJQyBtdXN0IGJlIGVuYWJsZWQgc2VwYXJhdGVseSBieQ0KICAgICAgICBjYWxsaW5nIHRoZSBNU1NfUlRDX2VuYWJsZV9pcnEoKSBmdW5jdGlvbi4gVGhlIGFsYXJtIGNhbiBiZSBkaXNhYmxlZCBhdA0KICAgICAgICBhbnkgdGltZSBieSBjYWxsaW5nIHRoZSBNU1NfUlRDX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24uIGFjdGl2YXRlDQogIA0KICBTdGFydGluZyBhbmQgU3RvcHBpbmcgdGhlIFJUQyBDb3VudGVyDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHN0YXJ0IGFuZCBzdG9wIHRoZSBSVEMgY291bnRlcjoNCiAgICAtIE1TU19SVENfc3RhcnQoKSCWIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBSVEMgY291bnRlci4NCiAgICAtIE1TU19SVENfc3RvcCgpIJYgVGhpcyBmdW5jdGlvbiBzdG9wcyB0aGUgUlRDIGNvdW50ZXIuDQogICAgDQogIEludGVycnVwdCBDb250cm9sDQogIFRoZSBNU1NfUlRDX2luaXQoKSBmdW5jdGlvbiBlbmFibGVzIHRoZSBSVENfV0FLRVVQX0NSWzBdIG1hc2sgYml0IGluIHRoZSBNU1MNCiAgU3lzdGVtIFJlZ2lzdGVyIHRvIGNvbm5lY3QgdGhlIFJUQyB3YWtldXAgaW50ZXJydXB0IHRvIHRoZSBDb3J0ZXgtTTMgaW50ZXJydXB0DQogIGNvbnRyb2xsZXIuDQogIEFuIFJUQ19XYWtldXBfSVJRSGFuZGxlcigpIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZGVmaW5lZCwgd2l0aCB3ZWFrDQogIGxpbmthZ2UsIGluIHRoZSBTbWFydEZ1c2lvbjIgQ01TSVMgSEFMLiBZb3UgbXVzdCBwcm92aWRlIHlvdXIgb3duDQogIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSVENfV2FrZXVwX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBvdmVycmlkZQ0KICB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uLg0KICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgUlRDIHdha2V1cCBpbnRlcnJ1cHQgaGFuZGxlciBpcyBhcyBmb2xsb3dzOg0KICAgIHZvaWQgUlRDX1dha2V1cF9JUlFIYW5kbGVyICggdm9pZCApDQogIFRoZSBSVEMgd2FrZXVwIGludGVycnVwdCBpcyBjb250cm9sbGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOg0KICAgIC0gTVNTX1JUQ19lbmFibGVfaXJxKCkgliBUaGUgTVNTX1JUQ19lbmFibGVfaXJxKCkgZnVuY3Rpb24gZW5hYmxlcyB0aGUgUlRDDQogICAgICB0byBpbnRlcnJ1cHQgdGhlIENvcnRleC1NMyB3aGVuIGEgd2FrZXVwIGFsYXJtIG9jY3Vycy4NCiAgICAtIE1TU19SVENfZGlzYWJsZV9pcnEoKSCWIFRoZSBNU1NfUlRDX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24gZGlzYWJsZXMgdGhlDQogICAgICBSVEMgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIENvcnRleC1NMyB3aGVuIGEgd2FrZXVwIGFsYXJtIG9jY3Vycy4NCiAgICAtIE1TU19SVENfY2xlYXJfaXJxKCkgliBUaGUgTVNTX1JUQ19jbGVhcl9pcnEoKSBmdW5jdGlvbiBjbGVhcnMgYSBwZW5kaW5nDQogICAgICBSVEMgd2FrZXVwIGludGVycnVwdCBhdCB0aGUgUlRDIHdha2V1cCBvdXRwdXQuIFlvdSBtdXN0IGNhbGwgdGhlDQogICAgICBNU1NfUlRDX2NsZWFyX2lycSgpIGZ1bmN0aW9uIGFzIHBhcnQgb2YgeW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCiAgICAgIFJUQ19XYWtldXBfSVJRSGFuZGxlcigpIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKElTUikgaW4gb3JkZXIgdG8NCiAgICAgIHByZXZlbnQgdGhlIHNhbWUgaW50ZXJydXB0IGV2ZW50IHJldHJpZ2dlcmluZyBhIGNhbGwgdG8gdGhlIElTUi4NCg0KICovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCiNpZm5kZWYgTVNTX1JUQ19IXw0KI2RlZmluZSBNU1NfUlRDX0hfDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIiB7DQojZW5kaWYgDQoNCiNpbmNsdWRlICIuLi8uLi9DTVNJUy9tMnN4eHguaCINCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19SVENfQklOQVJZX01PREUgY29uc3RhbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtb2RlIHBhcmFtZXRlciB0byB0aGUNCiAgTVNTX1JUQ19pbml0KCkgZnVuY3Rpb24uIFRoZSBSVEMgd2lsbCBydW4gaW4gYmluYXJ5IG1vZGUgaWYgdGhpcyBjb25zdGFudCBpcw0KICB1c2VkLiBJbiBiaW5hcnkgbW9kZSwgdGhlIGNhbGVuZGFyIGNvdW50ZXIgY291bnRzIGNvbnNlY3V0aXZlbHkgZnJvbSAwIGFsbCB0aGUNCiAgd2F5IHRvIDJeNDMuDQogKi8NCiNkZWZpbmUgTVNTX1JUQ19CSU5BUllfTU9ERSAgICAgICAgICAgICAgIDB1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX0NBTEVOREFSX01PREUgY29uc3RhbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtb2RlIHBhcmFtZXRlciB0bw0KICB0aGUgTVNTX1JUQ19pbml0KCkgZnVuY3Rpb24uIFRoZSBSVEMgd2lsbCBydW4gaW4gY2FsZW5kYXIgbW9kZSBpZiB0aGlzDQogIGNvbnN0YW50IGlzIHVzZWQuIEluIGNhbGVuZGFyIG1vZGUsIHRoZSBjYWxlbmRhciBjb3VudGVyIGNvdW50cyBzZWNvbmRzLA0KICBtaW51dGVzLCBob3VycywgZGF5cywgbW9udGhzLCB5ZWFycywgd2Vla2RheXMgYW5kIHdlZWtzLg0KICovDQojZGVmaW5lIE1TU19SVENfQ0FMRU5EQVJfTU9ERSAgICAgICAgICAgICAxdQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgYWxhcm1fdmFsdWUgcGFyYW1ldGVyIG9mIHRoZSBNU1NfUlRDX3NldF9jYWxlbmRhcl9jb3VudF9hbGFybSgpIGZ1bmN0aW9uDQogIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfcnRjX2NhbGVuZGFyX3QgZGF0YSBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgZGF0ZSBhbmQNCiAgdGltZSBhdCB3aGljaCB0aGUgYWxhcm0gaXMgdG8gb2NjdXIuIFlvdSBtdXN0IGFzc2lnbiB0aGUgcmVxdWlyZWQgZGF0ZSBhbmQNCiAgdGltZSB2YWx1ZXMgdG8gdGhlIG1zc19ydGNfY2FsZW5kYXJfdCBzdHJ1Y3R1cmUgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLg0KICBBbnkgb2YgdGhlIGZpZWxkcyBvZiB0aGUgbXNzX3J0Y19jYWxlbmRhcl90IHN0cnVjdHVyZSBjYW4gYmUgc2V0IHRvDQogIE1TU19SVENfQ0FMRU5EQVJfRE9OVF9DQVJFLCB0byBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlIG5vdCB0byBiZSBjb25zaWRlcmVkIGluDQogIGRlY2lkaW5nIHdoZW4gdGhlIGFsYXJtIHdpbGwgb2NjdXI7IHRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gc2V0dGluZyBwZXJpb2RpYw0KICBhbGFybXMuIA0KICovDQojZGVmaW5lIE1TU19SVENfQ0FMRU5EQVJfRE9OVF9DQVJFICAgICAgMHhGRnUNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgRGF5cyBvZiB0aGUgd2Vlay4NCiAqLw0KI2RlZmluZSBNU1NfUlRDX1NVTkRBWSAgICAgIDF1DQojZGVmaW5lIE1TU19SVENfTU9OREFZICAgICAgMnUNCiNkZWZpbmUgTVNTX1JUQ19UVUVTREFZICAgICAzdQ0KI2RlZmluZSBNU1NfUlRDX1dFRE5FU0RBWSAgIDR1DQojZGVmaW5lIE1TU19SVENfVEhSVVNEQVkgICAgNXUNCiNkZWZpbmUgTVNTX1JUQ19GUklEQVkgICAgICA2dQ0KI2RlZmluZSBNU1NfUlRDX1NBVFVSREFZICAgIDd1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBtc3NfcnRjX2FsYXJtX3R5cGVfdCBlbnVtZXJhdGlvbiBpcyB1c2VkIGFzIHRoZSBhbGFybV90eXBlIHBhcmFtZXRlciBmb3INCiAgdGhlIE1TU19SVENfc2V0X2NhbGVuZGFyX2NvdW50X2FsYXJtKCkgYW5kIE1TU19SVENfc2V0X2JpbmFyeV9jb3VudF9hbGFybSgpDQogIGZ1bmN0aW9ucyB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBhbGFybSBzaG91bGQgb2NjdXIgb25seSBvbmUgdGltZSBvcg0KICBwZXJpb2RpY2FsbHkuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1JUQ19TSU5HTEVfU0hPVF9BTEFSTSwNCiAgICBNU1NfUlRDX1BFUklPRElDX0FMQVJNDQp9IG1zc19ydGNfYWxhcm1fdHlwZV90Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBBIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIG1zc19ydGNfY2FsZW5kZXJfdCBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvDQogIHdyaXRlIG5ldyBkYXRlIGFuZCB0aW1lIHZhbHVlcyB0byB0aGUgUlRDIHVzaW5nIHRoZQ0KICBNU1NfUlRDX3NldF9ydGNfY2FsZW5kYXJfY291bnQoKSBhbmQgTVNTX1JUQ19zZXRfY2FsZW5kYXJfY291bnRfYWxhcm0oKQ0KICBmdW5jdGlvbnMuIFRoZSBNU1NfUlRDX2dldF9jYWxlbmRhcl9jb3VudCgpIGZ1bmN0aW9uIGFsc28gdXNlcyBhIHBvaW50ZXIgdG8gYW4NCiAgaW5zdGFuY2Ugb2YgdGhlIG1zc19ydGNfY2FsZW5kZXJfdCBkYXRhIHN0cnVjdHVyZSB0byByZWFkIHRoZSBjdXJyZW50IGRhdGUgYW5kDQogIHRpbWUgdmFsdWUgZnJvbSB0aGUgUlRDLg0KICovDQp0eXBlZGVmIHN0cnVjdCBtc3NfcnRjX2NhbGVuZGFyDQp7DQogICAgIHVpbnQ4X3Qgc2Vjb25kOw0KICAgICB1aW50OF90IG1pbnV0ZTsNCiAgICAgdWludDhfdCBob3VyOw0KICAgICB1aW50OF90IGRheTsNCiAgICAgdWludDhfdCBtb250aDsNCiAgICAgdWludDhfdCB5ZWFyOw0KICAgICB1aW50OF90IHdlZWtkYXk7DQogICAgIHVpbnQ4X3Qgd2VlazsNCn0gbXNzX3J0Y19jYWxlbmRhcl90IDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19SVENfaW5pdCgpIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBSVEMgZHJpdmVyIGFuZCBoYXJkd2FyZSB0byBhIGtub3duDQogIHN0YXRlLiANCiAgVG8gaW5pdGlhbGl6ZSB0aGUgUlRDIGhhcmR3YXJlLCB0aGlzIGZ1bmN0aW9uOg0KICAgIC0gU3RvcHMgdGhlIFJUQyBjb3VudGVycyBhbmQgZGlzYWJsZXMgdGhlIFJUQyBhbGFybQ0KICAgIC0gRGlzYWJsZXMgdGhlIFJUQyB3YWtldXAgaW50ZXJydXB0IGluIHRoZSBSVEMgYW5kIGluIHRoZSBDb3J0ZXgtTTMNCiAgICAgIGludGVycnVwdCBjb250cm9sbGVyIChOVklDKS4NCiAgICAtIENsZWFycyBhbnkgcGVuZGluZyBSVEMgd2FrZXVwIGludGVycnVwdCBpbiB0aGUgUlRDIGFuZCBpbiB0aGUgQ29ydGV4LU0zDQogICAgICBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykuDQogICAgLSBSZXNldHMgdGhlIFJUQyBjb3VudGVycyBhbmQgdGhlIGFsYXJtIGFuZCBjb21wYXJlIHJlZ2lzdGVycw0KICAgIC0gU2V0cyB0aGUgUlRDJ3Mgb3BlcmF0aW5nIG1vZGUgdG8gYmluYXJ5IGNvdW50ZXIgbW9kZSBvciBjYWxlbmRhciBjb3VudGVyDQogICAgICBtb2RlLCBhcyBzcGVjaWZpZWQgYnkgdGhlIG1vZGUgcGFyYW1ldGVyDQogICAgLSBTZXRzIHRoZSBSVEMncyBwcmVzY2FsZXIgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgcHJlc2NhbGVyDQogICAgICBwYXJhbWV0ZXINCiAgVGhlIE1TUyBjbG9jayBjb250cm9sbGVyIGNhbiBzdXBwbHkgb25lIG9mIHRocmVlIGNsb2NrIHNvdXJjZXMgdG8gdGhlIFJUQw0KICBjbG9jayBpbnB1dCAoUlRDQ0xLKToNCiAgICAtIENyeXN0YWwgT3NjaWxsYXRvciAzMi43Njgga0h6DQogICAgLSAxTUh6IE9zY2lsbGF0b3INCiAgICAtIDUwTUh6IE9zY2lsbGF0b3IuICAoMjUgTUh6IGluIGEgMS4wdiBwYXJ0KS4NCiAgRm9yIGNhbGVuZGFyIG1vZGUsIHByb2dyYW0gdGhlIHByZXNjYWxlciByZWdpc3RlciB0byBnZW5lcmF0ZSBhIDFIeiBzaWduYWwNCiAgZnJvbSB0aGUgYWN0aXZlIFJUQ0NMSyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBlcXVhdGlvbjoNCiAgICBwcmVzY2FsZXIgPSBSVENDTEsgliAxICh3aGVyZSBSVENDTEsgdW5pdCBpcyBIeikNCiAgRm9yIGEgMzIuNzY4IGtIeiBjbG9jaywgc2V0IHRoZSBwcmVzY2FsZXIgdG8gMzI3NjggLSAxID0gMzI3NjcuIFRoZSBwcmVzY2FsZXINCiAgcmVnaXN0ZXIgaXMgMjYgYml0cyB3aWRlLCBhbGxvd2luZyBjbG9jayBzb3VyY2VzIG9mIHVwIHRvIDY3IE1IeiB0byBnZW5lcmF0ZQ0KICB0aGUgMUh6IHRpbWUgYmFzZS4NCiAgRm9yIGJpbmFyeSBtb2RlLCB0aGUgcHJlc2NhbGVyIHJlZ2lzdGVyIGNhbiBiZSBwcm9ncmFtbWVkIHRvIGdlbmVyYXRlIGEgMUh6DQogIHRpbWUgYmFzZSBvciBhIGRpZmZlcmVudCB0aW1lIGJhc2UsIGFzIHJlcXVpcmVkLg0KICANCiAgQHBhcmFtIG1vZGUNCiAgICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgUlRDLiBUaGUNCiAgICBhbGxvd2VkIHZhbHVlcyBmb3IgbW9kZSBhcmU6DQogICAgICAtIE1TU19SVENfQklOQVJZX01PREUNCiAgICAgIC0gTVNTX1JUQ19DQUxFTkRBUl9NT0RFDQogICAgDQogIEBwYXJhbSBwcmVzY2FsZXINCiAgICBUaGUgcHJlc2NhbGVyIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHZhbHVlIHRvIGRpdmlkZSB0aGUgaW5jb21pbmcgUlRDIGNsb2NrDQogICAgYnksIHRvIGdlbmVyYXRlIHRoZSBSVEMgdGltZSBiYXNlIHNpZ25hbC4gRm9yIGNhbGVuZGFyIG1vZGUsIHNldCB0aGUNCiAgICBwcmVzY2FsZXIgdmFsdWUgdG8gZ2VuZXJhdGUgYSAxSHogdGltZSBiYXNlIGZyb20gdGhlIGluY29taW5nIFJUQyBjbG9jaw0KICAgIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGVxdWF0aW9uOg0KICAgICAgICBwcmVzY2FsZXIgPSBSVENDTEsgliAxICAgICh3aGVyZSB0aGUgUlRDQ0xLIHVuaXQgaXMgSHopDQogICAgRm9yIGJpbmFyeSBtb2RlLCBzZXQgdGhlIHByZXNjYWxlciB2YWx1ZSB0byBnZW5lcmF0ZSBhIDFIeiB0aW1lIGJhc2Ugb3IgYQ0KICAgIGRpZmZlcmVudCB0aW1lIGJhc2UsIGFzIHJlcXVpcmVkLg0KICAgIFRoZSBwcmVzY2FsZXIgcGFyYW1ldGVyIGNhbiBiZSBhbnkgaW50ZWdlciB2YWx1ZSBpbiB0aGUgcmFuZ2UgMiB0byAyXjI2Lg0KICAgIA0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgICANCiAgVGhlIGV4YW1wbGUgY29kZSBiZWxvdyBzaG93cyBob3cgdGhlIFJUQyBjYW4gYmUgaW5pdGlhbGl6ZWQgb25seSBhZnRlciBhIHBvd2VyLW9uDQogIHJlc2V0Lg0KICBAY29kZQ0KICAgICNkZWZpbmUgUE9fUkVTRVRfREVURUNUX01BU0sgICAgMHgwMDAwMDAwMXUNCiAgICANCiAgICB2b2lkIGluaXRfYXBwbGljYXRpb24odm9pZCkNCiAgICB7DQogICAgICAgIHVpbnQzMl90IHBvd2VyX29uX3Jlc2V0Ow0KICAgICAgICBwb3dlcl9vbl9yZXNldCA9IFNZU1JFRy0+UkVTRVRfU09VUkNFX0NSICYgUE9fUkVTRVRfREVURUNUX01BU0s7DQogICAgICAgIGlmKHBvd2VyX29uX3Jlc2V0KQ0KICAgICAgICB7DQogICAgICAgICAgICBNU1NfUlRDX2luaXQoTVNTX1JUQ19DQUxFTkRBUl9NT0RFLCAzMjc2Nyk7DQogICAgICAgICAgICBTWVNSRUctPlJFU0VUX1NPVVJDRV9DUiA9IFBPX1JFU0VUX0RFVEVDVF9NQVNLOw0KICAgICAgICB9DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfUlRDX2luaXQNCigNCiAgICB1aW50OF90IG1vZGUsDQogICAgdWludDMyX3QgcHJlc2NhbGVyDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgTVNTX1JUQ19zZXRfcnRjX2NhbGVuZGFyX2NvdW50KCkgZnVuY3Rpb24gc2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUNCiAgUlRDIGNhbGVuZGFyIGNvdW50ZXIuDQogIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbg0KICAgICAgICBjYWxlbmRhciBjb3VudGVyIG1vZGUuDQogICAgICAgIA0KICBAcGFyYW0gbmV3X3J0Y192YWx1ZQ0KICAgIFRoZSBuZXdfcnRjX3ZhbHVlIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3J0Y19jYWxlbmRhcl90IGRhdGENCiAgICBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgbmV3IGRhdGUgYW5kIHRpbWUgdmFsdWUgZnJvbSB3aGljaCB0aGUgUlRDIHdpbGwNCiAgICBpbmNyZW1lbnQuIFlvdSBtdXN0IHBvcHVsYXRlIHRoZSBtc3NfcnRjX2NhbGVuZGFyX3Qgc3RydWN0dXJlIHdpdGggdGhlDQogICAgcmVxdWlyZWQgZGF0ZSBhbmQgdGltZSB2YWx1ZXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4NCiAgICANCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKi8NCg0Kdm9pZA0KTVNTX1JUQ19zZXRfY2FsZW5kYXJfY291bnQNCigNCiAgICBjb25zdCBtc3NfcnRjX2NhbGVuZGFyX3QgKm5ld19ydGNfdmFsdWUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX3NldF9iaW5hcnlfY291bnQoKSBmdW5jdGlvbiBzZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSVEMNCiAgYmluYXJ5IGNvdW50ZXIuDQogIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbg0KICAgICAgICBiaW5hcnkgY291bnRlciBtb2RlLg0KICAgICAgICANCiAgQHBhcmFtIG5ld19ydGNfdmFsdWUNCiAgICBUaGUgbmV3X3J0Y192YWx1ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBuZXcgY291bnQgdmFsdWUgZnJvbSB3aGljaCB0aGUgUlRDDQogICAgd2lsbCBpbmNyZW1lbnQuIFRoZSBiaW5hcnkgY291bnRlciBpcyA0MyBiaXRzIHdpZGUsIHNvIHRoZSBtYXhpbXVtIGFsbG93ZWQNCiAgICBiaW5hcnkgdmFsdWUgaXMgMl40My4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0KDQp2b2lkDQpNU1NfUlRDX3NldF9iaW5hcnlfY291bnQNCigNCiAgICB1aW50NjRfdCBuZXdfcnRjX3ZhbHVlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgTVNTX1JUQ19nZXRfY2FsZW5kYXJfY291bnQoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSVEMNCiAgY2FsZW5kYXIgY291bnRlciB2aWEgdGhlIGRhdGEgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIHBfcnRjX2NhbGVuZGFyDQogIHBhcmFtZXRlci4NCiAgTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBSVEMgaXMgY29uZmlndXJlZCB0byBvcGVyYXRlIGluDQogICAgICAgIGNhbGVuZGFyIGNvdW50ZXIgbW9kZS4NCiAgICAgICAgDQogIEBwYXJhbSBwX3J0Y19jYWxlbmRhcg0KICAgIFRoZSBwX3J0Y19jYWxlbmRhciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc19ydGNfY2FsZW5kYXJfdCBkYXRhDQogICAgc3RydWN0dXJlIHdoZXJlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjYWxlbmRhciBjb3VudGVyIHdpbGwgYmUgd3JpdHRlbiBieQ0KICAgIHRoZSBNU1NfUlRDX2dldF9jYWxlbmRhcl9jb3VudCgpIGZ1bmN0aW9uDQogICAgDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICovDQp2b2lkDQpNU1NfUlRDX2dldF9jYWxlbmRhcl9jb3VudA0KKA0KICAgIG1zc19ydGNfY2FsZW5kYXJfdCAqcF9ydGNfY2FsZW5kYXINCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX2dldF9iaW5hcnlfY291bnQoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSVEMNCiAgYmluYXJ5IGNvdW50ZXIuIA0KICBOb3RlOiBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gdGhlIFJUQyBpcyBjb25maWd1cmVkIHRvIG9wZXJhdGUgaW4NCiAgICAgICAgYmluYXJ5IGNvdW50ZXIgbW9kZS4NCiAgICAgICAgDQogIEBwYXJhbQ0KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycy4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBSVEMgYmluYXJ5IGNvdW50ZXIgYXMgYW4NCiAgICB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlci4NCiAqLw0KdWludDY0X3QNCk1TU19SVENfZ2V0X2JpbmFyeV9jb3VudCh2b2lkKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19SVENfc3RhcnQoKSBmdW5jdGlvbiBzdGFydHMgdGhlIFJUQyBpbmNyZW1lbnRpbmcuDQoNCiAgQHBhcmFtDQogICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBubyBwYXJhbWV0ZXJzLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICovDQp2b2lkIE1TU19SVENfc3RhcnQodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX3N0b3AoKSBmdW5jdGlvbiBzdG9wcyB0aGUgUlRDIGZyb20gaW5jcmVtZW50aW5nLg0KDQogIEBwYXJhbQ0KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycy4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZCBNU1NfUlRDX3N0b3Aodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX3Jlc2V0X2NvdW50ZXIoKSBmdW5jdGlvbiByZXNldHMgdGhlIFJUQyBjb3VudGVycy4gSWYgdGhlIGNvdW50ZXINCiAgd2FzIHJ1bm5pbmcgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlbiBpdCBjb250aW51ZXMgaW5jcmVtZW50aW5nIGZyb20NCiAgdGhlIGNvdW50ZXKScyByZXNldCB2YWx1ZS4NCiAgDQogIEBwYXJhbQ0KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycy4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZCBNU1NfUlRDX3Jlc2V0X2NvdW50ZXIodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX2VuYWJsZV9pcnEoKSBmdW5jdGlvbiBlbmFibGVzIHRoZSBSVEMgd2FrZXVwIG91dHB1dCB0byBpbnRlcnJ1cHQNCiAgdGhlIENvcnRleC1NMyB3aGVuIGFuIGFsYXJtIG9jY3Vycy4gSXQgZW5hYmxlcyB0aGUgUlRDIHdha2V1cCBpbnRlcnJ1cHQNCiAgKFJUQ19XYWtldXBfSVJRbikgaW4gdGhlIENvcnRleC1NMyBpbnRlcnJ1cHQgY29udHJvbGxlciAoTlZJQykuIFRoZQ0KICBSVENfV2FrZXVwX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIGFuIFJUQyB3YWtldXAgaW50ZXJydXB0DQogIG9jY3Vycy4NCiAgTm90ZTogQW4gUlRDX1dha2V1cF9JUlFIYW5kbGVyKCkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBkZWZpbmVkLCB3aXRoIHdlYWsNCiAgICAgICAgbGlua2FnZSwgaW4gdGhlIFNtYXJ0RnVzaW9uMiBDTVNJUyBIQUwuIFlvdSBtdXN0IHByb3ZpZGUgeW91ciBvd24NCiAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJUQ19XYWtldXBfSVJRSGFuZGxlcigpIGZ1bmN0aW9uLCB3aGljaCB3aWxsDQogICAgICAgIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB0byBzdWl0IHlvdXIgYXBwbGljYXRpb24uDQogIE5vdGU6IFRoaXMgZnVuY3Rpb24gb25seSBlbmFibGVzIHRoZSBSVEMgd2FrZXVwIGludGVycnVwdCBhdCB0aGUgQ29ydGV4LU0zDQogICAgICAgIE5WSUMgbGV2ZWwuIFRoZSBhbGFybSBzZXR0aW5nIGZ1bmN0aW9ucyBlbmFibGUgdGhlIHdha2V1cCBpbnRlcnJ1cHQNCiAgICAgICAgb3V0cHV0IGZyb20gdGhlIFJUQy4NCiAqLw0Kdm9pZCBNU1NfUlRDX2VuYWJsZV9pcnEodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIFJUQyB3YWtldXAgaW50ZXJydXB0DQogIChSVENfV2FrZXVwX0lSUW4pIGluIHRoZSBDb3J0ZXgtTTMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKE5WSUMpLg0KICBOb3RlOiBUaGlzIGZ1bmN0aW9uIG9ubHkgZGlzYWJsZXMgdGhlIFJUQyB3YWtldXAgaW50ZXJydXB0IGF0IHRoZSBDb3J0ZXgtTTMNCiAgICAgICAgTlZJQyBsZXZlbC4gSXQgZG9lcyBub3QgZGlzYWJsZSB0aGUgd2FrZXVwIGludGVycnVwdCBvdXRwdXQgZnJvbSB0aGUNCiAgICAgICAgUlRDLg0KICAgICAgICANCiAgIEBwYXJhbQ0KICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIG5vIHBhcmFtZXRlcnMuDQoNCiAgIEByZXR1cm4NCiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZCBNU1NfUlRDX2Rpc2FibGVfaXJxKHZvaWQpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgTVNTX1JUQ19jbGVhcl9pcnEoKSBmdW5jdGlvbiBjbGVhcnMgYSBwZW5kaW5nIHdha2V1cCBpbnRlcnJ1cHQgZnJvbSB0aGUNCiAgUlRDLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNsZWFyIHRoZSBpbnRlcnJ1cHQgaW4gdGhlIENvcnRleC1NMyBpbnRlcnJ1cHQNCiAgY29udHJvbGxlciAoTlZJQyk7IGl0IG9ubHkgY2xlYXJzIHRoZSB3YWtldXAgb3V0cHV0IGZyb20gdGhlIFJUQy4NCiAgTm90ZTogWW91IG11c3QgY2FsbCB0aGUgTVNTX1JUQ19jbGVhcl9pcnEoKSBmdW5jdGlvbiBhcyBwYXJ0IG9mIHlvdXINCiAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJUQ19XYWtldXBfSVJRSGFuZGxlcigpIFJUQyB3YWtldXAgaW50ZXJydXB0DQogICAgICAgIHNlcnZpY2Ugcm91dGluZSAoSVNSKSBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSBzYW1lIGludGVycnVwdCBldmVudA0KICAgICAgICByZXRyaWdnZXJpbmcgYSBjYWxsIHRvIHRoZSBJU1IuDQogICAgICAgIA0KICBAcGFyYW0NCiAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIG5vIHBhcmFtZXRlcnMuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogIA0KICBFeGFtcGxlOg0KICBUaGUgZXhhbXBsZSBjb2RlIGJlbG93IGRlbW9pbnN0cmF0ZXMgaG93IHRoZSBNU1NfUlRDX2NsZWFyX2lycSgpIGZ1bmN0aW9uIGlzDQogIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgUlRDIHdha2V1cCBpbnRlcnJ1cHQgc2VydmljZXIgcm91dGluZSB1c2VkDQogIGJ5IGFuIGFwcGxpY2F0aW9uIHRvIGhhbmRsZSBSVEMgYWxhcm1zLg0KICBAY29kZQ0KICAgICNpZiBkZWZpbmVkKF9fR05VQ19fKQ0KICAgIF9fYXR0cmlidXRlX18oKF9faW50ZXJydXB0X18pKSB2b2lkIFJUQ19XYWtldXBfSVJRSGFuZGxlciggdm9pZCApDQogICAgI2Vsc2UNCiAgICB2b2lkIFJUQ19XYWtldXBfSVJRSGFuZGxlciggdm9pZCApDQogICAgI2VuZGlmDQogICAgew0KICAgICAgICBwcm9jZXNzX2FsYXJtKCk7DQogICAgICAgIE1TU19SVENfY2xlYXJfaXJxKCk7DQogICAgfQ0KICBAZW5kY29kZQ0KKi8NCnZvaWQgTVNTX1JUQ19jbGVhcl9pcnEodm9pZCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfUlRDX3NldF9jYWxlbmRhcl9jb3VudF9hbGFybSgpIGZ1bmN0aW9uIHNldHMgdXAgdGhlIFJUQyB0byBnZW5lcmF0ZSBhbg0KICBhbGFybSB3aGVuIHRoZSBSVEMgY291bnQgcmVhY2hlcyB0aGUgdGltZS9kYXRlIHNwZWNpZmllZCBieSB0aGUgYWxhcm1fdmFsdWUNCiAgcGFyYW1ldGVyLiBUaGUgYWxhcm0gYXNzZXJ0cyBhIHdha2V1cCBpbnRlcnJ1cHQgdG8gdGhlIENvcnRleC1NMy4gVGhpcw0KICBmdW5jdGlvbiBlbmFibGVzIHRoZSBSVEOScyB3YWtldXAgaW50ZXJydXB0IG91dHB1dCwgaG93ZXZlciB0aGUgUlRDIHdha2V1cA0KICBpbnRlcnJ1cHQgaW5wdXQgdG8gdGhlIENvcnRleC1NMyBOVklDIG11c3QgYmUgZW5hYmxlZCBzZXBhcmF0ZWx5IGJ5IGNhbGxpbmcNCiAgdGhlIE1TU19SVENfZW5hYmxlX2lycSgpIGZ1bmN0aW9uLiBUaGUgYWxhcm0gY2FuIGJlIGRpc2FibGVkIGF0IGFueSB0aW1lIGJ5DQogIGNhbGxpbmcgdGhlIE1TU19SVENfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbi4NCiAgDQogIFNpbmdsZS1zaG90IGFsYXJtDQogIFRoZSBhbGFybSBjYW4gYmUgYSBzaW5nbGUtc2hvdCBhbGFybSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3YWtldXANCiAgaW50ZXJydXB0IHRoZSBmaXJzdCB0aW1lIHRoZSBSVEMgY291bnQgcmVhY2hlcyB0aGUgdGltZS9kYXRlIHNwZWNpZmllZCBieQ0KICBhbGFybV92YWx1ZS4gQSBzaW5nbGUgc2hvdCBhbGFybSBpcyBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nIGEgdmFsdWUgZm9yIGV2ZXJ5DQogIGZpZWxkIG9mIHRoZSBtc3NfcnRjX2NhbGVuZGFyX3QgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgYWxhcm1fdmFsdWUNCiAgcGFyYW1ldGVyLiBUaGUgUlRDIGNvdW50ZXIgd2lsbCBrZWVwIGluY3JlbWVudGluZyBhZnRlciBhIHNpbmdsZSBzaG90IGFsYXJtDQogIG9jY3Vycy4NCiAgDQogIFBlcmlvZGljIGFsYXJtDQogIFRoZSBhbGFybSBjYW4gYWxzbyBiZSBhIHBlcmlvZGljIGFsYXJtLCB3aGljaCB3aWxsIGdlbmVyYXRlIGEgd2FrZXVwIGludGVycnVwdA0KICBldmVyeSB0aW1lIHRoZSBSVEMgY291bnQgcmVhY2hlcyB0aGUgdGltZS9kYXRlIHNwZWNpZmllZCBieSBhbGFybV92YWx1ZSwgd2l0aA0KICB0aGUgY291bnRlciBydW5uaW5nIGluIGEgY29udGludW91cyBsb29wLiBUaGUgcGVyaW9kaWMgYWxhcm0gY2FuIGJlIHNldCB0bw0KICBvY2N1ciBldmVyeSBtaW51dGUsIGhvdXIsIGRheSwgbW9udGgsIHllYXIsIHdlZWssIGRheSBvZiB0aGUgd2Vlaywgb3IgYW55DQogIHZhbGlkIGNvbWJpbmF0aW9uIG9mIHRoZXNlLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNldHRpbmcgc29tZSBvZiB0aGUgZmllbGRzIG9mDQogIHRoZSBtc3NfcnRjX2NhbGVuZGFyX3QgZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgYWxhcm1fdmFsdWUgcGFyYW1ldGVyLA0KICB0byBNU1NfUlRDX0NBTEVOREFSX0RPTlRfQ0FSRS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIHdlZWtkYXkgZmllbGQgdG8NCiAgTVNTX1JUQ19NT05EQVkgYW5kIGFsbCBvdGhlciBmaWVsZHMgdG8gTVNTX1JUQ19DQUxFTkRBUl9ET05UX0NBUkUgd2lsbCByZXN1bHQNCiAgaW4gYW4gYWxhcm0gb2NjdXJyaW5nIGV2ZXJ5IE1vbmRheS4gWW91IGNhbiByZWZpbmUgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGFsYXJtDQogIHdpbGwgb2NjdXIgYnkgc3BlY2lmeWluZyB2YWx1ZXMgZm9yIHRoZSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCBmaWVsZHMuDQogIE5vdGU6IFRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbg0KICAgICAgICBjYWxlbmRhciBjb3VudGVyIG1vZGUuDQogIA0KICBAcGFyYW0gYWxhcm1fdmFsdWUNCiAgICBUaGUgYWxhcm1fdmFsdWUgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfcnRjX2NhbGVuZGFyX3QgZGF0YQ0KICAgIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBhbGFybSBpcyB0byBvY2N1ci4gWW91DQogICAgbXVzdCBhc3NpZ24gdGhlIHJlcXVpcmVkIGRhdGUgYW5kIHRpbWUgdmFsdWVzIHRvIHRoZSBtc3NfcnRjX2NhbGVuZGFyX3QNCiAgICBzdHJ1Y3R1cmUgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gU29tZSBvZiB0aGUgZmllbGRzIHdpdGhpbiB0aGUNCiAgICBtc3NfcnRjX2NhbGVuZGFyX3Qgc3RydWN0dXJlIGNhbiBiZSBzZXQgdG8gTVNTX1JUQ19DQUxFTkRBUl9ET05UX0NBUkUsIHRvDQogICAgaW5kaWNhdGUgdGhhdCB0aGV5IGFyZSBub3QgdG8gYmUgY29uc2lkZXJlZCBpbiBkZWNpZGluZyB3aGVuIHRoZSBhbGFybSB3aWxsDQogICAgb2NjdXI7IHRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gc2V0dGluZyBwZXJpb2RpYyBhbGFybXMuDQogIA0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgICAgDQogIEV4YW1wbGVzOg0KICANCiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSBhDQogIHNpbmdsZSBjYWxlbmRhciBhbGFybSBhdCBhIHNwZWNpZmljIGRhdGUgYW5kIHRpbWUuIFRoZSBhbGFybSB3aWxsIG9ubHkgb2NjdXINCiAgb25jZSBhbmQgdGhlIFJUQyB3aWxsIGtlZXAgaW5jcmVtZW50aW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsYXJtIHRha2luZyBwbGFjZS4NCiAgDQogIEBjb2RlDQogICAgY29uc3QgbXNzX3J0Y19jYWxlbmRhcl90IGluaXRpYWxfY2FsZW5kYXJfY291bnQgPQ0KICAgIHsNCiAgICAgICAgMTV1LCAgICAgc2Vjb25kDQogICAgICAgIDMwdSwgICAgIG1pbnV0ZQ0KICAgICAgICA2dSwgICAgICBob3VyDQogICAgICAgIDZ1LCAgICAgIGRheQ0KICAgICAgICA5dSwgICAgICBtb250aA0KICAgICAgICAxMnUsICAgICB5ZWFyDQogICAgICAgIDV1LCAgICAgIHdlZWtkYXkNCiAgICAgICAgMzd1ICAgICAgd2Vlaw0KICAgIH07DQogICAgDQogICAgbXNzX3J0Y19jYWxlbmRhcl90IGFsYXJtX2NhbGVuZGFyX2NvdW50ID0NCiAgICB7DQogICAgICAgIDE3dSwgICAgIHNlY29uZA0KICAgICAgICAzMHUsICAgICBtaW51dGUNCiAgICAgICAgNnUsICAgICAgaG91cg0KICAgICAgICA2dSwgICAgICBkYXkNCiAgICAgICAgOXUsICAgICAgbW9udGgNCiAgICAgICAgMTJ1LCAgICAgeWVhcg0KICAgICAgICA1dSwgICAgICB3ZWVrZGF5DQogICAgICAgIDM3dSAgICAgIHdlZWsNCiAgICB9Ow0KICAgIA0KICAgIE1TU19SVENfaW5pdChNU1NfUlRDX0NBTEVOREFSX01PREUsIFJUQ19QUkVTQ0FMRVIpOw0KICAgIE1TU19SVENfY2xlYXJfaXJxKCk7DQogICAgTVNTX1JUQ19zZXRfY2FsZW5kYXJfY291bnQoJmluaXRpYWxfY2FsZW5kYXJfY291bnQpOw0KICAgIE1TU19SVENfZW5hYmxlX2lycSgpOw0KICAgIE1TU19SVENfc3RhcnQoKTsNCiAgICANCiAgICBNU1NfUlRDX3NldF9jYWxlbmRhcl9jb3VudF9hbGFybSgmYWxhcm1fY2FsZW5kYXJfY291bnQpOw0KICBAZW5kY29kZQ0KICANCiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBjb25maWd1cmUgdGhlIFJUQyB0byBnZW5lcmF0ZSBhDQogIHBlcmlvZGljIGNhbGVuZGFyIGFsYXJtLiBUaGUgUlRDIGlzIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gYWxhcm0gZXZlcnkNCiAgVHVlc2RheSBhdCAxNjo0NTowMC4gVGhlIGFsYXJtIHdpbGwgcmVvY2N1ciBldmVyeSB3ZWVrIHVudGlsIHRoZSBSVEMgd2FrZXVwDQogIGludGVycnVwdCBpcyBkaXNhYmxlZCB1c2luZyBhIGNhbGwgdG8gTVNTX1JUQ19kaXNhYmxlX2lycSgpLg0KICANCiAgQGNvZGUNCiAgICBtc3NfcnRjX2NhbGVuZGFyX3QgaW5pdGlhbF9jYWxlbmRhcl9jb3VudCA9DQogICAgew0KICAgICAgICA1OHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLXNlY29uZA0KICAgICAgICA1OXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLW1pbnV0ZQ0KICAgICAgICAyM3UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLWhvdXINCiAgICAgICAgMTB1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS1kYXkNCiAgICAgICAgOXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS1tb250aA0KICAgICAgICAxMnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLXllYXINCiAgICAgICAgTVNTX1JUQ19NT05EQVksICAgICAgICAgICAgICAgICA8LS13ZWVrZGF5DQogICAgICAgIDM3dSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0td2Vlaw0KICAgIH07DQogICAgDQogICAgbXNzX3J0Y19jYWxlbmRhcl90IGFsYXJtX2NhbGVuZGFyX2NvdW50ID0NCiAgICB7DQogICAgICAgIE1TU19SVENfQ0FMRU5EQVJfRE9OVF9DQVJFLCAgICAgPC0tc2Vjb25kDQogICAgICAgIDQ1dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tbWludXRlDQogICAgICAgIDE2dSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0taG91cg0KICAgICAgICBNU1NfUlRDX0NBTEVOREFSX0RPTlRfQ0FSRSwgICAgIDwtLWRheQ0KICAgICAgICBNU1NfUlRDX0NBTEVOREFSX0RPTlRfQ0FSRSwgICAgIDwtLW1vbnRoDQogICAgICAgIE1TU19SVENfQ0FMRU5EQVJfRE9OVF9DQVJFLCAgICAgPC0teWVhcg0KICAgICAgICBNU1NfUlRDX1RVRVNEQVksICAgICAgICAgICAgICAgIDwtLXdlZWtkYXkNCiAgICAgICAgTVNTX1JUQ19DQUxFTkRBUl9ET05UX0NBUkUgICAgICA8LS13ZWVrDQogICAgfTsNCiAgICANCiAgICBNU1NfUlRDX2luaXQoTVNTX1JUQ19DQUxFTkRBUl9NT0RFLCBSVENfUFJFU0NBTEVSKTsNCiAgICBNU1NfUlRDX3NldF9jYWxlbmRhcl9jb3VudCgmaW5pdGlhbF9jYWxlbmRhcl9jb3VudCk7DQogICAgTVNTX1JUQ19lbmFibGVfaXJxKCk7DQogICAgTVNTX1JUQ19zdGFydCgpOw0KICAgIA0KICAgIE1TU19SVENfc2V0X2NhbGVuZGFyX2NvdW50X2FsYXJtKCZhbGFybV9jYWxlbmRhcl9jb3VudCk7DQogIEBlbmRjb2RlDQogIA0KICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgdGhlIGNvZGUgdGhhdCB5b3UgbmVlZCB0byBpbmNsdWRlIGluDQogIHlvdXIgYXBwbGljYXRpb24gdG8gaGFuZGxlIGFsYXJtcy4gSXQgaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoZQ0KICBSVEMgd2FrZXVwIGludGVycnVwdCBpbnB1dCB0byB0aGUgQ29ydGV4LU0zIE5WSUMuIFlvdSBuZWVkIHRvIGFkZCB5b3VyDQogIGFwcGxpY2F0aW9uIGNvZGUgaW4gdGhpcyBmdW5jdGlvbiBpbiBwbGFjZSBvZiB0aGUgcHJvY2Vzc19hbGFybSgpIGZ1bmN0aW9uIGJ1dA0KICB5b3UgbXVzdCByZXRhaW4gdGhlIGNhbGwgdG8gTVNTX1JUQ19jbGVhcl9pcnEoKSB0byBlbnN1cmUgdGhhdCB0aGUgc2FtZSBhbGFybQ0KICBkb2VzIG5vdCByZXRyaWdnZXIgdGhlIGludGVycnVwdC4NCiAgDQogIEBjb2RlDQogICAgI2lmIGRlZmluZWQoX19HTlVDX18pDQogICAgX19hdHRyaWJ1dGVfXygoX19pbnRlcnJ1cHRfXykpIHZvaWQgUlRDX1dha2V1cF9JUlFIYW5kbGVyKCB2b2lkICkNCiAgICAjZWxzZQ0KICAgIHZvaWQgUlRDX1dha2V1cF9JUlFIYW5kbGVyKCB2b2lkICkNCiAgICAjZW5kaWYNCiAgICB7DQogICAgICAgIHByb2Nlc3NfYWxhcm0oKTsNCiAgICAgICAgTVNTX1JUQ19jbGVhcl9pcnEoKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgTVNTX1JUQ19zZXRfY2FsZW5kYXJfY291bnRfYWxhcm0NCigNCiAgICBjb25zdCBtc3NfcnRjX2NhbGVuZGFyX3QgKiBhbGFybV92YWx1ZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19SVENfc2V0X2JpbmFyeV9jb3VudF9hbGFybSgpIGZ1bmN0aW9uIHNldHMgdXAgdGhlIFJUQyB0byBnZW5lcmF0ZSBhbg0KICBhbGFybSB3aGVuIHRoZSBSVEMgY291bnQgcmVhY2hlcyB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSBhbGFybV92YWx1ZQ0KICBwYXJhbWV0ZXIuIFRoZSBhbGFybSBhc3NlcnRzIGEgd2FrZXVwIGludGVycnVwdCB0byB0aGUgQ29ydGV4LU0zLiBUaGlzDQogIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIFJUQ5JzIHdha2V1cCBpbnRlcnJ1cHQgb3V0cHV0LCBob3dldmVyIHRoZSBSVEMgd2FrZXVwDQogIGludGVycnVwdCBpbnB1dCB0byB0aGUgQ29ydGV4LU0zIE5WSUMgbXVzdCBiZSBlbmFibGVkIHNlcGFyYXRlbHkgYnkgY2FsbGluZw0KICB0aGUgTVNTX1JUQ19lbmFibGVfaXJxKCkgZnVuY3Rpb24uIFRoZSBhbGFybSBjYW4gYmUgZGlzYWJsZWQgYXQgYW55IHRpbWUgYnkNCiAgY2FsbGluZyB0aGUgTVNTX1JUQ19kaXNhYmxlX2lycSgpIGZ1bmN0aW9uLg0KDQogIFNpbmdsZS1zaG90IGFsYXJtDQogIFRoZSBhbGFybSBjYW4gYmUgYSBzaW5nbGUtc2hvdCBhbGFybSwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3YWtldXANCiAgaW50ZXJydXB0IHRoZSBmaXJzdCB0aW1lIHRoZSBSVEMgY291bnQgcmVhY2hlcyB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQ0KICBhbGFybV92YWx1ZSBwYXJhbWV0ZXIuIFNldHRpbmcgdGhlIGFsYXJtX3ZhbHVlIHBhcmFtZXRlciB0bw0KICBNU1NfUlRDX1BFUklPRElDX0FMQVJNIHByb2R1Y2VzIGEgc2luZ2xlLXNob3QgYWxhcm0uIFRoZSBSVEMgY291bnRlciBjb250aW51ZXMNCiAgaW5jcmVtZW50aW5nIHdoZW4gYSBzaW5nbGUgc2hvdCBhbGFybSBvY2N1cnMuDQoNCiAgUGVyaW9kaWMgYWxhcm0NCiAgVGhlIGFsYXJtIGNhbiBhbHNvIGJlIGEgcGVyaW9kaWMgYWxhcm0sIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYSB3YWtldXAgaW50ZXJydXB0DQogIGV2ZXJ5IHRpbWUgdGhlIFJUQyBjb3VudCByZWFjaGVzIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGFsYXJtX3ZhbHVlDQogIHBhcmFtZXRlci4gU2V0dGluZyB0aGUgYWxhcm1fdmFsdWUgcGFyYW1ldGVyIHRvIE1TU19SVENfU0lOR0xFX1NIT1RfQUxBUk0NCiAgcHJvZHVjZXMgYSBwZXJpb2RpYyBhbGFybS4gVGhlIFJUQyBjb3VudGVyIGF1dG9tYXRpY2FsbHkgd3JhcHMgYXJvdW5kIHRvIHplcm8NCiAgYW5kIGNvbnRpbnVlcyBpbmNyZW1lbnRpbmcgd2hlbiBhIHBlcmlvZGljIGFsYXJtIG9jY3Vycy4NCiAgTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBSVEMgaXMgY29uZmlndXJlZCB0byBvcGVyYXRlIGluDQogICAgICAgIGJpbmFyeSBjb3VudGVyIG1vZGUNCiAgDQogIEBwYXJhbSBhbGFybV92YWx1ZQ0KICAgIFRoZSBhbGFybV92YWx1ZSBwYXJhbWV0ZXIgaXMgYSA2NC1iaXQgdW5zaWduZWQgdmFsdWUgc3BlY2lmeWluZyB0aGUgUlRDDQogICAgY291bnRlciB2YWx1ZSB0aGF0IG11c3QgYmUgcmVhY2hlZCBmb3IgdGhlIHJlcXVlc3RlZCBhbGFybSB0byBvY2N1ci4NCiAgDQogIEBwYXJhbSBhbGFybV90eXBlDQogICAgVGhlIGFsYXJtX3R5cGUgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgYWxhcm0gaXMgYSBzaW5nbGUNCiAgICBzaG90IG9yIHBlcmlvZGljIGFsYXJtLiBJdCBjYW4gb25seSB0YWtlIG9uZSBvZiB0aGVzZSB0d28gdmFsdWVzOg0KICAgICAtIE1TU19SVENfU0lOR0xFX1NIT1RfQUxBUk0sDQogICAgIC0gTVNTX1JUQ19QRVJJT0RJQ19BTEFSTQ0KICANCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKi8NCnZvaWQgTVNTX1JUQ19zZXRfYmluYXJ5X2NvdW50X2FsYXJtDQooDQogICAgdWludDY0X3QgYWxhcm1fdmFsdWUsDQogICAgbXNzX3J0Y19hbGFybV90eXBlX3QgYWxhcm1fdHlwZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19SVENfZ2V0X3VwZGF0ZV9mbGFnKCkgZnVuY3Rpb24gaW5kaWNhdGVzIGlmIHRoZSBSVEMgY291bnRlciBoYXMNCiAgaW5jcmVtZW50ZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBNU1NfUlRDX2NsZWFyX3VwZGF0ZV9mbGFnKCkuIEl0IHJldHVybnMNCiAgemVybyBpZiBubyBSVEMgY291bnRlciBpbmNyZW1lbnQgaGFzIG9jY3VycmVkLiBJdCByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYNCiAgdGhlIFJUQyBjb3VudGVyIGhhcyBpbmNyZW1lbnRlZC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB3aGV0aGVyIHRoZSBSVEMgaXMNCiAgY29uZmlndXJlZCB0byBvcGVyYXRlIGluIGNhbGVuZGFyIG9yIGJpbmFyeSBjb3VudGVyIG1vZGUuDQogIA0KICBAcmV0dXJuDQogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMsIA0KICAgemVybzogICAgIGlmIHRoZSBSVEMgaGFzIG5vdCBpbmNyZW1lbnRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvDQogICAgICAgICAgICAgTVNTX1JUQ19jbGVhcl91cGRhdGVfZmxhZygpLCANCiAgIG5vbi16ZXJvOiBpZiB0aGUgUlRDIGhhcyBpbmNyZW1lbnRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvDQogICAgICAgICAgICAgTVNTX1JUQ19jbGVhcl91cGRhdGVfZmxhZygpLg0KDQogICANCiAgRXhhbXBsZQ0KICBUaGlzIGV4YW1wbGUgd2FpdHMgZm9yIHRoZSBSVEMgdGltZXIgdG8gaW5jcmVtZW50IGJ5IG9uZSBzZWNvbmQuDQogIEBjb2RlDQogICAgdm9pZCB3YWl0X3N0YXJ0X29mX3NlY29uZCh2b2lkKQ0KICAgIHsNCiAgICAgICAgdWludDMyX3QgcnRjX2NvdW50X3VwZGF0ZWQ7DQogICAgICAgIE1TU19SVENfY2xlYXJfdXBkYXRlX2ZsYWcoKTsNCiAgICAgICAgZG8gew0KICAgICAgICAgICAgcnRjX2NvdW50X3VwZGF0ZWQgPSBNU1NfUlRDX2dldF91cGRhdGVfZmxhZygpOw0KICAgICAgICB9IHdoaWxlKCFydGNfY291bnRfdXBkYXRlZCkNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnVpbnQzMl90IE1TU19SVENfZ2V0X3VwZGF0ZV9mbGFnKHZvaWQpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgTVNTX1JUQ19jbGVhcl91cGRhdGVfZmxhZygpIGZ1bmN0aW9uIGNsZWFycyB0aGUgQ09OVFJPTCByZWdpc3RlciBmbGFnIHRoYXQNCiAgaXMgc2V0IHdoZW4gdGhlIFJUQyBjb3VudGVyIGluY3JlbWVudHMuIEl0IGlzIHVzZWQgYWxvbmdzaWRlIGZ1bmN0aW9uDQogIE1TU19SVENfZ2V0X3VwZGF0ZV9mbGFnKCkgdG8gZGV0ZWN0IFJUQyBjb3VudGVyIGluY3JlbWVudHMuDQogIA0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgICANCiAgRXhhbXBsZQ0KICBUaGUgZXhhbXBsZSBiZWxvdyB3aWxsIHdhaXQgZm9yIHRoZSBSVEMgdGltZXIgdG8gaW5jcmVtZW50IGJ5IG9uZSBzZWNvbmQuDQogIEBjb2RlDQogIHZvaWQgd2FpdF9zdGFydF9vZl9zZWNvbmQodm9pZCkNCiAgew0KICAgICAgdWludDMyX3QgcnRjX2NvdW50X3VwZGF0ZWQ7DQogICAgICBNU1NfUlRDX2NsZWFyX3VwZGF0ZV9mbGFnKCk7DQogICAgICBkbyB7DQogICAgICAgICAgcnRjX2NvdW50X3VwZGF0ZWQgPSBNU1NfUlRDX2dldF91cGRhdGVfZmxhZygpOw0KICAgICAgfSB3aGlsZSghcnRjX2NvdW50X3VwZGF0ZWQpDQogIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBNU1NfUlRDX2NsZWFyX3VwZGF0ZV9mbGFnKHZvaWQpOw0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZW5kaWYgLyogTVNTX1JUQ19IXyAqLw0K