LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3RpbS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVElNIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3RpbS5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRJTSByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQojZGVmaW5lIENSMV9DRU5fU2V0ICAgICAgICAgICAgICAgICAoKHUxNikweDAwMDEpDQojZGVmaW5lIENSMV9DRU5fUmVzZXQgICAgICAgICAgICAgICAoKHUxNikweDAzRkUpDQojZGVmaW5lIENSMV9VRElTX1NldCAgICAgICAgICAgICAgICAoKHUxNikweDAwMDIpDQojZGVmaW5lIENSMV9VRElTX1Jlc2V0ICAgICAgICAgICAgICAoKHUxNikweDAzRkQpDQojZGVmaW5lIENSMV9VUlNfU2V0ICAgICAgICAgICAgICAgICAoKHUxNikweDAwMDQpDQojZGVmaW5lIENSMV9VUlNfUmVzZXQgICAgICAgICAgICAgICAoKHUxNikweDAzRkIpDQojZGVmaW5lIENSMV9PUE1fTWFzayAgICAgICAgICAgICAgICAoKHUxNikweDAzRjcpDQojZGVmaW5lIENSMV9Db3VudGVyTW9kZV9NYXNrICAgICAgICAoKHUxNikweDAzOUYpDQojZGVmaW5lIENSMV9BUlBFX1NldCAgICAgICAgICAgICAgICAoKHUxNikweDAwODApDQojZGVmaW5lIENSMV9BUlBFX1Jlc2V0ICAgICAgICAgICAgICAoKHUxNikweDAzN0YpDQojZGVmaW5lIENSMV9DS0RfTWFzayAgICAgICAgICAgICAgICAoKHUxNikweDAwRkYpDQoNCiNkZWZpbmUgQ1IyX0NDRFNfU2V0ICAgICAgICAgICAgICAgICgodTE2KTB4MDAwOCkNCiNkZWZpbmUgQ1IyX0NDRFNfUmVzZXQgICAgICAgICAgICAgICgodTE2KTB4MDAwNykNCiNkZWZpbmUgQ1IyX01NU19NYXNrICAgICAgICAgICAgICAgICgodTE2KTB4MDA4MCkNCiNkZWZpbmUgQ1IyX1RJMVNfU2V0ICAgICAgICAgICAgICAgICgodTE2KTB4MDA4MCkNCiNkZWZpbmUgQ1IyX1RJMVNfUmVzZXQgICAgICAgICAgICAgICgodTE2KTB4RkY3MCkNCg0KI2RlZmluZSBTTUNSX1NNU19NYXNrICAgICAgICAgICAgICAgKCh1MTYpMHhGRkYwKQ0KI2RlZmluZSBTTUNSX0VUUl9NYXNrICAgICAgICAgICAgICAgKCh1MTYpMHgwMEY3KQ0KI2RlZmluZSBTTUNSX1RTX01hc2sgICAgICAgICAgICAgICAgKCh1MTYpMHhGRjg3KQ0KI2RlZmluZSBTTUNSX01TTV9NYXNrICAgICAgICAgICAgICAgKCh1MTYpMHhGRjc3KQ0KI2RlZmluZSBTTUNSX0VDRV9TZXQgICAgICAgICAgICAgICAgKCh1MTYpMHg0MDAwKQ0KDQojZGVmaW5lIENDTVJfQ0MxM1NfTWFzayAgICAgICAgICAgICAoKHUxNikweDdGN0MpDQojZGVmaW5lIENDTVJfQ0MyNFNfTWFzayAgICAgICAgICAgICAoKHUxNikweDdDN0YpDQojZGVmaW5lIENDTVJfVEkxM0RpcmVjdF9TZXQgICAgICAgICAoKHUxNikweDAwMDEpDQojZGVmaW5lIENDTVJfVEkyNERpcmVjdF9TZXQgICAgICAgICAoKHUxNikweDAxMDApDQojZGVmaW5lIENDTVJfT0MxM0ZFX01hc2sgICAgICAgICAgICAoKHUxNikweDdGN0IpDQojZGVmaW5lIENDTVJfT0MyNEZFX01hc2sgICAgICAgICAgICAoKHUxNikweDdCN0YpDQojZGVmaW5lIENDTVJfT0MxM1BFX01hc2sgICAgICAgICAgICAoKHUxNikweDdGNzcpDQojZGVmaW5lIENDTVJfT0MyNFBFX01hc2sgICAgICAgICAgICAoKHUxNikweDc3N0YpDQojZGVmaW5lIENDTVJfT0NNMTNfTWFzayAgICAgICAgICAgICAoKHUxNikweDdGMEYpDQojZGVmaW5lIENDTVJfT0NNMjRfTWFzayAgICAgICAgICAgICAoKHUxNikweDBGN0YpDQojZGVmaW5lIENDTVJfSUMxM1BTQ19NYXNrICAgICAgICAgICAoKHUxNikweEZGRjMpDQojZGVmaW5lIENDTVJfSUMyNFBTQ19NYXNrICAgICAgICAgICAoKHUxNikweEYzRkYpDQojZGVmaW5lIENDTVJfSUMxM0ZfTWFzayAgICAgICAgICAgICAoKHUxNikweEZGMEYpDQojZGVmaW5lIENDTVJfSUMyNEZfTWFzayAgICAgICAgICAgICAoKHUxNikweDBGRkYpDQojZGVmaW5lIENDRVJfQ0MxUF9NYXNrICAgICAgICAgICAgICAoKHUxNikweEZGRkQpDQoNCiNkZWZpbmUgQ0NFUl9DQzJQX01hc2sgICAgICAgICAgICAgICgodTE2KTB4RkZERikNCiNkZWZpbmUgQ0NFUl9DQzNQX01hc2sgICAgICAgICAgICAgICgodTE2KTB4RkRGRikNCiNkZWZpbmUgQ0NFUl9DQzRQX01hc2sgICAgICAgICAgICAgICgodTE2KTB4REZGRikNCg0KI2RlZmluZSBDQ1JFX0NDMUVfU2V0ICAgICAgICAgICAgICAgKCh1MTYpMHgwMDAxKQ0KI2RlZmluZSBDQ1JFX0NDMUVfUmVzZXQgICAgICAgICAgICAgKCh1MTYpMHhGRkZFKQ0KI2RlZmluZSBDQ1JFX0NDMUVfTWFzayAgICAgICAgICAgICAgKCh1MTYpMHhGRkZFKQ0KDQojZGVmaW5lIENDUkVfQ0MyRV9TZXQgICAgICAgICAgICAgICAoKHUxNikweDAwMTApDQojZGVmaW5lIENDUkVfQ0MyRV9SZXNldCAgICAgICAgICAgICAoKHUxNikweEZGRUYpDQojZGVmaW5lIENDUkVfQ0MyRV9NYXNrICAgICAgICAgICAgICAoKHUxNikweEZGRUYpDQoNCiNkZWZpbmUgQ0NSRV9DQzNFX1NldCAgICAgICAgICAgICAgICgodTE2KTB4MDEwMCkNCiNkZWZpbmUgQ0NSRV9DQzNFX1Jlc2V0ICAgICAgICAgICAgICgodTE2KTB4RkVGRikNCg0KI2RlZmluZSBDQ1JFX0NDNEVfU2V0ICAgICAgICAgICAgICAgKCh1MTYpMHgxMDAwKQ0KI2RlZmluZSBDQ1JFX0NDNEVfUmVzZXQgICAgICAgICAgICAgKCh1MTYpMHhFRkZGKQ0KI2RlZmluZSBDQ1JFX0NDNEVfTWFzayAgICAgICAgICAgICAgKCh1MTYpMHhFRkZGKQ0KDQojZGVmaW5lIERDUl9ETUFfTWFzayAgICAgICAgICAgICAgICAoKHUxNikweDAwMDApDQoNCi8qIFRJTSBwcml2YXRlIE1hc2tzICovDQojZGVmaW5lIFRJTV9QZXJpb2RfUmVzZXRfTWFzayAgICAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTV9QcmVzY2FsZXJfUmVzZXRfTWFzayAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTV9QdWxzZV9SZXNldF9NYXNrICAgICAgICAoKHUxNikweDAwMDApDQojZGVmaW5lIFRJTV9JQ0ZpbHRlcl9NYXNrICAgICAgICAgICAoKHU4KTB4MDApDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIHVjMTYgVGFiX09DTW9kZU1hc2tbNF0gPSB7MHhGRjAwLCAweDAwRkYsIDB4RkYwMCwgMHgwMEZGfTsNCnN0YXRpYyB1YzE2IFRhYl9Qb2xhcml0eU1hc2tbNF0gPSB7Q0NFUl9DQzFQX01hc2ssIENDRVJfQ0MyUF9NYXNrLCBDQ0VSX0NDM1BfTWFzaywgQ0NFUl9DQzRQX01hc2t9Ow0KDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIHZvaWQgUFdNSV9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9JQ0luaXRUeXBlRGVmKiBUSU1fSUNJbml0U3RydWN0KTsNCnN0YXRpYyB2b2lkIFRJMV9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJMl9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJM19Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKTsNCnN0YXRpYyB2b2lkIEVUUl9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fRXh0VFJHUHJlc2NhbGVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgdTE2IFRJTV9FeHRUUkdQb2xhcml0eSwgdTggRXh0VFJHRmlsdGVyKTsNCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFRJTXggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRGVJbml0KFRJTV9UeXBlRGVmKiBUSU14KQ0KeyAgDQogIHN3aXRjaCAoKih1MzIqKSZUSU14KQ0KICB7DQogICAgY2FzZSBUSU0yX0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTIsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTIsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQogDQogICAgY2FzZSBUSU0zX0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTMsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTMsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQogDQogICAgY2FzZSBUSU00X0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTQsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1RJTTQsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQogDQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1RpbWVCYXNlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBUSU14IFRpbWUgQmFzZSBVbml0IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIA0KKiAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgVElNX1RpbWVCYXNlSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX1RpbWVCYXNlSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9UaW1lQmFzZUluaXRUeXBlRGVmDQoqICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvcg0KKiAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fVGltZUJhc2VJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fVGltZUJhc2VJbml0VHlwZURlZiogVElNX1RpbWVCYXNlSW5pdFN0cnVjdCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9DT1VOVEVSX01PREUoVElNX1RpbWVCYXNlSW5pdFN0cnVjdC0+VElNX0NvdW50ZXJNb2RlKSk7DQogIGFzc2VydChJU19USU1fQ0tEX0RJVihUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ2xvY2tEaXZpc2lvbikpOw0KICANCiAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIHZhbHVlICovDQogIFRJTXgtPkFSUiA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgOw0KDQogIC8qIFNldCB0aGUgUHJlc2NhbGVyIHZhbHVlICovDQogIFRJTXgtPlBTQyA9IFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QcmVzY2FsZXI7DQoNCiAgLyogU2VsZWN0IHRoZSBDb3VudGVyIE1vZGUgYW5kIHNldCB0aGUgY2xvY2sgZGl2aXNpb24gKi8NCiAgVElNeC0+Q1IxICY9IENSMV9DS0RfTWFzayAmIENSMV9Db3VudGVyTW9kZV9NYXNrOw0KICBUSU14LT5DUjEgfD0gKHUzMilUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ2xvY2tEaXZpc2lvbiB8DQogICAgICAgICAgICAgICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ291bnRlck1vZGU7DQp9DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9PQ0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgVElNeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVElNX09DSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX09DSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9PQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgICAgVElNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9PQ0luaXQoVElNX1R5cGVEZWYqIFRJTXgsIFRJTV9PQ0luaXRUeXBlRGVmKiBUSU1fT0NJbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wY2NtcnggPSAwLCB0bXBjY2VyID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fT0NfTU9ERShUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlKSk7DQogIGFzc2VydChJU19USU1fQ0hBTk5FTChUSU1fT0NJbml0U3RydWN0LT5USU1fQ2hhbm5lbCkpOw0KICBhc3NlcnQoSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ1BvbGFyaXR5KSk7DQoNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQoNCiAgaWYgKChUSU1fT0NJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSAodTE2KVRJTV9DaGFubmVsXzEpIHx8DQogICAgICAoVElNX09DSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gKHUxNilUSU1fQ2hhbm5lbF8yKSkNCiAgew0KICAgIHRtcGNjbXJ4ID0gVElNeC0+Q0NNUjE7DQogICAgDQogICAgLyogUmVzZXQgdGhlIE91dHB1dCBDb21wYXJlIEJpdHMgKi8NCiAgICB0bXBjY21yeCAmPSBUYWJfT0NNb2RlTWFza1tUSU1fT0NJbml0U3RydWN0LT5USU1fQ2hhbm5lbF07DQoNCiAgICAvKiBTZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICAgIHRtcGNjZXIgJj0gVGFiX1BvbGFyaXR5TWFza1tUSU1fT0NJbml0U3RydWN0LT5USU1fQ2hhbm5lbF07DQoNCiAgICBpZiAoVElNX09DSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMSkNCiAgICB7DQogICAgICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDE6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogICAgICBUSU14LT5DQ0VSICY9IENDUkVfQ0MxRV9SZXNldDsNCg0KICAgICAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQogICAgICB0bXBjY21yeCB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlOw0KDQogICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KICAgICAgVElNeC0+Q0NSMSA9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTsNCg0KICAgICAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgRW5hYmxlIEJpdCAqLw0KICAgICAgdG1wY2NlciB8PSBDQ1JFX0NDMUVfU2V0Ow0KDQogICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBQb2xhcml0eSAqLw0KICAgICAgdG1wY2NlciB8PSBUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eTsNCiAgICB9DQogICAgZWxzZSAvKiBUSU1fQ2hhbm5lbF8yICovDQogICAgew0KICAgICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCAyOiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICAgICAgVElNeC0+Q0NFUiAmPSBDQ1JFX0NDMkVfUmVzZXQ7DQoNCiAgICAgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KICAgICAgdG1wY2NtcnggfD0gKHUzMilUSU1fT0NJbml0U3RydWN0LT5USU1fT0NNb2RlIDw8IDg7DQoNCiAgICAgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFJlZ2lzdGVyIHZhbHVlICovDQogICAgICBUSU14LT5DQ1IyID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOw0KDQogICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBFbmFibGUgQml0ICovDQogICAgICB0bXBjY2VyIHw9IENDUkVfQ0MyRV9TZXQ7DQoNCiAgICAgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFBvbGFyaXR5ICovDQogICAgICB0bXBjY2VyIHw9ICh1MzIpVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgNDsNCiAgICB9DQoNCiAgICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2Ntcng7DQogIH0NCiAgZWxzZSANCiAgew0KICAgIGlmICgoVElNX09DSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMykgfHwNCiAgICAgICAgKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzQpKQ0KICAgIHsgDQogICAgICB0bXBjY21yeCA9IFRJTXgtPkNDTVIyOw0KDQogICAgICAvKiBSZXNldCB0aGUgT3V0cHV0IENvbXBhcmUgQml0cyAqLw0KICAgICAgdG1wY2NtcnggJj0gVGFiX09DTW9kZU1hc2tbVElNX09DSW5pdFN0cnVjdC0+VElNX0NoYW5uZWxdOw0KDQogICAgICAvKiBTZXQgdGhlIE91dHB1dCBQb2xhcml0eSBsZXZlbCAqLw0KICAgICAgdG1wY2NlciAmPSBUYWJfUG9sYXJpdHlNYXNrW1RJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsXTsNCg0KICAgICAgaWYgKFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzMpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgICAgICAgVElNeC0+Q0NFUiAmPSBDQ1JFX0NDM0VfUmVzZXQ7DQoNCiAgICAgICAgLyogU2VsZWN0IHRoZSBPdXRwdXQgQ29tcGFyZSBNb2RlICovDQogICAgICAgIHRtcGNjbXJ4IHw9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGU7DQoNCiAgICAgICAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgICAgICAgVElNeC0+Q0NSMyA9IFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9QdWxzZTsNCg0KICAgICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBFbmFibGUgQml0ICovDQogICAgICAgIHRtcGNjZXIgfD0gQ0NSRV9DQzNFX1NldDsNCg0KICAgICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBQb2xhcml0eSAqLw0KICAgICAgICB0bXBjY2VyIHw9ICh1MzIpVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPDwgODsNCiAgICAgIH0NCiAgICAgIGVsc2UgIC8qIFRJTV9DaGFubmVsXzQgKi8NCiAgICAgIHsNCiAgICAgICAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICAgICAgICBUSU14LT5DQ0VSICY9IENDUkVfQ0M0RV9SZXNldDsNCg0KICAgICAgIC8qIFNlbGVjdCB0aGUgT3V0cHV0IENvbXBhcmUgTW9kZSAqLw0KICAgICAgICB0bXBjY21yeCB8PSAodTMyKVRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUgPDwgODsNCg0KICAgICAgICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZSBSZWdpc3RlciB2YWx1ZSAqLw0KICAgICAgICBUSU14LT5DQ1I0ID0gVElNX09DSW5pdFN0cnVjdC0+VElNX1B1bHNlOw0KDQogICAgICAgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIEVuYWJsZSBCaXQgKi8NCiAgICAgICAgdG1wY2NlciB8PSBDQ1JFX0NDNEVfU2V0Ow0KDQogICAgICAgIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlIFBvbGFyaXR5ICovDQogICAgICAgIHRtcGNjZXIgfD0gKHUzMilUSU1fT0NJbml0U3RydWN0LT5USU1fT0NQb2xhcml0eSA8PCAxMjsNCiAgICAgIH0NCg0KICAgICAgVElNeC0+Q0NNUjIgPSAodTE2KXRtcGNjbXJ4Ow0KICAgIH0NCiAgfQ0KICANCiAgVElNeC0+Q0NFUiA9ICh1MTYpdG1wY2NlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fSUNJbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFRJTV9JQ0luaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fSUNJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICAgIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fSUNJbml0KFRJTV9UeXBlRGVmKiBUSU14LCBUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9JQ19NT0RFKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ01vZGUpKTsNCiAgYXNzZXJ0KElTX1RJTV9DSEFOTkVMKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsKSk7DQogIGFzc2VydChJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHkpKTsNCiAgYXNzZXJ0KElTX1RJTV9JQ19TRUxFQ1RJT04oVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uKSk7DQogIGFzc2VydChJU19USU1fSUNfUFJFU0NBTEVSKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcikpOw0KICBhc3NlcnQoSVNfVElNX0lDX0ZJTFRFUihUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpKTsNCiAgDQogIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fSUNNb2RlID09IFRJTV9JQ01vZGVfSUNBUCkNCiAgew0KICAgIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKQ0KICAgIHsNCiAgICAgIC8qIFRJMSBDb25maWd1cmF0aW9uICovDQogICAgICBUSTFfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LA0KICAgICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQoNCiAgICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgICB9DQogICAgZWxzZSBpZiAoVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPT0gVElNX0NoYW5uZWxfMikNCiAgICB7DQogICAgICAvKiBUSTIgQ29uZmlndXJhdGlvbiAqLw0KICAgICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KDQogICAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogICAgfQ0KICAgIGVsc2UgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9DaGFubmVsID09IFRJTV9DaGFubmVsXzMpDQogICAgew0KICAgICAgLyogVEkzIENvbmZpZ3VyYXRpb24gKi8NCiAgICAgIFRJM19Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksDQogICAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCg0KICAgICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgICAgVElNX1NldElDM1ByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KICAgIH0NCiAgICBlbHNlIC8qIFRJTV9DaGFubmVsXzQgKi8NCiAgICB7DQogICAgICAvKiBUSTQgQ29uZmlndXJhdGlvbiAqLw0KICAgICAgVEk0X0NvbmZpZyhUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KDQogICAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgICBUSU1fU2V0SUM0UHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIFBXTUlfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QpOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1RpbWVCYXNlU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVElNX1RpbWVCYXNlSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fVGltZUJhc2VJbml0VHlwZURlZg0KKiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9UaW1lQmFzZVN0cnVjdEluaXQoVElNX1RpbWVCYXNlSW5pdFR5cGVEZWYqIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QZXJpb2QgPSBUSU1fUGVyaW9kX1Jlc2V0X01hc2s7DQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9QcmVzY2FsZXIgPSBUSU1fUHJlc2NhbGVyX1Jlc2V0X01hc2s7DQogIFRJTV9UaW1lQmFzZUluaXRTdHJ1Y3QtPlRJTV9DbG9ja0RpdmlzaW9uID0gVElNX0NLRF9ESVYxOw0KICBUSU1fVGltZUJhc2VJbml0U3RydWN0LT5USU1fQ291bnRlck1vZGUgPSBUSU1fQ291bnRlck1vZGVfVXA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVElNX09DSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTV9PQ0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBUSU1fT0NJbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9PQ1N0cnVjdEluaXQoVElNX09DSW5pdFR5cGVEZWYqIFRJTV9PQ0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovDQogIFRJTV9PQ0luaXRTdHJ1Y3QtPlRJTV9PQ01vZGUgPSBUSU1fT0NNb2RlX1RpbWluZzsNCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPSBUSU1fQ2hhbm5lbF8xOw0KICBUSU1fT0NJbml0U3RydWN0LT5USU1fUHVsc2UgPSBUSU1fUHVsc2VfUmVzZXRfTWFzazsNCiAgVElNX09DSW5pdFN0cnVjdC0+VElNX09DUG9sYXJpdHkgPSBUSU1fT0NQb2xhcml0eV9IaWdoOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9JQ1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFRJTV9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNX0lDSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9JQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0lDU3RydWN0SW5pdChUSU1fSUNJbml0VHlwZURlZiogVElNX0lDSW5pdFN0cnVjdCkNCnsNCiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8NCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDTW9kZSA9IFRJTV9JQ01vZGVfSUNBUDsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0NoYW5uZWwgPSBUSU1fQ2hhbm5lbF8xOw0KICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQb2xhcml0eSA9IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZzsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDU2VsZWN0aW9uID0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIgPSBUSU1fSUNQU0NfRElWMTsNCiAgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyID0gVElNX0lDRmlsdGVyX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBUSU0gcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTXggcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9DbWQoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBUSU0gQ291bnRlciAqLw0KICAgIFRJTXgtPkNSMSB8PSBDUjFfQ0VOX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBUSU0gQ291bnRlciAqLw0KICAgIFRJTXgtPkNSMSAmPSBDUjFfQ0VOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeCBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSVQ6IHNwZWNpZmllcyB0aGUgVElNIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkDQoqICAgICAgICAgICAgICAgICAgICBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9VcGRhdGU6IFRpbWVyIHVwZGF0ZSBJbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0NDMTogQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9DQzI6IENhcHR1cmUgQ29tcGFyZSAyIEludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfQ0MzOiBDYXB0dXJlIENvbXBhcmUgMyBJbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0NDNDogQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9UcmlnZ2VyOiBUcmlnZ2VyIEludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3c3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFRJTXggaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9JVENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0lUKFRJTV9JVCkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIEludGVycnVwdCBzb3VyY2VzICovDQogICAgVElNeC0+RElFUiB8PSBUSU1fSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0IHNvdXJjZXMgKi8NCiAgICBUSU14LT5ESUVSICY9ICh1MTYpKH5USU1fSVQpOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0RNQUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTXiScyBETUEgaW50ZXJmYWNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRE1BQmFzZTogRE1BIEJhc2UgYWRkcmVzcy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9ETUFCYXNlX0NSMSwgVElNX0RNQUJhc2VfQ1IyLCBUSU1fRE1BQmFzZV9TTUNSLA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BQmFzZV9ESUVSLCBUSU1fRE1BQmFzZV9TUiwgVElNX0RNQUJhc2VfRUdSLA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBUSU1fRE1BQmFzZV9DQ01SMSwgVElNX0RNQUJhc2VfQ0NNUjIsIFRJTV9ETUFCYXNlX0NDRVIsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX0NOVCwgVElNX0RNQUJhc2VfUFNDLCBUSU1fRE1BQmFzZV9BUlIsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX0NDUjEsIFRJTV9ETUFCYXNlX0NDUjIsIFRJTV9ETUFCYXNlX0NDUjMsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCYXNlX0NDUjQsIFRJTV9ETUFCYXNlX0RDUi4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9ETUFCdXJzdExlbmd0aDogRE1BIEJ1cnN0IGxlbmd0aC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgdmFsdWUgYmV0d2VlbjoNCiogICAgICAgICAgICAgICAgICAgIFRJTV9ETUFCdXJzdExlbmd0aF8xQnl0ZSBhbmQgVElNX0RNQUJ1cnN0TGVuZ3RoXzE4Qnl0ZXMuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9ETUFDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fRE1BQmFzZSwgdTE2IFRJTV9ETUFCdXJzdExlbmd0aCkNCnsNCiAgdTMyIHRtcGRjciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9ETUFfQkFTRShUSU1fRE1BQmFzZSkpOw0KICBhc3NlcnQoSVNfVElNX0RNQV9MRU5HVEgoVElNX0RNQUJ1cnN0TGVuZ3RoKSk7DQogIA0KICB0bXBkY3IgPSBUSU14LT5EQ1I7DQoNCiAgLyogUmVzZXQgdGhlIERCQSBhbmQgdGhlIERCTCBCaXRzICovDQogIHRtcGRjciAmPSBEQ1JfRE1BX01hc2s7DQoNCiAgLyogU2V0IHRoZSBETUEgQmFzZSBhbmQgdGhlIERNQSBCdXJzdCBMZW5ndGggKi8NCiAgdG1wZGNyIHw9IFRJTV9ETUFCYXNlIHwgVElNX0RNQUJ1cnN0TGVuZ3RoOw0KDQogIFRJTXgtPkRDUiA9ICh1MTYpdG1wZGNyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9ETUFDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14knMgRE1BIFJlcXVlc3RzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRE1BU291cmNlczogc3BlY2lmaWVzIHRoZSBETUEgUmVxdWVzdCBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQV9DQzE6IENhcHR1cmUgQ29tcGFyZSAxIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQV9DQzI6IENhcHR1cmUgQ29tcGFyZSAyIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQV9DQzM6IENhcHR1cmUgQ29tcGFyZSAzIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQV9DQzQ6IENhcHR1cmUgQ29tcGFyZSA0IERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0RNQV9UcmlnZ2VyOiBUcmlnZ2VyIERNQSBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRE1BQ21kKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0RNQVNvdXJjZSwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KICB1MzIgdG1wZGllciA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0RNQV9TT1VSQ0UoVElNX0RNQVNvdXJjZSkpOw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdzdGF0ZSkpOw0KDQogIHRtcGRpZXIgPSBUSU14LT5ESUVSOw0KDQogIGlmIChOZXdzdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBETUEgc291cmNlcyAqLw0KICAgIHRtcGRpZXIgfD0gVElNX0RNQVNvdXJjZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgc291cmNlcyAqLw0KICAgIHRtcGRpZXIgJj0gKHUxNikoflRJTV9ETUFTb3VyY2UpOw0KICB9DQogIFRJTXgtPkRJRVIgPSAodTE2KXRtcGRpZXI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0ludGVybmFsQ2xvY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IGludGVycm5hbCBDbG9jaw0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9JbnRlcm5hbENsb2NrQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBEaXNhYmxlIHNsYXZlIG1vZGUgdG8gY2xvY2sgdGhlIHByZXNjYWxlciBkaXJlY3RseSB3aXRoIHRoZSBpbnRlcm5hbCBjbG9jayAqLw0KICBUSU14LT5TTUNSICY9ICBTTUNSX1NNU19NYXNrOw0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fSVRSeEV4dGVybmFsQ2xvY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IEludGVybmFsIFRyaWdnZXIgYXMgRXh0ZXJuYWwgQ2xvY2sNCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lUUlNvdXJjZTogVHJpZ2dlciBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfSVRSMDogSW50ZXJuYWwgVHJpZ2dlciAwDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UU19JVFIxOiBJbnRlcm5hbCBUcmlnZ2VyIDENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RTX0lUUjI6IEludGVybmFsIFRyaWdnZXIgMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfSVRSMzogSW50ZXJuYWwgVHJpZ2dlciAzDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9JVFJ4RXh0ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fSU5URVJOQUxfVFJJR0dFUl9TRUxFQ1RJT04oVElNX0lucHV0VHJpZ2dlclNvdXJjZSkpOw0KDQogIC8qIFNlbGVjdCB0aGUgSW50ZXJuYWwgVHJpZ2dlciAqLw0KICBUSU1fU2VsZWN0SW5wdXRUcmlnZ2VyKFRJTXgsIFRJTV9JbnB1dFRyaWdnZXJTb3VyY2UpOw0KDQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgVElNeC0+U01DUiB8PSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMTsNCn0NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1RJeEV4dGVybmFsQ2xvY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IFRyaWdnZXIgYXMgRXh0ZXJuYWwgQ2xvY2sNCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX1RJeEV4dGVybmFsQ0xLU291cmNlOiBUcmlnZ2VyIHNvdXJjZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UU19USTFGX0VEOiBUSTEgRWRnZSBEZXRlY3Rvcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfVEkxRlAxOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAxDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UU19USTJGUDI6IEZpbHRlcmVkIFRpbWVyIElucHV0IDINCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIFRJeCBQb2xhcml0eS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHlfUmlzaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAgLSBJQ0ZpbHRlciA6IHNwZWNpZmllcyB0aGUgZmlsdGVyIHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MCBhbmQgMHhGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fVEl4RXh0ZXJuYWxDbG9ja0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9USXhFeHRlcm5hbENMS1NvdXJjZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IFRJTV9JQ1BvbGFyaXR5LCB1OCBJQ0ZpbHRlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9USVhfVFJJR0dFUl9TRUxFQ1RJT04oVElNX1RJeEV4dGVybmFsQ0xLU291cmNlKSk7DQogIGFzc2VydChJU19USU1fSUNfUE9MQVJJVFkoVElNX0lDUG9sYXJpdHkpKTsNCiAgYXNzZXJ0KElTX1RJTV9JQ19GSUxURVIoSUNGaWx0ZXIpKTsNCg0KICAvKiBDb25maWd1cmUgdGhlIFRpbWVyIElucHV0IENsb2NrIFNvdXJjZSAqLw0KICBpZiAoVElNX1RJeEV4dGVybmFsQ0xLU291cmNlID09IFRJTV9USXhFeHRlcm5hbENMSzFTb3VyY2VfVEkyKQ0KICB7DQogICAgVEkyX0NvbmZpZyhUSU14LCBUSU1fSUNQb2xhcml0eSwgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgVEkxX0NvbmZpZyhUSU14LCBUSU1fSUNQb2xhcml0eSwgVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJLCBJQ0ZpbHRlcik7DQogIH0NCg0KICAvKiBTZWxlY3QgdGhlIFRyaWdnZXIgc291cmNlICovDQogIFRJTV9TZWxlY3RJbnB1dFRyaWdnZXIoVElNeCwgVElNX1RJeEV4dGVybmFsQ0xLU291cmNlKTsNCg0KICAvKiBTZWxlY3QgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUxICovDQogIFRJTXgtPlNNQ1IgfD0gVElNX1NsYXZlTW9kZV9FeHRlcm5hbDE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0VUUkNsb2NrTW9kZTFDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBFeHRlcm5hbCBjbG9jayBNb2RlMQ0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUHJlc2NhbGVyOiBUaGUgZXh0ZXJuYWwgVHJpZ2dlciBQcmVzY2FsZXIuDQoqICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUFNDX09GRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUFNDX0RJVjINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BTQ19ESVY0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQU0NfRElWOC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQb2xhcml0eTogVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkDQoqICAgICAgICAgICAgICAgICAgLSBFeHRUUkdGaWx0ZXI6IEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRVRSQ2xvY2tNb2RlMUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9FeHRUUkdQcmVzY2FsZXIsIHUxNiBUSU1fRXh0VFJHUG9sYXJpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IEV4dFRSR0ZpbHRlcikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9FWFRfUFJFU0NBTEVSKFRJTV9FeHRUUkdQcmVzY2FsZXIpKTsNCiAgYXNzZXJ0KElTX1RJTV9FWFRfUE9MQVJJVFkoVElNX0V4dFRSR1BvbGFyaXR5KSk7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBFVFIgQ2xvY2sgc291cmNlICovDQogIEVUUl9Db25maWcoVElNeCwgVElNX0V4dFRSR1ByZXNjYWxlciwgVElNX0V4dFRSR1BvbGFyaXR5LCBFeHRUUkdGaWx0ZXIpOw0KDQogIC8qIFNlbGVjdCB0aGUgRXh0ZXJuYWwgY2xvY2sgbW9kZTEgKi8NCiAgVElNeC0+U01DUiAmPSBTTUNSX1NNU19NYXNrOw0KICBUSU14LT5TTUNSIHw9IFRJTV9TbGF2ZU1vZGVfRXh0ZXJuYWwxOw0KDQogIC8qIFNlbGVjdCB0aGUgVHJpZ2dlciBzZWxlY3Rpb24gOiBFVFJGICovDQogIFRJTXgtPlNNQ1IgJj0gU01DUl9UU19NYXNrOw0KICBUSU14LT5TTUNSIHw9IFRJTV9UU19FVFJGOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9FVFJDbG9ja01vZGUyQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgRXh0ZXJuYWwgY2xvY2sgTW9kZTINCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1ByZXNjYWxlcjogVGhlIGV4dGVybmFsIFRyaWdnZXIgUHJlc2NhbGVyLg0KKiAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BTQ19PRkYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BTQ19ESVYyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQU0NfRElWNA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUFNDX0RJVjgNCiogICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQb2xhcml0eTogVGhlIGV4dGVybmFsIFRyaWdnZXIgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUG9sYXJpdHlfSW52ZXJ0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BvbGFyaXR5X05vbkludmVydGVkDQoqICAgICAgICAgICAgICAgICAgLSBFeHRUUkdGaWx0ZXI6IEV4dGVybmFsIFRyaWdnZXIgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRVRSQ2xvY2tNb2RlMkNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9FeHRUUkdQcmVzY2FsZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgVElNX0V4dFRSR1BvbGFyaXR5LCB1OCBFeHRUUkdGaWx0ZXIpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fRVhUX1BSRVNDQUxFUihUSU1fRXh0VFJHUHJlc2NhbGVyKSk7DQogIGFzc2VydChJU19USU1fRVhUX1BPTEFSSVRZKFRJTV9FeHRUUkdQb2xhcml0eSkpOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgRVRSIENsb2NrIHNvdXJjZSAqLw0KICBFVFJfQ29uZmlnKFRJTXgsIFRJTV9FeHRUUkdQcmVzY2FsZXIsIFRJTV9FeHRUUkdQb2xhcml0eSwgRXh0VFJHRmlsdGVyKTsNCg0KICAvKiBFbmFibGUgdGhlIEV4dGVybmFsIGNsb2NrIG1vZGUyICovDQogIFRJTXgtPlNNQ1IgfD0gU01DUl9FQ0VfU2V0Ow0KfQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2VsZWN0SW5wdXRUcmlnZ2VyDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgSW5wdXQgVHJpZ2dlciBzb3VyY2UNCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lucHV0VHJpZ2dlclNvdXJjZTogVGhlIElucHV0IFRyaWdnZXIgc291cmNlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RTX0lUUjA6IEludGVybmFsIFRyaWdnZXIgMA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfSVRSMTogSW50ZXJuYWwgVHJpZ2dlciAxDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UU19JVFIyOiBJbnRlcm5hbCBUcmlnZ2VyIDINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RTX0lUUjM6IEludGVybmFsIFRyaWdnZXIgMw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfVEkxRl9FRDogVEkxIEVkZ2UgRGV0ZWN0b3INCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RTX1RJMUZQMTogRmlsdGVyZWQgVGltZXIgSW5wdXQgMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFNfVEkyRlAyOiBGaWx0ZXJlZCBUaW1lciBJbnB1dCAyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UU19FVFJGOiBFeHRlcm5hbCBUcmlnZ2VyIGlucHV0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TZWxlY3RJbnB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSW5wdXRUcmlnZ2VyU291cmNlKQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9UUklHR0VSX1NFTEVDVElPTihUSU1fSW5wdXRUcmlnZ2VyU291cmNlKSk7DQoNCiAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQoNCiAgLyogU2VsZWN0IHRoZSBUZ2lnZ2VyIFNvdXJjZSAqLw0KICB0bXBzbWNyICY9IFNNQ1JfVFNfTWFzazsNCiAgdG1wc21jciB8PSBUSU1fSW5wdXRUcmlnZ2VyU291cmNlOw0KDQogIFRJTXgtPlNNQ1IgPSAodTE2KXRtcHNtY3I7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1ByZXNjYWxlckNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTXggUHJlc2NhbGVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBQcmVzY2FsZXI6IHNwZWNpZmllcyB0aGUgUHJlc2NhbGVyIFJlZ2lzdGVyIHZhbHVlDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fUFNDUmVsb2FkTW9kZTogc3BlY2lmaWVzIHRoZSBUSU0gUHJlc2NhbGVyIFJlbG9hZCBtb2RlDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fUFNDUmVsb2FkTW9kZV9VcGRhdGU6IFRoZSBQcmVzY2FsZXIgaXMgbG9hZGVkIGF0DQoqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1cGRhdGUgZXZlbnQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9QU0NSZWxvYWRNb2RlX0ltbWVkaWF0ZTogVGhlIFByZXNjYWxlciBpcyBsb2FkZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRseS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1ByZXNjYWxlckNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFByZXNjYWxlciwgdTE2IFRJTV9QU0NSZWxvYWRNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX1BSRVNDQUxFUl9SRUxPQUQoVElNX1BTQ1JlbG9hZE1vZGUpKTsNCg0KICAvKiBTZXQgdGhlIFByZXNjYWxlciB2YWx1ZSAqLw0KICBUSU14LT5QU0MgPSBQcmVzY2FsZXI7DQoNCiAgLyogU2V0IG9yIHJlc2V0IHRoZSBVRyBCaXQgKi8NCiAgaWYgKFRJTV9QU0NSZWxvYWRNb2RlID09IFRJTV9QU0NSZWxvYWRNb2RlX0ltbWVkaWF0ZSkNCiAgew0KICAgIFRJTXgtPkVHUiB8PSBUSU1fRXZlbnRTb3VyY2VfVXBkYXRlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFRJTXgtPkVHUiAmPSBUSU1fRXZlbnRTb3VyY2VfVXBkYXRlOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0NvdW50ZXJNb2RlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU3BlY2lmaWVzIHRoZSBUSU14IENvdW50ZXIgTW9kZSB0byBiZSB1c2VkLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fQ291bnRlck1vZGU6IHNwZWNpZmllcyB0aGUgQ291bnRlciBNb2RlIHRvIGJlIHVzZWQNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9Db3VudGVyTW9kZV9VcDogVElNIFVwIENvdW50aW5nIE1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0NvdW50ZXJNb2RlX0Rvd246IFRJTSBEb3duIENvdW50aW5nIE1vZGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQxOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTENCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQyOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0NvdW50ZXJNb2RlX0NlbnRlckFsaWduZWQzOiBUSU0gQ2VudGVyIEFsaWduZWQgTW9kZTMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0NvdW50ZXJNb2RlQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0NvdW50ZXJNb2RlKQ0Kew0KICB1MzIgdG1wY3IxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0NPVU5URVJfTU9ERShUSU1fQ291bnRlck1vZGUpKTsNCg0KICB0bXBjcjEgPSBUSU14LT5DUjE7DQoNCiAgLyogUmVzZXQgdGhlIENNUyBhbmQgRElSIEJpdHMgKi8NCiAgdG1wY3IxICY9IENSMV9Db3VudGVyTW9kZV9NYXNrOw0KDQogIC8qIFNldCB0aGUgQ291bnRlciBNb2RlICovDQogIHRtcGNyMSB8PSBUSU1fQ291bnRlck1vZGU7DQoNCiAgVElNeC0+Q1IxID0gKHUxNil0bXBjcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0ZvcmNlZE9DMUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgMSB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8NCiogICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DMVJFRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbg0KKiAgICAgICAgICAgICAgICAgICAgICAgICBPQzFSRUYuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9Gb3JjZWRPQzFDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fRm9yY2VkQWN0aW9uKQ0Kew0KICB1MzIgdG1wY2NtcjEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQoNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgT0NNIEJpdHMgKi8NCiAgdG1wY2NtcjEgJj0gQ0NNUl9PQ00xM19NYXNrOw0KDQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIxIHw9IFRJTV9Gb3JjZWRBY3Rpb247DQoNCiAgVElNeC0+Q0NNUjEgPSAodTE2KXRtcGNjbXIxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9Gb3JjZWRPQzJDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBGb3JjZXMgdGhlIFRJTXggb3V0cHV0IDIgd2F2ZWZvcm0gdG8gYWN0aXZlIG9yIGluYWN0aXZlIGxldmVsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRm9yY2VkQWN0aW9uOiBzcGVjaWZpZXMgdGhlIGZvcmNlZCBBY3Rpb24gdG8gYmUgc2V0IHRvDQoqICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdhdmVmb3JtLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZvcmNlZEFjdGlvbl9BY3RpdmU6IEZvcmNlIGFjdGl2ZSBsZXZlbCBvbiBPQzJSRUYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZvcmNlZEFjdGlvbl9JbkFjdGl2ZTogRm9yY2UgaW5hY3RpdmUgbGV2ZWwgb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgT0MyUkVGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRm9yY2VkT0MyQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0ZvcmNlZEFjdGlvbikNCnsNCiAgdTMyIHRtcGNjbXIxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0ZPUkNFRF9BQ1RJT04oVElNX0ZvcmNlZEFjdGlvbikpOw0KDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQoNCiAgLyogUmVzZXQgdGhlIE9DTSBCaXRzICovDQogIHRtcGNjbXIxICY9IENDTVJfT0NNMjRfTWFzazsNCg0KICAvKiBDb25maWd1cmUgVGhlIEZvcmNlZCBvdXRwdXQgTW9kZSAqLw0KICB0bXBjY21yMSB8PSAodTE2KShUSU1fRm9yY2VkQWN0aW9uIDw8IDgpOw0KDQogIFRJTXgtPkNDTVIxID0gKHUxNil0bXBjY21yMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fRm9yY2VkT0MzQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRm9yY2VzIHRoZSBUSU14IG91dHB1dCAzIHdhdmVmb3JtIHRvIGFjdGl2ZSBvciBpbmFjdGl2ZSBsZXZlbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0ZvcmNlZEFjdGlvbjogc3BlY2lmaWVzIHRoZSBmb3JjZWQgQWN0aW9uIHRvIGJlIHNldCB0bw0KKiAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3YXZlZm9ybS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9Gb3JjZWRBY3Rpb25fQWN0aXZlOiBGb3JjZSBhY3RpdmUgbGV2ZWwgb24gT0MzUkVGDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9Gb3JjZWRBY3Rpb25fSW5BY3RpdmU6IEZvcmNlIGluYWN0aXZlIGxldmVsIG9uDQoqICAgICAgICAgICAgICAgICAgICAgICAgIE9DM1JFRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0ZvcmNlZE9DM0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9Gb3JjZWRBY3Rpb24pDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9GT1JDRURfQUNUSU9OKFRJTV9Gb3JjZWRBY3Rpb24pKTsNCg0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KDQogIC8qIFJlc2V0IHRoZSBPQ00gQml0cyAqLw0KICB0bXBjY21yMiAmPSBDQ01SX09DTTEzX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIFRoZSBGb3JjZWQgb3V0cHV0IE1vZGUgKi8NCiAgdG1wY2NtcjIgfD0gVElNX0ZvcmNlZEFjdGlvbjsNCg0KICBUSU14LT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0ZvcmNlZE9DNENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEZvcmNlcyB0aGUgVElNeCBvdXRwdXQgNCB3YXZlZm9ybSB0byBhY3RpdmUgb3IgaW5hY3RpdmUgbGV2ZWwuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9Gb3JjZWRBY3Rpb246IHNwZWNpZmllcyB0aGUgZm9yY2VkIEFjdGlvbiB0byBiZSBzZXQgdG8NCiogICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgd2F2ZWZvcm0uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRm9yY2VkQWN0aW9uX0FjdGl2ZTogRm9yY2UgYWN0aXZlIGxldmVsIG9uIE9DNFJFRg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRm9yY2VkQWN0aW9uX0luQWN0aXZlOiBGb3JjZSBpbmFjdGl2ZSBsZXZlbCBvbg0KKiAgICAgICAgICAgICAgICAgICAgICAgICBPQzRSRUYuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9Gb3JjZWRPQzRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fRm9yY2VkQWN0aW9uKQ0Kew0KICB1MzIgdG1wY2NtcjIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fRk9SQ0VEX0FDVElPTihUSU1fRm9yY2VkQWN0aW9uKSk7DQoNCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCg0KICAvKiBSZXNldCB0aGUgT0NNIEJpdHMgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9PQ00yNF9NYXNrOw0KDQogIC8qIENvbmZpZ3VyZSBUaGUgRm9yY2VkIG91dHB1dCBNb2RlICovDQogIHRtcGNjbXIyIHw9ICh1MTYpKFRJTV9Gb3JjZWRBY3Rpb24gPDwgOCk7DQoNCiAgVElNeC0+Q0NNUjIgPSAodTE2KXRtcGNjbXIyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9BUlJQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBBUlIuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fQVJSUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KICB1MzIgdG1wY3IxID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld3N0YXRlKSk7DQoNCiAgdG1wY3IxID0gVElNeC0+Q1IxOw0KDQogIGlmIChOZXdzdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogU2V0IHRoZSBBUlIgUHJlbG9hZCBCaXQgKi8NCiAgICB0bXBjcjEgfD0gQ1IxX0FSUEVfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBBUlIgUHJlbG9hZCBCaXQgKi8NCiAgICB0bXBjcjEgJj0gQ1IxX0FSUEVfUmVzZXQ7DQogIH0NCg0KICBUSU14LT5DUjEgPSAodTE2KXRtcGNyMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2VsZWN0Q0NETUENCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBUSU14IHBlcmlwaGVyYWwgQ2FwdHVyZSBDb21wYXJlIERNQSBzb3VyY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIENhcHR1cmUgQ29tcGFyZSBETUEgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2VsZWN0Q0NETUEoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgdTMyIHRtcGNyMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3c3RhdGUpKTsNCg0KICB0bXBjcjIgPSBUSU14LT5DUjI7DQoNCiAgaWYgKE5ld3N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBTZXQgdGhlIENDRFMgQml0ICovDQogICAgdG1wY3IyIHw9IENSMl9DQ0RTX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgQ0NEUyBCaXQgKi8NCiAgICB0bXBjcjIgJj0gQ1IyX0NDRFNfUmVzZXQ7DQogIH0NCg0KICBUSU14LT5DUjIgPSAodTE2KXRtcGNyMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fT0MxUHJlbG9hZENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjEuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQNCiogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX09DMVByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fT0NQcmVsb2FkKQ0Kew0KICB1MzIgdG1wY2NtcjEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCg0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KDQogIC8qIFJlc2V0IHRoZSBPQ1BFIEJpdCAqLw0KICB0bXBjY21yMSAmPSBDQ01SX09DMTNQRV9NYXNrOw0KDQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjEgfD0gVElNX09DUHJlbG9hZDsNCg0KICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DMlByZWxvYWRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZCByZWdpc3RlciBvbiBDQ1IyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQcmVsb2FkOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkDQoqICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DUHJlbG9hZF9FbmFibGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DUHJlbG9hZF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9PQzJQcmVsb2FkQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX09DUHJlbG9hZCkNCnsNCiAgdTMyIHRtcGNjbXIxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX09DUFJFTE9BRF9TVEFURShUSU1fT0NQcmVsb2FkKSk7DQoNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgT0NQRSBCaXQgKi8NCiAgdG1wY2NtcjEgJj0gQ0NNUl9PQzI0UEVfTWFzazsNCg0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgUHJlbG9hZCBmZWF0dXJlICovDQogIHRtcGNjbXIxIHw9ICh1MTYpKFRJTV9PQ1ByZWxvYWQgPDwgOCk7DQoNCiAgVElNeC0+Q0NNUjEgPSAodTE2KXRtcGNjbXIxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9PQzNQcmVsb2FkQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQgcmVnaXN0ZXIgb24gQ0NSMy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX09DUHJlbG9hZDogbmV3IHN0YXRlIG9mIHRoZSBUSU14IHBlcmlwaGVyYWwgUHJlbG9hZA0KKiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXINCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ1ByZWxvYWRfRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ1ByZWxvYWRfRGlzYWJsZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fT0MzUHJlbG9hZENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9PQ1ByZWxvYWQpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9PQ1BSRUxPQURfU1RBVEUoVElNX09DUHJlbG9hZCkpOw0KDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIE9DUEUgQml0ICovDQogIHRtcGNjbXIyICY9IENDTVJfT0MxM1BFX01hc2s7DQoNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIFByZWxvYWQgZmVhdHVyZSAqLw0KICB0bXBjY21yMiB8PSBUSU1fT0NQcmVsb2FkOw0KDQogIFRJTXgtPkNDTVIyID0gKHUxNil0bXBjY21yMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fT0M0UHJlbG9hZENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyIG9uIENDUjQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PQ1ByZWxvYWQ6IG5ldyBzdGF0ZSBvZiB0aGUgVElNeCBwZXJpcGhlcmFsIFByZWxvYWQNCiogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQcmVsb2FkX0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQcmVsb2FkX0Rpc2FibGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX09DNFByZWxvYWRDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fT0NQcmVsb2FkKQ0Kew0KICB1MzIgdG1wY2NtcjIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fT0NQUkVMT0FEX1NUQVRFKFRJTV9PQ1ByZWxvYWQpKTsNCg0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KDQogIC8qIFJlc2V0IHRoZSBPQ1BFIEJpdCAqLw0KICB0bXBjY21yMiAmPSBDQ01SX09DMjRQRV9NYXNrOw0KDQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBQcmVsb2FkIGZlYXR1cmUgKi8NCiAgdG1wY2NtcjIgfD0gKHUxNikoVElNX09DUHJlbG9hZCA8PCA4KTsNCg0KICBUSU14LT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DMUZhc3RDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IE91dHB1dCBDb21wYXJlIDEgRmFzdCBmZWF0dXJlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ0Zhc3RfRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ0Zhc3RfRGlzYWJsZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fT0MxRmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9PQ0Zhc3QpDQp7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9PQ0ZBU1RfU1RBVEUoVElNX09DRmFzdCkpOw0KDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQoNCiAgLyogUmVzZXQgdGhlIE9DRkUgQml0ICovDQogIHRtcGNjbXIxICY9IENDTVJfT0MxM0ZFX01hc2s7DQoNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQogIHRtcGNjbXIxIHw9IFRJTV9PQ0Zhc3Q7DQoNCiAgVElNeC0+Q0NNUjEgPSAodTE2KXRtcGNjbXIxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9PQzJGYXN0Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNeCBPdXRwdXQgQ29tcGFyZSAyIEZhc3QgZmVhdHVyZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX09DRmFzdDogbmV3IHN0YXRlIG9mIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEVuYWJsZSBCaXQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NGYXN0X0VuYWJsZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NGYXN0X0Rpc2FibGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX09DMkZhc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fT0NGYXN0KQ0Kew0KICB1MzIgdG1wY2NtcjEgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fT0NGQVNUX1NUQVRFKFRJTV9PQ0Zhc3QpKTsNCg0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KDQogIC8qIFJlc2V0IHRoZSBPQ0ZFIEJpdCAqLw0KICB0bXBjY21yMSAmPSBDQ01SX09DMjRGRV9NYXNrOw0KDQogIC8qIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBPdXRwdXQgQ29tcGFyZSBGYXN0IEJpdCAqLw0KICB0bXBjY21yMSB8PSAodTE2KShUSU1fT0NGYXN0IDw8IDgpOw0KDQogIFRJTXgtPkNDTVIxID0gKHUxNil0bXBjY21yMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fT0MzRmFzdENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTXggT3V0cHV0IENvbXBhcmUgMyBGYXN0IGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PQ0Zhc3Q6IG5ldyBzdGF0ZSBvZiB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBFbmFibGUgQml0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DRmFzdF9FbmFibGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DRmFzdF9EaXNhYmxlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9PQzNGYXN0Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX09DRmFzdCkNCnsNCiAgdTMyIHRtcGNjbXIyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX09DRkFTVF9TVEFURShUSU1fT0NGYXN0KSk7DQoNCiAgdG1wY2NtcjIgPSBUSU14LT5DQ01SMjsNCg0KICAvKiBSZXNldCB0aGUgT0NGRSBCaXQgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9PQzEzRkVfTWFzazsNCg0KICAvKiBFbmFibGUgb3IgRGlzYWJsZSB0aGUgT3V0cHV0IENvbXBhcmUgRmFzdCBCaXQgKi8NCiAgdG1wY2NtcjIgfD0gVElNX09DRmFzdDsNCg0KICBUSU14LT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DNEZhc3RDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IE91dHB1dCBDb21wYXJlIDQgRmFzdCBmZWF0dXJlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fT0NGYXN0OiBuZXcgc3RhdGUgb2YgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgRW5hYmxlIEJpdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ0Zhc3RfRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ0Zhc3RfRGlzYWJsZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fT0M0RmFzdENvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9PQ0Zhc3QpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9PQ0ZBU1RfU1RBVEUoVElNX09DRmFzdCkpOw0KDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIE9DRkUgQml0ICovDQogIHRtcGNjbXIyICY9IENDTVJfT0MyNEZFX01hc2s7DQoNCiAgLyogRW5hYmxlIG9yIERpc2FibGUgdGhlIE91dHB1dCBDb21wYXJlIEZhc3QgQml0ICovDQogIHRtcGNjbXIyIHw9ICh1MTYpKFRJTV9PQ0Zhc3QgPDwgOCk7DQoNCiAgVElNeC0+Q0NNUjIgPSAodTE2KXRtcGNjbXIyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9VcGRhdGVEaXNhYmxlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBEaXNhYmxlcyB0aGUgVElNeCBVcGRhdGUgZXZlbnQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggcGVyaXBoZXJhbCBQcmVsb2FkIHJlZ2lzdGVyDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fVXBkYXRlRGlzYWJsZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgRnVuY3Rpb25hbFN0YXRlIE5ld3N0YXRlKQ0Kew0KICB1MzIgdG1wY3IxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdzdGF0ZSkpOw0KDQogIHRtcGNyMSA9IFRJTXgtPkNSMTsNCg0KICBpZiAoTmV3c3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgVXBkYXRlIERpc2FibGUgQml0ICovDQogICAgdG1wY3IxIHw9IENSMV9VRElTX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCB0aGUgVXBkYXRlIERpc2FibGUgQml0ICovDQogICAgdG1wY3IxICY9IENSMV9VRElTX1Jlc2V0Ow0KICB9DQoNCiAgVElNeC0+Q1IxID0gKHUxNil0bXBjcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0VuY29kZXJJbnRlcmZhY2VDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IEVuY29kZXIgSW50ZXJmYWNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRW5jb2Rlck1vZGU6IHNwZWNpZmllcyB0aGUgVElNeCBFbmNvZGVyIE1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRW5jb2Rlck1vZGVfVEkxOiBDb3VudGVyIGNvdW50cyBvbiBUSTFGUDEgZWRnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gVEkyRlAyIGxldmVsLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRW5jb2Rlck1vZGVfVEkyOiBDb3VudGVyIGNvdW50cyBvbiBUSTJGUDIgZWRnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gVEkxRlAxIGxldmVsLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRW5jb2Rlck1vZGVfVEkxMjogQ291bnRlciBjb3VudHMgb24gYm90aCBUSTFGUDEgYW5kDQoqICAgICAgICAgICAgICAgICAgICAgICAgIFRJMkZQMiBlZGdlcyBkZXBlbmRpbmcgb24gdGhlIGxldmVsIG9mIHRoZSBvdGhlciBpbnB1dC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQzFQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBJQzEgUG9sYXJpdHkNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDMlBvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIElDMiBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQb2xhcml0eV9GYWxsaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X1Jpc2luZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fRW5jb2RlckludGVyZmFjZUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9FbmNvZGVyTW9kZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IFRJTV9JQzFQb2xhcml0eSwgdTE2IFRJTV9JQzJQb2xhcml0eSkNCnsNCiAgdTMyIHRtcHNtY3IgPSAwOw0KICB1MzIgdG1wY2NtcjEgPSAwOw0KICB1MzIgdG1wY2NlciA9IDA7DQogICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fRU5DT0RFUl9NT0RFKFRJTV9FbmNvZGVyTW9kZSkpOw0KICBhc3NlcnQoSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQzFQb2xhcml0eSkpOw0KICBhc3NlcnQoSVNfVElNX0lDX1BPTEFSSVRZKFRJTV9JQzJQb2xhcml0eSkpOw0KDQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCg0KICAvKiBTZXQgdGhlIGVuY29kZXIgTW9kZSAqLw0KICB0bXBzbWNyICY9IFNNQ1JfU01TX01hc2s7DQogIHRtcHNtY3IgfD0gVElNX0VuY29kZXJNb2RlOw0KDQogIC8qIFNlbGVjdCB0aGUgQ2FwdHVyZSBDb21wYXJlIDEgYW5kIHRoZSBDYXB0dXJlIENvbXBhcmUgMiBhcyBpbnB1dCAqLw0KICB0bXBjY21yMSAmPSBDQ01SX0NDMTNTX01hc2sgJiBDQ01SX0NDMjRTX01hc2s7DQogIHRtcGNjbXIxIHw9IENDTVJfVEkxM0RpcmVjdF9TZXQgfCBDQ01SX1RJMjREaXJlY3RfU2V0Ow0KDQogIC8qIFNldCB0aGUgVEkxIGFuZCB0aGUgVEkyIFBvbGFyaXRpZXMgKi8NCiAgdG1wY2NlciAmPSBDQ0VSX0NDMVBfTWFzayAmIENDRVJfQ0MyUF9NYXNrOw0KICB0bXBjY2VyIHw9IChUSU1fSUMxUG9sYXJpdHkgfCAodTE2KSgodTE2KVRJTV9JQzJQb2xhcml0eSA8PCA0KSk7DQoNCiAgVElNeC0+U01DUiA9ICh1MTYpdG1wc21jcjsNCg0KICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQoNCiAgVElNeC0+Q0NFUiA9ICh1MTYpdG1wY2NlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2VuZXJhdGVFdmVudA0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTXggZXZlbnQgdG8gYmUgZ2VuZXJhdGUgYnkgc29mdHdhcmUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9FdmVudFNvdXJjZTogc3BlY2lmaWVzIHRoZSBldmVudCBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FdmVudFNvdXJjZV9VcGRhdGU6IFRpbWVyIHVwZGF0ZSBFdmVudCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V2ZW50U291cmNlX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRXZlbnQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FdmVudFNvdXJjZV9DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEV2ZW50IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXZlbnRTb3VyY2VfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBFdmVudCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V2ZW50U291cmNlX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRXZlbnQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FdmVudFNvdXJjZV9UcmlnZ2VyOiBUaW1lciBUcmlnZ2VyIEV2ZW50IHNvdXJjZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fR2VuZXJhdGVFdmVudChUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9FdmVudFNvdXJjZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9FVkVOVF9TT1VSQ0UoVElNX0V2ZW50U291cmNlKSk7DQoNCiAgLyogU2V0IHRoZSBldmVudCBzb3VyY2VzICovDQogIFRJTXgtPkVHUiB8PSBUSU1fRXZlbnRTb3VyY2U7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DMVBvbGFyaXR5Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDEgcG9sYXJpdHkuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMSBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX09DMVBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX09DUG9sYXJpdHkpDQp7DQogIHUzMiB0bXBjY2VyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQoNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzFQIEJpdCAqLw0KICB0bXBjY2VyICY9IENDRVJfQ0MxUF9NYXNrOw0KICB0bXBjY2VyIHw9IFRJTV9PQ1BvbGFyaXR5Ow0KDQogIFRJTXgtPkNDRVIgPSAodTE2KXRtcGNjZXI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX09DMlBvbGFyaXR5Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNeCBjaGFubmVsIDIgcG9sYXJpdHkuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PQ1BvbGFyaXR5OiBzcGVjaWZpZXMgdGhlIE9DMiBQb2xhcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQb2xhcml0eV9IaWdoOiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgaGlnaA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQb2xhcml0eV9Mb3c6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBsb3cNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX09DMlBvbGFyaXR5Q29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX09DUG9sYXJpdHkpDQp7DQogIHUzMiB0bXBjY2VyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX09DX1BPTEFSSVRZKFRJTV9PQ1BvbGFyaXR5KSk7DQoNCiAgdG1wY2NlciA9IFRJTXgtPkNDRVI7DQoNCiAgLyogU2V0IG9yIFJlc2V0IHRoZSBDQzJQIEJpdCAqLw0KICB0bXBjY2VyICY9IENDRVJfQ0MyUF9NYXNrOw0KICB0bXBjY2VyIHw9ICh1MTYpKCh1MTYpVElNX09DUG9sYXJpdHkgPDwgNCk7DQoNCiAgVElNeC0+Q0NFUiA9ICh1MTYpdG1wY2NlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fT0MzUG9sYXJpdHlDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBUSU14IGNoYW5uZWwgMyBwb2xhcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX09DUG9sYXJpdHk6IHNwZWNpZmllcyB0aGUgT0MzIFBvbGFyaXR5DQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcm1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ1BvbGFyaXR5X0hpZ2g6IE91dHB1dCBDb21wYXJlIGFjdGl2ZSBoaWdoDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PQ1BvbGFyaXR5X0xvdzogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGxvdw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fT0MzUG9sYXJpdHlDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fT0NQb2xhcml0eSkNCnsNCiAgdTMyIHRtcGNjZXIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fT0NfUE9MQVJJVFkoVElNX09DUG9sYXJpdHkpKTsNCg0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCg0KICAvKiBTZXQgb3IgUmVzZXQgdGhlIENDM1AgQml0ICovDQogIHRtcGNjZXIgJj0gQ0NFUl9DQzNQX01hc2s7DQogIHRtcGNjZXIgfD0gKHUxNikoKHUxNilUSU1fT0NQb2xhcml0eSA8PCA4KTsNCg0KICBUSU14LT5DQ0VSID0gKHUxNil0bXBjY2VyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9PQzRQb2xhcml0eUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFRJTXggY2hhbm5lbCA0IHBvbGFyaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fT0NQb2xhcml0eTogc3BlY2lmaWVzIHRoZSBPQzQgUG9sYXJpdHkNCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFybWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DUG9sYXJpdHlfSGlnaDogT3V0cHV0IENvbXBhcmUgYWN0aXZlIGhpZ2gNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX09DUG9sYXJpdHlfTG93OiBPdXRwdXQgQ29tcGFyZSBhY3RpdmUgbG93DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9PQzRQb2xhcml0eUNvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9PQ1BvbGFyaXR5KQ0Kew0KICB1MzIgdG1wY2NlciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9PQ19QT0xBUklUWShUSU1fT0NQb2xhcml0eSkpOw0KDQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgQ0M0UCBCaXQgKi8NCiAgdG1wY2NlciAmPSBDQ0VSX0NDNFBfTWFzazsNCiAgdG1wY2NlciB8PSAodTE2KSgodTE2KVRJTV9PQ1BvbGFyaXR5IDw8IDEyKTsNCg0KICBUSU14LT5DQ0VSID0gKHUxNil0bXBjY2VyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9VcGRhdGVSZXF1ZXN0Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNeCBVcGRhdGUgUmVxdWVzdCBJbnRlcnJ1cHQgc291cmNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fVXBkYXRlU291cmNlOiBzcGVjaWZpZXMgdGhlIFVwZGF0ZSBzb3VyY2UuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVXBkYXRlU291cmNlX1JlZ3VsYXINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1VwZGF0ZVNvdXJjZV9HbG9iYWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1VwZGF0ZVJlcXVlc3RDb25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fVXBkYXRlU291cmNlKQ0Kew0KICB1MzIgdG1wY3IxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX1VQREFURV9TT1VSQ0UoVElNX1VwZGF0ZVNvdXJjZSkpOw0KDQogIHRtcGNyMSA9IFRJTXgtPkNSMTsNCg0KICBpZiAoVElNX1VwZGF0ZVNvdXJjZSA9PSBUSU1fVXBkYXRlU291cmNlX1JlZ3VsYXIpDQogIHsNCiAgICAvKiBTZXQgdGhlIFVSUyBCaXQgKi8NCiAgICB0bXBjcjEgfD0gQ1IxX1VSU19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIFVSUyBCaXQgKi8NCiAgICB0bXBjcjEgJj0gQ1IxX1VSU19SZXNldDsNCiAgfQ0KICBUSU14LT5DUjEgPSAodTE2KXRtcGNyMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2VsZWN0SGFsbFNlbnNvcg0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFRJTXiScyBIYWxsIHNlbnNvciBpbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld3N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFRJTXggSGFsbCBzZW5zb3IgaW50ZXJmYWNlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NlbGVjdEhhbGxTZW5zb3IoVElNX1R5cGVEZWYqIFRJTXgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdzdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3c3RhdGUpKTsNCg0KICBpZiAoTmV3c3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFNldCB0aGUgVEkxUyBCaXQgKi8NCiAgICBUSU14LT5DUjIgfD0gQ1IyX1RJMVNfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IHRoZSBUSTFTIEJpdCAqLw0KICAgIFRJTXgtPkNSMiAmPSBDUjJfVEkxU19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZWxlY3RPbmVQdWxzZU1vZGUNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBUSU14knMgT25lIFB1bHNlIE1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9PUE1vZGU6IHNwZWNpZmllcyB0aGUgT1BNIE1vZGUgdG8gYmUgdXNlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PUE1vZGVfU2luZ2xlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9PUE1vZGVfUmVwZXRpdGl2ZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2VsZWN0T25lUHVsc2VNb2RlKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX09QTW9kZSkNCnsNCiAgdTMyIHRtcGNyMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9PUE1fTU9ERShUSU1fT1BNb2RlKSk7DQoNCiAgdG1wY3IxID0gVElNeC0+Q1IxOw0KDQogIC8qIFJlc2V0IHRoZSBPUE0gQml0ICovDQogIHRtcGNyMSAmPSBDUjFfT1BNX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBPUE0gTW9kZSAqLw0KICB0bXBjcjEgfD0gVElNX09QTW9kZTsNCg0KICBUSU14LT5DUjEgPSAodTE2KXRtcGNyMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2VsZWN0T3V0cHV0VHJpZ2dlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIFRJTXggVHJpZ2dlciBPdXRwdXQgTW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX1RSR09Tb3VyY2U6IHNwZWNpZmllcyB0aGUgVHJpZ2dlciBPdXRwdXQgc291cmNlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFJHT1NvdXJjZV9SZXNldA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFJHT1NvdXJjZV9FbmFibGUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RSR09Tb3VyY2VfVXBkYXRlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UUkdPU291cmNlX09DMQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFJHT1NvdXJjZV9PQzFSZWYNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1RSR09Tb3VyY2VfT0MyUmVmDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9UUkdPU291cmNlX09DM1JlZg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fVFJHT1NvdXJjZV9PQzRSZWYNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NlbGVjdE91dHB1dFRyaWdnZXIoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fVFJHT1NvdXJjZSkNCnsNCiAgdTMyIHRtcGNyMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9UUkdPX1NPVVJDRShUSU1fVFJHT1NvdXJjZSkpOw0KDQogIHRtcGNyMiA9IFRJTXgtPkNSMjsNCiAgLyogUmVzZXQgdGhlIE1NUyBCaXRzICovDQogIHRtcGNyMiAmPSBDUjJfTU1TX01hc2s7DQoNCiAgLyogU2VsZWN0IHRoZSBUUkdPIHNvdXJjZSAqLw0KICB0bXBjcjIgfD0gIFRJTV9UUkdPU291cmNlOw0KDQogIFRJTXgtPkNSMiA9ICh1MTYpdG1wY3IyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZWxlY3RTbGF2ZU1vZGUNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBUSU14IFNsYXZlIE1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9TbGF2ZU1vZGU6IHNwZWNpZmllcyB0aGUgVGltZXIgU2xhdmUgTW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW10ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX1NsYXZlTW9kZV9SZXNldA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU2xhdmVNb2RlX0dhdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9TbGF2ZU1vZGVfVHJpZ2dlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fU2xhdmVNb2RlX0V4dGVybmFsMQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2VsZWN0U2xhdmVNb2RlKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX1NsYXZlTW9kZSkNCnsNCiAgdTMyIHRtcHNtY3IgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19USU1fU0xBVkVfTU9ERShUSU1fU2xhdmVNb2RlKSk7DQoNCiAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQoNCiAgLyogUmVzZXQgdGhlIFNNUyBCaXRzICovDQogIHRtcHNtY3IgJj0gU01DUl9TTVNfTWFzazsNCg0KICAvKiBTZWxlY3QgdGhlIFNsYXZlIE1vZGUgKi8NCiAgdG1wc21jciB8PSBUSU1fU2xhdmVNb2RlOw0KDQogIFRJTXgtPlNNQ1IgPSAodTE2KXRtcHNtY3I7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NlbGVjdE1hc3RlclNsYXZlTW9kZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgb3IgUmVzZXRzIHRoZSBUSU14IE1hc3Rlci9TbGF2ZSBNb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fTWFzdGVyU2xhdmVNb2RlOiBzcGVjaWZpZXMgdGhlIFRpbWVyIE1hc3RlciBTbGF2ZSBNb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fTWFzdGVyU2xhdmVNb2RlX0VuYWJsZTogc3luY2hyb25pemF0aW9uIGJldHdlZW4gdGhlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZXIgYW5kIGl0cyBzbGF2ZXMgKHRocm91Z2ggVFJHTykuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9NYXN0ZXJTbGF2ZU1vZGVfRGlzYWJsZTogTm8gYWN0aW9uDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TZWxlY3RNYXN0ZXJTbGF2ZU1vZGUoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fTWFzdGVyU2xhdmVNb2RlKQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9NU01fU1RBVEUoVElNX01hc3RlclNsYXZlTW9kZSkpOw0KDQogIHRtcHNtY3IgPSBUSU14LT5TTUNSOw0KDQogIC8qIFNldCBvciBSZXNldCB0aGUgTVNNIEJpdCAqLw0KICB0bXBzbWNyICY9IFNNQ1JfTVNNX01hc2s7DQogIHRtcHNtY3IgfD0gVElNX01hc3RlclNsYXZlTW9kZTsNCg0KICBUSU14LT5TTUNSID0gKHUxNil0bXBzbWNyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZXRBdXRvcmVsb2FkDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNeCBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEF1dG9yZWxvYWQ6IHNwZWNpZmllcyB0aGUgQXV0b3JlbG9hZCByZWdpc3RlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TZXRBdXRvcmVsb2FkKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgQXV0b3JlbG9hZCkNCnsNCiAgLyogU2V0IHRoZSBBdXRvcmVsb2FkIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkFSUiA9IEF1dG9yZWxvYWQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldENvbXBhcmUxDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNeCBDYXB0dXJlIENvbXBhcmUxIFJlZ2lzdGVyIHZhbHVlDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIENvbXBhcmUxOiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTEgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2V0Q29tcGFyZTEoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBDb21wYXJlMSkNCnsNCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmUxIFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjEgPSBDb21wYXJlMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2V0Q29tcGFyZTINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU14IENhcHR1cmUgQ29tcGFyZTIgUmVnaXN0ZXIgdmFsdWUNCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQ29tcGFyZTI6IHNwZWNpZmllcyB0aGUgQ2FwdHVyZSBDb21wYXJlMiByZWdpc3RlciBuZXcgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9TZXRDb21wYXJlMihUSU1fVHlwZURlZiogVElNeCwgdTE2IENvbXBhcmUyKQ0Kew0KICAvKiBTZXQgdGhlIENhcHR1cmUgQ29tcGFyZTIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgVElNeC0+Q0NSMiA9IENvbXBhcmUyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZXRDb21wYXJlMw0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTXggQ2FwdHVyZSBDb21wYXJlMyBSZWdpc3RlciB2YWx1ZQ0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBDb21wYXJlMzogc3BlY2lmaWVzIHRoZSBDYXB0dXJlIENvbXBhcmUzIHJlZ2lzdGVyIG5ldyB2YWx1ZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldENvbXBhcmUzKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgQ29tcGFyZTMpDQp7DQogIC8qIFNldCB0aGUgQ2FwdHVyZSBDb21wYXJlMyBSZWdpc3RlciB2YWx1ZSAqLw0KICBUSU14LT5DQ1IzID0gQ29tcGFyZTM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldENvbXBhcmU0DQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNeCBDYXB0dXJlIENvbXBhcmU0IFJlZ2lzdGVyIHZhbHVlDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIENvbXBhcmU0OiBzcGVjaWZpZXMgdGhlIENhcHR1cmUgQ29tcGFyZTQgcmVnaXN0ZXIgbmV3IHZhbHVlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2V0Q29tcGFyZTQoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBDb21wYXJlNCkNCnsNCiAgLyogU2V0IHRoZSBDYXB0dXJlIENvbXBhcmU0IFJlZ2lzdGVyIHZhbHVlICovDQogIFRJTXgtPkNDUjQgPSBDb21wYXJlNDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fU2V0SUMxUHJlc2NhbGVyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVElNeCBJbnB1dCBDYXB0dXJlIDEgcHJlc2NhbGVyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSUMxUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUxIHByZXNjYWxlcg0KKiAgICAgICAgICAgICAgICAgICAgbmV3IHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUFNDX0RJVjE6IG5vIHByZXNjYWxlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUFNDX0RJVjQ6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDQgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVY4OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA4IGV2ZW50cw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBUSU1fU2V0SUMxUHJlc2NhbGVyKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0lDMVByZXNjYWxlcikNCnsNCiAgdTMyIHRtcGNjbXIxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0lDX1BSRVNDQUxFUihUSU1fSUMxUHJlc2NhbGVyKSk7DQoNCiAgdG1wY2NtcjEgPSBUSU14LT5DQ01SMTsNCg0KICAvKiBSZXNldCB0aGUgSUMxUFNDIEJpdHMgKi8NCiAgdG1wY2NtcjEgJj0gQ0NNUl9JQzEzUFNDX01hc2s7DQoNCiAgLyogU2V0IHRoZSBJQzFQU0MgdmFsdWUgKi8NCiAgdG1wY2NtcjEgfD0gVElNX0lDMVByZXNjYWxlcjsNCg0KICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldElDMlByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAyIHByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDMlByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlMiBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgIG5ldyB2YWx1ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldElDMlByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JQzJQcmVzY2FsZXIpDQp7DQogIHUzMiB0bXBjY21yMSA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDMlByZXNjYWxlcikpOw0KDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQoNCiAgLyogUmVzZXQgdGhlIElDMlBTQyBCaXRzICovDQogIHRtcGNjbXIxICY9IENDTVJfSUMyNFBTQ19NYXNrOw0KDQogIC8qIFNldCB0aGUgSUMyUFNDIHZhbHVlICovDQogIHRtcGNjbXIxIHw9ICh1MTYpKCh1MTYpVElNX0lDMlByZXNjYWxlciA8PCA4KTsNCg0KICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2NtcjE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldElDM1ByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIFRJTXggSW5wdXQgQ2FwdHVyZSAzIHByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDM1ByZXNjYWxlcjogc3BlY2lmaWVzIHRoZSBJbnB1dCBDYXB0dXJlMyBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgIG5ldyB2YWx1ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUFNDX0RJVjI6IGNhcHR1cmUgaXMgZG9uZSBvbmNlIGV2ZXJ5IDIgZXZlbnRzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVY0OiBjYXB0dXJlIGlzIGRvbmUgb25jZSBldmVyeSA0IGV2ZW50cw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldElDM1ByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JQzNQcmVzY2FsZXIpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDM1ByZXNjYWxlcikpOw0KDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIElDM1BTQyBCaXRzICovDQogIHRtcGNjbXIyICY9IENDTVJfSUMxM1BTQ19NYXNrOw0KDQogIC8qIFNldCB0aGUgSUMzUFNDIHZhbHVlICovDQogIHRtcGNjbXIyIHw9IFRJTV9JQzNQcmVzY2FsZXI7DQoNCiAgVElNeC0+Q0NNUjIgPSAodTE2KXRtcGNjbXIyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJTV9TZXRJQzRQcmVzY2FsZXINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgNCBwcmVzY2FsZXIuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQzRQcmVzY2FsZXI6IHNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZTQgcHJlc2NhbGVyDQoqICAgICAgICAgICAgICAgICAgICBuZXcgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BTQ19ESVYxOiBubyBwcmVzY2FsZXINCiogICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWMjogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgMiBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWNDogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgNCBldmVudHMNCiogICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQU0NfRElWODogY2FwdHVyZSBpcyBkb25lIG9uY2UgZXZlcnkgOCBldmVudHMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldElDNFByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JQzRQcmVzY2FsZXIpDQp7DQogIHUzMiB0bXBjY21yMiA9IDA7DQogICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9JQ19QUkVTQ0FMRVIoVElNX0lDNFByZXNjYWxlcikpOw0KDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQoNCiAgLyogUmVzZXQgdGhlIElDNFBTQyBCaXRzICovDQogIHRtcGNjbXIyICY9IENDTVJfSUMyNFBTQ19NYXNrOw0KDQogIC8qIFNldCB0aGUgSUM0UFNDIHZhbHVlICovDQogIHRtcGNjbXIyIHw9ICh1MTYpKCh1MTYpVElNX0lDNFByZXNjYWxlciA8PCA4KTsNCg0KICBUSU14LT5DQ01SMiA9ICh1MTYpdG1wY2NtcjI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX1NldENsb2NrRGl2aXNpb24NCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBUSU14IENsb2NrIERpdmlzaW9uIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fQ0tEOiBzcGVjaWZpZXMgdGhlIGNsb2NrIGRpdmlzaW9uIHZhbHVlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ0tEX0RJVjE6IFREVFMgPSBUY2tfdGltDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9DS0RfRElWMjogVERUUyA9IDIqVGNrX3RpbQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fQ0tEX0RJVjQ6IFREVFMgPSA0KlRja190aW0NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX1NldENsb2NrRGl2aXNpb24oVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fQ0tEKQ0Kew0KICB1MzIgdG1wY3IxID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0NLRF9ESVYoVElNX0NLRCkpOw0KDQogIHRtcGNyMSA9IFRJTXgtPkNSMTsNCg0KICAvKiBSZXNldCB0aGUgQ0tEIEJpdHMgKi8NCiAgdG1wY3IxICY9IENSMV9DS0RfTWFzazsNCg0KICAvKiBTZXQgdGhlIENLRCB2YWx1ZSAqLw0KICB0bXBjcjEgfD0gVElNX0NLRDsNCg0KICBUSU14LT5DUjEgPSAodTE2KXRtcGNyMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0Q2FwdHVyZTENCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMSB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBDYXB0dXJlIENvbXBhcmUgMSBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldENhcHR1cmUxKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBHZXQgdGhlIENhcHR1cmUgMSBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0Q2FwdHVyZTINCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMiB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBDYXB0dXJlIENvbXBhcmUgMiBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldENhcHR1cmUyKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBHZXQgdGhlIENhcHR1cmUgMiBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0Q2FwdHVyZTMNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgMyB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBDYXB0dXJlIENvbXBhcmUgMyBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldENhcHR1cmUzKFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBHZXQgdGhlIENhcHR1cmUgMyBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSMzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0Q2FwdHVyZTQNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBUSU14IElucHV0IENhcHR1cmUgNCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBDYXB0dXJlIENvbXBhcmUgNCBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldENhcHR1cmU0KFRJTV9UeXBlRGVmKiBUSU14KQ0Kew0KICAvKiBHZXQgdGhlIENhcHR1cmUgNCBSZWdpc3RlciB2YWx1ZSAqLw0KICByZXR1cm4gVElNeC0+Q0NSNDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0Q291bnRlcg0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTXggQ291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBUSU1fR2V0Q291bnRlcihUSU1fVHlwZURlZiogVElNeCkNCnsNCiAgLyogR2V0IHRoZSBDb3VudGVyIFJlZ2lzdGVyIHZhbHVlICovDQogIHJldHVybiBUSU14LT5DTlQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0dldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFRJTXggUHJlc2NhbGVyIHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNeDogd2hlcmUgeCBjYW4gYmUgMiwgMyBvciA0IHRvIHNlbGVjdCB0aGUgVElNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFByZXNjYWxlciBSZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVElNX0dldFByZXNjYWxlcihUSU1fVHlwZURlZiogVElNeCkNCnsNCiAgLyogR2V0IHRoZSBQcmVzY2FsZXIgUmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuIFRJTXgtPlBTQzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVElNeCBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19VcGRhdGU6IFRpbWVyIHVwZGF0ZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19UcmlnZ2VyOiBUaW1lciBUcmlnZ2VyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MxT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MyT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MzT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0M0T0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBUSU1fRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFRJTV9HZXRGbGFnU3RhdHVzKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0ZMQUcpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9HRVRfRkxBRyhUSU1fRkxBRykpOw0KDQogIGlmICgoVElNeC0+U1IgJiBUSU1fRkxBRykgIT0gKHUxNilSRVNFVCApDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSU1fQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBUSU14J3MgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyBiaXQgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19VcGRhdGU6IFRpbWVyIHVwZGF0ZSBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19DQzI6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MzOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMyBGbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9GTEFHX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgRmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRkxBR19UcmlnZ2VyOiBUaW1lciBUcmlnZ2VyIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MxT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAxIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MyT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAyIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0MzT0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAzIG92ZXJjYXB0dXJlIEZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0ZMQUdfQ0M0T0Y6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSA0IG92ZXJjYXB0dXJlIEZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVElNX0NsZWFyRmxhZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0NMRUFSX0ZMQUcoVElNX0ZMQUcpKTsNCg0KICAvKiBDbGVhciB0aGUgZmxhZ3MgKi8NCiAgVElNeC0+U1IgJj0gKHUxNil+VElNX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIFRJTXggaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JVDogc3BlY2lmaWVzIHRoZSBUSU0gaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX1VwZGF0ZTogVGltZXIgdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfQ0MxOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMSBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0NDMjogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDIgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9DQzM6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfQ0M0OiBUaW1lciBDYXB0dXJlIENvbXBhcmUgNCBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX1RyaWdnZXI6IFRpbWVyIFRyaWdnZXIgSW50ZXJydXB0IHNvdXJjZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIHRoZSBUSU1fSVQoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBUSU1fR2V0SVRTdGF0dXMoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICANCiAgdTE2IGl0c3RhdHVzID0gMHgwLCBpdGVuYWJsZSA9IDB4MDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVElNX0dFVF9JVChUSU1fSVQpKTsNCiAgDQogIGl0c3RhdHVzID0gVElNeC0+U1IgJiBUSU1fSVQ7DQogIA0KICBpdGVuYWJsZSA9IFRJTXgtPkRJRVIgJiBUSU1fSVQ7DQoNCiAgaWYgKChpdHN0YXR1cyAhPSAodTE2KVJFU0VUKSAgJiYgKGl0ZW5hYmxlICE9ICh1MTYpUkVTRVQpKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVElNX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBUSU14J3MgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lUOiBzcGVjaWZpZXMgdGhlIHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX1VwZGF0ZTogVGltZXIgdXBkYXRlIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0NDMTogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDEgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfQ0MyOiBUaW1lciBDYXB0dXJlIENvbXBhcmUgMiBJbnRlcnJ1cHQgc291cmNlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JVF9DQzM6IFRpbWVyIENhcHR1cmUgQ29tcGFyZSAzIEludGVycnVwdCBzb3VyY2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lUX0NDNDogVGltZXIgQ2FwdHVyZSBDb21wYXJlIDQgSW50ZXJydXB0IHNvdXJjZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSVRfVHJpZ2dlcjogVGltZXIgVHJpZ2dlciBJbnRlcnJ1cHQgc291cmNlDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFRJTV9DbGVhcklUUGVuZGluZ0JpdChUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1RJTV9JVChUSU1fSVQpKTsNCiAgDQogIC8qIENsZWFyIHRoZSBJVCBwZW5kaW5nIEJpdCAqLw0KICBUSU14LT5TUiAmPSAodTE2KX5USU1fSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogUFdNSW5wdXRfQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVElNIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBUSU1fSUNJbml0U3RydWN0IHRvIG1lYXN1cmUgYW4gZXh0ZXJuYWwgUFdNDQoqICAgICAgICAgICAgICAgICAgc2lnbmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVElNX0lDSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFRJTV9JQ0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgICAgVElNIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBQV01JX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgVElNX0lDSW5pdFR5cGVEZWYqIFRJTV9JQ0luaXRTdHJ1Y3QpDQp7DQogIHU4IElDUG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9SaXNpbmc7DQogIHU4IElDU2VsZWN0aW9uID0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOw0KDQogIC8qIFNlbGVjdCB0aGUgT3Bwb3NpdGUgSW5wdXQgUG9sYXJpdHkgKi8NCiAgaWYgKFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5ID09IFRJTV9JQ1BvbGFyaXR5X1Jpc2luZykNCiAgew0KICAgIElDUG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9GYWxsaW5nOw0KICB9DQogIGVsc2UNCiAgew0KICAgIElDUG9sYXJpdHkgPSBUSU1fSUNQb2xhcml0eV9SaXNpbmc7DQogIH0NCg0KICAvKiBTZWxlY3QgdGhlIE9wcG9zaXRlIElucHV0ICovDQogIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24gPT0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJKQ0KICB7DQogICAgSUNTZWxlY3Rpb24gPSBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBJQ1NlbGVjdGlvbiA9IFRJTV9JQ1NlbGVjdGlvbl9EaXJlY3RUSTsNCiAgfQ0KDQogIGlmIChUSU1fSUNJbml0U3RydWN0LT5USU1fQ2hhbm5lbCA9PSBUSU1fQ2hhbm5lbF8xKQ0KICB7DQogICAgLyogVEkxIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTFfQ29uZmlnKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1BvbGFyaXR5LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNTZWxlY3Rpb24sDQogICAgICAgICAgICAgICBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCg0KICAgIC8qIFRJMiBDb25maWd1cmF0aW9uICovDQogICAgVEkyX0NvbmZpZyhUSU14LCBJQ1BvbGFyaXR5LCBJQ1NlbGVjdGlvbiwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDRmlsdGVyKTsNCg0KICAgIC8qIFNldCB0aGUgSW5wdXQgQ2FwdHVyZSBQcmVzY2FsZXIgdmFsdWUgKi8NCiAgICBUSU1fU2V0SUMyUHJlc2NhbGVyKFRJTXgsIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1ByZXNjYWxlcik7DQogIH0NCiAgZWxzZQ0KICB7CSANCiAgICAvKiBUSTEgQ29uZmlndXJhdGlvbiAqLw0KICAgIFRJMl9Db25maWcoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUG9sYXJpdHksIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgIFRJTV9JQ0luaXRTdHJ1Y3QtPlRJTV9JQ0ZpbHRlcik7DQoNCiAgICAvKiBTZXQgdGhlIElucHV0IENhcHR1cmUgUHJlc2NhbGVyIHZhbHVlICovDQogICAgVElNX1NldElDMlByZXNjYWxlcihUSU14LCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNQcmVzY2FsZXIpOw0KDQogICAgLyogVEkyIENvbmZpZ3VyYXRpb24gKi8NCiAgICBUSTFfQ29uZmlnKFRJTXgsIElDUG9sYXJpdHksIElDU2VsZWN0aW9uLCBUSU1fSUNJbml0U3RydWN0LT5USU1fSUNGaWx0ZXIpOw0KDQogICAgLyogU2V0IHRoZSBJbnB1dCBDYXB0dXJlIFByZXNjYWxlciB2YWx1ZSAqLw0KICAgIFRJTV9TZXRJQzFQcmVzY2FsZXIoVElNeCwgVElNX0lDSW5pdFN0cnVjdC0+VElNX0lDUHJlc2NhbGVyKTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJMV9Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmUgdGhlIFRJMSBhcyBJbnB1dC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTSBJbnB1dCAxIGlzIHNlbGVjdGVkIHRvDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbm5lY3RlZCB0byBJQzEuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMSBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fVFJHSTogVElNIElucHV0IDEgaXMgc2VsZWN0ZWQgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIFRSR0kuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgVEkxX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JQ1BvbGFyaXR5LCB1MTYgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1OCBUSU1fSUNGaWx0ZXIpDQp7DQogIHUzMiB0bXBjY21yMSA9IDAsIHRtcGNjZXIgPSAwOw0KDQogIHRtcGNjbXIxID0gVElNeC0+Q0NNUjE7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMTogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSBDQ1JFX0NDMUVfUmVzZXQ7DQoNCiAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCiAgdG1wY2NtcjEgJj0gQ0NNUl9DQzEzU19NYXNrICYgQ0NNUl9JQzEzRl9NYXNrOw0KICB0bXBjY21yMSB8PSBUSU1fSUNTZWxlY3Rpb24gfCAodTE2KSgodTE2KVRJTV9JQ0ZpbHRlciA8PCA0KTsNCg0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5ICBhbmQgc2V0IHRoZSBDQ0UgQml0ICovDQogIHRtcGNjZXIgJj0gQ0NFUl9DQzFQX01hc2sgJiBDQ1JFX0NDMUVfTWFzazsNCiAgdG1wY2NlciB8PSBUSU1fSUNQb2xhcml0eSB8IENDUkVfQ0MxRV9TZXQ7DQoNCiAgVElNeC0+Q0NNUjEgPSAweDAwMDA7DQogIFRJTXgtPkNDTVIxID0gKHUxNil0bXBjY21yMTsNCiAgVElNeC0+Q0NFUiA9ICh1MTYpdG1wY2NlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSTJfQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlIHRoZSBUSTIgYXMgSW5wdXQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHlfUmlzaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgMiBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUMyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDIgaXMgc2VsZWN0ZWQgdG8NCiogICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29ubmVjdGVkIHRvIElDMS4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uX1RSR0k6IFRJTSBJbnB1dCAyIGlzIHNlbGVjdGVkIHRvIGJlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBUUkdJLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIFRJMl9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKQ0Kew0KICB1MzIgdG1wY2NtcjEgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCg0KICB0bXBjY21yMSA9IFRJTXgtPkNDTVIxOw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgdG1wID0gKHUxNikoKHUxNilUSU1fSUNQb2xhcml0eSA8PCA0KTsNCg0KICAvKiBEaXNhYmxlIHRoZSBDaGFubmVsIDI6IFJlc2V0IHRoZSBDQ0UgQml0ICovDQogIFRJTXgtPkNDRVIgJj0gQ0NSRV9DQzJFX1Jlc2V0Ow0KDQogIC8qIFNlbGVjdCB0aGUgSW5wdXQgYW5kIHNldCB0aGUgZmlsdGVyICovDQogIHRtcGNjbXIxICY9IENDTVJfQ0MyNFNfTWFzayAmIENDTVJfSUMyNEZfTWFzazsNCiAgdG1wY2NtcjEgfD0gKHUxNikoKHUxNilUSU1fSUNGaWx0ZXIgPDwgMTIpOw0KICB0bXBjY21yMSB8PSAodTE2KSgodTE2KVRJTV9JQ1NlbGVjdGlvbiA8PCA4KTsNCg0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5ICBhbmQgc2V0IHRoZSBDQ0UgQml0ICovDQogIHRtcGNjZXIgJj0gQ0NFUl9DQzJQX01hc2sgJiBDQ1JFX0NDMkVfTWFzazsNCiAgdG1wY2NlciB8PSAgdG1wIHwgQ0NSRV9DQzJFX1NldDsNCg0KICBUSU14LT5DQ01SMSA9ICh1MTYpdG1wY2NtcjEgOw0KICBUSU14LT5DQ0VSID0gKHUxNil0bXBjY2VyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFRJM19Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmUgdGhlIFRJMyBhcyBJbnB1dC4NCiogSW5wdXQgICAgICAgICAgOiAtIFRJTXg6IHdoZXJlIHggY2FuIGJlIDIsIDMgb3IgNCB0byBzZWxlY3QgdGhlIFRJTSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHkgOiBUaGUgSW5wdXQgUG9sYXJpdHkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNQb2xhcml0eV9SaXNpbmcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHlfRmFsbGluZw0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uOiBzcGVjaWZpZXMgdGhlIGlucHV0IHRvIGJlIHVzZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fRGlyZWN0VEk6IFRJTSBJbnB1dCAzIGlzIHNlbGVjdGVkIHRvDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbm5lY3RlZCB0byBJQzMuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1NlbGVjdGlvbl9JbmRpcmVjdFRJOiBUSU0gSW5wdXQgMyBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUM0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fVFJHSTogVElNIElucHV0IDMgaXMgc2VsZWN0ZWQgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIFRSR0kuDQoqICAgICAgICAgICAgICAgICAgLSBUSU1fSUNGaWx0ZXI6IFNwZWNpZmllcyB0aGUgSW5wdXQgQ2FwdHVyZSBGaWx0ZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweDBGLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kc3RhdGljIHZvaWQgVEkzX0NvbmZpZyhUSU1fVHlwZURlZiogVElNeCwgdTE2IFRJTV9JQ1BvbGFyaXR5LCB1MTYgVElNX0lDU2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICB1OCBUSU1fSUNGaWx0ZXIpDQp7DQogIHUzMiB0bXBjY21yMiA9IDAsIHRtcGNjZXIgPSAwLCB0bXAgPSAwOw0KDQogIHRtcGNjbXIyID0gVElNeC0+Q0NNUjI7DQogIHRtcGNjZXIgPSBUSU14LT5DQ0VSOw0KICB0bXAgPSAodTE2KSgodTE2KVRJTV9JQ1BvbGFyaXR5IDw8IDgpOw0KDQogIC8qIERpc2FibGUgdGhlIENoYW5uZWwgMzogUmVzZXQgdGhlIENDRSBCaXQgKi8NCiAgVElNeC0+Q0NFUiAmPSBDQ1JFX0NDM0VfUmVzZXQ7DQoNCiAgLyogU2VsZWN0IHRoZSBJbnB1dCBhbmQgc2V0IHRoZSBmaWx0ZXIgKi8NCiAgdG1wY2NtcjIgJj0gQ0NNUl9DQzEzU19NYXNrICYgQ0NNUl9JQzEzRl9NYXNrOw0KICB0bXBjY21yMiB8PSBUSU1fSUNTZWxlY3Rpb24gfCAodTE2KSgodTE2KVRJTV9JQ0ZpbHRlciA8PCA0KTsNCg0KICAvKiBTZWxlY3QgdGhlIFBvbGFyaXR5ICBhbmQgc2V0IHRoZSBDQ0UgQml0ICovDQogIHRtcGNjZXIgJj0gQ0NFUl9DQzFQX01hc2sgJiBDQ1JFX0NDMUVfTWFzazsNCiAgdG1wY2NlciB8PSB0bXAgfCBDQ1JFX0NDM0VfU2V0Ow0KDQogIFRJTXgtPkNDTVIyID0gKHUxNil0bXBjY21yMjsNCiAgVElNeC0+Q0NFUiA9ICh1MTYpdG1wY2NlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBUSTRfQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlIHRoZSBUSTEgYXMgSW5wdXQuDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5IDogVGhlIElucHV0IFBvbGFyaXR5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDUG9sYXJpdHlfUmlzaW5nDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9JQ1BvbGFyaXR5X0ZhbGxpbmcNCiogICAgICAgICAgICAgICAgICAtIFRJTV9JQ1NlbGVjdGlvbjogc3BlY2lmaWVzIHRoZSBpbnB1dCB0byBiZSB1c2VkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uX0RpcmVjdFRJOiBUSU0gSW5wdXQgNCBpcyBzZWxlY3RlZCB0bw0KKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjb25uZWN0ZWQgdG8gSUM0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fSUNTZWxlY3Rpb25fSW5kaXJlY3RUSTogVElNIElucHV0IDQgaXMgc2VsZWN0ZWQgdG8NCiogICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29ubmVjdGVkIHRvIElDMy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0lDU2VsZWN0aW9uX1RSR0k6IFRJTSBJbnB1dCA0IGlzIHNlbGVjdGVkIHRvIGJlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byBUUkdJLg0KKiAgICAgICAgICAgICAgICAgIC0gVElNX0lDRmlsdGVyOiBTcGVjaWZpZXMgdGhlIElucHV0IENhcHR1cmUgRmlsdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHgwMCBhbmQgMHgwRi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnN0YXRpYyB2b2lkIFRJNF9Db25maWcoVElNX1R5cGVEZWYqIFRJTXgsIHUxNiBUSU1fSUNQb2xhcml0eSwgdTE2IFRJTV9JQ1NlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggVElNX0lDRmlsdGVyKQ0Kew0KICB1MzIgdG1wY2NtcjIgPSAwLCB0bXBjY2VyID0gMCwgdG1wID0gMDsNCg0KICB0bXBjY21yMiA9IFRJTXgtPkNDTVIyOw0KICB0bXBjY2VyID0gVElNeC0+Q0NFUjsNCiAgdG1wID0gKHUxNikoKHUxNilUSU1fSUNQb2xhcml0eSA8PCAxMik7DQoNCiAgLyogRGlzYWJsZSB0aGUgQ2hhbm5lbCA0OiBSZXNldCB0aGUgQ0NFIEJpdCAqLw0KICBUSU14LT5DQ0VSICY9IENDUkVfQ0M0RV9SZXNldDsNCg0KICAvKiBTZWxlY3QgdGhlIElucHV0IGFuZCBzZXQgdGhlIGZpbHRlciAqLw0KICB0bXBjY21yMiAmPSBDQ01SX0NDMjRTX01hc2sgJiBDQ01SX0lDMjRGX01hc2s7DQogIHRtcGNjbXIyIHw9ICh1MTYpKCh1MTYpVElNX0lDU2VsZWN0aW9uIDw8IDgpIHwgKHUxNikoKHUxNilUSU1fSUNGaWx0ZXIgPDwgMTIpOw0KDQogIC8qIFNlbGVjdCB0aGUgUG9sYXJpdHkgIGFuZCBzZXQgdGhlIENDRSBCaXQgKi8NCiAgdG1wY2NlciAmPSBDQ0VSX0NDNFBfTWFzayAmIENDUkVfQ0M0RV9NYXNrOw0KICB0bXBjY2VyIHw9IHRtcCB8IENDUkVfQ0M0RV9TZXQ7DQoNCiAgVElNeC0+Q0NNUjIgPSAodTE2KXRtcGNjbXIyOw0KICBUSU14LT5DQ0VSID0gKHUxNil0bXBjY2VyIDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBFVFJfQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlIHRoZSBFeHRlcm5hbCBUcmlnZ2VyDQoqIElucHV0ICAgICAgICAgIDogLSBUSU14OiB3aGVyZSB4IGNhbiBiZSAyLCAzIG9yIDQgdG8gc2VsZWN0IHRoZSBUSU0gcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQcmVzY2FsZXI6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFByZXNjYWxlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQU0NfT0ZGDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQU0NfRElWMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUFNDX0RJVjQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BTQ19ESVY4DQoqICAgICAgICAgICAgICAgICAgLSBUSU1fRXh0VFJHUG9sYXJpdHk6IFRoZSBleHRlcm5hbCBUcmlnZ2VyIFBvbGFyaXR5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVElNX0V4dFRSR1BvbGFyaXR5X0ludmVydGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFRJTV9FeHRUUkdQb2xhcml0eV9Ob25JbnZlcnRlZA0KKiAgICAgICAgICAgICAgICAgIC0gRXh0VFJHRmlsdGVyOiBFeHRlcm5hbCBUcmlnZ2VyIEZpbHRlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4MDAgYW5kIDB4MEYuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpzdGF0aWMgdm9pZCBFVFJfQ29uZmlnKFRJTV9UeXBlRGVmKiBUSU14LCB1MTYgVElNX0V4dFRSR1ByZXNjYWxlciwgdTE2IFRJTV9FeHRUUkdQb2xhcml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgdTggRXh0VFJHRmlsdGVyKQ0Kew0KICB1MzIgdG1wc21jciA9IDA7DQoNCiAgdG1wc21jciA9IFRJTXgtPlNNQ1I7DQoNCiAgLyogU2V0IHRoZSBQcmVzY2FsZXIsIHRoZSBGaWx0ZXIgdmFsdWUgYW5kIHRoZSBQb2xhcml0eSAqLw0KICB0bXBzbWNyICY9IFNNQ1JfRVRSX01hc2s7DQogIHRtcHNtY3IgfD0gVElNX0V4dFRSR1ByZXNjYWxlciB8IFRJTV9FeHRUUkdQb2xhcml0eSB8ICh1MTYpKCh1MTYpRXh0VFJHRmlsdGVyIDw8IDgpOw0KDQogIFRJTXgtPlNNQ1IgPSAodTE2KXRtcHNtY3I7DQp9DQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDcgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K