LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3RiLmMNCiogQXV0aG9yICAgICAgICAgICAgIDogTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiogRGF0ZSBGaXJzdCBJc3N1ZWQgIDogMDMvMTAvMjAwNg0KKiBEZXNjcmlwdGlvbiAgICAgICAgOiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBUQiBzb2Z0d2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNy8xNy8yMDA2IDogVjEuMA0KKiAwMy8xMC8yMDA2IDogVjAuMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAiNzV4X3RiLmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNkZWZpbmUgVEJfSVRfRW5hYmxlX01hc2sgICAweDdGRkYNCiNkZWZpbmUgVEJfSVRfQ2xlYXJfTWFzayAgICAweDdGRkYNCiNkZWZpbmUgVEJfSUNfRW5hYmxlICAgICAgICAweDAwMDQNCiNkZWZpbmUgVEJfSUNQb2xhcml0eV9TZXQgICAweDAwMDgNCiNkZWZpbmUgVEJfSUNQb2xhcml0eV9SZXNldCAweEZGRjcNCiNkZWZpbmUgVEJfVUZTX1Jlc2V0ICAgICAgICAweEZGRkUNCiNkZWZpbmUgVEJfVUZTX1NldCAgICAgICAgICAweDAwMDENCg0KLyogVEIgZGVidWcgc3RhdGUgKi8NCiNkZWZpbmUgVEJfREJHQ19TZXQgICAgMHgwNDAwDQojZGVmaW5lIFRCX0RCR0NfUmVzZXQgIDB4RkI3Rg0KDQovKiBUQiBjb3VudGVyIHN0YXRlICovDQojZGVmaW5lIFRCX0NPVU5URVJfUmVzZXQgIDB4MDAwMg0KI2RlZmluZSBUQl9DT1VOVEVSX1N0YXJ0ICAweDAwMDQNCiNkZWZpbmUgVEJfQ09VTlRFUl9TdG9wICAgMHhGRkZCDQoNCiNkZWZpbmUgVEJfU01TX0VYVENMS19TZXQgICAweDAwMDgNCiNkZWZpbmUgVEJfU01TX1JFU0VUQ0xLX1NldCAweDAwMDANCg0KLyogVEIgU2xhdmUgTW9kZSBFbmFibGUgU2V0L1Jlc2V0IHZhbHVlICovDQojZGVmaW5lIFRCX1NNRV9SZXNldCAgMHg3MzFCDQojZGVmaW5lIFRCX1NNRV9TZXQgICAgMHgwMDA0DQoNCi8qIFRCIFRyaWdnZXIgU2VsZWN0aW9uIHZhbHVlICovDQojZGVmaW5lIFRCX1RTX0lDMV9TZXQgIDB4MDIwMA0KDQovKiBUQiBTQ1IgTWFza3MgYml0ICovDQojZGVmaW5lIFRCX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrICAgICAgICAweDczMDcNCiNkZWZpbmUgVEJfVHJpZ2dlclNlbGVjdGlvbl9NYXNrICAgICAgICAgIDB4NzAxRg0KDQovKiBSZXNldCBSZWdpc3RlciBNYXNrcyAqLw0KI2RlZmluZSBUQl9QcmVzY2FsZXJfUmVzZXRfTWFzayAgIDB4MDAwMA0KI2RlZmluZSBUQl9Db3VudGVyTW9kZV9NYXNrICAgICAgIDB4RkY4Rg0KI2RlZmluZSBUQl9BdXRvUmVsb2FkX1Jlc2V0X01hc2sgIDB4RkZGRg0KDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUQl9EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBUQiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0DQoqICAgICAgICAgICAgICAgICAgcmVzZXQgdmFsdWVzLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVEJfRGVJbml0KHZvaWQpDQp7DQogLyogRW50ZXJzIGFuZCBleGl0cyB0aGUgVEIgcGVyaXBoZXJhbCB0byBhbmQgZnJvbSByZXNldCAqLw0KIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1RCLEVOQUJMRSk7DQogTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVEIsRElTQUJMRSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIFRCICBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVEJfSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiBUQl9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVEJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFRCIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRCX0luaXQoVEJfSW5pdFR5cGVEZWYqIFRCX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgVEIgcHJlc2NhbGVyIHZhbHVlICovDQogIFRCLT5QU0MgPSBUQl9Jbml0U3RydWN0LT5UQl9QcmVzY2FsZXI7DQoNCiAgLyogU2V0IHRoZSBUQiBwZXJpb2QgdmFsdWUgKi8NCiAgVEItPkFSUiA9IFRCX0luaXRTdHJ1Y3QtPlRCX0F1dG9SZWxvYWQ7DQoNCiAgLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGNvdW50ZXIgbW9kZSAqLw0KICBUQi0+Q1IgPSAoVEItPkNSICYgVEJfQ291bnRlck1vZGVfTWFzaykgfCBUQl9Jbml0U3RydWN0LT5UQl9Db3VudGVyTW9kZTsNCg0KICAvKiBTZXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xvY2sgc291cmNlICovDQogIGlmKFRCX0luaXRTdHJ1Y3QtPlRCX0Nsb2NrU291cmNlID09IFRCX0Nsb2NrU291cmNlX0NLUlRDKQ0KICB7ICANCiAgICBUQi0+U0NSICY9IFRCX1NNRV9SZXNldCAmIFRCX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrICYgVEJfVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICAgIFRCLT5TQ1IgfD0gVEJfU01TX0VYVENMS19TZXQgfCBUQl9TTUVfU2V0IHwgVEJfVFNfSUMxX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUQi0+U0NSICY9IFRCX1NNRV9SZXNldCAmIFRCX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrICYgVEJfVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICB9DQoNCiAgaWYoVEJfSW5pdFN0cnVjdC0+VEJfTW9kZSA9PSBUQl9Nb2RlX0lDKQ0KICB7DQogICAgLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFRCIFNDUiByZWdpc3RlciAqLw0KICAgIFRCLT5TQ1IgJj0gVEJfU01FX1Jlc2V0ICYgVEJfU2xhdmVNb2RlU2VsZWN0aW9uX01hc2sgJiBUQl9UcmlnZ2VyU2VsZWN0aW9uX01hc2s7DQogICAgVEItPlNDUiB8PSBUQl9TTVNfUkVTRVRDTEtfU2V0IHwgVEJfU01FX1NldCB8IFRCX1RTX0lDMV9TZXQ7DQoNCiAgICAvKiBTZXQgdGhlIElDMSBlbmFibGUgYml0ICovDQogICAgVEItPklNQ1IgfD0gVEJfSUNfRW5hYmxlOw0KDQogICAgLyogU2V0IHRoZSBpbnB1dCBzaWduYWwgcG9sYXJpdHkgKi8NCiAgICBpZiAoVEJfSW5pdFN0cnVjdC0+VEJfSUNBUG9sYXJpdHkgPT0gVEJfSUNBUG9sYXJpdHlfRmFsbGluZykNCiAgICB7DQogICAgICBUQi0+SU1DUiB8PSBUQl9JQ1BvbGFyaXR5X1NldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIFRCLT5JTUNSICY9IFRCX0lDUG9sYXJpdHlfUmVzZXQ7DQogICAgfQ0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVEJfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZQ0KKiBJbnB1dCAgICAgICAgICA6IFRCX0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgVEJfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoDQoqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVEJfU3RydWN0SW5pdChUQl9Jbml0VHlwZURlZiAqVEJfSW5pdFN0cnVjdCkNCnsNCiAgVEJfSW5pdFN0cnVjdC0+VEJfTW9kZSA9IFRCX01vZGVfVGltaW5nOw0KICBUQl9Jbml0U3RydWN0LT5UQl9DbG9ja1NvdXJjZSA9IFRCX0Nsb2NrU291cmNlX0NLVElNOw0KICBUQl9Jbml0U3RydWN0LT5UQl9Db3VudGVyTW9kZSA9IFRCX0NvdW50ZXJNb2RlX1VwOw0KICBUQl9Jbml0U3RydWN0LT5UQl9JQ0FQb2xhcml0eSA9IFRCX0lDQVBvbGFyaXR5X1Jpc2luZzsNCiAgVEJfSW5pdFN0cnVjdC0+VEJfUHJlc2NhbGVyID0gVEJfUHJlc2NhbGVyX1Jlc2V0X01hc2s7DQogIFRCX0luaXRTdHJ1Y3QtPlRCX0F1dG9SZWxvYWQgPSBUQl9BdXRvUmVsb2FkX1Jlc2V0X01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVEIgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUQiBwZXJpcGhlcmFsLiBUaGlzIHBhcmFtZXRlciBjYW4NCiogICAgICAgICAgICAgICAgICBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRCX0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFRCLT5DUiB8PSBUQl9DT1VOVEVSX1N0YXJ0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIFRCLT5DUiAmPSBUQl9DT1VOVEVSX1N0b3A7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUQl9JVENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBUQiBpbnRlcnJ1cHQuDQoqIElucHV0ICAgICAgICAgIDogLSBUQl9JVDogc3BlY2lmaWVzIHRoZSBUQiBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yDQoqICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfVXBkYXRlOiBUQiBVcGRhdGUgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfR2xvYmFsVXBkYXRlOiBUQiBHbG9iYWwgVXBkYXRlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRCX0lUX0lDOiBUQiBJbnB1dCBDYXB0dXJlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3c3RhdGU6ICBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBUQiBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVEJfSVRDb25maWcodTE2IFRCX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIHUxNiBUQl9JVF9FbmFibGUgPSAwOw0KDQogIFRCX0lUX0VuYWJsZSA9IFRCX0lUICYgVEJfSVRfRW5hYmxlX01hc2s7DQoNCiAgaWYoTmV3c3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAvKiBVcGRhdGUgaW50ZXJydXB0IGdsb2JhbCBzb3VyY2U6IG92ZXJmbG93L3VuZGVmbG93LCBjb3VudGVyIHJlc2V0IG9wZXJhdGlvbg0KICAgb3Igc2xhdmUgbW9kZSBjb250cm9sbGVyIGluIHJlc2V0IG1vZGUgKi8NCiAgIGlmICgoVEJfSVQgJiBUQl9JVF9HbG9iYWxVcGRhdGUpID09IFRCX0lUX0dsb2JhbFVwZGF0ZSkNCiAgIHsNCiAgICAgVEItPkNSICY9IFRCX1VGU19SZXNldDsNCiAgICB9DQogICAvKiBVcGRhdGUgaW50ZXJydXB0IHNvdXJjZTogY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cgKi8NCiAgIGVsc2UgaWYgKChUQl9JVCAmIFRCX0lUX1VwZGF0ZSkgPT0gVEJfSVRfVXBkYXRlKQ0KICAgew0KICAgIFRCLT5DUiB8PSBUQl9VRlNfU2V0Ow0KICAgfQ0KICAgLyogU2VsZWN0IGFuZCBlbmFibGUgdGhlIGludGVycnVwdHMgcmVxdWVzdHMgKi8NCiAgIFRCLT5SU1IgfD0gVEJfSVRfRW5hYmxlOw0KICAgVEItPlJFUiB8PSBUQl9JVF9FbmFibGU7DQogIH0NCiAgLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0cyByZXF1ZXN0cyAqLw0KICBlbHNlDQogIHsNCiAgIFRCLT5SU1IgJj0gflRCX0lUX0VuYWJsZTsNCiAgIFRCLT5SRVIgJj0gflRCX0lUX0VuYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX1NldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRCIFByZXNjYWxlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBQcmVzY2FsZXI6IHNwZWNpZmllcyB0aGUgVEIgUHJlc2NhbGVyIHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUQl9TZXRQcmVzY2FsZXIodTE2IFByZXNjYWxlcikNCnsNCiAgLyogU2V0cyB0aGUgcHJlc2NhbGVyIHZhbHVlICovDQogIFRCLT5QU0MgPSBQcmVzY2FsZXI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfUmVzZXRDb3VudGVyDQoqIERlc2NyaXB0aW9uICAgIDogUmUtaW50aWFsaXplcyB0aGUgY291bnRlciBhbmQgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUNCiogICAgICAgICAgICAgICAgICByZWdpc3RlcnMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUQl9SZXNldENvdW50ZXIodm9pZCkNCnsNCiAgLyogUmUtaW50aWFsaXplcyBUQiBjb3VudGVyICovDQogIFRCLT5DUiB8PSBUQl9DT1VOVEVSX1Jlc2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0RlYnVnQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBUQiBwZXJpcGhlcmFsIERlYnVnIGNvbnRyb2wuDQoqIElucHV0ICAgICAgICAgIDogTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVEIgRGVidWcgY29udHJvbC4NCiogICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUQl9EZWJ1Z0NtZChGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFRCLT5DUiB8PSBUQl9EQkdDX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUQi0+Q1IgJj0gVEJfREJHQ19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0NvdW50ZXJNb2RlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVEIgQ291bnRlciBNb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IFRCX0NvdW50ZXJNb2RlOiBzcGVjaWZpZXMgdGhlIFRCIGNvdW50ZXIgbW9kZSB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfQ291bnRlck1vZGVfVXA6IFRCIFVwIENvdW50aW5nIE1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUQl9Db3VudGVyTW9kZV9Eb3duOiBUQiBEb3duIENvdW50aW5nIE1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUQl9Db3VudGVyTW9kZV9DZW50ZXJBbGlnbmVkOiBUQiBDZW50ZXIgQWxpZ25lZCBNb2RlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRCX0NvdW50ZXJNb2RlQ29uZmlnKHUxNiBUQl9Db3VudGVyTW9kZSkNCnsNCiAgLyogQ291bnRlciBtb2RlIGNvbmZpZ3VyYXRpb24gKi8NCiAgVEItPkNSICY9IFRCX0NvdW50ZXJNb2RlX01hc2s7DQogIFRCLT5DUiB8PSBUQl9Db3VudGVyTW9kZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUQl9TTGF2ZU1vZGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUQiBzbGF2ZSBNb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IFRCX1NNU01vZGU6IHNwZWNpZmllcyB0aGUgVEIgc2xhdmUgbW9kZSB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfU01TTW9kZV9UcmlnZ2VyOiBUaGUgY291bnRlciBzdGFydHMgYXQgYSByaXNpbmcgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSBvZiB0aGUgdHJpZ2dlciANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUQl9TTVNNb2RlX0dhdGVkOiBUaGUgY291bnRlciBjbG9jayBpcyBlbmFibGVkIHdoZW4gDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlciBzaWduYWwgaXMgaGlnaA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRCX1NNU01vZGVfRXh0ZXJuYWw6IFRoZSByaXNpbmcgZWRnZSBvZiBzZWxlY3RlZCB0cmlnZ2VyDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tzIHRoZSBjb3VudGVyDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfU01TTW9kZV9SZXNldDogVGhlIHJpc2luZyBlZGdlIG9mIHRoZSBzZWxlY3RlZCANCiogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyIHNpZ25hbCByZXNldHMgdGhlIGNvdW50ZXINCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVEJfU0xhdmVNb2RlQ29uZmlnKHUxNiBUQl9TTVNNb2RlKQ0Kew0KICBUQi0+U0NSICY9IFRCX1NNRV9SZXNldCAmIFRCX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrICYgVEJfVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICBUQi0+U0NSIHw9IFRCX1NNRV9TZXQgfCBUQl9TTVNNb2RlIHwgVEJfVFNfSUMxX1NldDsgDQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0dldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUQiBDb3VudGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIFRCIGNvdW50ZXIgcmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRCX0dldENvdW50ZXIodm9pZCkNCnsNCiAgcmV0dXJuIFRCLT5DTlQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfR2V0SUNBUDENCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUQiBJbnB1dCBjYXB0dXJlIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIFRCIElDUjEgcmVnaXN0ZXIgdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRCX0dldElDQVAxKHZvaWQpDQp7DQogIHJldHVybiBUQi0+SUNSMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUQl9TZXRDb3VudGVyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVEIgQ291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBDb3VudGVyOiBzcGVjaWZpZXMgdGhlIFRCIENvdW50ZXIgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRCX1NldENvdW50ZXIodTE2IENvdW50ZXIpDQp7DQogIFRCLT5DTlQgPSBDb3VudGVyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFRCIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiBUQl9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUQl9GTEFHX0lDOiBUQiBJbnB1dCBDYXB0dXJlIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUQl9GTEFHX1VwZGF0ZTogVEIgdXBkYXRlIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiB0aGUgVEJfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFRCX0dldEZsYWdTdGF0dXModTE2IFRCX0ZMQUcpDQp7DQogIGlmKChUQi0+SVNSICYgVEJfRkxBRykgIT0gUkVTRVQgKQ0KICB7DQogICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVEJfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBUQpJzIHBlbmRpbmcgZmxhZ3MuDQoqIElucHV0ICAgICAgICAgIDogVEJfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfRkxBR19JQzogVEIgSW5wdXQgQ2FwdHVyZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfRkxBR19VcGRhdGU6IFRCIHVwZGF0ZSBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRCX0NsZWFyRmxhZyh1MTYgVEJfRkxBRykNCnsNCiAgLyogQ2xlYXJzIHRoZSBmbGFncyAqLw0KICBUQi0+SVNSICY9IH5UQl9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUQiBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiBUQl9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfVXBkYXRlOiBUQiBVcGRhdGUgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRCX0lUX0dsb2JhbFVwZGF0ZTogVEIgR2xvYmFsIFVwZGF0ZSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfSUM6IFRCIElucHV0IENhcHR1cmUgaW50ZXJydXB0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgdGhlIFRCX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFRCX0dldElUU3RhdHVzKHUxNiBUQl9JVCkNCnsNCiAgdTE2IFRCX0lUX0NoZWNrID0gMDsNCg0KICAvKiBDYWxjdWxhdGVzIHRoZSBwZW5kaW5nIGJpdHMgdG8gYmUgY2hlY2tlZCAqLw0KICBUQl9JVF9DaGVjayA9IFRCX0lUICYgVEJfSVRfQ2xlYXJfTWFzazsNCiAgDQogIGlmKChUQi0+SVNSICYgVEJfSVRfQ2hlY2spICE9IFJFU0VUICkNCiAgew0KICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRCX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBUQidzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQoqIElucHV0ICAgICAgICAgIDogVEJfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfVXBkYXRlOiBUQiBVcGRhdGUgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVEJfSVRfR2xvYmFsVXBkYXRlOiBUQiBHbG9iYWwgVXBkYXRlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRCX0lUX0lDOiBUQiBJbnB1dCBDYXB0dXJlIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUQl9DbGVhcklUUGVuZGluZ0JpdCh1MTYgVEJfSVQpDQp7DQogIHUxNiBUQl9JVF9DbGVhciA9IDA7DQoNCiAgLyogQ2FsY3VsYXRlcyB0aGUgcGVuZGluZyBiaXRzIHRvIGJlIGNsZWFyZWQgKi8NCiAgVEJfSVRfQ2xlYXIgPSBUQl9JVCAmIFRCX0lUX0NsZWFyX01hc2s7DQoNCiAgLyogQ2xlYXJzIHRoZSBwZW5kaW5nIGJpdHMgKi8NCiAgVEItPklTUiAmPSB+VEJfSVRfQ2xlYXI7DQp9DQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K