LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDE1IE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2UgZm9yIHRoZSBDb3JlMTY1NTANCiAqIGJhcmUgbWV0YWwgZHJpdmVyLg0KICoNCiAqIFNWTiAkUmV2aXNpb246IDc5NjMgJA0KICogU1ZOICREYXRlOiAyMDE1LTEwLTA5IDE3OjU4OjIxICswNTMwIChGcmksIDA5IE9jdCAyMDE1KSAkDQogKi8NCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovLyoqDQogIEBtYWlucGFnZSBDb3JlMTY1NTAgQmFyZSBNZXRhbCBEcml2ZXIuDQoNCiAgQHNlY3Rpb24gaW50cm9fc2VjIEludHJvZHVjdGlvbg0KICBUaGUgQ29yZTE2NTUwIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml2ZXJzYWwgQXN5bmNocm9ub3VzDQogIFJlY2VpdmVyL1RyYW5zbWl0dGVyIGFpbWVkIGF0IGNvbXBsZXRlIGNvbXBsaWFuY2UgdG8gc3RhbmRhcmQgMTY1NTAgVUFSVC4NCiAgVGhlIENvcmUxNjU1MCBiYXJlIG1ldGFsIHNvZnR3YXJlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdXNlIGluIHN5c3RlbXMNCiAgd2l0aCBubyBvcGVyYXRpbmcgc3lzdGVtLg0KDQogIFRoZSBDb3JlMTY1NTAgZHJpdmVyIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgcG9sbGVkIGFuZCBpbnRlcnJ1cHQgZHJpdmVuDQogIHRyYW5zbWl0dGluZyBhbmQgcmVjZWl2aW5nLiBJdCBhbHNvIHByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyB0aGUNCiAgdmFsdWVzIGZyb20gZGlmZmVyZW50IHN0YXR1cyByZWdpc3RlcnMsIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgaW50ZXJydXB0cw0KICBhdCBDb3JlMTY1NTAgbGV2ZWwuIFRoZSBDb3JlMTY1NTAgZHJpdmVyIGlzIHByb3ZpZGVkIGFzIEMgc291cmNlIGNvZGUuDQoNCiAgQHNlY3Rpb24gZHJpdmVyX2NvbmZpZ3VyYXRpb24gRHJpdmVyIENvbmZpZ3VyYXRpb24NCiAgWW91ciBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgY29uZmlndXJlIHRoZSBDb3JlMTY1NTAgZHJpdmVyIHRocm91Z2gNCiAgY2FsbHMgdG8gdGhlIFVBUlRfMTY1NTBfaW5pdCgpIGZ1bmN0aW9uIGZvciBlYWNoIENvcmUxNjU1MCBpbnN0YW5jZSBpbg0KICB0aGUgaGFyZHdhcmUgZGVzaWduLiBUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluY2x1ZGUgdGhlIENvcmUxNjU1MA0KICBoYXJkd2FyZSBpbnN0YW5jZSBiYXNlIGFkZHJlc3MgYW5kIG90aGVyIHJ1bnRpbWUgcGFyYW1ldGVycywgc3VjaCBhcyBiYXVkDQogIHZhbHVlLCBiaXQgd2lkdGgsIGFuZCBwYXJpdHkuDQoNCiAgTm8gQ29yZTE2NTUwIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbmVlZGVkIGJ5IHRoZSBkcml2ZXIsDQogIGFwYXJ0IGZyb20gdGhlIENvcmUxNjU1MCBoYXJkd2FyZSBpbnN0YW5jZSBiYXNlIGFkZHJlc3MuIEhlbmNlLCBubw0KICBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHVzZSB0aGUgZHJpdmVyLg0KDQogIEBzZWN0aW9uIHRoZW9yeV9vcCBUaGVvcnkgb2YgT3BlcmF0aW9uDQogIFRoZSBDb3JlMTY1NTAgc29mdHdhcmUgZHJpdmVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBjb250cm9sIG9mIG11bHRpcGxlDQogIGluc3RhbmNlcyBvZiBDb3JlMTY1NTAuIEVhY2ggaW5zdGFuY2Ugb2YgQ29yZTE2NTUwIGluIHRoZSBoYXJkd2FyZSBkZXNpZ24NCiAgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSB1YXJ0XzE2NTUwX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogIGluIHRoZSBzb2Z0d2FyZS4gWW91IG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvbmUgdW5pcXVlDQogIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgaW5zdGFuY2UgZm9yIGVhY2ggQ29yZTE2NTUwIGhhcmR3YXJlIGluc3RhbmNlLg0KICBUaGUgY29udGVudHMgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBkdXJpbmcgY2FsbHMgdG8NCiAgZnVuY3Rpb24gVUFSVF8xNjU1MF9pbml0KCkuIEEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGlzIHBhc3NlZCB0bw0KICBzdWJzZXF1ZW50IGRyaXZlciBmdW5jdGlvbnMgaW4gb3JkZXIgdG8gaWRlbnRpZnkgdGhlIENvcmUxNjU1MCBoYXJkd2FyZQ0KICBpbnN0YW5jZSB5b3Ugd2lzaCB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIG9uLg0KDQogIE5vdGU6ICAgICBEbyBub3QgYXR0ZW1wdCB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBjb250ZW50IG9mDQogIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmVzLiBUaGlzIHN0cnVjdHVyZSBpcyBvbmx5IGludGVuZGVkIHRvIGJlDQogIG1vZGlmaWVkIGJ5IHRoZSBkcml2ZXIgZnVuY3Rpb24uDQoNCiAgSW5pdGlhbGl6YXRpb24NCiAgVGhlIENvcmUxNjU1MCBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBhIGNhbGwgdG8gdGhlIFVBUlRfMTY1NTBfaW5pdCgpDQogIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBVQVJUknMgY29uZmlndXJhdGlvbiBhcyBwYXJhbWV0ZXJzLg0KICBUaGUgVUFSVF8xNjU1MF9pbml0KCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBDb3JlMTY1NTANCiAgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLg0KDQogIFBvbGxlZCBUcmFuc21pc3Npb24gYW5kIFJlY2VwdGlvbg0KICBUaGUgZHJpdmVyIGNhbiBiZSB1c2VkIHRvIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRhdGEgb25jZSBpbml0aWFsaXplZC4gUG9sbGVkDQogIG9wZXJhdGlvbnMgd2hlcmUgdGhlIGRyaXZlciBjb25zdGFudGx5IHBvbGxzIHRoZSBzdGF0ZSBvZiB0aGUgVUFSVCByZWdpc3RlcnMNCiAgaW4gb3JkZXIgdG8gY29udHJvbCBkYXRhIHRyYW5zbWl0IG9yIGRhdGEgcmVjZWl2ZSBhcmUgcGVyZm9ybWVkIHVzaW5nIHRoZXNlDQogIGZ1bmN0aW9uczoNCiAgICAgICAgIJUgIFVBUlRfMTY1NTBfcG9sbGVkX3R4KCkNCiAgICAgICAgIJUgIFVBUlRfMTY1NTBfcG9sbGVkX3R4X3N0cmluZw0KICAgICAgICAglSAgVUFSVF8xNjU1MF9maWxsX3R4X2ZpZm8oKQ0KICAgICAgICAglSAgVUFSVF8xNjU1MF9nZXRfcngoKQ0KDQogIERhdGEgaXMgdHJhbnNtaXR0ZWQgdXNpbmcgdGhlIFVBUlRfMTY1NTBfcG9sbGVkX3R4KCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24NCiAgaXMgYmxvY2tpbmcsIG1lYW5pbmcgdGhhdCBpdCB3aWxsIG9ubHkgcmV0dXJuIG9uY2UgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZQ0KICBmdW5jdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSBDb3JlMTY1NTAgaGFyZHdhcmUuIERhdGEgcmVjZWl2ZWQgYnkgdGhlDQogIENvcmUxNjU1MCBoYXJkd2FyZSBjYW4gYmUgcmVhZCBieSB0aGUgVUFSVF8xNjU1MF9nZXRfcngoKSBmdW5jdGlvbi4NCg0KICBUaGUgVUFSVF8xNjU1MF9wb2xsZWRfdHhfc3RyaW5nKCkgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gdHJhbnNtaXQgYSBOVUxMICiRXDCSKQ0KICB0ZXJtaW5hdGVkIHN0cmluZyBpbiBwb2xsZWQgbW9kZS4gVGhpcyBmdW5jdGlvbiBpcyBibG9ja2luZywgbWVhbmluZyB0aGF0IGl0DQogIHdpbGwgb25seSByZXR1cm4gb25jZSB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIHNlbnQgdG8gdGhlDQogIENvcmUxNjU1MCBoYXJkd2FyZS4NCg0KICBUaGUgVUFSVF8xNjU1MF9maWxsX3R4X2ZpZm8oKSBmdW5jdGlvbiBmaWxscyB0aGUgQ29yZTE2NTUwIGhhcmR3YXJlIHRyYW5zbWl0DQogIEZJRk8gd2l0aCBkYXRhIGZyb20gYSBidWZmZXIgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YNCiAgYnl0ZXMgdHJhbnNmZXJyZWQgdG8gdGhlIEZJRk8uIElmIHRoZSB0cmFuc21pdCBGSUZPIGlzIG5vdCBlbXB0eSB3aGVuIHRoZQ0KICBVQVJUXzE2NTUwX2ZpbGxfdHhfZmlmbygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBpdCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQNCiAgdHJhbnNmZXJyaW5nIGFueSBkYXRhIHRvIHRoZSBGSUZPLg0KDQogIEludGVycnVwdCBEcml2ZW4gT3BlcmF0aW9ucw0KICBUaGUgZHJpdmVyIGNhbiBhbHNvIHRyYW5zbWl0IG9yIHJlY2VpdmUgZGF0YSB1bmRlciBpbnRlcnJ1cHQgY29udHJvbCwgZnJlZWluZw0KICB5b3VyIGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0gb3RoZXIgdGFza3MgdW50aWwgYW4gaW50ZXJydXB0IG9jY3VycyBpbmRpY2F0aW5nDQogIHRoYXQgdGhlIGRyaXZlcpJzIGF0dGVudGlvbiBpcyByZXF1aXJlZC4gSW50ZXJydXB0IGNvbnRyb2xsZWQgVUFSVCBvcGVyYXRpb25zDQogIGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlc2UgZnVuY3Rpb25zOg0KICAgICAgICCVICAgVUFSVF8xNjU1MF9pc3IoKQ0KICAgICAgICCVICAgVUFSVF8xNjU1MF9pcnFfdHgoKQ0KICAgICAgICCVICAgVUFSVF8xNjU1MF90eF9jb21wbGV0ZSgpDQogICAgICAgIJUgICBVQVJUXzE2NTUwX3NldF90eF9oYW5kbGVyKCkNCiAgICAgICAglSAgIFVBUlRfMTY1NTBfc2V0X3J4X2hhbmRsZXIoKQ0KICAgICAgICCVICAgVUFSVF8xNjU1MF9zZXRfcnhzdGF0dXNfaGFuZGxlcigpDQogICAgICAgIJUgICBVQVJUXzE2NTUwX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkNCiAgICAgICAglSAgIFVBUlRfMTY1NTBfZW5hYmxlX2lycSgpDQogICAgICAgIJUgICBVQVJUXzE2NTUwX2Rpc2FibGVfaXJxKCkNCg0KICBJbnRlcnJ1cHQgSGFuZGxlcnMNCiAgVGhlIFVBUlRfMTY1NTBfaXNyKCkgZnVuY3Rpb24gaXMgdGhlIHRvcCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiBmb3INCiAgdGhlIENvcmUxNjU1MCBkcml2ZXIuIFlvdSBtdXN0IGNhbGwgaXQgZnJvbSB0aGUgc3lzdGVtIGxldmVsDQogIChDb3JlSW50ZXJydXB0IGFuZCBOVklDIGxldmVsKSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIChJU1IpIGFzc2lnbmVkIHRvIHRoZQ0KICBpbnRlcnJ1cHQgdHJpZ2dlcmVkIGJ5IHRoZSBDb3JlMTY1NTAgSU5UUiBzaWduYWwuIFRoZSBVQVJUXzE2NTUwX2lzcigpIGZ1bmN0aW9uDQogIGlkZW50aWZpZXMgdGhlIHNvdXJjZSBvZiB0aGUgQ29yZTE2NTUwIGludGVycnVwdCBhbmQgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcNCiAgaGFuZGxlciBmdW5jdGlvbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgZHJpdmVyIHRocm91Z2ggY2FsbHMgdG8gdGhlDQogIFVBUlRfMTY1NTBfc2V0X3J4X2hhbmRsZXIoKSwgVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpLA0KICBVQVJUXzE2NTUwX3NldF9yeHN0YXR1c19oYW5kbGVyKCksIGFuZCBVQVJUXzE2NTUwX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkNCiAgZnVuY3Rpb25zLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGVzZSBsb3dlciBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlcnMNCiAgYXMgcGFydCBvZiB5b3VyIGFwcGxpY2F0aW9uIHByb2dyYW0gYW5kIHJlZ2lzdGVyaW5nIHRoZW0gd2l0aCB0aGUgZHJpdmVyLg0KICBUaGUgVUFSVF8xNjU1MF9lbmFibGVfaXJxKCkgYW5kIFVBUlRfMTY1NTBfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8NCiAgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlY2VpdmVkIGxpbmUgc3RhdHVzLCByZWNlaXZlZCBkYXRhIGF2YWlsYWJsZS9jaGFyYWN0ZXINCiAgdGltZW91dCwgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgYXQgdGhlDQogIENvcmUxNjU1MCBsZXZlbC4NCg0KICBUcmFuc21pdHRpbmcgRGF0YQ0KICBJbnRlcnJ1cHQtZHJpdmVuIHRyYW5zbWl0IGlzIGluaXRpYXRlZCBieSBhIGNhbGwgdG8gVUFSVF8xNjU1MF9pcnFfdHgoKSwNCiAgc3BlY2lmeWluZyB0aGUgYmxvY2sgb2YgZGF0YSB0byB0cmFuc21pdC4gWW91ciBhcHBsaWNhdGlvbiBpcyB0aGVuIGZyZWUgdG8NCiAgcGVyZm9ybSBvdGhlciB0YXNrcyBhbmQgaW5xdWlyZSBsYXRlciB3aGV0aGVyIHRyYW5zbWl0IGhhcyBjb21wbGV0ZWQgYnkgY2FsbGluZw0KICB0aGUgVUFSVF8xNjU1MF90eF9jb21wbGV0ZSgpIGZ1bmN0aW9uLiBUaGUgVUFSVF8xNjU1MF9pcnFfdHgoKSBmdW5jdGlvbiBlbmFibGVzDQogIHRoZSBVQVJUknMgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSAoVEhSRSkgaW50ZXJydXB0IGFuZCB0aGVuLCB3aGVuIHRoZQ0KICBpbnRlcnJ1cHQgZ29lcyBhY3RpdmUsIHRoZSBkcml2ZXKScyBkZWZhdWx0IFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgdHJhbnNmZXJzDQogIHRoZSBkYXRhIGJsb2NrIHRvIHRoZSBVQVJUIHVudGlsIHRoZSBlbnRpcmUgYmxvY2sgaXMgdHJhbnNtaXR0ZWQuDQoNCiAgTm90ZTogICAgIFlvdSBjYW4gdXNlIHRoZSBVQVJUXzE2NTUwX3NldF90eF9oYW5kbGVyKCkgZnVuY3Rpb24gdG8gYXNzaWduIGFuDQogIGFsdGVybmF0aXZlIGhhbmRsZXIgdG8gdGhlIFRIUkUgaW50ZXJydXB0LiBJbiB0aGlzIGNhc2UsIHlvdSBtdXN0IG5vdCB1c2UgdGhlDQogIFVBUlRfMTY1NTBfaXJxX3R4KCkgZnVuY3Rpb24gdG8gaW5pdGlhdGUgdGhlIHRyYW5zbWl0LCBhcyB0aGlzIHdpbGwgcmUtYXNzaWduDQogIHRoZSBkcml2ZXKScyBkZWZhdWx0IFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgdG8gdGhlIFRIUkUgaW50ZXJydXB0LiBJbnN0ZWFkLA0KICB5b3VyIGFsdGVybmF0aXZlIFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgbXVzdCBpbmNsdWRlIGEgY2FsbCB0byB0aGUNCiAgVUFSVF8xNjU1MF9maWxsX3R4X2ZpZm8oKSBmdW5jdGlvbiB0byB0cmFuc2ZlciB0aGUgZGF0YSB0byB0aGUgVUFSVC4NCg0KICBSZWNlaXZpbmcgRGF0YQ0KICBJbnRlcnJ1cHQtZHJpdmVuIHJlY2VpdmUgaXMgcGVyZm9ybWVkIGJ5IGZpcnN0IGNhbGxpbmcgVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlcigpDQogIHRvIHJlZ2lzdGVyIGEgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuZXZlcg0KICByZWNlaXZlIGRhdGEgaXMgYXZhaWxhYmxlLiBZb3UgbXVzdCBwcm92aWRlIHRoaXMgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9uIHdoaWNoDQogIG11c3QgaW5jbHVkZSBhIGNhbGwgdG8gdGhlIFVBUlRfMTY1NTBfZ2V0X3J4KCkgZnVuY3Rpb24gdG8gYWN0dWFsbHkgcmVhZCB0aGUNCiAgcmVjZWl2ZWQgZGF0YS4NCg0KICBVQVJUIFN0YXR1cw0KICBUaGUgZnVuY3Rpb24gVUFSVF8xNjU1MF9nZXRfcnhfc3RhdHVzKCkgaXMgdXNlZCB0byByZWFkIHRoZSByZWNlaXZlciBlcnJvciBzdGF0dXMuDQogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgb3ZlcnJ1biwgcGFyaXR5LCBmcmFtaW5nLCBicmVhaywgYW5kIEZJRk8gZXJyb3Igc3RhdHVzDQogIG9mIHRoZSByZWNlaXZlci4NCiAgVGhlIGZ1bmN0aW9uIFVBUlRfMTY1NTBfZ2V0X3R4X3N0YXR1cygpIGlzIHVzZWQgdG8gcmVhZCB0aGUgdHJhbnNtaXR0ZXIgc3RhdHVzLg0KICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRyYW5zbWl0IGVtcHR5IChURU1UKSBhbmQgdHJhbnNtaXQgaG9sZGluZyByZWdpc3Rlcg0KICBlbXB0eSAoVEhSRSkgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlci4NCiAgVGhlIGZ1bmN0aW9uIFVBUlRfMTY1NTBfZ2V0X21vZGVtX3N0YXR1cygpIGlzIHVzZWQgdG8gcmVhZCB0aGUgbW9kZW0gc3RhdHVzIGZsYWdzLg0KICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIG1vZGVtIHN0YXR1cyByZWdpc3Rlci4NCg0KICBMb29wYmFjaw0KICBUaGUgZnVuY3Rpb24gVUFSVF8xNjU1MF9zZXRfbG9vcGJhY2soKSBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIGxvb3BiYWNrDQogIGJldHdlZW4gVHggYW5kIFJ4IGxpbmVzIGludGVybmFsIHRvIENvcmUxNjU1MC4NCiovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCiNpZm5kZWYgX19DT1JFXzE2NTUwX0gNCiNkZWZpbmUgX19DT1JFXzE2NTUwX0ggMQ0KDQojaW5jbHVkZSAiY3B1X3R5cGVzLmgiDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIiB7DQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFJlY2VpdmVyIEVycm9yIFN0YXR1cw0KICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgVUFSVCByZWNlaXZlciBlcnJvciB0eXBlLg0KICogVGhlc2UgYml0IG1hc2sgY29uc3RhbnRzIGFyZSB1c2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUNCiAqIFVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cygpIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IGlmIGFueSBlcnJvcnMgb2NjdXJyZWQNCiAqIHdoaWxlIHJlY2VpdmluZyBkYXRhLg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfTk9fRVJST1IgICAgICAgICAoICh1aW50OF90KSAweDAwICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9PVkVSUlVOX0VSUk9SICAgICggKHVpbnQ4X3QpIDB4MDIgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX1BBUklUWV9FUlJPUiAgICAgKCAodWludDhfdCkgMHgwNCApDQojZGVmaW5lIFVBUlRfMTY1NTBfRlJBTUlOR19FUlJPUiAgICAoICh1aW50OF90KSAweDA4ICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9CUkVBS19FUlJPUiAgICAgICggKHVpbnQ4X3QpIDB4MTAgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX0ZJRk9fRVJST1IgICAgICAgKCAodWludDhfdCkgMHg4MCApDQojZGVmaW5lIFVBUlRfMTY1NTBfSU5WQUxJRF9QQVJBTSAgICAoICh1aW50OF90KSAweEZGICkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIE1vZGVtIFN0YXR1cw0KICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbW9kZW0gc3RhdHVzLiBUaGVzZSBiaXQNCiAqIG1hc2sgY29uc3RhbnRzIGFyZSB1c2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUNCiAqIFVBUlRfMTY1NTBfZ2V0X21vZGVtX3N0YXR1cygpIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBtb2RlbSBzdGF0dXMgb2YNCiAqIHRoZSBVQVJULg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfRENUUyAgICAgICAgICAgICAoICh1aW50OF90KSAweDAxICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9ERFNSICAgICAgICAgICAgICggKHVpbnQ4X3QpIDB4MDIgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX1RFUkkgICAgICAgICAgICAgKCAodWludDhfdCkgMHgwNCApDQojZGVmaW5lIFVBUlRfMTY1NTBfRERDRCAgICAgICAgICAgICAoICh1aW50OF90KSAweDA4ICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9DVFMgICAgICAgICAgICAgICggKHVpbnQ4X3QpIDB4MTAgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX0RTUiAgICAgICAgICAgICAgKCAodWludDhfdCkgMHgyMCApDQojZGVmaW5lIFVBUlRfMTY1NTBfUkkgICAgICAgICAgICAgICAoICh1aW50OF90KSAweDQwICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9EQ0QgICAgICAgICAgICAgICggKHVpbnQ4X3QpIDB4ODAgKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogVHJhbnNtaXR0ZXIgU3RhdHVzDQogKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgVUFSVCB0cmFuc21pdHRlciBzdGF0dXMuDQogKiBUaGVzZSBiaXQgbWFzayBjb25zdGFudHMgYXJlIHVzZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQ0KICogVUFSVF8xNjU1MF9nZXRfdHhfc3RhdHVzKCkgZnVuY3Rpb24gdG8gZmluZCBvdXQgdGhlIHN0YXR1cyBvZiB0aGUNCiAqIHRyYW5zbWl0dGVyLg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfVFhfQlVTWSAgICAgICAgICAoICh1aW50OF90KSAweDAwICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9USFJFICAgICAgICAgICAgICggKHVpbnQ4X3QpIDB4MjAgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX1RFTVQgICAgICAgICAgICAgKCAodWludDhfdCkgMHg0MCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBDb3JlMTY1NTAgSW50ZXJydXB0cw0KICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIHRvIGVuYWJsZSBhbmQgZGlzYWJsZSBDb3JlMTY1NTAgaW50ZXJydXB0cy4NCiAqIFRoZXkgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgZm9yIHRoZQ0KICogVUFSVF8xNjU1MF9lbmFibGVfaXJxKCkgYW5kIFVBUlRfMTY1NTBfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbnMuIEEgYml0d2lzZQ0KICogT1Igb2YgdGhlc2UgY29uc3RhbnRzIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgbXVsdGlwbGUgaW50ZXJydXB0cy4NCiAqLw0KI2RlZmluZSBVQVJUXzE2NTUwX1JCRl9JUlEgICAgICAgICAgKCAodWludDhfdCkgMHgwMSApDQojZGVmaW5lIFVBUlRfMTY1NTBfVEJFX0lSUSAgICAgICAgICAoICh1aW50OF90KSAweDAyICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9MU19JUlEgICAgICAgICAgICggKHVpbnQ4X3QpIDB4MDQgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX01TX0lSUSAgICAgICAgICAgKCAodWludDhfdCkgMHgwOCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBEYXRhIFdpZHRoDQogKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBVQVJUXzE2NTUwX2luaXQoKQ0KICogZnVuY3Rpb24gbGluZV9jb25maWcgcGFyYW1ldGVyLg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfREFUQV81X0JJVFMgICAgICAoICh1aW50OF90KSAweDAwICkNCiNkZWZpbmUgVUFSVF8xNjU1MF9EQVRBXzZfQklUUyAgICAgICggKHVpbnQ4X3QpIDB4MDEgKQ0KI2RlZmluZSBVQVJUXzE2NTUwX0RBVEFfN19CSVRTICAgICAgKCAodWludDhfdCkgMHgwMiApDQojZGVmaW5lIFVBUlRfMTY1NTBfREFUQV84X0JJVFMgICAgICAoICh1aW50OF90KSAweDAzICkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFBhcml0eSBDb250cm9sDQogKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBVQVJUXzE2NTUwX2luaXQoKQ0KICogZnVuY3Rpb24gbGluZV9jb25maWcgcGFyYW1ldGVyLg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfTk9fUEFSSVRZICAgICAgICAgICAgKCAodWludDhfdCkgMHgwMCApDQojZGVmaW5lIFVBUlRfMTY1NTBfT0REX1BBUklUWSAgICAgICAgICAgKCAodWludDhfdCkgMHgwOCApDQojZGVmaW5lIFVBUlRfMTY1NTBfRVZFTl9QQVJJVFkgICAgICAgICAgKCAodWludDhfdCkgMHgxOCApDQojZGVmaW5lIFVBUlRfMTY1NTBfU1RJQ0tfUEFSSVRZXzEgICAgICAgKCAodWludDhfdCkgMHgyOCApDQojZGVmaW5lIFVBUlRfMTY1NTBfU1RJQ0tfUEFSSVRZXzAgICAgICAgKCAodWludDhfdCkgMHgzOCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBOdW1iZXIgb2YgU3RvcCBCaXRzDQogKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBVQVJUXzE2NTUwX2luaXQoKQ0KICogZnVuY3Rpb24gbGluZV9jb25maWcgcGFyYW1ldGVyLg0KICovDQojZGVmaW5lIFVBUlRfMTY1NTBfT05FX1NUT1BfQklUICAgICAoICh1aW50OF90KSAweDAwICkNCi8qb25seSB3aGVuIGRhdGEgYml0cyBpcyA1Ki8NCiNkZWZpbmUgVUFSVF8xNjU1MF9PTkVIQUxGX1NUT1BfQklUICggKHVpbnQ4X3QpIDB4MDQgKQ0KLypvbmx5IHdoZW4gZGF0YSBiaXRzIGlzIG5vdCA1Ki8NCiNkZWZpbmUgVUFSVF8xNjU1MF9UV09fU1RPUF9CSVRTICAgICggKHVpbnQ4X3QpIDB4MDQgKQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgcmVjZWl2ZXIgRklGTyB0cmlnZ2VyIGxldmVsLiBUaGlzIGlzIHRoZSBudW1iZXINCiAgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIHJlY2VpdmVkIGJlZm9yZSB0aGUgVUFSVCBnZW5lcmF0ZXMgYSByZWNlaXZlIGRhdGENCiAgYXZhaWxhYmxlIGludGVycnVwdC4gSXQgcHJvdmlkZXMgdGhlIGFsbG93ZWQgdmFsdWVzIGZvciB0aGUNCiAgVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlcigpIGZ1bmN0aW9uknMgdHJpZ2dlcl9sZXZlbCBwYXJhbWV0ZXIuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgVUFSVF8xNjU1MF9GSUZPX1NJTkdMRV9CWVRFICAgID0gMCwNCiAgICBVQVJUXzE2NTUwX0ZJRk9fRk9VUl9CWVRFUyAgICAgPSAxLA0KICAgIFVBUlRfMTY1NTBfRklGT19FSUdIVF9CWVRFUyAgICA9IDIsDQogICAgVUFSVF8xNjU1MF9GSUZPX0ZPVVJURUVOX0JZVEVTID0gMywNCiAgICBVQVJUXzE2NTUwX0ZJRk9fSU5WQUxJRF9UUklHX0xFVkVMDQp9IHVhcnRfMTY1NTBfcnhfdHJpZ19sZXZlbF90Ow0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgTG9vcGJhY2sgY29uZmlndXJhdGlvbiBvZiB0aGUgVUFSVC4gSXQgcHJvdmlkZXMNCiAgdGhlIGFsbG93ZWQgdmFsdWVzIGZvciB0aGUgVUFSVF8xNjU1MF9zZXRfbG9vcGJhY2soKSBmdW5jdGlvbpJzIGxvb3BiYWNrDQogIHBhcmFtZXRlci4NCiAqLw0KdHlwZWRlZiBlbnVtIHsNCiAgICBVQVJUXzE2NTUwX0xPT1BCQUNLX09GRiAgID0gMCwNCiAgICBVQVJUXzE2NTUwX0xPT1BCQUNLX09OICAgID0gMSwNCiAgICBVQVJUXzE2NTUwX0lOVkFMSURfTE9PUEJBQ0sNCn0gdWFydF8xNjU1MF9sb29wYmFja190Ow0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGlzIGlzIHR5cGUgZGVmaW5pdGlvbiBmb3IgQ29yZTE2NTUwIGluc3RhbmNlLiBZb3UgbmVlZCB0byBjcmVhdGUgYW5kDQogIG1haW50YWluIGEgcmVjb3JkIG9mIHRoaXMgdHlwZS4gVGhpcyBob2xkcyBhbGwgZGF0YSByZWdhcmRpbmcgdGhlIENvcmUxNjU1MA0KICBpbnN0YW5jZS4NCiAqLw0KdHlwZWRlZiBzdHJ1Y3QgdWFydF8xNjU1MF9pbnN0YW5jZSB1YXJ0XzE2NTUwX2luc3RhbmNlX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgdHlwZWRlZiBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgQ29yZTE2NTUwIGludGVycnVwdCBoYW5kbGVycy4NCiAgQWxsIGludGVycnVwdCBoYW5kbGVycyByZWdpc3RlcmVkIHdpdGggdGhlIENvcmUxNjU1MCBkcml2ZXIgbXVzdCBiZSBvZiB0aGlzDQogIHR5cGUuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZHJpdmVyIHRocm91Z2ggdGhlDQogIFVBUlRfMTY1NTBfc2V0X3J4X2hhbmRsZXIoKSwgVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpLA0KICBVQVJUXzE2NTUwX3NldF9yeHN0YXR1c19oYW5kbGVyKCksIGFuZCBVQVJUXzE2NTUwX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkNCiAgZnVuY3Rpb25zLg0KDQogIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdA0KICBob2xkcyBhbGwgZGF0YSByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICovDQp0eXBlZGVmIHZvaWQgKCp1YXJ0XzE2NTUwX2lycV9oYW5kbGVyX3QpKHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIHVhcnRfMTY1NTBfaW5zdGFuY2UuDQogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHZhcmlvdXMgQ29yZTE2NTUwIGhhcmR3YXJlIGluc3RhbmNlcw0KICBpbiB5b3VyIHN5c3RlbS4gWW91ciBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzaG91bGQgZGVjbGFyZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcw0KICBzdHJ1Y3R1cmUgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgQ29yZTE2NTUwIGluIHlvdXIgc3lzdGVtLiBUaGUgZnVuY3Rpb24NCiAgVUFSVF8xNjU1MF9pbml0KCkgaW5pdGlhbGl6ZXMgdGhpcyBzdHJ1Y3R1cmUuIEEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZA0KICBpbnN0YW5jZSBvZiB0aGUgc3RydWN0dXJlIHNob3VsZCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGUNCiAgQ29yZTE2NTUwIGRyaXZlciBmdW5jdGlvbnMsIHRvIGlkZW50aWZ5IHdoaWNoIENvcmUxNjU1MCBoYXJkd2FyZSBpbnN0YW5jZQ0KICBzaG91bGQgcGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4NCiAqLw0Kc3RydWN0IHVhcnRfMTY1NTBfaW5zdGFuY2V7DQogICAgLyogQ29yZTE2NTUwIGluc3RhbmNlIGJhc2UgYWRkcmVzczogKi8NCiAgICBhZGRyX3QgICAgICBiYXNlX2FkZHJlc3M7DQogICAgLyogQWNjdW11bGF0ZWQgc3RhdHVzOiAqLw0KICAgIHVpbnQ4X3QgICAgIHN0YXR1czsNCg0KICAgIC8qIHRyYW5zbWl0IHJlbGF0ZWQgaW5mbzogKi8NCiAgICBjb25zdCB1aW50OF90KiAgdHhfYnVmZmVyOw0KICAgIHVpbnQzMl90ICAgICAgICB0eF9idWZmX3NpemU7DQogICAgdWludDMyX3QgICAgICAgIHR4X2lkeDsNCg0KICAgIC8qIGxpbmUgc3RhdHVzIChPRSwgUEUsIEZFICYgQkkpIGludGVycnVwdCBoYW5kbGVyOiovDQogICAgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90IGxpbmVzdHNfaGFuZGxlcjsNCiAgICAvKiByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyOiovDQogICAgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90IHJ4X2hhbmRsZXI7DQogICAgLyogdHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBpbnRlcnJ1cHQgaGFuZGxlcjoqLw0KICAgIHVhcnRfMTY1NTBfaXJxX2hhbmRsZXJfdCB0eF9oYW5kbGVyOw0KICAgIC8qIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlcjoqLw0KICAgIHVhcnRfMTY1NTBfaXJxX2hhbmRsZXJfdCBtb2RlbXN0c19oYW5kbGVyOw0KfTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZHJpdmVyknMgZGF0YSBzdHJ1Y3R1cmVzIGFuZA0KICogdGhlIENvcmUxNjU1MCBoYXJkd2FyZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCBhcyBwYXJhbWV0ZXJzLi4gVGhlDQogKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIHRoZSBiYXVkX3ZhbHVlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGJhdWQgcmF0ZSwNCiAqIGFuZCB0aGUgbGluZV9jb25maWcgdXNlZCB0byBzcGVjaWZ5IHRoZSBsaW5lIGNvbmZpZ3VyYXRpb24gKGJpdCBsZW5ndGgsDQogKiBzdG9wIGJpdHMgYW5kIHBhcml0eSkuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4gVGhpcyBwb2ludGVyDQogKiAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0YXJnZXQgQ29yZTE2NTUwIGhhcmR3YXJlDQogKiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBpbiBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBDb3JlMTY1NTAgZHJpdmVyDQogKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMuDQogKiBAcGFyYW0gYmFzZV9hZGRyICAgICBUaGUgYmFzZV9hZGRyZXNzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSBhZGRyZXNzIGluIHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yJ3MgbWVtb3J5IG1hcCBmb3IgdGhlIHJlZ2lzdGVycyBvZiB0aGUNCiAqICAgICAgICAgICAgICAgICAgICAgIENvcmUxNjU1MCBpbnN0YW5jZSBiZWluZyBpbml0aWFsaXplZC4NCiAqIEBwYXJhbSBiYXVkX3ZhbHVlICAgIFRoZSBiYXVkX3ZhbHVlIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgYmF1ZCByYXRlDQogKiAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFVBUlQuIFRoZSBiYXVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUNCiAqICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeSBvZiB0aGUgc3lzdGVtIGNsb2NrIGluIEhlcnR6IGFuZCB0aGUgZGVzaXJlZA0KICogICAgICAgICAgICAgICAgICAgICAgYmF1ZCByYXRlIHVzaW5nIHRoZSBmb2xsb3dpbmcgZXF1YXRpb246DQogKg0KICogICAgICAgICAgICAgICAgICAgICAgYmF1ZF92YWx1ZSA9IChjbG9jayAvKGJhdWRfcmF0ZSAqIDE2KSkNCiAqDQogKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYmF1ZF92YWx1ZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGluIHRoZSByYW5nZSAwDQogKiAgICAgICAgICAgICAgICAgICAgICB0byA2NTUzNSAob3IgMHgwMDAwIHRvIDB4RkZGRikuDQogKiBAcGFyYW0gbGluZV9jb25maWcgICBUaGlzIHBhcmFtZXRlciBpcyB0aGUgbGluZSBjb25maWd1cmF0aW9uIHNwZWNpZnlpbmcgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBiaXQgbGVuZ3RoLCBudW1iZXIgb2Ygc3RvcCBiaXRzIGFuZCBwYXJpdHkgc2V0dGluZ3MuIFRoaXMNCiAqICAgICAgICAgICAgICAgICAgICAgIGlzIGEgYml0d2lzZSBPUiBvZiBvbmUgdmFsdWUgZnJvbSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcNCiAqICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyBvZiBhbGxvd2VkIHZhbHVlczoNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBEYXRhIGxlbmd0aHM6DQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9EQVRBXzVfQklUUw0KICogICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfREFUQV82X0JJVFMNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX0RBVEFfN19CSVRTDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9EQVRBXzhfQklUUw0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFBhcml0eSB0eXBlczoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX05PX1BBUklUWQ0KICogICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfRVZFTl9QQVJJVFkNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX09ERF9QQVJJVFkNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX1NUSUNLX1BBUklUWV8wDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9TVElDS19QQVJJVFlfMQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIE51bWJlciBvZiBzdG9wIGJpdHM6DQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9PTkVfU1RPUF9CSVQNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX09ORUhBTEZfU1RPUF9CSVQNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX1RXT19TVE9QX0JJVFMNCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKg0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAjZGVmaW5lIFVBUlRfMTY1NTBfQkFTRV9BRERSICAgMHgyQTAwMDAwMA0KICogI2RlZmluZSBCQVVEX1ZBTFVFXzU3NjAwICAgIDI2DQogKg0KICogdWFydF8xNjU1MF9pbnN0YW5jZV90IGdfdWFydDsNCiAqDQogKiBVQVJUXzE2NTUwX2luaXQoICZnX3VhcnQsIFVBUlRfMTY1NTBfQkFTRV9BRERSLCBCQVVEX1ZBTFVFXzU3NjAwLA0KICogICAgICAgICAgICAgICAgICAoVUFSVF8xNjU1MF9EQVRBXzhfQklUUyB8DQogKiAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX0VWRU5fUEFSSVRZIHwNCiAqICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfT05FX1NUT1BfQklUKSApOw0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9pbml0DQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90KiB0aGlzX3VhcnQsDQogICAgYWRkcl90IGJhc2VfYWRkciwNCiAgICB1aW50MTZfdCBiYXVkX3ZhbHVlLA0KICAgIHVpbnQ4X3QgbGluZV9jb25maWcNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9wb2xsZWRfdHgoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbWl0IGRhdGEuIEl0IHRyYW5zZmVycw0KICogdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pdHRlciBkYXRhIGJ1ZmZlciwgcGFzc2VkIGFzIGEgZnVuY3Rpb24gcGFyYW1ldGVyLA0KICogaW50byB0aGUgVUFSVCdzIGhhcmR3YXJlIHRyYW5zbWl0dGVyIEZJRk8uIEl0IHJldHVybnMgd2hlbiB0aGUgZnVsbCBjb250ZW50DQogKiBvZiB0aGUgdHJhbnNtaXR0ZXIgZGF0YSBidWZmZXIgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFVBUlQncyB0cmFuc21pdHRlcg0KICogRklGTy4gSXQgaXMgc2FmZSB0byByZWxlYXNlIG9yIHJldXNlIHRoZSBtZW1vcnkgdXNlZCBhcyB0aGUgdHJhbnNtaXR0ZXIgZGF0YQ0KICogYnVmZmVyIG9uY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zLg0KICoNCiAqIE5vdGU6ICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFVBUlSScyBsaW5lIHN0YXR1cyByZWdpc3RlciAoTFNSKSB0byBwb2xsDQogKiBmb3IgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgdHJhbnNtaXR0ZXIgaG9sZGluZyByZWdpc3RlciBlbXB0eSAoVEhSRSkgYml0DQogKiBiZWZvcmUgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBidWZmZXIgdG8gdGhlIHRyYW5zbWl0dGVyIEZJRk8uIEl0DQogKiB0cmFuc2ZlcnMgZGF0YSB0byB0aGUgdHJhbnNtaXR0ZXIgRklGTyBpbiBibG9ja3Mgb2YgMTYgYnl0ZXMgb3IgbGVzcyBhbmQNCiAqIGFsbG93cyB0aGUgRklGTyB0byBlbXB0eSBiZWZvcmUgdHJhbnNmZXJyaW5nIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEuDQogKg0KICogTm90ZTogICAgVGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgc2VyaWFsIGNvbm5lY3Rpb24gd2lsbCBzdGlsbCBiZSBpbg0KICogcHJvZ3Jlc3Mgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIFVzZSB0aGUgVUFSVF8xNjU1MF9nZXRfdHhfc3RhdHVzKCkNCiAqIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGtub3cgd2hlbiB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwNCiAqICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEBwYXJhbSBwYnVmZiAgICAgICAgIFRoZSBwYnVmZiBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcNCiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLg0KICogQHBhcmFtIHR4X3NpemUgICAgICAgVGhlIHR4X3NpemUgcGFyYW1ldGVyIGlzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLg0KICogQHJldHVybiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICAgdWludDhfdCB0ZXN0bXNnMVtdID0geyJcblxyXG5cclxuXHJVQVJUXzE2NTUwX3BvbGxlZF90eCgpIHRlc3QgbWVzc2FnZSAxIn07DQogKiAgIFVBUlRfMTY1NTBfcG9sbGVkX3R4KCZnX3VhcnQsKGNvbnN0IHVpbnQ4X3QgKil0ZXN0bXNnMSxzaXplb2YodGVzdG1zZzEpKTsNCiAqIEBlbmRjb2RlDQogKi8NCnZvaWQNClVBUlRfMTY1NTBfcG9sbGVkX3R4DQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwYnVmZiwNCiAgICB1aW50MzJfdCB0eF9zaXplDQopOw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX3BvbGxlZF90eF9zdHJpbmcoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbWl0IGEgTlVMTCAoJ1wwJykNCiAqIHRlcm1pbmF0ZWQgc3RyaW5nLiBJdCB0cmFuc2ZlcnMgdGhlIHRleHQgc3RyaW5nLCBmcm9tIHRoZSBidWZmZXIgc3RhcnRpbmcgYXQNCiAqIHRoZSBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgcF9zel9zdHJpbmcsIGludG8gdGhlIFVBUlSScyBoYXJkd2FyZSB0cmFuc21pdHRlcg0KICogRklGTy4gSXQgcmV0dXJucyB3aGVuIHRoZSBjb21wbGV0ZSBzdHJpbmcgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFVBUlQncw0KICogdHJhbnNtaXQgRklGTy4gSXQgaXMgc2FmZSB0byByZWxlYXNlIG9yIHJldXNlIHRoZSBtZW1vcnkgdXNlZCBhcyB0aGUgc3RyaW5nDQogKiBidWZmZXIgb25jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuDQogKg0KICogTm90ZTogICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpIHRvIHBvbGwNCiAqIGZvciB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSB0cmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5IChUSFJFKSBiaXQNCiAqIGJlZm9yZSB0cmFuc2ZlcnJpbmcgZGF0YSBmcm9tIHRoZSBkYXRhIGJ1ZmZlciB0byB0aGUgdHJhbnNtaXR0ZXIgRklGTy4gSXQNCiAqIHRyYW5zZmVycyBkYXRhIHRvIHRoZSB0cmFuc21pdHRlciBGSUZPIGluIGJsb2NrcyBvZiAxNiBieXRlcyBvciBsZXNzIGFuZA0KICogYWxsb3dzIHRoZSBGSUZPIHRvIGVtcHR5IGJlZm9yZSB0cmFuc2ZlcnJpbmcgdGhlIG5leHQgYmxvY2sgb2YgZGF0YS4NCiAqDQogKiBOb3RlOiAgICBUaGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBzZXJpYWwgY29ubmVjdGlvbiB3aWxsIHN0aWxsIGJlDQogKiBpbiBwcm9ncmVzcyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gVXNlIHRoZSBVQVJUXzE2NTUwX2dldF90eF9zdGF0dXMoKQ0KICogZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8ga25vdyB3aGVuIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eS4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIHBfc3pfc3RyaW5nICAgVGhlIHBfc3pfc3RyaW5nIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXINCiAqICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIE5VTEwgKCdcMCcpIHRlcm1pbmF0ZWQgc3RyaW5nIHRvIGJlDQogKiAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZC4NCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKg0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAgIHVpbnQ4X3QgdGVzdG1zZzFbXSA9IHsiXHJcblxyXG5VQVJUXzE2NTUwX3BvbGxlZF90eF9zdHJpbmcoKSB0ZXN0IG1lc3NhZ2UgMVwwIn07DQogKiAgIFVBUlRfMTY1NTBfcG9sbGVkX3R4X3N0cmluZygmZ191YXJ0LChjb25zdCB1aW50OF90ICopdGVzdG1zZzEpOw0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9wb2xsZWRfdHhfc3RyaW5nDQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwX3N6X3N0cmluZw0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX2lycV90eCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhdGUgYW4gaW50ZXJydXB0IGRyaXZlbg0KICogdHJhbnNtaXQuIEl0IHJldHVybnMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFraW5nIGEgbm90ZSBvZiB0aGUgdHJhbnNtaXQgYnVmZmVyDQogKiBsb2NhdGlvbiBhbmQgZW5hYmxpbmcgdGhlIHRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKFRIUkUpIGludGVycnVwdA0KICogYXQgdGhlIENvcmUxNjU1MCBsZXZlbC4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHBvaW50ZXIgdmlhIHRoZSBwYnVmZiBwYXJhbWV0ZXINCiAqIHRvIGEgbWVtb3J5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHRyYW5zbWl0LiBUaGUgbWVtb3J5IGJ1ZmZlcg0KICogc3BlY2lmaWVkIHRocm91Z2ggdGhpcyBwb2ludGVyIG11c3QgcmVtYWluIGFsbG9jYXRlZCBhbmQgY29udGFpbiB0aGUgZGF0YSB0bw0KICogdHJhbnNtaXQgdW50aWwgdGhlIHRyYW5zbWl0IGNvbXBsZXRpb24gaGFzIGJlZW4gZGV0ZWN0ZWQgdGhyb3VnaCBjYWxscyB0bw0KICogZnVuY3Rpb24gVUFSVF8xNjU1MF90eF9jb21wbGV0ZSgpLlRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIG92ZXIgdGhlIHNlcmlhbA0KICogY29ubmVjdGlvbiBpcyBzdGlsbCBpbiBwcm9ncmVzcyB1bnRpbCBjYWxscyB0byB0aGUgVUFSVF8xNjU1MF90eF9jb21wbGV0ZSgpDQogKiBmdW5jdGlvbiBpbmRpY2F0ZSB0cmFuc21pdCBjb21wbGV0aW9uLg0KICoNCiAqIE5vdGU6ICAgIEl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCBVQVJUXzE2NTUwX2lzcigpLCB0aGUgZHJpdmVyknMNCiAqIHRvcCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiwgZnJvbSB0aGUgc3lzdGVtIGxldmVsIChDb3JlSW50ZXJydXB0DQogKiBhbmQgTlZJQyBsZXZlbCkgaW50ZXJydXB0IGhhbmRsZXIgYXNzaWduZWQgdG8gdGhlIGludGVycnVwdCB0cmlnZ2VyZWQgYnkgdGhlDQogKiBDb3JlMTY1NTAgSU5UUiBzaWduYWwuIFlvdSBtdXN0IGRvIHRoaXMgYmVmb3JlIHVzaW5nIHRoZSBVQVJUXzE2NTUwX2lycV90eCgpDQogKiBmdW5jdGlvbi4NCiAqDQogKiBOb3RlOiAgICBJdCBpcyBhbHNvIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZW5hYmxlIHRoZSBzeXN0ZW0gbGV2ZWwNCiAqIChDb3JlSW50ZXJydXB0IGFuZCBOVklDIGxldmVsKSBpbnRlcnJ1cHQgY29ubmVjdGVkIHRvIHRoZSBDb3JlMTY1NTAgSU5UUg0KICogaW50ZXJydXB0IHNpZ25hbC4NCiAqDQogKiBOb3RlOiAgICBUaGUgVUFSVF8xNjU1MF9pcnFfdHgoKSBmdW5jdGlvbiBhc3NpZ25zIGFuIGludGVybmFsIGRlZmF1bHQgdHJhbnNtaXQNCiAqIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uIHRvIHRoZSBVQVJUknMgVEhSRSBpbnRlcnJ1cHQuIFRoaXMgaW50ZXJydXB0IGhhbmRsZXINCiAqIG92ZXJyaWRlcyBhbnkgY3VzdG9tIGludGVycnVwdCBoYW5kbGVyIHRoYXQgeW91IG1heSBoYXZlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZA0KICogdXNpbmcgdGhlIFVBUlRfMTY1NTBfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbi4NCiAqDQogKiBOb3RlOiAgICBUaGUgVUFSVF8xNjU1MF9pcnFfdHgoKSBmdW5jdGlvbpJzIGRlZmF1bHQgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXINCiAqIGRpc2FibGVzIHRoZSBVQVJUknMgVEhSRSBpbnRlcnJ1cHQgd2hlbiBhbGwgb2YgdGhlIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQNCiAqIHRvIHRoZSBVQVJUJ3MgdHJhbnNtaXQgRklGTy4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIHBidWZmICAgICAgICAgVGhlIHBidWZmIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZw0KICogICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQuDQogKiBAcGFyYW0gdHhfc2l6ZSAgICAgICBUaGUgdHhfc2l6ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YNCiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLg0KICogQHJldHVybiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqIHVpbnQ4X3QgdHhfYnVmZlsxMF0gPSAiYWJjZGVmZ2hpIjsNCiAqDQogKiBVQVJUXzE2NTUwX2lycV90eCggJmdfdWFydCwgdHhfYnVmZiwgc2l6ZW9mKHR4X2J1ZmYpKTsNCiAqIHdoaWxlICggMCA9PSBVQVJUXzE2NTUwX3R4X2NvbXBsZXRlKCAmZ191YXJ0ICkgKQ0KICogeyA7IH0NCiAqIEBlbmRjb2RlDQogKi8NCnZvaWQNClVBUlRfMTY1NTBfaXJxX3R4DQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwYnVmZiwNCiAgICB1aW50MzJfdCB0eF9zaXplDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogVGhlIFVBUlRfMTY1NTBfdHhfY29tcGxldGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpbmQgb3V0IGlmIHRoZSBpbnRlcnJ1cHQNCiAqIGRyaXZlbiB0cmFuc21pdCBwcmV2aW91c2x5IGluaXRpYXRlZCB0aHJvdWdoIGEgY2FsbCB0byBVQVJUXzE2NTUwX2lycV90eCgpDQogKiBpcyBjb21wbGV0ZS4gVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCB0byBmaW5kIG91dCB3aGVuIGl0IGlzIHNhZmUNCiAqIHRvIHJldXNlIG9yIHJlbGVhc2UgdGhlIG1lbW9yeSBidWZmZXIgaG9sZGluZyB0aGUgdHJhbnNtaXQgZGF0YS4NCiAqDQogKiBOb3RlOiAgICBUaGUgdHJhbnNmZXIgb2YgYWxsIG9mIHRoZSBkYXRhIGZyb20gdGhlIG1lbW9yeSBidWZmZXIgdG8gdGhlIFVBUlSScw0KICogdHJhbnNtaXQgRklGTyBhbmQgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgc2VyaWFsIGNvbm5lY3Rpb24gYXJlIGJvdGgNCiAqIGNvbXBsZXRlIHdoZW4gYSBjYWxsIHRvIHRoZSBVQVJUXzE2NTUwX3R4X2NvbXBsZXRlKCkgZnVuY3Rpb24gaW5kaWNhdGUNCiAqIHRyYW5zbWl0IGNvbXBsZXRpb24uDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHRyYW5zbWl0IGhhcw0KICogICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkLCBvdGhlcndpc2UgaXQgcmV0dXJucyB6ZXJvLg0KICogIEV4YW1wbGU6DQogKiAgIFNlZSB0aGUgVUFSVF8xNjU1MF9pcnFfdHgoKSBmdW5jdGlvbiBmb3IgYW4gZXhhbXBsZSB0aGF0IHVzZXMgdGhlDQogKiAgIFVBUlRfMTY1NTBfdHhfY29tcGxldGUoKSBmdW5jdGlvbi4NCiAqLw0KaW50OF90DQpVQVJUXzE2NTUwX3R4X2NvbXBsZXRlDQooDQogICB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9nZXRfcngoKSBmdW5jdGlvbiByZWFkcyB0aGUgY29udGVudCBvZiB0aGUgQ29yZTE2NTUwDQogKiByZWNlaXZlcpJzIEZJRk8gYW5kIHN0b3JlcyBpdCBpbiB0aGUgcmVjZWl2ZSBidWZmZXIgdGhhdCBpcyBwYXNzZWQgdmlhIHRoZQ0KICogcnhfYnVmZiBmdW5jdGlvbiBwYXJhbWV0ZXIuIEl0IGNvcGllcyBlaXRoZXIgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIEZJRk8NCiAqIGludG8gdGhlIHJlY2VpdmUgYnVmZmVyLCBvciBqdXN0IGVub3VnaCBkYXRhIGZyb20gdGhlIEZJRk8gdG8gZmlsbCB0aGUgcmVjZWl2ZQ0KICogYnVmZmVyLCBkZXBlbmRlbnQgdXBvbiB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIgcGFzc2VkIGJ5IHRoZSBidWZmX3NpemUNCiAqIHBhcmFtZXRlci4gVGhlIFVBUlRfMTY1NTBfZ2V0X3J4KCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZA0KICogaW50byB0aGUgcmVjZWl2ZSBidWZmZXIgLlRoaXMgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nIGFuZCB3aWxsIHJldHVybiAwDQogKiBpbW1lZGlhdGVseSBpZiBubyBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLg0KICoNCiAqIE5vdGU6ICAgIFRoZSBVQVJUXzE2NTUwX2dldF9yeCgpIGZ1bmN0aW9uIHJlYWRzIGFuZCBhY2N1bXVsYXRlcyB0aGUgcmVjZWl2ZXINCiAqIHN0YXR1cyBvZiB0aGUgQ29yZTE2NTUwIGluc3RhbmNlIGJlZm9yZSByZWFkaW5nIGVhY2ggYnl0ZSBmcm9tIHRoZSByZWNlaXZlcidzDQogKiBkYXRhIHJlZ2lzdGVyL0ZJRk8uIFRoaXMgYWxsb3dzIHRoZSBkcml2ZXIgdG8gbWFpbnRhaW4gYSBzdGlja3kgcmVjb3JkIG9mIGFueQ0KICogcmVjZWl2ZXIgZXJyb3JzIHRoYXQgb2NjdXIgYXMgdGhlIFVBUlQgcmVjZWl2ZXMgZWFjaCBkYXRhIGJ5dGU7IHJlY2VpdmVyIGVycm9ycw0KICogd291bGQgb3RoZXJ3aXNlIGJlIGxvc3QgYWZ0ZXIgZWFjaCByZWFkIGZyb20gdGhlIHJlY2VpdmVyJ3MgZGF0YSByZWdpc3Rlci4gQSBjYWxsDQogKiB0byB0aGUgVUFSVF8xNjU1MF9nZXRfcnhfc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyBhbnkgcmVjZWl2ZXIgZXJyb3JzIGFjY3VtdWxhdGVkDQogKiBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgVUFSVF8xNjU1MF9nZXRfcngoKSBmdW5jdGlvbi4NCiAqDQogKiBOb3RlOiAgICBJZiB5b3UgbmVlZCB0byByZWFkIHRoZSBlcnJvciBzdGF0dXMgZm9yIGVhY2ggYnl0ZSByZWNlaXZlZCwgc2V0IHRoZQ0KICogYnVmZl9zaXplIHRvIDEgYW5kIHJlYWQgdGhlIHJlY2VpdmUgbGluZSBlcnJvciBzdGF0dXMgZm9yIGVhY2ggYnl0ZSB1c2luZyB0aGUNCiAqIFVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cygpIGZ1bmN0aW9uLg0KICogVGhlIFVBUlRfMTY1NTBfZ2V0X3J4KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gcG9sbGVkIG1vZGUsIHdoZXJlIGl0IGlzIGNhbGxlZA0KICogYXQgcmVndWxhciBpbnRlcnZhbHMgdG8gZmluZCBvdXQgaWYgYW55IGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIG9yIGluIGludGVycnVwdA0KICogZHJpdmVuLW1vZGUsIHdoZXJlIGl0IGlzIGNhbGxlZCBhcyBwYXJ0IG9mIGEgcmVjZWl2ZSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIGJ5DQogKiB0aGUgZHJpdmVyIGFzIGEgcmVzdWx0IG9mIGRhdGEgYmVpbmcgcmVjZWl2ZWQuDQogKg0KICogTm90ZTogICAgSW4gaW50ZXJydXB0IGRyaXZlbiBtb2RlIHlvdSBzaG91bGQgY2FsbCB0aGUgVUFSVF8xNjU1MF9nZXRfcngoKQ0KICogZnVuY3Rpb24gYXMgcGFydCBvZiB0aGUgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgeW91IHJlZ2lzdGVyIHdpdGggdGhlDQogKiBDb3JlMTY1NTAgZHJpdmVyIHRocm91Z2ggYSBjYWxsIHRvIFVBUlRfMTY1NTBfc2V0X3J4X2hhbmRsZXIoKS4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIHJ4X2J1ZmYgICAgICAgVGhlIHJ4X2J1ZmYgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIG1lbW9yeSBidWZmZXINCiAqICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSByZWNlaXZlZCBkYXRhIGlzIGNvcGllZC4NCiAqIEBwYXJhbSBidWZmX3NpemUgICAgIFRoZSBidWZmX3NpemUgcGFyYW1ldGVyIGlzIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlDQogKiAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaW4gYnl0ZXMuDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50bw0KICogICAgICAgICAgICAgICAgICAgICAgdGhlIHJlY2VpdmUgYnVmZmVyLg0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAgICNkZWZpbmUgTUFYX1JYX0RBVEFfU0laRSAgICAyNTYNCiAqDQogKiAgIHVpbnQ4X3QgcnhfZGF0YVtNQVhfUlhfREFUQV9TSVpFXTsNCiAqICAgdWludDhfdCByeF9zaXplID0gMDsNCiAqDQogKiAgIHJ4X3NpemUgPSBVQVJUXzE2NTUwX2dldF9yeCggJmdfdWFydCwgcnhfZGF0YSwgc2l6ZW9mKHJ4X2RhdGEpICk7DQogKiBAZW5kY29kZQ0KICovDQpzaXplX3QNClVBUlRfMTY1NTBfZ2V0X3J4DQooDQogICB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICB1aW50OF90ICogcnhfYnVmZiwNCiAgIHNpemVfdCBidWZmX3NpemUNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9pc3IoKSBmdW5jdGlvbiBpcyB0aGUgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uIGZvcg0KICogdGhlIENvcmUxNjU1MCBkcml2ZXIuIFlvdSBtdXN0IGNhbGwgVUFSVF8xNjU1MF9pc3IoKSBmcm9tIHRoZSBzeXN0ZW0gbGV2ZWwNCiAqIChDb3JlSW50ZXJydXB0IGFuZCBOVklDIGxldmVsKSBpbnRlcnJ1cHQgaGFuZGxlciBhc3NpZ25lZCB0byB0aGUgaW50ZXJydXB0DQogKiB0cmlnZ2VyZWQgYnkgdGhlIENvcmUxNjU1MCBJTlRSIHNpZ25hbC4gWW91ciBzeXN0ZW0gbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXINCiAqIG11c3QgYWxzbyBjbGVhciB0aGUgc3lzdGVtIGxldmVsIGludGVycnVwdCB0cmlnZ2VyZWQgYnkgdGhlIENvcmUxNjU1MCBJTlRSDQogKiBzaWduYWwgYmVmb3JlIHJldHVybmluZywgdG8gcHJldmVudCBhIHJlLWFzc2VydGlvbiBvZiB0aGUgc2FtZSBpbnRlcnJ1cHQuDQogKg0KICogTm90ZTogICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBhbGwgdHlwZXMgb2YgaW50ZXJydXB0IHRyaWdnZXJlZCBieSBDb3JlMTY1NTAuDQogKiBJdCBpcyBub3QgYSBjb21wbGV0ZSBpbnRlcnJ1cHQgaGFuZGxlciBieSBpdHNlbGY7IHJhdGhlciwgaXQgaXMgYSB0b3AgbGV2ZWwNCiAqIHdyYXBwZXIgdGhhdCBhYnN0cmFjdHMgQ29yZTE2NTUwIGludGVycnVwdCBoYW5kbGluZyBieSBjYWxsaW5nIGxvd2VyIGxldmVsDQogKiBoYW5kbGVyIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgQ29yZTE2NTUwIGludGVycnVwdC4gWW91IG11c3QNCiAqIGNyZWF0ZSB0aGUgbG93ZXIgbGV2ZWwgaGFuZGxlciBmdW5jdGlvbnMgdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uIGFuZA0KICogcmVnaXN0ZXIgdGhlbSB3aXRoIHRoZSBkcml2ZXIgdGhyb3VnaCBjYWxscyB0byB0aGUgVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlcigpLA0KICogVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpLCBVQVJUXzE2NTUwX3NldF9yeHN0YXR1c19oYW5kbGVyKCkgYW5kDQogKiBVQVJUXzE2NTUwX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkgZnVuY3Rpb25zLg0KICoNCiAqIEBwYXJhbSB0aGlzX3VhcnQgICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhDQogKiAgICAgICAgICAgICAgICAgICAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3Qgc3RydWN0dXJlIHRoYXQgaG9sZHMgYWxsIGRhdGENCiAqICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGluZyB0aGlzIGluc3RhbmNlIG9mIHRoZSBDb3JlMTY1NTAuDQogKg0KICogQHJldHVybiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICAgdm9pZCBDSUNfaXJxMV9oYW5kbGVyKHZvaWQpDQogKiAgIHsNCiAqICAgICAgVUFSVF8xNjU1MF9pc3IoICZnX3VhcnQgKTsNCiAqICAgfQ0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9pc3INCigNCiAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX3NldF9yeF9oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIHJlY2VpdmUgaGFuZGxlcg0KICogZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIGEgVUFSVCByZWNlaXZlIGRhdGEgYXZhaWxhYmxlIChSREEpDQogKiBpbnRlcnJ1cHQgb2NjdXJzLiBUaGUgVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlcigpIGZ1bmN0aW9uIGFsc28gZW5hYmxlcyB0aGUNCiAqIFJEQSBpbnRlcnJ1cHQgYXQgdGhlIENvcmUxNjU1MCBsZXZlbC4gWW91IG11c3QgY3JlYXRlIGFuZCByZWdpc3RlciB0aGUgcmVjZWl2ZQ0KICogaGFuZGxlciBmdW5jdGlvbiB0byBzdWl0IHlvdXIgYXBwbGljYXRpb24gYW5kIGl0IG11c3QgaW5jbHVkZSBhIGNhbGwgdG8gdGhlDQogKiBVQVJUXzE2NTUwX2dldF9yeCgpIGZ1bmN0aW9uIHRvIGFjdHVhbGx5IHJlYWQgdGhlIHJlY2VpdmVkIGRhdGEuDQogKg0KICogTm90ZTogICAgVGhlIGRyaXZlcpJzIHRvcCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiBVQVJUXzE2NTUwX2lzcigpDQogKiB3aWxsIGNhbGwgeW91ciByZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb24gaW4gcmVzcG9uc2UgdG8gYW4gUkRBIGludGVycnVwdCBmcm9tDQogKiB0aGUgQ29yZTE2NTUwLg0KICoNCiAqIE5vdGU6ICAgIFlvdSBjYW4gZGlzYWJsZSB0aGUgUkRBIGludGVycnVwdCBvbmNlIHRoZSBkYXRhIGlzIHJlY2VpdmVkIGJ5IGNhbGxpbmcNCiAqIHRoZSBVQVJUXzE2NTUwX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24uIFRoaXMgaXMgeW91ciBjaG9pY2UgYW5kIGlzIGRlcGVuZGVudA0KICogdXBvbiB5b3VyIGFwcGxpY2F0aW9uLg0KICoNCiAqIEBwYXJhbSB0aGlzX3VhcnQgICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhDQogKiAgICAgICAgICAgICAgICAgICAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3Qgc3RydWN0dXJlIHRoYXQgaG9sZHMgYWxsIGRhdGENCiAqICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGluZyB0aGlzIGluc3RhbmNlIG9mIHRoZSBDb3JlMTY1NTAuDQogKiBAcGFyYW0gaGFuZGxlciAgICAgICBUaGUgaGFuZGxlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgcmVjZWl2ZSBpbnRlcnJ1cHQNCiAqICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgZnVuY3Rpb24gcHJvdmlkZWQgYnkgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgYmUNCiAqICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiBhIFVBUlQgUkRBIGludGVycnVwdC4gVGhpcyBoYW5kbGVyDQogKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdXN0IGJlIG9mIHR5cGUgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90Lg0KICogQHBhcmFtIHRyaWdnZXJfbGV2ZWwgVGhlIHRyaWdnZXJfbGV2ZWwgcGFyYW1ldGVyIGlzIHRoZSByZWNlaXZlIEZJRk8NCiAqICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgbGV2ZWwuIFRoaXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdA0KICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZWNlaXZlZCBiZWZvcmUgdGhlIFVBUlQgdHJpZ2dlcnMgYW4gUkRBDQogKiAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQuDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICoNCiAqIEV4YW1wbGU6DQogKiBAY29kZQ0KICogI2luY2x1ZGUgImNvcmVfMTY1NTAuaCINCiAqDQogKiAjZGVmaW5lIFJYX0JVRkZfU0laRSAgICA2NA0KICogI2RlZmluZSBVQVJUXzU3NjAwX0JBVUQgMjYNCiAqDQogKiB1aW50OF90IGdfcnhfYnVmZltSWF9CVUZGX1NJWkVdOw0KICogdWFydF8xNjU1MF9pbnN0YW5jZV90IGdfdWFydDsNCiAqIHZvaWQgdWFydF9yeF9oYW5kbGVyKCB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQgKQ0KICogew0KICogICAgIFVBUlRfMTY1NTBfZ2V0X3J4KCB0aGlzX3VhcnQsIGdfcnhfYnVmZiwgUlhfQlVGRl9TSVpFICk7DQogKiB9DQogKg0KICogaW50IG1haW4odm9pZCkNCiAqIHsNCiAqICAgICBVQVJUXzE2NTUwX2luaXQoICZnX3VhcnQsIFVBUlRfNTc2MDBfQkFVRCwNCiAqICAgICAgICAgICAgICAgICAgICAgICAoIFVBUlRfMTY1NTBfREFUQV84X0JJVFMgfCBVQVJUXzE2NTUwX05PX1BBUklUWSApICk7DQogKiAgICAgVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlciggJmdfdWFydCwgdWFydF9yeF9oYW5kbGVyLA0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfRklGT19TSU5HTEVfQllURSk7DQogKiAgICAgd2hpbGUgKCAxICkNCiAqICAgICB7DQogKiAgICAgICAgIDsNCiAqICAgICB9DQogKiAgICAgcmV0dXJuKDApOw0KICogfQ0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9zZXRfcnhfaGFuZGxlcg0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICB1YXJ0XzE2NTUwX2lycV9oYW5kbGVyX3QgaGFuZGxlciwNCiAgICB1YXJ0XzE2NTUwX3J4X3RyaWdfbGV2ZWxfdCB0cmlnZ2VyX2xldmVsDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogVGhlIFVBUlRfMTY1NTBfc2V0X2xvb3BiYWNrKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2NhbGx5IGxvb3BiYWNrIHRoZSBUeA0KICogYW5kIFJ4IGxpbmVzIG9mIGEgQ29yZTE2NTUwIFVBUlQuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEBwYXJhbSBsb29wYmFjayAgICAgIFRoZSBsb29wYmFjayBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgVUFSVCdzIHRyYW5zbWl0IGFuZCByZWNlaXZlIGxpbmVzIHNob3VsZCBiZSBsb29wZWQgYmFjay4NCiAqICAgICAgICAgICAgICAgICAgICAgIEFsbG93ZWQgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOg0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfTE9PUEJBQ0tfT04NCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0xPT1BCQUNLX09GRg0KICogQHJldHVybiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICNpbmNsdWRlICJjb3JlXzE2NTUwLmgiDQogKg0KICogI2RlZmluZSBVQVJUXzU3NjAwX0JBVUQgMjYNCiAqICNkZWZpbmUgREFUQV9TSVpFIDQNCiAqDQogKiB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgZ191YXJ0Ow0KICoNCiAqIGludCBtYWluKHZvaWQpDQogKiB7DQogKiAgICAgIHVpbnQ4X3QgdHhidWZbREFUQV9TSVpFXSA9ICJhYmMiOw0KICogICAgICB1aW50OF90IHJ4YnVmW0RBVEFfU0laRV07DQogKiAgICAgIFVBUlRfMTY1NTBfaW5pdCggJmdfdWFydCwgVUFSVF81NzYwMF9CQVVELA0KICogICAgICAgICAgICAgICAgICAgICAgICAoIFVBUlRfMTY1NTBfREFUQV84X0JJVFMgfCBVQVJUXzE2NTUwX05PX1BBUklUWSB8DQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9PTkVfU1RPUF9CSVQpICk7DQogKiAgICAgIFVBUlRfMTY1NTBfc2V0X2xvb3BiYWNrKCAmZ191YXJ0LCBVQVJUXzE2NTUwX0xPT1BCQUNLX09OICk7DQogKg0KICogICAgICB3aGlsZSgxKQ0KICogICAgICB7DQogKiAgICAgICAgICBVQVJUXzE2NTUwX3BvbGxlZF90eCggJmdfdWFydCwgdHhidWYsIERBVEFfU0laRSk7DQogKiAgICAgICAgICBkZWxheSgxMDApOw0KICogICAgICAgICAgVUFSVF8xNjU1MF9nZXRfcngoICZnX3VhcnQsIHJ4YnVmLCBEQVRBX1NJWkUpOw0KICogICAgICB9DQogKiB9DQogKiBAZW5kY29kZQ0KICovDQp2b2lkDQpVQVJUXzE2NTUwX3NldF9sb29wYmFjaw0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICB1YXJ0XzE2NTUwX2xvb3BiYWNrX3QgbG9vcGJhY2sNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9nZXRfcnhfc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVjZWl2ZXIgZXJyb3Igc3RhdHVzIG9mDQogKiB0aGUgQ29yZTE2NTUwIGluc3RhbmNlLiBJdCByZWFkcyBib3RoIHRoZSBjdXJyZW50IGVycm9yIHN0YXR1cyBvZiB0aGUgcmVjZWl2ZXINCiAqIGZyb20gdGhlIFVBUlSScyBsaW5lIHN0YXR1cyByZWdpc3RlciAoTFNSKSBhbmQgdGhlIGFjY3VtdWxhdGVkIGVycm9yIHN0YXR1cw0KICogZnJvbSBwcmVjZWRpbmcgY2FsbHMgdG8gdGhlIFVBUlRfMTY1NTBfZ2V0X3J4KCkgZnVuY3Rpb24sIGFuZCBpdCBjb21iaW5lcw0KICogdGhlbSB1c2luZyBhIGJpdHdpc2UgT1IuIEl0IHJldHVybnMgdGhlIGN1bXVsYXRpdmUgb3ZlcnJ1biwgcGFyaXR5LCBmcmFtaW5nLA0KICogYnJlYWsgYW5kIEZJRk8gZXJyb3Igc3RhdHVzIG9mIHRoZSByZWNlaXZlciwgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwgdG8NCiAqIFVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cygpLCBhcyBhbiA4LWJpdCBlbmNvZGVkIHZhbHVlLg0KICoNCiAqIE5vdGU6ICAgIFRoZSBVQVJUXzE2NTUwX2dldF9yeCgpIGZ1bmN0aW9uIHJlYWRzIGFuZCBhY2N1bXVsYXRlcyB0aGUgcmVjZWl2ZXINCiAqIHN0YXR1cyBvZiB0aGUgQ29yZTE2NTUwIGluc3RhbmNlIGJlZm9yZSByZWFkaW5nIGVhY2ggYnl0ZSBmcm9tIHRoZSByZWNlaXZlcpJzDQogKiBkYXRhIHJlZ2lzdGVyL0ZJRk8uIFRoZSBkcml2ZXIgbWFpbnRhaW5zIGEgc3RpY2t5IHJlY29yZCBvZiB0aGUgY3VtdWxhdGl2ZQ0KICogcmVjZWl2ZXIgZXJyb3Igc3RhdHVzLCB3aGljaCBwZXJzaXN0cyBhZnRlciB0aGUgVUFSVF8xNjU1MF9nZXRfcngoKSBmdW5jdGlvbg0KICogcmV0dXJucy4gVGhlIFVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cygpIGZ1bmN0aW9uIGNsZWFycyB0aGUgZHJpdmVyknMgc3RpY2t5DQogKiByZWNlaXZlciBlcnJvciByZWNvcmQgYmVmb3JlIHJldHVybmluZy4NCiAqDQogKiBOb3RlOiAgICBUaGUgZHJpdmVyknMgdHJhbnNtaXQgZnVuY3Rpb25zIGFsc28gcmVhZCB0aGUgbGluZSBzdGF0dXMgcmVnaXN0ZXINCiAqIChMU1IpIGFzIHBhcnQgb2YgdGhlaXIgaW1wbGVtZW50YXRpb24uIFdoZW4gdGhlIGRyaXZlciByZWFkcyB0aGUgTFNSLCB0aGUNCiAqIFVBUlQgY2xlYXJzIGFueSBhY3RpdmUgcmVjZWl2ZXIgZXJyb3IgYml0cyBpbiB0aGUgTFNSLiBUaGlzIGNvdWxkIHJlc3VsdCBpbg0KICogdGhlIGRyaXZlciBsb3NpbmcgcmVjZWl2ZXIgZXJyb3JzLiBUbyBhdm9pZCBhbnkgbG9zcyBvZiByZWNlaXZlciBlcnJvcnMsIHRoZQ0KICogdHJhbnNtaXQgZnVuY3Rpb25zIGFsc28gdXBkYXRlIHRoZSBkcml2ZXKScyBzdGlja3kgcmVjb3JkIG9mIHRoZSBjdW11bGF0aXZlDQogKiByZWNlaXZlciBlcnJvciBzdGF0dXMgd2hlbmV2ZXIgdGhleSByZWFkIHRoZSBMU1IuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVUFSVJJzIHJlY2VpdmVyIGVycm9yIHN0YXR1cw0KICogICAgICAgICAgICAgICAgICAgICAgYXMgYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gVGhlIHJldHVybmVkIHZhbHVlIGlzIDANCiAqICAgICAgICAgICAgICAgICAgICAgIGlmIG5vIHJlY2VpdmVyIGVycm9ycyBvY2N1cnJlZC4gVGhlIGRyaXZlciBwcm92aWRlcyBhDQogKiAgICAgICAgICAgICAgICAgICAgICBzZXQgb2YgYml0IG1hc2sgY29uc3RhbnRzIHRoYXQgc2hvdWxkIGJlIGNvbXBhcmVkIHdpdGgNCiAqICAgICAgICAgICAgICAgICAgICAgIGFuZC9vciB1c2VkIHRvIG1hc2sgdGhlIHJldHVybmVkIHZhbHVlIHRvIGRldGVybWluZSB0aGUNCiAqICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyIGVycm9yIHN0YXR1cy4NCiAqICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBjb21wYXJlZCB0byB0aGUgZm9sbG93aW5nIGJpdA0KICogICAgICAgICAgICAgICAgICAgICAgbWFza3MsIGEgbm9uLXplcm8gcmVzdWx0IGluZGljYXRlcyB0aGF0IHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBlcnJvciBvY2N1cnJlZDoNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX09WRVJSVU5fRVJST1IgICAgKGJpdCBtYXNrID0gMHgwMikNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX1BBUklUWV9FUlJPUiAgICAgKGJpdCBtYXNrID0gMHgwNCkNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0ZSQU1JTkdfRVJST1IgICAgKGJpdCBtYXNrID0gMHgwOCkNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0JSRUFLX0VSUk9SICAgICAgKGJpdCBtYXNrID0gMHgxMCkNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0ZJRk9fRVJST1IgICAgICAgKGJpdCBtYXNrID0gMHg4MCkNCiAqICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBjb21wYXJlZCB0byB0aGUgZm9sbG93aW5nIGJpdA0KICogICAgICAgICAgICAgICAgICAgICAgbWFzaywgYSBub24temVybyByZXN1bHQgaW5kaWNhdGVzIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQ6DQogKiAgICAgICAgICAgICAgICAgICAgICCVICAgVUFSVF8xNjU1MF9OT19FUlJPUiAgICAgICAgIChiaXQgbWFzayA9IDB4MDApDQogKiAgICAgICAgICAgICAgICAgICAgICBVcG9uIHVuc3VjY2Vzc2Z1bCBleGVjdXRpb24sIHRoaXMgZnVuY3Rpb24gcmV0dXJuczoNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0lOVkFMSURfUEFSQU0gICAgKGJpdCBtYXNrID0gMHhGRikNCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IGdfdWFydDsNCiAqICAgdWludDhfdCByeF9kYXRhW01BWF9SWF9EQVRBX1NJWkVdOw0KICogICB1aW50OF90IGVycl9zdGF0dXM7DQogKg0KICogICBlcnJfc3RhdHVzID0gVUFSVF8xNjU1MF9nZXRfcnhfc3RhdHVzKCZnX3VhcnQpOw0KICogICBpZihVQVJUXzE2NTUwX05PX0VSUk9SID09IGVycl9zdGF0dXMgKQ0KICogICB7DQogKiAgICAgICAgcnhfc2l6ZSA9IFVBUlRfMTY1NTBfZ2V0X3J4KCAmZ191YXJ0LCByeF9kYXRhLCBNQVhfUlhfREFUQV9TSVpFICk7DQogKiAgIH0NCiAqIEBlbmRjb2RlDQogKi8NCnVpbnQ4X3QNClVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cw0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9lbmFibGVfaXJxKCkgZnVuY3Rpb24gZW5hYmxlcyB0aGUgQ29yZTE2NTUwIGludGVycnVwdHMNCiAqIHNwZWNpZmllZCBieSB0aGUgaXJxX21hc2sgcGFyYW1ldGVyLiBUaGUgaXJxX21hc2sgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlDQogKiBDb3JlMTY1NTAgaW50ZXJydXB0cyBieSBiaXQgcG9zaXRpb24sIGFzIGRlZmluZWQgaW4gdGhlIGludGVycnVwdCBlbmFibGUNCiAqIHJlZ2lzdGVyIChJRVIpIG9mIENvcmUxNjU1MC4gVGhlIENvcmUxNjU1MCBpbnRlcnJ1cHRzIGFuZCB0aGVpciBpZGVudGlmeWluZw0KICogaXJxX21hc2sgYml0IHBvc2l0aW9ucyBhcmUgYXMgZm9sbG93czoNCiAqICAgICAglSAgIFJlY2VpdmUgZGF0YSBhdmFpbGFibGUgaW50ZXJydXB0IChSREEpICAgICAgKGlycV9tYXNrIGJpdCAwKQ0KICogICAgICCVICAgVHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQgKFRIUkUpICAgIChpcnFfbWFzayBiaXQgMSkNCiAqICAgICAglSAgIFJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdCAoTFMpICAgICAgICAgKGlycV9tYXNrIGJpdCAyKQ0KICogICAgICCVICAgTW9kZW0gc3RhdHVzIGludGVycnVwdCAoTVMpICAgICAgICAgKGlycV9tYXNrIGJpdCAzKQ0KICogV2hlbiBhbiBpcnFfbWFzayBiaXQgcG9zaXRpb24gaXMgc2V0IHRvIDEsIHRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUNCiAqIGNvcnJlc3BvbmRpbmcgQ29yZTE2NTUwIGludGVycnVwdCBpbiB0aGUgSUVSIHJlZ2lzdGVyLiBXaGVuIGFuIGlycV9tYXNrDQogKiBiaXQgcG9zaXRpb24gaXMgc2V0IHRvIDAsIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdJJzIHN0YXRlIHJlbWFpbnMNCiAqIHVuY2hhbmdlZCBpbiB0aGUgSUVSIHJlZ2lzdGVyLg0KICoNCiAqIEBwYXJhbSB0aGlzX3VhcnQgICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhDQogKiAgICAgICAgICAgICAgICAgICAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3Qgc3RydWN0dXJlIHRoYXQgaG9sZHMgYWxsIGRhdGENCiAqICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGluZyB0aGlzIGluc3RhbmNlIG9mIHRoZSBDb3JlMTY1NTAuDQogKiBAcGFyYW0gaXJxX21hc2sgICAgICBUaGUgaXJxX21hc2sgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2VsZWN0IHdoaWNoIG9mIHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgQ29yZTE2NTUwknMgaW50ZXJydXB0cyB5b3Ugd2FudCB0byBlbmFibGUuIFRoZSBhbGxvd2VkDQogKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmb3IgdGhlIGlycV9tYXNrIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RhbnRzIG9yIGEgYml0d2lzZSBPUiBvZiBtb3JlIHRoYW4gb25lOg0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfUkJGX0lSUSAgICAgIChiaXQgbWFzayA9IDB4MDEpDQogKiAgICAgICAgICAgICAgICAgICAgICCVICAgVUFSVF8xNjU1MF9UQkVfSVJRICAgICAgKGJpdCBtYXNrID0gMHgwMikNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0xTX0lSUSAgICAgICAoYml0IG1hc2sgPSAweDA0KQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfTVNfSVJRICAgICAgIChiaXQgbWFzayA9IDB4MDgpDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICoNCiAqIEV4YW1wbGU6DQogKiBAY29kZQ0KICogICBVQVJUXzE2NTUwX2VuYWJsZV9pcnEoICZnX3VhcnQsKCBVQVJUXzE2NTUwX1JCRl9JUlEgfCBVQVJUXzE2NTUwX1RCRV9JUlEgKSApOw0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9lbmFibGVfaXJxDQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIHVpbnQ4X3QgaXJxX21hc2sNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBDb3JlMTY1NTAgaW50ZXJydXB0cw0KICogc3BlY2lmaWVkIGJ5IHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIuIFRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUNCiAqIENvcmUxNjU1MCBpbnRlcnJ1cHRzIGJ5IGJpdCBwb3NpdGlvbiwgYXMgZGVmaW5lZCBpbiB0aGUgaW50ZXJydXB0IGVuYWJsZQ0KICogcmVnaXN0ZXIgKElFUikgb2YgQ29yZTE2NTUwLiBUaGUgQ29yZTE2NTUwIGludGVycnVwdHMgYW5kIHRoZWlyIGlkZW50aWZ5aW5nDQogKiBiaXQgcG9zaXRpb25zIGFyZSBhcyBmb2xsb3dzOg0KICogICAgICCVICAgUmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSBpbnRlcnJ1cHQgKFJEQSkgICAgICAgICAgICAgIChpcnFfbWFzayBiaXQgMCkNCiAqICAgICAglSAgIFRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0IChUSFJFKSAgICAoaXJxX21hc2sgYml0IDEpDQogKiAgICAgIJUgICBSZWNlaXZlciBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgKExTKSAgICAgICAgICAgICAgICAgKGlycV9tYXNrIGJpdCAyKQ0KICogICAgICCVICAgTW9kZW0gc3RhdHVzIGludGVycnVwdCAoTVMpICAgICAgICAgICAgICAgICAgICAgICAgIChpcnFfbWFzayBiaXQgMykNCiAqIFdoZW4gYW4gaXJxX21hc2sgYml0IHBvc2l0aW9uIGlzIHNldCB0byAxLCB0aGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZQ0KICogY29ycmVzcG9uZGluZyBDb3JlMTY1NTAgaW50ZXJydXB0IGluIHRoZSBJRVIgcmVnaXN0ZXIuIFdoZW4gYW4gaXJxX21hc2sgYml0DQogKiBwb3NpdGlvbiBpcyBzZXQgdG8gMCwgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0knMgc3RhdGUgcmVtYWlucyB1bmNoYW5nZWQNCiAqIGluIHRoZSBJRVIgcmVnaXN0ZXIuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEBwYXJhbSBpcnFfbWFzayAgICAgIFRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBDb3JlMTY1NTCScyBpbnRlcnJ1cHRzIHlvdSB3YW50IHRvIGRpc2FibGUuIFRoZSBhbGxvd2VkDQogKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmb3IgdGhlIGlycV9tYXNrIHBhcmFtZXRlciBpcyBvbmUgb2YgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uc3RhbnRzIG9yIGEgYml0d2lzZSBPUiBvZiBtb3JlIHRoYW4gb25lOg0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfUkJGX0lSUSAgICAgIChiaXQgbWFzayA9IDB4MDEpDQogKiAgICAgICAgICAgICAgICAgICAgICCVICAgVUFSVF8xNjU1MF9UQkVfSVJRICAgICAgKGJpdCBtYXNrID0gMHgwMikNCiAqICAgICAgICAgICAgICAgICAgICAgIJUgICBVQVJUXzE2NTUwX0xTX0lSUSAgICAgICAoYml0IG1hc2sgPSAweDA0KQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfTVNfSVJRICAgICAgIChiaXQgbWFzayA9IDB4MDgpDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICoNCiAqIEV4YW1wbGU6DQogKiBAY29kZQ0KICogICBVQVJUXzE2NTUwX2Rpc2FibGVfaXJxKCAmZ191YXJ0LCAoIFVBUlRfMTY1NTBfUkJGX0lSUSB8IFVBUlRfMTY1NTBfVEJFX0lSUSApICk7DQogKiBAZW5kY29kZQ0KICovDQp2b2lkDQpVQVJUXzE2NTUwX2Rpc2FibGVfaXJxDQooDQogICAgdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIHVpbnQ4X3QgaXJxX21hc2sNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9nZXRfbW9kZW1fc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgbW9kZW0gc3RhdHVzIG9mIHRoZQ0KICogQ29yZTE2NTUwIGluc3RhbmNlLiBJdCByZWFkcyB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIChNU1IpIGFuZCByZXR1cm5zIHRoZQ0KICogOCBiaXQgdmFsdWUuIFRoZSBiaXQgZW5jb2Rpbmcgb2YgdGhlIHJldHVybmVkIHZhbHVlIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMNCiAqIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBiaXRzIGluIHRoZSBNU1IuDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjdXJyZW50IHN0YXRlIG9mIHRoZSBVQVJUJ3MgTVNSDQogKiAgICAgICAgICAgICAgICAgICAgICBhcyBhbiA4IGJpdCB1bnNpZ25lZCBpbnRlZ2VyLiBUaGUgZHJpdmVyIHByb3ZpZGVzIHRoZQ0KICogICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHNldCBvZiBiaXQgbWFzayBjb25zdGFudHMgdGhhdCBzaG91bGQgYmUNCiAqICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVkIHdpdGggYW5kL29yIHVzZWQgdG8gbWFzayB0aGUgcmV0dXJuZWQgdmFsdWUNCiAqICAgICAgICAgICAgICAgICAgICAgIHRvIGRldGVybWluZSB0aGUgbW9kZW0gc3RhdHVzOg0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfRENUUyAoYml0IG1hc2sgPSAweDAxKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfRERTUiAoYml0IG1hc2sgPSAweDAyKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfVEVSSSAoYml0IG1hc2sgPSAweDA0KQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfRERDRCAoYml0IG1hc2sgPSAweDA4KQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfQ1RTICAoYml0IG1hc2sgPSAweDEwKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfRFNSICAoYml0IG1hc2sgPSAweDIwKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfUkkgICAoYml0IG1hc2sgPSAweDQwKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfRENEICAoYml0IG1hc2sgPSAweDgwKQ0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAgIHZvaWQgdWFydF9tb2RlbV9zdGF0dXNfaXNyKHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCkNCiAqICAgew0KICogICAgICB1aW50OF90IHN0YXR1czsNCiAqICAgICAgc3RhdHVzID0gVUFSVF8xNjU1MF9nZXRfbW9kZW1fc3RhdHVzKCB0aGlzX3VhcnQgKTsNCiAqICAgICAgaWYoIHN0YXR1cyAmIFVBUlRfMTY1NTBfRENUUyApDQogKiAgICAgIHsNCiAqICAgICAgICAgIHVhcnRfZGN0c19oYW5kbGVyKCk7DQogKiAgICAgIH0NCiAqICAgICAgaWYoIHN0YXR1cyAmIFVBUlRfMTY1NTBfQ1RTICkNCiAqICAgICAgew0KICogICAgICAgICAgdWFydF9jdHNfaGFuZGxlcigpOw0KICogICAgICB9DQogKiAgIH0NCiAqIEBlbmRjb2RlDQogKi8NCnVpbnQ4X3QNClVBUlRfMTY1NTBfZ2V0X21vZGVtX3N0YXR1cw0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX3NldF9yeHN0YXR1c19oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIHJlY2VpdmVyDQogKiBzdGF0dXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIHJlY2VpdmVyDQogKiBsaW5lIHN0YXR1cyAoUkxTKSBpbnRlcnJ1cHQgb2NjdXJzLiBUaGUgVUFSVF8xNjU1MF9zZXRfcnhzdGF0dXNfaGFuZGxlcigpDQogKiBmdW5jdGlvbiBhbHNvIGVuYWJsZXMgdGhlIFJMUyBpbnRlcnJ1cHQgYXQgdGhlIENvcmUxNjU1MCBsZXZlbC4gWW91IG11c3QNCiAqIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIHJlY2VpdmVyIHN0YXR1cyBoYW5kbGVyIGZ1bmN0aW9uIHRvIHN1aXQgeW91cg0KICogYXBwbGljYXRpb24uDQogKg0KICogTm90ZTogICAgVGhlIGRyaXZlcpJzIHRvcCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiBVQVJUXzE2NTUwX2lzcigpDQogKiB3aWxsIGNhbGwgeW91ciByZWNlaXZlIHN0YXR1cyBoYW5kbGVyIGZ1bmN0aW9uIGluIHJlc3BvbnNlIHRvIGFuIFJMUw0KICogaW50ZXJydXB0IGZyb20gdGhlIENvcmUxNjU1MC4NCiAqDQogKiBOb3RlOiAgICBZb3UgY2FuIGRpc2FibGUgdGhlIFJMUyBpbnRlcnJ1cHQgd2hlbiByZXF1aXJlZCBieSBjYWxsaW5nIHRoZQ0KICogVUFSVF8xNjU1MF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9uLiBUaGlzIGlzIHlvdXIgY2hvaWNlIGFuZCBpcyBkZXBlbmRlbnQNCiAqIHVwb24geW91ciBhcHBsaWNhdGlvbi4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIGhhbmRsZXIgICAgICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIHJlY2VpdmVyIGxpbmUNCiAqICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiBwcm92aWRlZCBieSB5b3VyDQogKiAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGENCiAqICAgICAgICAgICAgICAgICAgICAgIFVBUlQgUkxTIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIGZ1bmN0aW9uIG11c3QgYmUNCiAqICAgICAgICAgICAgICAgICAgICAgIG9mIHR5cGUgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90Lg0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAjaW5jbHVkZSAiY29yZV8xNjU1MC5oIg0KICoNCiAqICNkZWZpbmUgVUFSVF81NzYwMF9CQVVEIDI2DQogKg0KICogdWFydF8xNjU1MF9pbnN0YW5jZV90IGdfdWFydDsNCiAqDQogKiB2b2lkIHVhcnRfcnhzdHNfaGFuZGxlciggdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0ICkNCiAqIHsNCiAqICAgICAgdWludDhfdCBzdGF0dXM7DQogKiAgICAgIHN0YXR1cyA9IFVBUlRfMTY1NTBfZ2V0X3J4X3N0YXR1cyggdGhpc191YXJ0ICk7DQogKiAgICAgIGlmKCBzdGF0dXMgJiBVQVJUXzE2NTUwX09WRVJVTl9FUlJPUiApDQogKiAgICAgIHsNCiAqICAgICAgICAgIGRpc2NhcmRfcnhfZGF0YSgpOw0KICogICAgICB9DQogKiB9DQogKg0KICogaW50IG1haW4odm9pZCkNCiAqIHsNCiAqICAgICBVQVJUXzE2NTUwX2luaXQoICZnX3VhcnQsIFVBUlRfNTc2MDBfQkFVRCwNCiAqICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfREFUQV84X0JJVFMgfCBVQVJUXzE2NTUwX05PX1BBUklUWSB8DQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfT05FX1NUT1BfQklUICk7DQogKiAgICAgVUFSVF8xNjU1MF9zZXRfcnhzdGF0dXNfaGFuZGxlciggJmdfdWFydCwgdWFydF9yeHN0c19oYW5kbGVyICk7DQogKg0KICogICAgIHdoaWxlICggMSApDQogKiAgICAgew0KICogICAgICAgICA7DQogKiAgICAgfQ0KICogICAgIHJldHVybigwKTsNCiAqIH0NCiAqIEBlbmRjb2RlDQogKi8NCnZvaWQNClVBUlRfMTY1NTBfc2V0X3J4c3RhdHVzX2hhbmRsZXINCigNCiAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSB0cmFuc21pdA0KICogaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIHRyYW5zbWl0IGhvbGRpbmcNCiAqIHJlZ2lzdGVyIGVtcHR5IChUSFJFKSBpbnRlcnJ1cHQgb2NjdXJzLiBUaGUgVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpDQogKiBmdW5jdGlvbiBhbHNvIGVuYWJsZXMgdGhlIFRIUkUgaW50ZXJydXB0IGF0IHRoZSBDb3JlMTY1NTAgbGV2ZWwuIFlvdSBtdXN0DQogKiBjcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSB0cmFuc21pdCBoYW5kbGVyIGZ1bmN0aW9uIHRvIHN1aXQgeW91ciBhcHBsaWNhdGlvbi4NCiAqIFlvdSBjYW4gdXNlIHRoZSBVQVJUXzE2NTUwX2ZpbGxfdHhfZmlmbygpIGZ1bmN0aW9uIGluIHlvdXIgdHJhbnNtaXQgaGFuZGxlcg0KICogZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSB0byB0aGUgdHJhbnNtaXR0ZXIuDQogKg0KICogTm90ZTogICAgVGhlIGRyaXZlcpJzIHRvcCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiBVQVJUXzE2NTUwX2lzcigpDQogKiB3aWxsIGNhbGwgeW91ciB0cmFuc21pdCBoYW5kbGVyIGZ1bmN0aW9uIGluIHJlc3BvbnNlIHRvIGFuIFRIUkUgaW50ZXJydXB0DQogKiBmcm9tIHRoZSBDb3JlMTY1NTAuDQogKg0KICogTm90ZTogICAgWW91IGNhbiBkaXNhYmxlIHRoZSBUSFJFIGludGVycnVwdCB3aGVuIHJlcXVpcmVkIGJ5IGNhbGxpbmcgdGhlDQogKiBVQVJUXzE2NTUwX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24uIFRoaXMgaXMgeW91ciBjaG9pY2UgYW5kIGlzIGRlcGVuZGVudA0KICogdXBvbiB5b3VyIGFwcGxpY2F0aW9uLg0KICoNCiAqIE5vdGU6ICAgIFRoZSBVQVJUXzE2NTUwX2lycV90eCgpIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSB0aGUgdHJhbnNtaXQgaGFuZGxlcg0KICogZnVuY3Rpb24gdGhhdCB5b3UgcmVnaXN0ZXIgd2l0aCB0aGUgVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcigpIGZ1bmN0aW9uLg0KICogSXQgdXNlcyBpdHMgb3duIGludGVybmFsIFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBvdmVycmlkZXMgYW55DQogKiBjdXN0b20gaW50ZXJydXB0IGhhbmRsZXIgdGhhdCB5b3UgcmVnaXN0ZXIgdXNpbmcgdGhlDQogKiBVQVJUXzE2NTUwX3NldF90eF9oYW5kbGVyKCkgZnVuY3Rpb24uDQogKg0KICogQHBhcmFtIHRoaXNfdWFydCAgICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGENCiAqICAgICAgICAgICAgICAgICAgICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgcmVnYXJkaW5nIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIENvcmUxNjU1MC4NCiAqIEBwYXJhbSBoYW5kbGVyICAgICAgIFRoZSBoYW5kbGVyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSB0cmFuc21pdHRlcg0KICogICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gcHJvdmlkZWQgYnkgeW91ciBhcHBsaWNhdGlvbiwNCiAqICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgVUFSVCBUSFJFIGludGVycnVwdC4NCiAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaGFuZGxlciBpcyBvZiB1YXJ0XzE2NTUwX2lycV9oYW5kbGVyX3QgdHlwZS4NCiAqIEByZXR1cm4gICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKg0KICogRXhhbXBsZToNCiAqIEBjb2RlDQogKiAjaW5jbHVkZSAiY29yZV8xNjU1MC5oIg0KICoNCiAqICNkZWZpbmUgVUFSVF81NzYwMF9CQVVEIDI2DQogKg0KICogdWFydF8xNjU1MF9pbnN0YW5jZV90IGdfdWFydDsNCiAqDQogKiB1aW50OF90ICogZ190eF9idWZmZXI7DQogKiBzaXplX3QgZ190eF9zaXplID0gMDsNCiAqDQogKiB2b2lkIHVhcnRfdHhfaGFuZGxlciggdWFydF8xNjU1MF9pbnN0YW5jZV90ICogdGhpc191YXJ0ICkNCiAqIHsNCiAqICAgICAgc2l6ZV90IHNpemVfaW5fZmlmbzsNCiAqDQogKiAgICAgIHNpemVfaW5fZmlmbyA9IFVBUlRfMTY1NTBfZmlsbF90eF9maWZvKCB0aGlzX3VhcnQsDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWdfdHhfYnVmZmVyLA0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ190eF9zaXplICk7DQogKg0KICogICAgICBpZihzaXplX2luX2ZpZm8gPT0gZ190eF9zaXplKQ0KICogICAgICB7DQogKiAgICAgICAgIGdfdHhfc2l6ZSA9IDA7DQogKiAgICAgICAgIFVBUlRfMTY1NTBfZGlzYWJsZV9pcnEoIHRoaXNfdWFydCwgVUFSVF8xNjU1MF9UQkVfSVJRICk7DQogKiAgICAgIH0NCiAqICAgICAgZWxzZQ0KICogICAgICB7DQogKiAgICAgICAgIGdfdHhfYnVmZmVyID0gJmdfdHhfYnVmZmVyW3NpemVfaW5fZmlmb107DQogKiAgICAgICAgIGdfdHhfc2l6ZSA9IGdfdHhfc2l6ZSAtIHNpemVfaW5fZmlmbzsNCiAqICAgICAgfQ0KICogIH0NCiAqDQogKiAgaW50IG1haW4odm9pZCkNCiAqICB7DQogKiAgICAgIHVpbnQ4X3QgbWVzc2FnZVsxMl0gPSAiSGVsbG8gd29ybGQiOw0KICoNCiAqICAgICAgVUFSVF8xNjU1MF9pbml0KCAmZ191YXJ0LCBVQVJUXzU3NjAwX0JBVUQsDQogKiAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9EQVRBXzhfQklUUyB8IFVBUlRfMTY1NTBfTk9fUEFSSVRZIHwNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUXzE2NTUwX09ORV9TVE9QX0JJVCApOw0KICoNCiAqICAgICAgZ190eF9idWZmZXIgPSBtZXNzYWdlOw0KICogICAgICBnX3R4X3NpemUgPSBzaXplb2YobWVzc2FnZSk7DQogKg0KICogICAgICBVQVJUXzE2NTUwX3NldF90eF9oYW5kbGVyKCAmZ191YXJ0LCB1YXJ0X3R4X2hhbmRsZXIpOw0KICoNCiAqICAgICAgd2hpbGUgKCAxICkNCiAqICAgICAgew0KICogICAgICAgICAgOw0KICogICAgICB9DQogKiAgICAgIHJldHVybigwKTsNCiAqICB9DQogKg0KICogQGVuZGNvZGUNCiAqLw0Kdm9pZA0KVUFSVF8xNjU1MF9zZXRfdHhfaGFuZGxlcg0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICB1YXJ0XzE2NTUwX2lycV9oYW5kbGVyX3QgaGFuZGxlcg0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIFRoZSBVQVJUXzE2NTUwX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhDQogKiBtb2RlbSBzdGF0dXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIG1vZGVtDQogKiBzdGF0dXMgKE1TKSBpbnRlcnJ1cHQgb2NjdXJzLiBUaGUgVUFSVF8xNjU1MF9zZXRfbW9kZW1zdGF0dXNfaGFuZGxlcigpDQogKiBmdW5jdGlvbiBhbHNvIGVuYWJsZXMgdGhlIE1TIGludGVycnVwdCBhdCB0aGUgQ29yZTE2NTUwIGxldmVsLiBZb3UgbXVzdA0KICogY3JlYXRlIGFuZCByZWdpc3RlciB0aGUgbW9kZW0gc3RhdHVzIGhhbmRsZXIgZnVuY3Rpb24gdG8gc3VpdCB5b3VyDQogKiBhcHBsaWNhdGlvbi4NCiAqDQogKiBOb3RlOiAgICBUaGUgZHJpdmVyknMgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uIFVBUlRfMTY1NTBfaXNyKCkNCiAqIHdpbGwgY2FsbCB5b3VyIHJlY2VpdmUgc3RhdHVzIGhhbmRsZXIgZnVuY3Rpb24gaW4gcmVzcG9uc2UgdG8gYW4gTVMgaW50ZXJydXB0DQogKiBmcm9tIHRoZSBDb3JlMTY1NTAuDQogKg0KICogTm90ZTogICAgWW91IGNhbiBkaXNhYmxlIHRoZSBNUyBpbnRlcnJ1cHQgd2hlbiByZXF1aXJlZCBieSBjYWxsaW5nIHRoZQ0KICogVUFSVF8xNjU1MF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9uLiBUaGlzIGlzIHlvdXIgY2hvaWNlIGFuZCBpcyBkZXBlbmRlbnQNCiAqIHVwb24geW91ciBhcHBsaWNhdGlvbi4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIGhhbmRsZXIgICAgICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIG1vZGVtIHN0YXR1cw0KICogICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gcHJvdmlkZWQgYnkgeW91ciBhcHBsaWNhdGlvbg0KICogICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiBhIFVBUlQgTVMgaW50ZXJydXB0Lg0KICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBoYW5kbGVyIGZ1bmN0aW9uIG11c3QgYmUgb2YgdHlwZQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90Lg0KICogQHJldHVybiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICNpbmNsdWRlICJjb3JlXzE2NTUwLmgiDQogKg0KICogI2RlZmluZSBVQVJUXzU3NjAwX0JBVUQgMjYNCiAqDQogKiB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgZ191YXJ0Ow0KICoNCiAqIHZvaWQgdWFydF9tb2RlbV9oYW5kbGVyKCB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQgKQ0KICogew0KICogICAgICB1aW50OF90IHN0YXR1czsNCiAqICAgICAgc3RhdHVzID0gVUFSVF8xNjU1MF9nZXRfbW9kZW1fc3RhdHVzKCB0aGlzX3VhcnQgKTsNCiAqICAgICAgaWYoIHN0YXR1cyAmIFVBUlRfMTY1NTBfQ1RTICkNCiAqICAgICAgew0KICogICAgICAgICAgdWFydF9jdHNfaGFuZGxlcigpOw0KICogICAgICB9DQogKiB9DQogKg0KICogaW50IG1haW4odm9pZCkNCiAqIHsNCiAqICAgICBVQVJUXzE2NTUwX2luaXQoICZnX3VhcnQsIFVBUlRfNTc2MDBfQkFVRCwNCiAqICAgICAgICAgICAgICAgICAgICAgIFVBUlRfMTY1NTBfREFUQV84X0JJVFMgfCBVQVJUXzE2NTUwX05PX1BBUklUWSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVF8xNjU1MF9PTkVfU1RPUF9CSVQpOw0KICogICAgIFVBUlRfMTY1NTBfc2V0X21vZGVtc3RhdHVzX2hhbmRsZXIoICZnX3VhcnQsIHVhcnRfbW9kZW1faGFuZGxlcik7DQogKg0KICogICAgIHdoaWxlICggMSApDQogKiAgICAgew0KICogICAgICAgICA7DQogKiAgICAgfQ0KICogICAgIHJldHVybigwKTsNCiAqIH0NCiAqIEBlbmRjb2RlDQogKi8NCnZvaWQNClVBUlRfMTY1NTBfc2V0X21vZGVtc3RhdHVzX2hhbmRsZXINCigNCiAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgdWFydF8xNjU1MF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogKiBUaGUgVUFSVF8xNjU1MF9maWxsX3R4X2ZpZm8oKSBmdW5jdGlvbiBmaWxscyB0aGUgVUFSVCdzIGhhcmR3YXJlIHRyYW5zbWl0dGVyDQogKiBGSUZPIHdpdGggdGhlIGRhdGEgZm91bmQgaW4gdGhlIHRyYW5zbWl0dGVyIGJ1ZmZlciB0aGF0IGlzIHBhc3NlZCB2aWEgdGhlDQogKiB0eF9idWZmZXIgZnVuY3Rpb24gcGFyYW1ldGVyLiBJZiB0aGUgdHJhbnNtaXR0ZXIgRklGTyBpcyBub3QgZW1wdHkgd2hlbiB0aGUNCiAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCB0cmFuc2ZlcnJpbmcNCiAqIGFueSBkYXRhIHRvIHRoZSBGSUZPOyBvdGhlcndpc2UsIHRoZSBmdW5jdGlvbiB0cmFuc2ZlcnMgZGF0YSBmcm9tIHRoZQ0KICogdHJhbnNtaXR0ZXIgYnVmZmVyIHRvIHRoZSBGSUZPIHVudGlsIGl0IGlzIGZ1bGwgb3IgdW50aWwgdGhlIGNvbXBsZXRlDQogKiBjb250ZW50cyBvZiB0aGUgdHJhbnNtaXR0ZXIgYnVmZmVyIGhhdmUgYmVlbiBjb3BpZWQgaW50byB0aGUgRklGTy4gVGhlDQogKiBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIFVBUlQncyB0cmFuc21pdHRlciBGSUZPLg0KICoNCiAqIE5vdGU6ICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFVBUlSScyBsaW5lIHN0YXR1cyByZWdpc3RlciAoTFNSKSB0byBjaGVjaw0KICogZm9yIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIHRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKFRIUkUpIGJpdA0KICogYmVmb3JlIHRyYW5zZmVycmluZyBkYXRhIGZyb20gdGhlIGRhdGEgYnVmZmVyIHRvIHRoZSB0cmFuc21pdHRlciBGSUZPLiBJZg0KICogVEhSRSBpcyAwLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSwgd2l0aG91dCB0cmFuc2ZlcnJpbmcgYW55IGRhdGENCiAqIHRvIHRoZSBGSUZPLiBJZiBUSFJFIGlzIDEsIHRoZSBmdW5jdGlvbiB0cmFuc2ZlcnMgdXAgdG8gMTYgYnl0ZXMgb2YgZGF0YSB0bw0KICogdGhlIEZJRk8gYW5kIHRoZW4gcmV0dXJucy4NCiAqDQogKiBOb3RlOiAgICBUaGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBzZXJpYWwgY29ubmVjdGlvbiB3aWxsIHN0aWxsIGJlIGluDQogKiBwcm9ncmVzcyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gVXNlIHRoZSBVQVJUXzE2NTUwX2dldF90eF9zdGF0dXMoKQ0KICogZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8ga25vdyB3aGVuIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eS4NCiAqDQogKiBAcGFyYW0gdGhpc191YXJ0ICAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYQ0KICogICAgICAgICAgICAgICAgICAgICAgdWFydF8xNjU1MF9pbnN0YW5jZV90IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGFsbCBkYXRhDQogKiAgICAgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgdGhpcyBpbnN0YW5jZSBvZiB0aGUgQ29yZTE2NTUwLg0KICogQHBhcmFtIHR4X2J1ZmZlciAgICAgVGhlIHR4X2J1ZmZlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyDQogKiAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkLg0KICogQHBhcmFtIHR4X3NpemUgICAgICAgVGhlIHR4X3NpemUgcGFyYW1ldGVyIGlzIHRoZSBzaXplIGluIGJ5dGVzLCBvZiB0aGUgZGF0YQ0KICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdHJhbnNtaXR0ZWQuDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQNCiAqICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIFVBUlQncyB0cmFuc21pdHRlciBGSUZPLg0KICoNCiAqIEV4YW1wbGU6DQogKiBAY29kZQ0KICogICB2b2lkIHNlbmRfdXNpbmdfaW50ZXJydXB0KHVpbnQ4X3QgKiBwYnVmZiwgc2l6ZV90IHR4X3NpemUpDQogKiAgIHsNCiAqICAgICAgIHNpemVfdCBzaXplX2luX2ZpZm87DQogKiAgICAgICBzaXplX2luX2ZpZm8gPSBVQVJUXzE2NTUwX2ZpbGxfdHhfZmlmbyggJmdfdWFydCwgcGJ1ZmYsIHR4X3NpemUgKTsNCiAqICAgfQ0KICogQGVuZGNvZGUNCiAqLw0Kc2l6ZV90DQpVQVJUXzE2NTUwX2ZpbGxfdHhfZmlmbw0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBjb25zdCB1aW50OF90ICogdHhfYnVmZmVyLA0KICAgIHNpemVfdCB0eF9zaXplDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogVGhlIFVBUlRfMTY1NTBfZ2V0X3R4X3N0YXR1cygpIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRyYW5zbWl0dGVyIHN0YXR1cyBvZg0KICogdGhlIENvcmUxNjU1MCBpbnN0YW5jZS4gSXQgcmVhZHMgYm90aCB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpDQogKiBhbmQgcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc21pdCBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5IChUSFJFKSBhbmQNCiAqIHRyYW5zbWl0dGVyIGVtcHR5IChURU1UKSBiaXRzLg0KICoNCiAqIEBwYXJhbSB0aGlzX3VhcnQgICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhDQogKiAgICAgICAgICAgICAgICAgICAgICB1YXJ0XzE2NTUwX2luc3RhbmNlX3Qgc3RydWN0dXJlIHRoYXQgaG9sZHMgYWxsIGRhdGENCiAqICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGluZyB0aGlzIGluc3RhbmNlIG9mIHRoZSBDb3JlMTY1NTAuDQogKiBAcmV0dXJuICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFVBUlSScyB0cmFuc21pdHRlciBzdGF0dXMNCiAqICAgICAgICAgICAgICAgICAgICAgIGFzIGFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyAwDQogKiAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgdHJhbnNtaXR0ZXIgc3RhdHVzIGJpdHMgYXJlIG5vdCBzZXQgb3IgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkLiBUaGUgZHJpdmVyIHByb3ZpZGVzIGEgc2V0DQogKiAgICAgICAgICAgICAgICAgICAgICBvZiBiaXQgbWFzayBjb25zdGFudHMgdGhhdCBzaG91bGQgYmUgY29tcGFyZWQgd2l0aA0KICogICAgICAgICAgICAgICAgICAgICAgYW5kL29yIHVzZWQgdG8gbWFzayB0aGUgcmV0dXJuZWQgdmFsdWUgdG8gZGV0ZXJtaW5lDQogKiAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNtaXR0ZXIgc3RhdHVzLg0KICogICAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGNvbXBhcmVkIHRvIHRoZSBmb2xsb3dpbmcNCiAqICAgICAgICAgICAgICAgICAgICAgIGJpdG1hc2tzLCBhIG5vbi16ZXJvIHJlc3VsdCBpbmRpY2F0ZXMgdGhhdCB0aGUNCiAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdHJhbnNtaXR0ZXIgc3RhdHVzIGJpdCBpcyBzZXQ6DQogKiAgICAgICAgICAgICAgICAgICAgICCVICAgVUFSVF8xNjU1MF9USFJFICAgICAoYml0IG1hc2sgPSAweDIwKQ0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfVEVNVCAgICAgKGJpdCBtYXNrID0gMHg0MCkNCiAqICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBjb21wYXJlZCB0byB0aGUgZm9sbG93aW5nDQogKiAgICAgICAgICAgICAgICAgICAgICBiaXQgbWFzaywgYSBub24temVybyByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlDQogKiAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlciBpcyBidXN5IG9yIHRoZSBmdW5jdGlvbiBleGVjdXRpb24gZmFpbGVkLg0KICogICAgICAgICAgICAgICAgICAgICAglSAgIFVBUlRfMTY1NTBfVFhfQlVTWSAgICAgIChiaXQgbWFzayA9IDB4MDApDQogKiBFeGFtcGxlOg0KICogQGNvZGUNCiAqICAgdWludDhfdCB0eF9idWZmWzEwXSA9ICJhYmNkZWZnaGkiOw0KICoNCiAqICAgVUFSVF8xNjU1MF9wb2xsZWRfdHgoICZnX3VhcnQsIHR4X2J1ZmYsIHNpemVvZih0eF9idWZmKSk7DQogKg0KICogICB3aGlsZSAoICEgKFVBUlRfMTY1NTBfVEVNVCAmIFVBUlRfMTY1NTBfZ2V0X3R4X3N0YXR1cyggJmdfdWFydCApICkgICkNCiAqICAgew0KICogICAgICA7DQogKiAgIH0NCiAqIEBlbmRjb2RlDQogKi8NCnVpbnQ4X3QNClVBUlRfMTY1NTBfZ2V0X3R4X3N0YXR1cw0KKA0KICAgIHVhcnRfMTY1NTBfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmIC8qIF9fQ09SRV8xNjU1MF9IICovDQo=