LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3RpbS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVElNIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfdGltLmgiIA0KI2luY2x1ZGUgIjc1eF9tcmNjLmgiDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBUSU0gaW50ZXJydXB0IG1hc2tzICovDQojZGVmaW5lIFRJTV9JVF9DbGVhcl9NYXNrICAgMHg3RkZGDQojZGVmaW5lIFRJTV9JVF9FbmFibGVfTWFzayAgMHg3RkZGDQoNCi8qIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbiBTZXQvUmVzZXQgKi8NCiNkZWZpbmUgVElNX0lDMVNfU2V0ICAgIDB4MDAwMQ0KI2RlZmluZSBUSU1fSUMxU19SZXNldCAgMHgwMDNFDQoNCi8qIFRJTSBJbnB1dCBDYXB0dXJlIFNlbGVjdGlvbiBTZXQvUmVzZXQgKi8NCiNkZWZpbmUgVElNX0lDMlNfU2V0ICAgIDB4MDAwMg0KI2RlZmluZSBUSU1fSUMyU19SZXNldCAgMHgwMDNEDQoNCi8qIFRJTV9TQ1IgTWFza3MgYml0ICovDQojZGVmaW5lIFRJTV9FbmNvZGVyX01hc2sgICAgICAgICAgICAgICAgICAgMHg3MzFDDQojZGVmaW5lIFRJTV9TbGF2ZU1vZGVTZWxlY3Rpb25fTWFzayAgICAgICAgMHg3MzA3DQojZGVmaW5lIFRJTV9UcmlnZ2VyU2VsZWN0aW9uX01hc2sgICAgICAgICAgMHg3MDFGDQojZGVmaW5lIFRJTV9JbnRlcm5hbFRyaWdnZXJTZWxlY3Rpb25fTWFzayAgMHgwMzFGDQoNCi8qIFRJTSBFbmNvZGVyIG1vZGUgU2V0IHZhbHVlICovDQojZGVmaW5lIFRJTV9FbmNvZGVyMV9TZXQgIDB4MDAwMQ0KI2RlZmluZSBUSU1fRW5jb2RlcjJfU2V0ICAweDAwMDINCiNkZWZpbmUgVElNX0VuY29kZXIzX1NldCAgMHgwMDAzDQoNCi8qIFRJTSBTbGF2ZSBNb2RlIEVuYWJsZSBTZXQvUmVzZXQgdmFsdWUgKi8NCiNkZWZpbmUgVElNX1NNRV9SZXNldCAgMHg3MzFCDQojZGVmaW5lIFRJTV9TTUVfU2V0ICAgIDB4MDAwNA0KDQovKiBUSU0gSW50ZXJuYWwgVHJpZ2dlciBTZWxlY3Rpb24gdmFsdWUgKi8NCiNkZWZpbmUgVElNX0lUU19USU0wICAweDEwMDANCiNkZWZpbmUgVElNX0lUU19USU0xICAweDIwMDANCiNkZWZpbmUgVElNX0lUU19USU0yICAweDMwMDANCiNkZWZpbmUgVElNX0lUU19QV00gICAweDQwMDANCg0KLyogVElNIFRyaWdnZXIgU2VsZWN0aW9uIHZhbHVlICovDQojZGVmaW5lIFRJTV9UU19JQzFfU2V0ICAweDAyMDANCiNkZWZpbmUgVElNX1RTX0lDMl9TZXQgIDB4MDMwMA0KDQovKiBUSU0gU2xhdmUgTW9kZSBzZWxjdGlvbiBleHRlcm5hbCBjbG9jayBTZXQgdmFsdWUgKi8NCiNkZWZpbmUgVElNX1NNU19FWFRDTEtfU2V0ICAgIDB4MDAwOA0KI2RlZmluZSBUSU1fU01TX1JFU0VUQ0xLX1NldCAgMHgwMDAwDQoNCi8qIFRJTV9DUiBNYXNrcyBiaXQgKi8NCiNkZWZpbmUgVElNX0RCQVNFX01hc2sgICAgICAgICAgICAgICAgMHgwNzdGDQojZGVmaW5lIFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2sgIDB4RkM3Rg0KI2RlZmluZSBUSU1fQ291bnRlck1vZGVfTWFzayAgICAgICAgICAweEZGOEYNCg0KLyogVElNIFVwZGF0ZSBmbGFnIHNlbGVjdGlvbiBTZXQvUmVzZXQgdmFsdWUgKi8NCiNkZWZpbmUgVElNX1VGU19SZXNldCAgMHhGRkZFDQojZGVmaW5lIFRJTV9VRlNfU2V0ICAgIDB4MDAwMQ0KDQovKiBUSU0gQ291bnRlciB2YWx1ZSAqLw0KI2RlZmluZSBUSU1fQ09VTlRFUl9SZXNldCAgMHgwMDAyDQojZGVmaW5lIFRJTV9DT1VOVEVSX1N0YXJ0ICAweDAwMDQNCiNkZWZpbmUgVElNX0NPVU5URVJfU3RvcCAgIDB4RkZGQg0KDQovKiBUSU0gT25lIHB1bHNlIE1vZGUgc2V0IHZhbHVlICovDQojZGVmaW5lIFRJTV9PUE1fU2V0ICAgIDB4MDAwOA0KI2RlZmluZSBUSU1fT1BNX1Jlc2V0ICAweEZGRjcNCg0KLyogVElNIERlYnVnIE1vZGUgU2V0L1Jlc2V0IHZhbHVlICovDQojZGVmaW5lIFRJTV9EQkdDX1NldCAgICAweDA0MDANCiNkZWZpbmUgVElNX0RCR0NfUmVzZXQgIDB4RkI3Rg0KDQovKiBUSU0gSW5wdXQgQ2FwdHVyZSBFbmFibGUvRGlzYWJsZSB2YWx1ZSAqLw0KI2RlZmluZSBUSU1fSUMxX0VuYWJsZSAgMHgwMDA0DQojZGVmaW5lIFRJTV9JQzJfRW5hYmxlICAweDAwMTANCg0KLyogVElNIElucHV0IENhcHR1cmUgUG9sYXJpdHkgU2V0L1Jlc2V0IHZhbHVlICovDQojZGVmaW5lIFRJTV9JQzFQX1NldCAgICAweDAwMDgNCiNkZWZpbmUgVElNX0lDMlBfU2V0ICAgIDB4MDAyMA0KI2RlZmluZSBUSU1fSUMxUF9SZXNldCAgMHgwMDM3DQojZGVmaW5lIFRJTV9JQzJQX1Jlc2V0ICAweDAwMUYNCg0KLyogVElNIE91dHB1dCBDb21wYXJlIFBvbGFyaXR5IFNldC9SZXNldCB2YWx1ZSAqLw0KI2RlZmluZSBUSU1fT0MxUF9TZXQgICAgMHgwMDIwDQojZGVmaW5lIFRJTV9PQzJQX1NldCAgICAweDIwMDANCiNkZWZpbmUgVElNX09DMVBfUmVzZXQgIDB4M0YxRg0KI2RlZmluZSBUSU1fT0MyUF9SZXNldCAgMHgxRjNGDQoNCi8qIFRJTSBPdXRwdXQgQ29tcGFyZSBjb250cm9sIG1vZGUgY29uc3RhbnQgKi8NCiNkZWZpbmUgVElNX09DQ29udHJvbF9QV00gICAgICAgICAweDAwMEMNCiNkZWZpbmUgVElNX09DQ29udHJvbF9PQ1RvZ2dsZSAgICAweDAwMDYNCiNkZWZpbmUgVElNX09DQ29udHJvbF9PQ0luYWN0aXZlICAweDAwMDQNCiNkZWZpbmUgVElNX09DQ29udHJvbF9PQ0FjdGl2ZSAgICAweDAwMDINCiNkZWZpbmUgVElNX09DQ29udHJvbF9PQ1RpbWluZyAgICAweDAwMDANCg0KLyogVElNIE91dHB1dCBDb21wYXJlIG1vZGUgRW5hYmxlIHZhbHVlICovDQojZGVmaW5lIFRJTV9PQzFfRW5hYmxlICAweDAwMTANCiNkZWZpbmUgVElNX09DMl9FbmFibGUgIDB4MTAwMA0KDQovKiBUSU0gT3V0cHV0IENvbXBhcmUgbW9kZSBNYXNrIHZhbHVlICovDQojZGVmaW5lIFRJTV9PQzFDX01hc2sgIDB4M0YzMQ0KI2RlZmluZSBUSU1fT0MyQ19NYXNrICAweDMxM0YNCg0KLyogVElNIFByZWxvYWQgYml0IFNldC9SZXNldCB2YWx1ZSAqLw0KI2RlZmluZSBUSU1fUExEMV9TZXQgICAgMHgwMDAxDQojZGVmaW5lIFRJTV9QTEQxX1Jlc2V0ICAweEZGRkUNCg0KI2RlZmluZSBUSU1fUExEMl9TZXQgICAgMHgwMTAwDQojZGVmaW5lIFRJTV9QTEQyX1Jlc2V0ICAweEZFRkYNCg0KLyogVElNIE9DUk0gU2V0L1Jlc2V0IHZhbHVlICovDQojZGVmaW5lIFRJTV9PQ1JNX1NldCAgICAweDAwODANCiNkZWZpbmUgVElNX09DUk1fUmVzZXQgIDB4MDMwRA0KDQovKiBSZXNldCBSZWdpc3RlciBNYXNrcyAqLw0KI2RlZmluZSBUSU1fUHVsc2UyX1Jlc2V0X01hc2sgICAgIDB4MDAwMA0KI2RlZmluZSBUSU1fUHJlc2NhbGVyX1Jlc2V0X01hc2sgIDB4MDAwMA0KI2RlZmluZSBUSU1fUHVsc2UxX1Jlc2V0X01hc2sgICAgIDB4MDAwMA0KI2RlZmluZSBUSU1fUGVyaW9kX1Jlc2V0X01hc2sgICAgIDB4RkZGRg0KI2RlZmluZSBUSU1fQ291bnRlcl9SZXNldCAgICAgICAgIDB4MDAwMg0KDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIHZvaWQgSUNBUF9Nb2R1bGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9Jbml0VHlwZURlZiogVElNX0luaXRTdHJ1Y3QpOw0Kc3RhdGljIHZvaWQgRW5jb2Rlcl9Nb2RlQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSW5pdFR5cGVEZWYqIFRJTV9Jbml0U3RydWN0KTsNCnN0YXRpYyB2b2lkIE9DTV9Nb2R1bGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9Jbml0VHlwZURlZiogVElNX0luaXRTdHJ1Y3QpOw0KDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgVElNIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCiogICAgICAgICAgICAgICAgICB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9EZUluaXQoVElNX1R5cGVEZWYgKlRJTXgpDQp7IA0KICBpZihUSU14ID09IFRJTTApDQogIHsNCiAgICBNUkNDX1BlcmlwaGVyYWxTV1Jlc2V0Q29uZmlnKE1SQ0NfUGVyaXBoZXJhbF9USU0wLEVOQUJMRSk7DQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVElNMCxESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmKFRJTXggPT0gVElNMSkNCiAgew0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1RJTTEsRU5BQkxFKTsNCiAgICBNUkNDX1BlcmlwaGVyYWxTV1Jlc2V0Q29uZmlnKE1SQ0NfUGVyaXBoZXJhbF9USU0xLERJU0FCTEUpOw0KICB9DQogIGVsc2UgaWYoVElNeCA9PSBUSU0yKQ0KICB7DQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVElNMixFTkFCTEUpOw0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1RJTTIsRElTQUJMRSk7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBUSU14IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSW5pdFN0cnVjdCAuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAwLCAxIG9yIDIgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQoqICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBUSU0NCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9Jbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSW5pdFR5cGVEZWYqIFRJTV9Jbml0U3RydWN0KQ0Kew0KICAvKiBTZXQgdGhlIHByZXNjYWxlciB2YWx1ZSAqLw0KICBUSU14LT5QU0MgPSBUSU1fSW5pdFN0cnVjdC0+VElNX1ByZXNjYWxlcjsNCg0KICAvKiBTZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSAqLw0KICBUSU1fQ2xvY2tTb3VyY2VDb25maWcoVElNeCwgVElNX0luaXRTdHJ1Y3QtPlRJTV9DbG9ja1NvdXJjZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9Jbml0U3RydWN0LT5USU1fRXh0Q0xLRWRnZSk7DQoNCiAgLyogU2VsZWN0IHRoZSBjb3VudGVyIG1vZGUgKi8NCiAgVElNeC0+Q1IgJj0gVElNX0NvdW50ZXJNb2RlX01hc2s7DQogIFRJTXgtPkNSIHw9IFRJTV9Jbml0U3RydWN0LT5USU1fQ291bnRlck1vZGU7DQoNCiAgLyogU2V0IHRoZSBwZXJpb2QgdmFsdWUgKi8NCiAgVElNeC0+QVJSID0gVElNX0luaXRTdHJ1Y3QtPlRJTV9QZXJpb2Q7DQoNCiAgc3dpdGNoKFRJTV9Jbml0U3RydWN0LT5USU1fTW9kZSkNCiAgew0KICAgIGNhc2UgVElNX01vZGVfT0NUaW1pbmc6IGNhc2UgVElNX01vZGVfT0NBY3RpdmU6IGNhc2UgVElNX01vZGVfT0NJbmFjdGl2ZToNCiAgICBjYXNlIFRJTV9Nb2RlX09DVG9nZ2xlOiBjYXNlIFRJTV9Nb2RlX1BXTToNCiAgICAgIE9DTV9Nb2R1bGVDb25maWcoVElNeCwgVElNX0luaXRTdHJ1Y3QpOw0KICAgIGJyZWFrOw0KDQogICAgY2FzZSBUSU1fTW9kZV9QV01JOiBjYXNlIFRJTV9Nb2RlX0lDOg0KICAgICAgSUNBUF9Nb2R1bGVDb25maWcoVElNeCwgVElNX0luaXRTdHJ1Y3QpOw0KICAgIGJyZWFrOw0KDQogICAgY2FzZSBUSU1fTW9kZV9FbmNvZGVyMTogY2FzZSBUSU1fTW9kZV9FbmNvZGVyMjogY2FzZSBUSU1fTW9kZV9FbmNvZGVyMzoNCiAgICAgIEVuY29kZXJfTW9kZUNvbmZpZyhUSU14LCBUSU1fSW5pdFN0cnVjdCk7DQogICAgYnJlYWs7DQoNCiAgICBjYXNlIFRJTV9Nb2RlX09QTV9QV006IGNhc2UgVElNX01vZGVfT1BNX1RvZ2dsZTogY2FzZSBUSU1fTW9kZV9PUE1fQWN0aXZlOg0KDQogICAgICAvKiBPdXRwdXQgbW9kdWxlIGNvbmZpZ3VyYXRpb24gKi8NCiAgICAgIE9DTV9Nb2R1bGVDb25maWcoVElNeCwgVElNX0luaXRTdHJ1Y3QpOw0KDQogICAgICAvKiBJbnB1dCBtb2R1bGUgY29uZmlndXJhdGlvbiAqLw0KICAgICAgSUNBUF9Nb2R1bGVDb25maWcoVElNeCwgVElNX0luaXRTdHJ1Y3QpOw0KICAgICAgDQogICAgICAvKiBTZXQgdGhlIHNsYXZlIG1vZGUgdG8gdHJpZ2dlciBNb2RlICovDQogICAgICBUSU14LT5TQ1IgfD0gVElNX1N5bmNocm9Nb2RlX1RyaWdnZXI7DQoNCiAgICAgIC8qIFJlcGV0aXRpdmUgcHVsc2Ugc3RhdGUgc2VsZWN0aW9uICovDQogICAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX1JlcGV0aXRpdmVQdWxzZSA9PSBUSU1fUmVwZXRpdGl2ZVB1bHNlX0Rpc2FibGUpDQogICAgICB7DQogICAgICAgIFRJTXgtPkNSIHw9IFRJTV9PUE1fU2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBUSU14LT5DUiAmPSBUSU1fT1BNX1Jlc2V0Ow0KICAgICAgfQ0KICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBUSU1fSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBUSU1fSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBUSU1fSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lICAgICAgICAgICAgICAgICAgICAgICAgDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TdHJ1Y3RJbml0KFRJTV9Jbml0VHlwZURlZiAqVElNX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTV9Jbml0U3RydWN0LT5USU1fTW9kZSA9IFRJTV9Nb2RlX09DVGltaW5nOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX1ByZXNjYWxlciA9IFRJTV9QcmVzY2FsZXJfUmVzZXRfTWFzazsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9DbG9ja1NvdXJjZSA9IFRJTV9DbG9ja1NvdXJjZV9JbnRlcm5hbDsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9FeHRDTEtFZGdlID0gVElNX0V4dENMS0VkZ2VfUmlzaW5nOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX0NvdW50ZXJNb2RlID0gVElNX0NvdW50ZXJNb2RlX1VwOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX1BlcmlvZCA9IFRJTV9QZXJpb2RfUmVzZXRfTWFzazsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID0gVElNX0NoYW5uZWxfQUxMOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX1B1bHNlMSA9IFRJTV9QdWxzZTFfUmVzZXRfTWFzazsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTIgPSBUSU1fUHVsc2UyX1Jlc2V0X01hc2s7DQogIFRJTV9Jbml0U3RydWN0LT5USU1fUmVwZXRpdGl2ZVB1bHNlID0gVElNX1JlcGV0aXRpdmVQdWxzZV9EaXNhYmxlOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX1BvbGFyaXR5MSA9IFRJTV9Qb2xhcml0eTFfTG93Ow0KICBUSU1fSW5pdFN0cnVjdC0+VElNX1BvbGFyaXR5MiA9IFRJTV9Qb2xhcml0eTJfTG93Ow0KICBUSU1fSW5pdFN0cnVjdC0+VElNX0lDMVNlbGVjdGlvbiA9IFRJTV9JQzFTZWxlY3Rpb25fVEkxOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX0lDMlNlbGVjdGlvbiA9IFRJTV9JQzJTZWxlY3Rpb25fVEkxOw0KICBUSU1fSW5pdFN0cnVjdC0+VElNX0lDMVBvbGFyaXR5ID0gVElNX0lDMVBvbGFyaXR5X1Jpc2luZzsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9JQzJQb2xhcml0eSA9IFRJTV9JQzJQb2xhcml0eV9SaXNpbmc7DQogIFRJTV9Jbml0U3RydWN0LT5USU1fUFdNSV9JQ1NlbGVjdGlvbiA9IFRJTV9QV01JX0lDU2VsZWN0aW9uX1RJMTsNCiAgVElNX0luaXRTdHJ1Y3QtPlRJTV9QV01JX0lDUG9sYXJpdHkgPSBUSU1fUFdNSV9JQ1BvbGFyaXR5X1Jpc2luZzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fQ21kKFRJTV9UeXBlRGVmICpUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogaWYoTmV3c3RhdGUgPT0gRU5BQkxFKQ0KICB7IA0KICAgIFRJTXgtPkNSIHw9IFRJTV9DT1VOVEVSX1N0YXJ0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIFRJTXgtPkNSICY9IFRJTV9DT1VOVEVSX1N0b3A7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU0gaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lUOiBzcGVjaWZpZXMgdGhlIFRJTSBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9JQzE6IElucHV0IENhcHR1cmUgMSBJbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX09DMTogT3V0cHV0IENvbXBhcmUgMSBJbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX1VwZGF0ZTogVGltZXIgdXBkYXRlIEludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfR2xvYmFsVXBkYXRlOiBUaW1lciBnbG9iYWwgdXBkYXRlIEludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfSUMyOiBJbnB1dCBDYXB0dXJlIDIgSW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9PQzI6IE91dHB1dCBDb21wYXJlIDIgSW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFRJTXggaW50ZXJydXB0cy4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fSVRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHUxNiBUSU1fSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsgDQogIHUxNiBUSU1fSVRfRW5hYmxlID0gMDsNCg0KICBUSU1fSVRfRW5hYmxlID0gVElNX0lUICYgVElNX0lUX0VuYWJsZV9NYXNrOw0KDQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIFVwZGF0ZSBpbnRlcnJ1cHQgZ2xvYmFsIHNvdXJjZTogb3ZlcmZsb3cvdW5kZWZsb3csIGNvdW50ZXIgcmVzZXQgb3BlcmF0aW9uDQogICAgb3Igc2xhdmUgbW9kZSBjb250cm9sbGVyIGluIHJlc2V0IG1vZGUgKi8NCiAgICBpZigoVElNX0lUICYgVElNX0lUX0dsb2JhbFVwZGF0ZSkgPT0gVElNX0lUX0dsb2JhbFVwZGF0ZSkNCiAgICB7DQogICAgICBUSU14LT5DUiAmPSBUSU1fVUZTX1Jlc2V0Ow0KICAgIH0NCiAgICAvKiBVcGRhdGUgaW50ZXJydXB0IHNvdXJjZTogY291bnRlciBvdmVyZmxvdy91bmRlcmZsb3cgKi8NCiAgICBlbHNlIGlmKChUSU1fSVQgJiBUSU1fSVRfVXBkYXRlKSA9PSBUSU1fSVRfVXBkYXRlKQ0KICAgIHsNCiAgICAgIFRJTXgtPkNSIHw9IFRJTV9VRlNfU2V0Ow0KICAgIH0NCiAgICAvKiBTZWxlY3QgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cyByZXF1ZXN0cyAqLw0KICAgIFRJTXgtPlJTUiB8PSBUSU1fSVRfRW5hYmxlOw0KICAgIFRJTXgtPlJFUiB8PSBUSU1fSVRfRW5hYmxlOw0KICB9DQogIC8qIERpc2FibGUgdGhlIGludGVycnVwdHMgcmVxdWVzdHMgKi8NCiAgZWxzZQ0KICB7DQogICAgVElNeC0+UlNSICY9IH5USU1fSVRfRW5hYmxlOw0KICAgIFRJTXgtPlJFUiAmPSB+VElNX0lUX0VuYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9QcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBUSU0gcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIE9DUnguDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAwLCAxIG9yIDIgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBjaGFubmVsIHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzE6IFRJTSBDaGFubmVsIDEgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDIgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsX0FMTDogVElNIENoYW5uZWwgMWFuZCAyIGFyZSB1c2VkDQoqICAgICAgICAgICAgICAgICAgLSBOZXdzdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3Rlcg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1ByZWxvYWRDb25maWcoVElNX1R5cGVEZWYgKlRJTXgsIHUxNiBUSU1fQ2hhbm5lbCwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KICBpZihOZXdzdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICBzd2l0Y2ggKFRJTV9DaGFubmVsKQ0KICAgIHsNCiAgICAgIGNhc2UgVElNX0NoYW5uZWxfMToNCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX1BMRDFfU2V0Ow0KICAgICAgYnJlYWs7DQogICANCiAgICAgIGNhc2UgVElNX0NoYW5uZWxfMjoNCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX1BMRDJfU2V0Ow0KICAgICAgYnJlYWs7DQoNCiAgICAgIGNhc2UgVElNX0NoYW5uZWxfQUxMOg0KICAgICAgVElNeC0+T01SMSB8PSBUSU1fUExEMV9TZXQgfCBUSU1fUExEMl9TZXQ7DQogICAgICBicmVhazsNCg0KICAgICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIHN3aXRjaCAoVElNX0NoYW5uZWwpDQogICAgew0KICAgICAgY2FzZSBUSU1fQ2hhbm5lbF8xOg0KICAgICAgVElNeC0+T01SMSAmPSBUSU1fUExEMV9SZXNldDsNCiAgICAgIGJyZWFrOw0KICAgDQogICAgICBjYXNlIFRJTV9DaGFubmVsXzI6DQogICAgICBUSU14LT5PTVIxICY9IFRJTV9QTEQyX1Jlc2V0Ow0KICAgICAgYnJlYWs7DQoNCiAgICAgIGNhc2UgVElNX0NoYW5uZWxfQUxMOg0KICAgICAgVElNeC0+T01SMSAmPSBUSU1fUExEMV9SZXNldCAmIFRJTV9QTEQyX1Jlc2V0Ow0KICAgICAgYnJlYWs7DQoNCiAgICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsNCiAgICB9DQogIH0gIA0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9ETUFDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU0wknMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTV9ETUFTb3VyY2VzOiBzcGVjaWZpZXMgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9ETUFTb3VyY2VfT0MxOiBPdXRwdXQgQ29tcGFyZSAxIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRE1BU291cmNlX09DMjogT3V0cHV0IENvbXBhcmUgMiBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQVNvdXJjZV9JQzE6IElucHV0IENhcHR1cmUgMSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQVNvdXJjZV9JQzI6IElucHV0IENhcHR1cmUgMiBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQVNvdXJjZV9VcGRhdGU6IFRpbWVyIFVwZGF0ZSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fT0NSTVN0YXRlOiB0aGUgc3RhdGUgb2Ygb3V0cHV0IGNvbXBhcmUgcmVxdWVzdCBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NSTVN0YXRlX0VuYWJsZSANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NSTVN0YXRlX0Rpc2FibGUgDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRE1BQmFzZTpETUEgQmFzZSBhZGRyZXNzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX0NSLCBUSU1fRE1BQmFzZV9TQ1IsIFRJTV9ETUFCYXNlX0lNQ1IsDQoqICAgICAgICAgICAgICAgICAgICBUSU1fRE1BQmFzZV9PTVIxLCBUSU1fRE1BQmFzZV9SU1IsDQoqICAgICAgICAgICAgICAgICAgICBUSU1fRE1BQmFzZV9SRVIsIFRJTV9ETUFCYXNlX0lTUiwgVElNX0RNQUJhc2VfQ05ULCANCiogICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX1BTQywgVElNX0RNQUJhc2VfQVJSLCBUSU1fRE1BQmFzZV9PQ1IxLCANCiogICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX09DUjIsIFRJTV9ETUFCYXNlX0lDUjEsIFRJTV9ETUFCYXNlX0lDUjINCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0RNQUNvbmZpZyh1MTYgVElNX0RNQVNvdXJjZXMsIHUxNiBUSU1fT0NSTVN0YXRlLCB1MTYgVElNX0RNQUJhc2UpDQp7DQogIC8qIFNlbGVjdCB0aGUgRE1BIHJlcXVlc3RzICovDQogIFRJTTAtPlJTUiAmPSBUSU1fRE1BU291cmNlczsNCg0KICAvKiBTZXQgdGhlIE9DUk0gc3RhdGUgKi8NCiAgaWYoVElNX09DUk1TdGF0ZSA9PSBUSU1fT0NSTVN0YXRlX0VuYWJsZSkNCiAgew0KICAgIFRJTTAtPlJTUiB8PSBUSU1fT0NSTV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgVElNMC0+UlNSICY9IFRJTV9PQ1JNX1Jlc2V0Ow0KICB9DQoNCiAgLyogU2V0IHRoZSBETUEgQmFzZSBhZGRyZXNzICovDQogIFRJTTAtPkNSICY9IFRJTV9EQkFTRV9NYXNrOw0KICBUSU0wLT5DUiB8PSBUSU1fRE1BQmFzZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fRE1BQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNMJJzIERNQSBpbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU1fRE1BU291cmNlczogc3BlY2lmaWVzIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRE1BU291cmNlX09DMTogT3V0cHV0IENvbXBhcmUgMSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQVNvdXJjZV9PQzI6IE91dHB1dCBDb21wYXJlIDIgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9ETUFTb3VyY2VfSUMxOiBJbnB1dCBDYXB0dXJlIDEgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9ETUFTb3VyY2VfSUMyOiBJbnB1dCBDYXB0dXJlIDIgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9ETUFTb3VyY2VfVXBkYXRlOiBUaW1lciBVcGRhdGUgRE1BIHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgIC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9ETUFDbWQodTE2IFRJTV9ETUFTb3VyY2VzLCBGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFRJTTAtPlJFUiB8PSBUSU1fRE1BU291cmNlczsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUSU0wLT5SRVIgJj0gflRJTV9ETUFTb3VyY2VzOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0Nsb2NrU291cmNlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNIGNsb2NrIHNvdXJjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0Nsb2NrU291cmNlOiBzcGVjaWZpZXMgdGhlIFRJTSBjbG9jayBzb3VyY2UgdG8gYmUgDQoqICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0Nsb2NrU291cmNlX0ludGVybmFsOiBDS19USU0gaW50ZXJuYWwgY2xvY2sNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ2xvY2tTb3VyY2VfVEkxMTogRXh0ZXJuYWwgaW5wdXQgcGluIFRJMSANCiogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMxIGNoYW5uZWwuDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0Nsb2NrU291cmNlX1RJMTI6IEV4dGVybmFsIGlucHV0IHBpbiBUSTENCiogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMyIGNoYW5uZWwuDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0Nsb2NrU291cmNlX1RJMjI6IEV4dGVybmFsIGlucHV0IHBpbiBUSTINCiogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMyIGNoYW5uZWwuDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0Nsb2NrU291cmNlX1RJMjE6IEV4dGVybmFsIGlucHV0IHBpbiBUSTINCiogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8gSUMxIGNoYW5uZWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0Q0xLRWRnZTogc3BlY2lmaWVzIHRoZSBFeHRlcm5hbCBpbnB1dCBzaWduYWwgZWRnZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dENMS0VkZ2VfRmFsbGluZyA6IEZhbGxpbmcgZWRnZSBzZWxlY3RlZC4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0Q0xLRWRnZV9SaXNpbmcgOiBSaXNpbmcgZWRnZSBzZWxlY3RlZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0Nsb2NrU291cmNlQ29uZmlnKFRJTV9UeXBlRGVmICpUSU14LCB1MTYgVElNX0Nsb2NrU291cmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IFRJTV9FeHRDTEtFZGdlKQ0Kew0KICBpZihUSU1fQ2xvY2tTb3VyY2UgPT0gVElNX0Nsb2NrU291cmNlX0ludGVybmFsKQ0KICB7DQogICAgLyogQ0tfVElNIGlzIHVzZWQgYXMgY2xvY2sgc291cmNlICovDQogICAgVElNeC0+U0NSICY9IFRJTV9TTUVfUmVzZXQgJiBUSU1fU2xhdmVNb2RlU2VsZWN0aW9uX01hc2sgJiBUSU1fVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICB9DQogIGVsc2UNCiAgLyogSW5wdXQgQ2FwdHVyZXMgYXJlIHVzZWQgYXMgVElNIGV4dGVybmFsIGNsb2NrICovDQogIHsNCiAgICBUSU14LT5TQ1IgJj0gVElNX1NNRV9SZXNldCAmIFRJTV9TbGF2ZU1vZGVTZWxlY3Rpb25fTWFzayAmIFRJTV9UcmlnZ2VyU2VsZWN0aW9uX01hc2s7DQogICAgVElNeC0+U0NSIHw9IFRJTV9TTVNfRVhUQ0xLX1NldCB8IFRJTV9TTUVfU2V0Ow0KDQogICAgaWYoKFRJTV9DbG9ja1NvdXJjZSA9PSBUSU1fQ2xvY2tTb3VyY2VfVEkxMSkgfHwNCiAgICAgIChUSU1fQ2xvY2tTb3VyY2UgPT0gVElNX0Nsb2NrU291cmNlX1RJMjEpKQ0KICAgIC8qIElucHV0IENhcHR1cmUgMSBpcyBzZWxlY3RlZCAqLw0KICAgIHsNCiAgICAgLyogSW5wdXQgY2FwdHVyZSAgRW5hYmxlICovDQogICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFfRW5hYmxlOw0KICAgICAgVElNeC0+U0NSIHw9IFRJTV9UU19JQzFfU2V0Ow0KDQogICAgICBpZihUSU1fRXh0Q0xLRWRnZSA9PSBUSU1fRXh0Q0xLRWRnZV9GYWxsaW5nKQ0KICAgICAgLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIHBvbGFyaXR5ICovDQogICAgICB7DQogICAgICAgIFRJTXgtPklNQ1IgfD0gVElNX0lDMVBfU2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgeyAgIA0KICAgICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzFQX1Jlc2V0Ow0KICAgICAgfQ0KICAgICAgaWYoVElNX0Nsb2NrU291cmNlID09IFRJTV9DbG9ja1NvdXJjZV9USTExKQ0KICAgICAgew0KICAgICAgICAvKiBFeHRlcm5hbCBzaWduYWwgVEkxIGNvbm5lY3RlZCB0byBJQzEgY2hhbm5lbCAqLw0KICAgICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzFTX1Jlc2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiBFeHRlcm5hbCBzaWduYWwgVEkyIGNvbm5lY3RlZCB0byBJQzEgY2hhbm5lbCAqLw0KICAgICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFTX1NldDsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIC8qIElucHV0IENhcHR1cmUgMiBpcyBzZWxlY3RlZCAqLw0KICAgIHsNCiAgICAgIC8qIElucHV0IGNhcHR1cmUgIEVuYWJsZSAqLw0KICAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyX0VuYWJsZTsNCiAgICAgIFRJTXgtPlNDUiB8PSBUSU1fVFNfSUMyX1NldDsNCg0KICAgICAgaWYoVElNX0V4dENMS0VkZ2UgPT0gVElNX0V4dENMS0VkZ2VfRmFsbGluZykNCiAgICAgIC8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBwb2xhcml0eSAqLw0KICAgICAgew0KICAgICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzJQX1NldDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlBfUmVzZXQ7DQogICAgICB9DQogICAgICBpZihUSU1fQ2xvY2tTb3VyY2UgPT0gVElNX0Nsb2NrU291cmNlX1RJMjIpDQogICAgICB7DQogICAgICAgIC8qIEV4dGVybmFsIHNpZ25hbCBUSTIgY29ubmVjdGVkIHRvIElDMiBjaGFubmVsICovDQogICAgICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlNfUmVzZXQ7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIEV4dGVybmFsIHNpZ25hbCBUSTEgY29ubmVjdGVkIHRvIElDMiBjaGFubmVsICovDQogICAgICAgIFRJTXgtPklNQ1IgfD0gVElNX0lDMlNfU2V0Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZXRQcmVzY2FsZXINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU0gcHJlc2NhbGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFByZXNjYWxlcjogVElNIHByZXNjYWxlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TZXRQcmVzY2FsZXIoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBQcmVzY2FsZXIpDQp7DQogIFRJTXgtPlBTQyA9IFByZXNjYWxlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2V0UGVyaW9kDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNIHBlcmlvZCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBQZXJpb2Q6IFRJTSBwZXJpb2QgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2V0UGVyaW9kKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgUGVyaW9kKQ0Kew0KICBUSU14LT5BUlIgPSBQZXJpb2Q7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldFB1bHNlDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNIHB1bHNlIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsOiBzcGVjaWZpZXMgdGhlIFRJTSBjaGFubmVsIHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzE6IFRJTSBDaGFubmVsIDEgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzI6IFRJTSBDaGFubmVsIDIgaXMgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsX0FMTDogVElNIENoYW5uZWwgMWFuZCAyIGFyZSB1c2VkDQoqICAgICAgICAgICAgICAgICAgLSBQdWxzZTogVElNIHB1bHNlIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldFB1bHNlKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0NoYW5uZWwsIHUxNiBQdWxzZSkNCnsNCiAgLyogU2V0IENoYW5uZWwgMSBwdWxzZSB2YWx1ZSAqLw0KICBpZihUSU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKQ0KICB7DQogICAgVElNeC0+T0NSMSA9IFB1bHNlOw0KICB9DQogIC8qIFNldCBDaGFubmVsIDIgcHVsc2UgdmFsdWUgKi8NCiAgZWxzZSBpZihUSU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8yKQ0KICB7DQogICBUSU14LT5PQ1IyID0gUHVsc2U7DQogIH0NCiAgLyogU2V0IENoYW5uZWwgMSBhbmQgQ2hhbm5lbCAyIHB1bHNlIHZhbHVlcyAqLw0KICBlbHNlIGlmKFRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsX0FMTCkNCiAgew0KICAgIFRJTXgtPk9DUjEgPSBQdWxzZTsNCiAgICBUSU14LT5PQ1IyID0gUHVsc2U7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0SUNBUDENCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBJbnB1dCBDYXB0dXJlIDEgdmFsdWUuIA0KKiBJbnB1dCAgICAgICAgICA6IFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IElucHV0IENhcHR1cmUgMSBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldElDQVAxKFRJTV9UeXBlRGVmICpUSU14KQ0Kew0KICByZXR1cm4gVElNeC0+SUNSMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0SUNBUDINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBJbnB1dCBDYXB0dXJlIDIgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogSW5wdXQgQ2FwdHVyZSAyIFJlZ2lzdGVyIHZhbHVlDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFRJTV9HZXRJQ0FQMihUSU1fVHlwZURlZiAqVElNeCkNCnsNCiAgcmV0dXJuIFRJTXgtPklDUjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0dldFBXTUlQdWxzZQ0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFBXTSBJbnB1dCBwdWxzZSB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBUSU14OiB3aGVyZSB4IGNhbiBiZSAwLCAxIG9yIDIgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBJbnB1dCBDYXB0dXJlIDIgUmVnaXN0ZXIgdmFsdWUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldFBXTUlQdWxzZShUSU1fVHlwZURlZiAqVElNeCkNCnsNCiAgcmV0dXJuIFRJTXgtPklDUjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0dldFBXTUlQZXJpb2QNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBQV00gSW5wdXQgcGVyaW9kIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IElucHV0IENhcHR1cmUgMSBSZWdpc3RlciB2YWx1ZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBUSU1fR2V0UFdNSVBlcmlvZChUSU1fVHlwZURlZiAqVElNeCkNCnsNCiAgcmV0dXJuIFRJTXgtPklDUjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0RlYnVnQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsIERlYnVnIGNvbnRyb2wuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAwLCAxIG9yIDIgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBEZWJ1ZyBjb250cm9sLg0KICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0RlYnVnQ21kKFRJTV9UeXBlRGVmICpUSU14LCBGdW5jdGlvbmFsU3RhdGUgTmV3c3RhdGUpDQp7DQogIGlmKE5ld3N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFRJTXgtPkNSIHw9IFRJTV9EQkdDX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBUSU14LT5DUiAmPSBUSU1fREJHQ19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9Db3VudGVyTW9kZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFNwZWNpZmllcyB0aGUgQ291bnRlciBNb2RlIHRvIGJlIHVzZWQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAwLCAxIG9yIDIgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9Db3VudGVyTW9kZTogc3BlY2lmaWVzIHRoZSBDb3VudGVyIE1vZGUgdG8gYmUgdXNlZA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0NvdW50ZXJNb2RlX1VwOiBUSU0gVXAgQ291bnRpbmcgTW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ291bnRlck1vZGVfRG93bjogVElNIERvd24gQ291bnRpbmcgTW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDE6IFRJTSBDZW50ZXIgQWxpZ25lZCBNb2RlMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDI6IFRJTSBDZW50ZXIgQWxpZ25lZCBNb2RlMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ291bnRlck1vZGVfQ2VudGVyQWxpZ25lZDM6IFRJTSBDZW50ZXIgQWxpZ25lZCBNb2RlMw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fQ291bnRlck1vZGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fQ291bnRlck1vZGUpDQp7DQogIC8qIENvdW50ZXIgbW9kZSBjb25maWd1cmF0aW9uICovDQogIFRJTXgtPkNSICY9IFRJTV9Db3VudGVyTW9kZV9NYXNrOw0KICBUSU14LT5DUiB8PSBUSU1fQ291bnRlck1vZGU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0ZvcmNlZE9DQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRm9yY2VzIHRoZSBUSU0gb3V0cHV0IHdhdmVmb3JtIHRvIGFjdGl2ZSBvciBpbmFjdGl2ZSBsZXZlbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0NoYW5uZWw6IHNwZWNpZmllcyB0aGUgVElNIGNoYW5uZWwgdG8gYmUgdXNlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzE6IFRpbWVyIENoYW5uZWwgMSBpcyB1c2VkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsXzI6IFRpbWVyIENoYW5uZWwgMiBpcyB1c2VkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DaGFubmVsX0FMTDogVGltZXIgQ2hhbm5lbCAxIGFuZCAyIGFyZSB1c2VkDQoqICAgICAgICAgICAgICAgICAtIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8NCiogICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQ3hSRUYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24gDQoqICAgICAgICAgICAgICAgICAgICAgICAgIE9DeFJFRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0ZvcmNlZE9DQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0NoYW5uZWwsdTE2IFRJTV9Gb3JjZWRBY3Rpb24pDQp7DQogIC8qIENoYW5uZWwgMSBGb3JjZWQgT3V0cHV0IENvbXBhcmUgbW9kZSBjb25maWd1cmF0aW9uICovDQogIGlmKFRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzEpDQogIHsNCiAgICBUSU14LT5PTVIxICY9IFRJTV9PQzFDX01hc2s7DQogICAgVElNeC0+T01SMSB8PSBUSU1fRm9yY2VkQWN0aW9uOw0KICB9DQogIC8qIENoYW5uZWwgMiBGb3JjZWQgT3V0cHV0IENvbXBhcmUgbW9kZSBjb25maWd1cmF0aW9uICovDQogIGVsc2UNCiAgew0KICAgIGlmKFRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzIpDQogICAgew0KICAgICAgVElNeC0+T01SMSAmPSBUSU1fT0MyQ19NYXNrOw0KICAgICAgVElNeC0+T01SMSB8PSAoVElNX0ZvcmNlZEFjdGlvbjw8OCk7DQogICAgfQ0KICAgIC8qIENoYW5uZWwgMSBhbmQgQ2hhbm5lbCAyIEZvcmNlZCBPdXRwdXQgQ29tcGFyZSBtb2RlIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBlbHNlDQogICAgew0KICAgICAgVElNeC0+T01SMSAmPSBUSU1fT0MxQ19NYXNrICYgVElNX09DMkNfTWFzazsNCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX0ZvcmNlZEFjdGlvbiB8KFRJTV9Gb3JjZWRBY3Rpb248PDgpOw0KICAgIH0NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9SZXNldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBSZS1pbnRpYWxpemVzIHRoZSBUSU0gY291bnRlciBhbmQgZ2VuZXJhdGVzIGFuIHVwZGF0ZSBvZiB0aGUNCiogICAgICAgICAgICAgICAgICByZWdpc3RlcnMuDQoqIElucHV0ICAgICAgICAgIDogVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1Jlc2V0Q291bnRlcihUSU1fVHlwZURlZiogVElNeCkNCnsNCiAgLyogUmUtaW50aWFsaXplIHRoZSBUSU0gY291bnRlciAqLw0KICBUSU14LT5DUiB8PSBUSU1fQ09VTlRFUl9SZXNldDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU3luY2hyb0NvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFN5bmNocm9uaXplcyB0d28gVGltZXJzIGluIGEgc3BlY2lmaWVkIG1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBNYXN0ZXI6IHNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBtYXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgUFdNX01hc3RlciwgVElNMF9NYXN0ZXIsIFRJTTFfTWFzdGVyIG9yIFRJTTJfTWFzdGVyLg0KKiAgICAgICAgICAgICAgICAgIC0gU2xhdmU6IHNwZWNpZmllcyB0aGUgcGVyaXBoZXJhbCBzbGF2ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICBQV01fU2xhdmUsIFRJTTBfU2xhdmUsIFRJTTFfU2xhdmUgb3IgVElNMl9TbGF2ZS4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9TeW5jaHJvQWN0aW9uOiBzcGVjaWZpZXMgdGhlIHN5bmNocm9uaXphdGlvbiBBY3Rpb24gdG8gDQoqICAgICAgICAgICAgICAgICAgICBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb0FjdGlvbl9FbmFibGU6IFRoZSBDTlRfRU4gYml0IGlzIHVzZWQgYXMgVFJHTw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9TeW5jaHJvQWN0aW9uX1VwZGF0ZTogVGhlIFVwZGF0ZSBldmVudCBpcyB1c2VkIGFzIFRSR08NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb0FjdGlvbl9SZXNldDogVGhlIENOVF9SU1QgYml0IGlzIHVzZWQgYXMgVFJHTw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9TeW5jaHJvQWN0aW9uX09DOiBUaGUgT0MxIHNpZ25hbCBpcyB1c2VkIGFzIFRSR08NCiogICAgICAgICAgICAgICAgICAtIFRJTV9TeW5jaHJvTW9kZTogc3BlY2lmaWVzIHRoZSBzeW5jaHJvbml6YXRpb24gTW9kZSB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb01vZGVfR2F0ZWQ6IEJvdGggc3RhcnQgYW5kIHN0b3Agb2YgdGhlIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgaXMgY29udHJvbGxlZC4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb01vZGVfVHJpZ2dlcjogT25seSB0aGUgc3RhcnQgb2YgdGhlIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgaXMgY29udHJvbGxlZC4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb01vZGVfRXh0ZXJuYWw6IFRoZSByaXNpbmcgZWRnZSBvZiBzZWxlY3RlZCB0cmlnZ2VyIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrcyB0aGUgY291bnRlci4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU3luY2hyb01vZGVfUmVzZXQ6IFRoZSByaXNpbmcgZWRnZSBvZiB0aGUgc2VsZWN0ZWQgdHJpZ2dlciANCiogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwgcmVzZXRzIHRoZSBjb3VudGVyIGFuZCBnZW5lcmF0ZXMgYW4gdXBkYXRlIG9mIHRoZSByZWdpc3RlcnMuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TeW5jaHJvQ29uZmlnKE1hc3Rlcl9UeXBlRGVmIE1hc3RlciwgU2xhdmVfVHlwZURlZiBTbGF2ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgdTE2IFRJTV9TeW5jaHJvQWN0aW9uLCB1MTYgVElNX1N5bmNocm9Nb2RlKQ0Kew0KICBzd2l0Y2ggKFNsYXZlKQ0KICB7DQogICAgY2FzZSBQV01fU2xhdmU6DQogICAgew0KICAgICAgUFdNLT5TQ1IgJj0gVElNX1NNRV9SZXNldCAmIFRJTV9UcmlnZ2VyU2VsZWN0aW9uX01hc2sgJiBUSU1fU2xhdmVNb2RlU2VsZWN0aW9uX01hc2sgJg0KICAgICAgICAgICAgICAgICAgVElNX0ludGVybmFsVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICAgICAgUFdNLT5TQ1IgfD0gVElNX1N5bmNocm9Nb2RlIHwgVElNX1NNRV9TZXQ7DQoNCiAgICAgIGlmKE1hc3RlciA9PSBUSU0xX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAJUFdNLT5TQ1IgfD0gVElNX0lUU19USU0xOw0KDQogICAgICAgIC8qIFNldCB0aGUgc3luY2hyb25pemF0aW9uIGFjdGlvbiAqLw0KICAgICAgICBUSU0xLT5DUiAmPSBUSU1fTWFzdGVyTW9kZVNlbGVjdGlvbl9NYXNrOw0KICAgICAgICBUSU0xLT5DUiB8PSBUSU1fU3luY2hyb0FjdGlvbjsNCiAgICAgIH0NCg0KICAgICAgZWxzZSBpZihNYXN0ZXIgPT0gVElNMF9NYXN0ZXIpDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgaW50ZXJuYWwgdHJpZ2dlciAqLw0KICAgICAgICBQV00tPlNDUiB8PSBUSU1fSVRTX1RJTTA7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTAtPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTAtPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KDQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0yX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFBXTS0+U0NSIHw9IFRJTV9JVFNfVElNMjsNCg0KICAgICAgICAvKiBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBhY3Rpb24gKi8NCiAgICAgICAgVElNMi0+Q1IgJj0gVElNX01hc3Rlck1vZGVTZWxlY3Rpb25fTWFzazsNCiAgICAgICAgVElNMi0+Q1IgfD0gVElNX1N5bmNocm9BY3Rpb247DQogICAgICB9DQogICAgfQ0KICAgIGJyZWFrOw0KDQogICAgY2FzZSBUSU0wX1NsYXZlOg0KICAgIHsNCiAgICAgIFRJTTAtPlNDUiAmPSBUSU1fU01FX1Jlc2V0ICYgVElNX1RyaWdnZXJTZWxlY3Rpb25fTWFzayAmIFRJTV9TbGF2ZU1vZGVTZWxlY3Rpb25fTWFzayAmDQogICAgICAgICAgICAgICAgICAgVElNX0ludGVybmFsVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICAgICAgVElNMC0+U0NSIHw9IFRJTV9TeW5jaHJvTW9kZSB8IFRJTV9TTUVfU2V0Ow0KDQogICAgICBpZihNYXN0ZXIgPT0gUFdNX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFRJTTAtPlNDUiB8PSBUSU1fSVRTX1BXTTsNCg0KICAgICAgICAvKiBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBhY3Rpb24gKi8NCiAgICAgICAgUFdNLT5DUiAmPSBUSU1fTWFzdGVyTW9kZVNlbGVjdGlvbl9NYXNrOw0KICAgICAgICBQV00tPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KDQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0xX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFRJTTAtPlNDUiB8PSBUSU1fSVRTX1RJTTE7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTEtPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTEtPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KDQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0yX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFRJTTAtPlNDUiB8PSBUSU1fSVRTX1RJTTI7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTItPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTItPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KICAgIH0NCiAgICBicmVhazsNCg0KICAgIGNhc2UgVElNMV9TbGF2ZToNCiAgICB7DQoNCiAgICAgIFRJTTEtPlNDUiAmPSBUSU1fU01FX1Jlc2V0ICYgVElNX1RyaWdnZXJTZWxlY3Rpb25fTWFzayAmIFRJTV9TbGF2ZU1vZGVTZWxlY3Rpb25fTWFzayAmDQogICAgICAgICAgICAgICAgICAgVElNX0ludGVybmFsVHJpZ2dlclNlbGVjdGlvbl9NYXNrOw0KICAgICAgVElNMS0+U0NSIHw9IFRJTV9TeW5jaHJvTW9kZSB8IFRJTV9TTUVfU2V0Ow0KICAgICANCiAgICAgIGlmKE1hc3RlciA9PSBQV01fTWFzdGVyKQ0KICAgICAgew0KICAgICAgCSAvKiBTZXQgdGhlIGludGVybmFsIHRyaWdnZXIgKi8NCiAgICAgIAkgVElNMS0+U0NSIHw9IFRJTV9JVFNfUFdNOw0KDQogICAgICAgIC8qIFNldCB0aGUgc3luY2hyb25pemF0aW9uIGFjdGlvbiAqLw0KICAgICAgICBQV00tPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFBXTS0+Q1IgfD0gVElNX1N5bmNocm9BY3Rpb247DQogICAgICB9DQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0wX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFRJTTEtPlNDUiB8PSBUSU1fSVRTX1RJTTA7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTAtPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTAtPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KDQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0yX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBpbnRlcm5hbCB0cmlnZ2VyICovDQogICAgICAgIFRJTTEtPlNDUiB8PSBUSU1fSVRTX1RJTTI7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTItPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTItPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KICAgIH0NCiAgICBicmVhazsNCg0KICAgIGNhc2UgVElNMl9TbGF2ZToNCiAgICB7DQogICAgIA0KICAgICAgVElNMi0+U0NSICY9IFRJTV9TTUVfUmVzZXQgJiBUSU1fVHJpZ2dlclNlbGVjdGlvbl9NYXNrICYgVElNX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrICYNCiAgICAgICAgICAgICAgICAgICBUSU1fSW50ZXJuYWxUcmlnZ2VyU2VsZWN0aW9uX01hc2s7DQogICAgICBUSU0yLT5TQ1IgfD0gVElNX1N5bmNocm9Nb2RlIHwgVElNX1NNRV9TZXQ7DQoNCiAgICAgIGlmKE1hc3RlciA9PSBQV01fTWFzdGVyKQ0KICAgICAgew0KICAgICAgICAvKiBJbnRlcm5hbCB0cmlnZ2VyIHNlbGVjdGlvbiAqLw0KICAgICAgICBUSU0yLT5TQ1IgfD0gVElNX0lUU19QV007DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFBXTS0+Q1IgJj0gVElNX01hc3Rlck1vZGVTZWxlY3Rpb25fTWFzazsNCiAgICAgICAgUFdNLT5DUiB8PSBUSU1fU3luY2hyb0FjdGlvbjsNCiAgICAgIH0NCg0KICAgICAgZWxzZSBpZihNYXN0ZXIgPT0gVElNMV9NYXN0ZXIpDQogICAgICB7DQogICAgICAgIC8qIEludGVybmFsIHRyaWdnZXIgc2VsZWN0aW9uICovDQogICAgICAgIFRJTTItPlNDUiB8PSBUSU1fSVRTX1RJTTE7DQoNCiAgICAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6YXRpb24gYWN0aW9uICovDQogICAgICAgIFRJTTEtPkNSICY9IFRJTV9NYXN0ZXJNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICAgIFRJTTEtPkNSIHw9IFRJTV9TeW5jaHJvQWN0aW9uOw0KICAgICAgfQ0KDQogICAgICBlbHNlIGlmKE1hc3RlciA9PSBUSU0wX01hc3RlcikNCiAgICAgIHsNCiAgICAgICAgLyogSW50ZXJuYWwgdHJpZ2dlciBzZWxlY3Rpb24gKi8NCiAgICAgICAgVElNMi0+U0NSIHw9IFRJTV9JVFNfVElNMDsNCg0KICAgICAgICAvKiBTZXQgdGhlIHN5bmNocm9uaXphdGlvbiBhY3Rpb24gKi8NCiAgICAgICAgVElNMC0+Q1IgJj0gVElNX01hc3Rlck1vZGVTZWxlY3Rpb25fTWFzazsNCiAgICAgICAgVElNMC0+Q1IgfD0gVElNX1N5bmNocm9BY3Rpb247DQogICAgICB9DQogICAgfQ0KICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBUSU0gZmxhZyBpcyBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfSUMxOiBJbnB1dCBDYXB0dXJlIDEgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX09DMTogT3V0cHV0IENvbXBhcmUgMSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfVXBkYXRlOiBUaW1lciB1cGRhdGUgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0lDMjogSW5wdXQgQ2FwdHVyZSAyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19PQzI6IE91dHB1dCBDb21wYXJlIDIgRmxhZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFRJTV9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgVElNX0dldEZsYWdTdGF0dXMoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fRkxBRykNCnsNCiAgaWYoKFRJTXgtPklTUiAmIFRJTV9GTEFHKSAhPSBSRVNFVCApDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFRJTXgncyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfSUMxOiBUaW1lciBJbnB1dCBDYXB0dXJlIDEgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX09DMTogVGltZXIgT3V0cHV0IENvbXBhcmUgMSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfVXBkYXRlOiBUaW1lciB1cGRhdGUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0lDMjogVGltZXIgSW5wdXQgQ2FwdHVyZSAyIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19PQzI6IFRpbWVyIE91dHB1dCBDb21wYXJlIDIgZmxhZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fQ2xlYXJGbGFnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0ZMQUcpDQp7DQogIC8qIENsZWFyIHRoZSBmbGFncyAqLw0KICBUSU14LT5JU1IgJj0gflRJTV9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSVQ6IHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9JQzE6IElucHV0IENhcHR1cmUgMSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfT0MxOiBPdXRwdXQgQ29tcGFyZSAxIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9VcGRhdGU6IFRpbWVyIHVwZGF0ZSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfR2xvYmFsVXBkYXRlOiBUaW1lciBnbG9iYWwgdXBkYXRlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9JQzI6IElucHV0IENhcHR1cmUgMiBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfT0MyOiBPdXRwdXQgQ29tcGFyZSAyIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFRJTV9JVChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFRJTV9HZXRJVFN0YXR1cyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JVCkNCnsNCiAgdTE2IFRJTV9JVF9DaGVjayA9IDA7DQoNCiAgLyogQ2FsY3VsYXRlcyB0aGUgcGVuZGluZyBiaXRzIHRvIGJlIGNoZWNrZWQgKi8NCiAgVElNX0lUX0NoZWNrID0gVElNX0lUICYgVElNX0lUX0NsZWFyX01hc2s7DQogIA0KICBpZigoVElNeC0+SVNSICYgVElNX0lUX0NoZWNrKSAhPSBSRVNFVCApDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgVElNJ3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0lDMTogSW5wdXQgQ2FwdHVyZSAxIEludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfT0MxOiBPdXRwdXQgQ29tcGFyZSAxIEludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfVXBkYXRlOiBUaW1lciB1cGRhdGUgSW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9HbG9iYWxVcGRhdGU6IFRpbWVyIGdsb2JhbCB1cGRhdGUgSW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9JQzI6IElucHV0IENhcHR1cmUgMiBJbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX09DMjogT3V0cHV0IENvbXBhcmUgMiBJbnRlcnJ1cHQgDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9DbGVhcklUUGVuZGluZ0JpdChUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JVCkNCnsNCiAgdTE2IFRJTV9JVF9DbGVhciA9IDA7DQoNCiAgLyogQ2FsY3VsYXRlIHRoZSBwZW5kaW5nIGJpdHMgdG8gYmUgY2xlYXJlZCAqLw0KICBUSU1fSVRfQ2xlYXIgPSBUSU1fSVQgJiBUSU1fSVRfQ2xlYXJfTWFzazsNCg0KICAvKiBDbGVhciB0aGUgcGVuZGluZyBiaXRzICovDQogIFRJTXgtPklTUiAmPSB+VElNX0lUX0NsZWFyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE9DTV9Nb2R1bGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBPdXRwdXQgQ29tcGFyZSBNb2R1bGUgY29uZmlndXJhdGlvbg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFRJTV9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQoqICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNDQoqICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIE9DTV9Nb2R1bGVDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9Jbml0VHlwZURlZiogVElNX0luaXRTdHJ1Y3QpDQp7DQogIHUxNiBUSU1fT0NDb250cm9sID0gMHgwMDAwOw0KDQogIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fTW9kZSA9PSBUSU1fTW9kZV9PQ1RpbWluZykNCiAgew0KICAgIFRJTV9PQ0NvbnRyb2wgPSBUSU1fT0NDb250cm9sX09DVGltaW5nOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGlmKChUSU1fSW5pdFN0cnVjdC0+VElNX01vZGUgPT0gVElNX01vZGVfT0NBY3RpdmUpIHx8IA0KICAgICAgIChUSU1fSW5pdFN0cnVjdC0+VElNX01vZGUgPT0gVElNX01vZGVfT1BNX0FjdGl2ZSkpDQogICAgew0KICAgICAgVElNX09DQ29udHJvbCA9IFRJTV9PQ0NvbnRyb2xfT0NBY3RpdmU7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX01vZGUgPT0gVElNX01vZGVfT0NJbmFjdGl2ZSkNCiAgICAgIHsNCiAgICAgICAgVElNX09DQ29udHJvbCA9IFRJTV9PQ0NvbnRyb2xfT0NJbmFjdGl2ZTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgIAkgaWYoKFRJTV9Jbml0U3RydWN0LT5USU1fTW9kZSA9PSBUSU1fTW9kZV9PQ1RvZ2dsZSkgfHwNCiAgICAgICAgICAgIChUSU1fSW5pdFN0cnVjdC0+VElNX01vZGUgPT0gVElNX01vZGVfT1BNX1RvZ2dsZSkpDQogICAgICAgIHsNCiAgICAgICAgICBUSU1fT0NDb250cm9sID0gVElNX09DQ29udHJvbF9PQ1RvZ2dsZTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBUSU1fT0NDb250cm9sID0gVElNX09DQ29udHJvbF9QV007DQoNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKQ0KICB7DQogICAgLyogQ29uZmlndXJlIENoYW5uZWwgMSBvbiBPdXRwdXQgQ29tcGFyZSBtb2RlICovDQogICAgVElNeC0+T01SMSAmPSBUSU1fT0MxQ19NYXNrOw0KICAgIFRJTXgtPk9NUjEgfD0gVElNX09DQ29udHJvbHxUSU1fT0MxX0VuYWJsZTsNCiAgICBUSU14LT5PTVIxIHw9IFRJTV9QTEQxX1NldDsNCiAgICBUSU14LT5PQ1IxID0gVElNX0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTE7DQoNCiAgICAvKiBTZXQgdGhlIE9DMSB3YXZlIHBvbGFyaXR5ICovDQogICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9Qb2xhcml0eTEgPT0gVElNX1BvbGFyaXR5MV9Mb3cpDQogICAgew0KICAgICAgVElNeC0+T01SMSB8PSBUSU1fT0MxUF9TZXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBUSU14LT5PTVIxICY9IFRJTV9PQzFQX1Jlc2V0Ow0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMikNCiAgICB7DQogICAgICAvKiBDb25maWd1cmUgQ2hhbm5lbCAyIG9uIE91dHB1dCBDb21wYXJlIG1vZGUgKi8NCiAgICAgIFRJTXgtPk9NUjEgJj0gVElNX09DMkNfTWFzazsNCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX09DQ29udHJvbDw8OHxUSU1fT0MyX0VuYWJsZTsNCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX1BMRDJfU2V0Ow0KICAgICAgVElNeC0+T0NSMiA9IFRJTV9Jbml0U3RydWN0LT5USU1fUHVsc2UyOw0KDQogICAgICAvKiBTZXQgdGhlIE9DQiB3YXZlIHBvbGFyaXR5ICovDQogICAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX1BvbGFyaXR5MiA9PSBUSU1fUG9sYXJpdHkyX0xvdykNCiAgICAgIHsNCiAgICAgICAgVElNeC0+T01SMSB8PSBUSU1fT0MyUF9TZXQ7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIFRJTXgtPk9NUjEgJj0gVElNX09DMlBfUmVzZXQ7DQogICAgICB9DQogICAgfQ0KICAgICAvKiBDb25maWd1cmUgQ2hhbm5lbCAxIGFuZCBDaGFubmVsIDIgb24gT3V0cHV0IENvbXBhcmUgbW9kZSAqLw0KICAgIGVsc2UNCiAgICB7DQogICAgICBUSU14LT5PTVIxICY9IFRJTV9PQzFDX01hc2sgJiBUSU1fT0MyQ19NYXNrOyANCiAgICAgIFRJTXgtPk9NUjEgfD0gVElNX09DQ29udHJvbHwoVElNX09DQ29udHJvbDw8OCl8VElNX09DMV9FbmFibGV8VElNX09DMl9FbmFibGV8DQogICAgICAgICAgICAgICAgICAgVElNX1BMRDFfU2V0fFRJTV9QTEQyX1NldDsNCg0KICAgICAgVElNeC0+T0NSMSA9IFRJTV9Jbml0U3RydWN0LT5USU1fUHVsc2UxOw0KICAgICAgVElNeC0+T0NSMiA9IFRJTV9Jbml0U3RydWN0LT5USU1fUHVsc2UyOw0KDQogICAgICAvKiBTZXQgdGhlIE9DMSB3YXZlIHBvbGFyaXR5ICovDQogICAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX1BvbGFyaXR5MSA9PSBUSU1fUG9sYXJpdHkxX0xvdykNCiAgICAgIHsNCiAgICAgICAgVElNeC0+T01SMSB8PSBUSU1fT0MxUF9TZXQ7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIFRJTXgtPk9NUjEgJj0gVElNX09DMVBfUmVzZXQ7DQogICAgICB9DQoNCiAgICAgIC8qIFNldCB0aGUgT0MyIHdhdmUgcG9sYXJpdHkgKi8NCiAgICAgIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fUG9sYXJpdHkyID09IFRJTV9Qb2xhcml0eTJfTG93KQ0KICAgICAgew0KICAgICAgICBUSU14LT5PTVIxIHw9IFRJTV9PQzJQX1NldDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgVElNeC0+T01SMSAmPSBUSU1fT0MyUF9SZXNldDsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJQ0FQX01vZHVsZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IElucHV0IENhcHR1cmUgTW9kdWxlIGNvbmZpZ3VyYXRpb24NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDAsIDEgb3IgMiB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFRJTQ0KKiAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBJQ0FQX01vZHVsZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgVElNX0luaXRUeXBlRGVmKiBUSU1fSW5pdFN0cnVjdCkNCnsNCiAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9Nb2RlID09IFRJTV9Nb2RlX1BXTUkpDQogIHsgLyogUFdNIGlucHV0IG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICAgIFRJTXgtPlNDUiB8PSBUSU1fVFNfSUMxX1NldHxUSU1fU01TX1JFU0VUQ0xLX1NldHxUSU1fU01FX1NldDsNCg0KICAgIC8qIENoYW5uZWwgMSBhbmQgY2hhbm5lbCAyIGlucHV0IHNlbGVjdGlvbiAqLw0KICAgIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fUFdNSV9JQ1NlbGVjdGlvbiA9PSBUSU1fUFdNSV9JQ1NlbGVjdGlvbl9USTEpDQogICAgew0KICAgICAgVElNeC0+SU1DUiAmPSBUSU1fSUMxU19SZXNldDsNCiAgICAgIFRJTXgtPklNQ1IgfD0gVElNX0lDMlNfU2V0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMxU19TZXQ7DQogICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzJTX1Jlc2V0Ow0KICAgIH0NCg0KICAgIC8qIENoYW5uZWwgcG9sYXJpdHkgKi8NCiAgICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX1BXTUlfSUNQb2xhcml0eSA9PSBUSU1fUFdNSV9JQ1BvbGFyaXR5X1Jpc2luZykNCiAgICB7DQogICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzFQX1Jlc2V0Ow0KICAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyUF9TZXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFQX1NldDsNCiAgICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlBfUmVzZXQ7DQogICAgfQ0KDQogICAgLyogSW5wdXQgY2FwdHVyZSAgRW5hYmxlICovDQogICAgVElNeC0+SU1DUiB8PSBUSU1fSUMxX0VuYWJsZSB8VElNX0lDMl9FbmFibGU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzEpDQogICAgew0KICAgICAgLyogSW5wdXQgQ2FwdHVyZSAxIG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICAgICAgVElNeC0+U0NSICY9IFRJTV9UcmlnZ2VyU2VsZWN0aW9uX01hc2sgJiBUSU1fU2xhdmVNb2RlU2VsZWN0aW9uX01hc2s7DQogICAgICBUSU14LT5TQ1IgfD0gVElNX1RTX0lDMV9TZXR8VElNX1NNU19SRVNFVENMS19TZXR8VElNX1NNRV9TZXQ7DQogICAgICANCiAgICAgIC8qIENoYW5uZWwgMSBpbnB1dCBzZWxlY3Rpb24gKi8NCiAgICAgIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fSUMxU2VsZWN0aW9uID09IFRJTV9JQzFTZWxlY3Rpb25fVEkxKQ0KICAgICAgew0KICAgICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzFTX1Jlc2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFTX1NldDsNCiAgICAgIH0NCiAgICAgIC8qIENoYW5uZWwgMSBwb2xhcml0eSAqLw0KICAgICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9JQzFQb2xhcml0eSA9PSBUSU1fSUMxUG9sYXJpdHlfUmlzaW5nKQ0KICAgICAgew0KICAgICAgICBUSU14LT5JTUNSICY9IFRJTV9JQzFQX1Jlc2V0Ow0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFQX1NldDsNCiAgICAgIH0NCg0KICAgICAgLyogSW5wdXQgY2FwdHVyZSAgRW5hYmxlICovDQogICAgICBUSU14LT5JTUNSIHw9IFRJTV9JQzFfRW5hYmxlOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogSW5wdXQgQ2FwdHVyZSAyIG1vZGUgY29uZmlndXJhdGlvbiAqLw0KICAgICAgVElNeC0+U0NSICY9IChUSU1fVHJpZ2dlclNlbGVjdGlvbl9NYXNrICYgVElNX1NsYXZlTW9kZVNlbGVjdGlvbl9NYXNrKTsNCiAgICAgIFRJTXgtPlNDUiB8PSBUSU1fVFNfSUMyX1NldHxUSU1fU01TX1JFU0VUQ0xLX1NldHxUSU1fU01FX1NldDsNCg0KICAgICAgLyogQ2hhbm5lbCAyIGlucHV0IHNlbGVjdGlvbiAqLw0KICAgICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9JQzJTZWxlY3Rpb24gPT0gVElNX0lDMlNlbGVjdGlvbl9USTIpDQogICAgICB7DQogICAgICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlNfUmVzZXQ7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIFRJTXgtPklNQ1IgfD0gVElNX0lDMlNfU2V0Ow0KICAgICAgfQ0KDQogICAgICAvKiBDaGFubmVsIDIgcG9sYXJpdHkgKi8NCiAgICAgIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fSUMyUG9sYXJpdHkgPT0gVElNX0lDMlBvbGFyaXR5X1Jpc2luZykNCiAgICAgIHsNCiAgICAgICAgVElNeC0+SU1DUiAmPSBUSU1fSUMyUF9SZXNldDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyUF9TZXQ7DQogICAgICB9DQoNCiAgICAgIC8qIElucHV0IGNhcHR1cmUgIEVuYWJsZSAqLw0KICAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyX0VuYWJsZTsNCiAgICB9DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBFbmNvZGVyX01vZGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmNvZGVyIE1vZGUgY29uZmlndXJhdGlvbg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMCwgMSBvciAyIHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFRJTV9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVElNX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB0aGF0DQoqICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVElNDQoqICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIEVuY29kZXJfTW9kZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgVElNX0luaXRUeXBlRGVmKiBUSU1fSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IEVuY29kZXIgbW9kZSAqLw0KICBUSU14LT5TQ1IgJj0gVElNX0VuY29kZXJfTWFzazsNCiAgDQogIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fTW9kZSA9PSBUSU1fTW9kZV9FbmNvZGVyMSkgDQogIHsNCiAgICBUSU14LT5TQ1IgfD0gVElNX0VuY29kZXIxX1NldDsNCiAgfQ0KICBlbHNlIGlmIChUSU1fSW5pdFN0cnVjdC0+VElNX01vZGUgPT0gVElNX01vZGVfRW5jb2RlcjIpDQogIHsNCiAgICBUSU14LT5TQ1IgfD0gVElNX0VuY29kZXIyX1NldDsNCiAgfQ0KICBlbHNlIA0KICB7DQogICAgVElNeC0+U0NSIHw9IFRJTV9FbmNvZGVyM19TZXQ7DQogIH0NCg0KICAvKiBDaGFubmVsIDEgaW5wdXQgc2VsZWN0aW9uICovDQogIGlmKFRJTV9Jbml0U3RydWN0LT5USU1fSUMxU2VsZWN0aW9uID09IFRJTV9JQzFTZWxlY3Rpb25fVEkyKQ0KICB7DQogICAgVElNeC0+SU1DUiB8PSBUSU1fSUMxU19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgVElNeC0+SU1DUiAmPSBUSU1fSUMxU19SZXNldDsNCiAgfQ0KDQogICAvKiBDaGFubmVsIDIgaW5wdXQgc2VsZWN0aW9uICovDQogICBpZihUSU1fSW5pdFN0cnVjdC0+VElNX0lDMlNlbGVjdGlvbiA9PSBUSU1fSUMyU2VsZWN0aW9uX1RJMSkNCiAgIHsNCiAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyU19TZXQ7DQogICB9DQogICBlbHNlDQogICB7DQogICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlNfUmVzZXQ7DQogICB9DQoNCiAgIC8qIENoYW5uZWwgMSBwb2xhcml0eSAqLw0KICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9JQzFQb2xhcml0eSA9PSBUSU1fSUMxUG9sYXJpdHlfRmFsbGluZykNCiAgIHsNCiAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMxUF9TZXQ7DQogICB9DQogICBlbHNlDQogICB7DQogICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMVBfUmVzZXQ7DQogICB9DQoNCiAgIC8qIENoYW5uZWwgMiBwb2xhcml0eSAqLw0KICAgaWYoVElNX0luaXRTdHJ1Y3QtPlRJTV9JQzJQb2xhcml0eSA9PSBUSU1fSUMyUG9sYXJpdHlfRmFsbGluZykNCiAgIHsNCiAgICAgVElNeC0+SU1DUiB8PSBUSU1fSUMyUF9TZXQ7DQogICB9DQogICBlbHNlDQogICB7DQogICAgIFRJTXgtPklNQ1IgJj0gVElNX0lDMlBfUmVzZXQ7DQogICB9DQp9DQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K