LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3J0Yy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgUlRDIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3J0Yy5oIg0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNkZWZpbmUgQ1JMX0NORl9TZXQgICAgICAoKHUxNikweDAwMTApICAgICAgLyogQ29uZmlndXJhdGlvbiBGbGFnIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSTF9DTkZfUmVzZXQgICAgKCh1MTYpMHhGRkVGKSAgICAgIC8qIENvbmZpZ3VyYXRpb24gRmxhZyBEaXNhYmxlIE1hc2sgKi8NCiNkZWZpbmUgUlRDX0xTQl9NYXNrICAgICAoKHUzMikweDAwMDBGRkZGKSAgLyogUlRDIExTQiBNYXNrICovDQojZGVmaW5lIFJUQ19NU0JfTWFzayAgICAgKCh1MzIpMHhGRkZGMDAwMCkgIC8qIFJUQyBNU0IgTWFzayAqLw0KI2RlZmluZSBQUkxIX01TQl9NYXNrICAgICgodTMyKTB4MDAwRjAwMDApICAvKiBSVEMgUHJlc2NhbGVyIE1TQiBNYXNrICovDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFJUQyBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gUlRDX0lUOiBzcGVjaWZpZXMgdGhlIFJUQyBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfSVRfT1c6IE92ZXJmbG93IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfSVRfQUxSOiBBbGFybSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX1NFQzogU2Vjb25kIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFJUQyBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUlRDX0lUQ29uZmlnKHUxNiBSVENfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1JUQ19JVChSVENfSVQpKTsgIA0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBSVEMtPkNSSCB8PSBSVENfSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgUlRDLT5DUkggJj0gKHUxNil+UlRDX0lUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0VudGVyQ29uZmlnTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IEVudGVycyB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19FbnRlckNvbmZpZ01vZGUodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBDTkYgZmxhZyB0byBlbnRlciBpbiB0aGUgQ29uZmlndXJhdGlvbiBNb2RlICovDQogIFJUQy0+Q1JMIHw9IENSTF9DTkZfU2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19FeGl0Q29uZmlnTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IEV4aXRzIGZyb20gdGhlIFJUQyBjb25maWd1cmF0aW9uIG1vZGUuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBSVENfRXhpdENvbmZpZ01vZGUodm9pZCkNCnsNCiAgLyogUmVzZXQgdGhlIENORiBmbGFnIHRvIGV4aXQgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiBNb2RlICovDQogIFJUQy0+Q1JMICY9IENSTF9DTkZfUmVzZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBSVEMgY291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFJUQyBjb3VudGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBSVENfR2V0Q291bnRlcih2b2lkKQ0Kew0KICB1MTYgdG1wID0gMDsNCiAgdG1wID0gUlRDLT5DTlRMOw0KDQogIHJldHVybiAoKCh1MzIpUlRDLT5DTlRIIDw8IDE2ICkgfCB0bXApIDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfU2V0Q291bnRlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFJUQyBjb3VudGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQ291bnRlclZhbHVlOiBSVEMgY291bnRlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19TZXRDb3VudGVyKHUzMiBDb3VudGVyVmFsdWUpDQp7IA0KICBSVENfRW50ZXJDb25maWdNb2RlKCk7DQoNCiAgLyogU2V0IFJUQyBDT1VOVEVSIE1TQiB3b3JkICovDQogIFJUQy0+Q05USCA9IChDb3VudGVyVmFsdWUgJiBSVENfTVNCX01hc2spID4+IDE2Ow0KICAvKiBTZXQgUlRDIENPVU5URVIgTFNCIHdvcmQgKi8NCiAgUlRDLT5DTlRMID0gKENvdW50ZXJWYWx1ZSAmIFJUQ19MU0JfTWFzayk7DQoNCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFJUQyBwcmVzY2FsZXIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBSVEMgcHJlc2NhbGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBSVENfR2V0UHJlc2NhbGVyKHZvaWQpDQp7DQogIHUzMiB0bXAgPSAweDAwOw0KDQogIHRtcCA9ICgodTMyKVJUQy0+UFJMSCAmICh1MzIpMHgwMDBGKSA8PCAweDEwOw0KICB0bXAgfD0gUlRDLT5QUkxMOw0KDQogIHJldHVybiB0bXA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX1NldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFJUQyBwcmVzY2FsZXIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBQcmVzY2FsZXJWYWx1ZTogUlRDIHByZXNjYWxlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19TZXRQcmVzY2FsZXIodTMyIFByZXNjYWxlclZhbHVlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfUlRDX1BSRVNDQUxFUihQcmVzY2FsZXJWYWx1ZSkpOw0KICANCiAgUlRDX0VudGVyQ29uZmlnTW9kZSgpOw0KDQogIC8qIFNldCBSVEMgUFJFU0NBTEVSIE1TQiB3b3JkICovDQogIFJUQy0+UFJMSCA9IChQcmVzY2FsZXJWYWx1ZSAmIFBSTEhfTVNCX01hc2spID4+IDB4MTA7DQogIC8qIFNldCBSVEMgUFJFU0NBTEVSIExTQiB3b3JkICovDQogIFJUQy0+UFJMTCA9IChQcmVzY2FsZXJWYWx1ZSAmIFJUQ19MU0JfTWFzayk7DQoNCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX1NldEFsYXJtDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgUlRDIGFsYXJtIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQWxhcm1WYWx1ZTogUlRDIGFsYXJtIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUlRDX1NldEFsYXJtKHUzMiBBbGFybVZhbHVlKQ0KeyAgDQogIFJUQ19FbnRlckNvbmZpZ01vZGUoKTsNCg0KICAvKiBTZXQgdGhlIEFMQVJNIE1TQiB3b3JkICovDQogIFJUQy0+QUxSSCA9IChBbGFybVZhbHVlICYgUlRDX01TQl9NYXNrKSA+PiAxNjsNCiAgLyogU2V0IHRoZSBBTEFSTSBMU0Igd29yZCAqLw0KICBSVEMtPkFMUkwgPSAoQWxhcm1WYWx1ZSAmIFJUQ19MU0JfTWFzayk7DQoNCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldERpdmlkZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBSVEMgZGl2aWRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFJUQyBEaXZpZGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBSVENfR2V0RGl2aWRlcih2b2lkKQ0Kew0KICB1MzIgdG1wID0gMHgwMDsNCg0KICB0bXAgPSAoKHUzMilSVEMtPkRJVkggJiAodTMyKTB4MDAwRikgPDwgMHgxMDsNCiAgdG1wIHw9IFJUQy0+RElWTDsNCg0KICByZXR1cm4gdG1wOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19XYWl0Rm9yTGFzdFRhc2sNCiogRGVzY3JpcHRpb24gICAgOiBXYWl0cyB1bnRpbCBsYXN0IHdyaXRlIG9wZXJhdGlvbiBvbiBSVEMgcmVnaXN0ZXJzIGhhcyBmaW5pc2hlZC4NCiogICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgd3JpdGUgdG8gUlRDIHJlZ2lzdGVycy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19XYWl0Rm9yTGFzdFRhc2sodm9pZCkNCnsNCiAgLyogTG9vcCB1bnRpbCBSVE9GRiBmbGFnIGlzIHNldCAqLw0KICB3aGlsZSAoKFJUQy0+Q1JMICYgUlRDX0ZMQUdfUlRPRkYpID09ICh1MTYpUkVTRVQpDQogIHsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19XYWl0Rm9yU3luY2hybw0KKiBEZXNjcmlwdGlvbiAgICA6IFdhaXRzIHVudGlsIHRoZSBSVEMgcmVnaXN0ZXJzIChSVENfQ05ULCBSVENfQUxSIGFuZCBSVENfUFJMKQ0KKiAgICAgICAgICAgICAgICAgIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSByZWFkIG9wZXJhdGlvbiBhZnRlcg0KKiAgICAgICAgICAgICAgICAgIGFuIEFQQiByZXNldCBvciBhbiBBUEIgY2xvY2sgc3RvcC4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFJUQ19XYWl0Rm9yU3luY2hybyh2b2lkKQ0Kew0KICAvKiBDbGVhciBSU0YgZmxhZyAqLw0KICBSVEMtPkNSTCAmPSAodTE2KX5SVENfRkxBR19SU0Y7DQoNCiAgLyogTG9vcCB1bnRpbCBSU0YgZmxhZyBpcyBzZXQgKi8NCiAgd2hpbGUgKChSVEMtPkNSTCAmIFJUQ19GTEFHX1JTRikgPT0gKHUxNilSRVNFVCkNCiAgew0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBSVENfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfUlRPRkY6IFJUQyBPcGVyYXRpb24gT0ZGIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfUlNGOiBSZWdpc3RlcnMgU3luY2hyb25pemVkIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfT1c6IE92ZXJmbG93IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfQUxSOiBBbGFybSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX1NFQzogU2Vjb25kIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBSVENfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFJUQ19HZXRGbGFnU3RhdHVzKHUxNiBSVENfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19SVENfR0VUX0ZMQUcoUlRDX0ZMQUcpKTsgDQogIA0KICBpZiAoKFJUQy0+Q1JMICYgUlRDX0ZMQUcpICE9ICh1MTYpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBSVENfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBSVEOScyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gUlRDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX1JTRjogUmVnaXN0ZXJzIFN5bmNocm9uaXplZCBmbGFnLiBUaGlzIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2xlYXJlZCBvbmx5IGFmdGVyIGFuIEFQQiByZXNldCBvciBhbiBBUEIgQ2xvY2sgc3RvcC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfT1c6IE92ZXJmbG93IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0ZMQUdfQUxSOiBBbGFybSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19GTEFHX1NFQzogU2Vjb25kIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgUlRDX0NsZWFyRmxhZyh1MTYgUlRDX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19SVENfQ0xFQVJfRkxBRyhSVENfRkxBRykpOyANCiAgICANCiAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIGZsYWcgKi8NCiAgUlRDLT5DUkwgJj0gKHUxNil+UlRDX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUlRDX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBSVEMgaW50ZXJydXB0IGhhcyBvY2N1cmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFJUQ19JVDogc3BlY2lmaWVzIHRoZSBSVEMgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX09XOiBPdmVyZmxvdyBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX0FMUjogQWxhcm0gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFJUQ19JVF9TRUM6IFNlY29uZCBpbnRlcnJ1cHQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgUlRDX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFJUQ19HZXRJVFN0YXR1cyh1MTYgUlRDX0lUKQ0Kew0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfUlRDX0dFVF9JVChSVENfSVQpKTsgDQogIA0KICBiaXRzdGF0dXMgPSAoSVRTdGF0dXMpKChSVEMtPkNSTCAmIFJUQ19JVCkgIT0gKHUxNilSRVNFVCk7DQoNCiAgaWYgKCgoUlRDLT5DUkggJiBSVENfSVQpICE9ICh1MTYpUkVTRVQpICYmIGJpdHN0YXR1cykNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFJUQ19DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgUlRDknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFJUQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfSVRfT1c6IE92ZXJmbG93IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBSVENfSVRfQUxSOiBBbGFybSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gUlRDX0lUX1NFQzogU2Vjb25kIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBSVENfQ2xlYXJJVFBlbmRpbmdCaXQodTE2IFJUQ19JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1JUQ19JVChSVENfSVQpKTsgIA0KICANCiAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIHBlbmRpbmcgYml0ICovDQogIFJUQy0+Q1JMICY9ICh1MTYpflJUQ19JVDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA3IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==