LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2FkYy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgQURDIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2FkYy5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBBREMgQURPTiBtYXNrICovDQojZGVmaW5lIENSMl9BRE9OX1NldCAgICAgICAgICAgICAgICgodTMyKTB4MDAwMDAwMDEpDQojZGVmaW5lIENSMl9BRE9OX1Jlc2V0ICAgICAgICAgICAgICgodTMyKTB4RkZGRkZGRkUpDQoNCi8qIEFEQyBETUEgbWFzayAqLw0KI2RlZmluZSBDUjJfRE1BX1NldCAgICAgICAgICAgICAgICAoKHUxNikweDAxMDApDQojZGVmaW5lIENSMl9ETUFfUmVzZXQgICAgICAgICAgICAgICgodTE2KTB4RkVGRikNCg0KLyogQURDIFJTVENBTCBtYXNrICovDQojZGVmaW5lIENSMl9SU1RDQUxfU2V0ICAgICAgICAgICAgICgodTE2KTB4MDAwOCkNCg0KLyogQURDIENBTCBtYXNrICovDQojZGVmaW5lIENSMl9DQUxfU2V0ICAgICAgICAgICAgICAgICgodTE2KTB4MDAwNCkNCg0KLyogQURDIFNXU1RSVCBtYXNrICovDQojZGVmaW5lIENSMl9TV1NUUlRfU2V0ICAgICAgICAgICAgICgodTMyKTB4MDA0MDAwMDApDQoNCi8qIEFEQyBESVNDTlVNIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0RJU0NOVU1fUmVzZXQgICAgICAgICAgKCh1MzIpMHhGRkZGMUZGRikNCg0KLyogQURDIERJU0NFTiBtYXNrICovDQojZGVmaW5lIENSMV9ESVNDRU5fU2V0ICAgICAgICAgICAgICgodTMyKTB4MDAwMDA4MDApDQojZGVmaW5lIENSMV9ESVNDRU5fUmVzZXQgICAgICAgICAgICgodTMyKTB4RkZGRkY3RkYpDQoNCi8qIEFEQyBFWFRUUklHIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU2V0ICAgICAgICAgICAgKCh1MzIpMHgwMDEwMDAwMCkNCiNkZWZpbmUgQ1IyX0VYVFRSSUdfUmVzZXQgICAgICAgICAgKCh1MzIpMHhGRkVGRkZGRikNCg0KLyogQURDIFNvZnR3YXJlIHN0YXJ0IG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU1dTVFJUX1NldCAgICAgKCh1MzIpMHgwMDUwMDAwMCkNCiNkZWZpbmUgQ1IyX0VYVFRSSUdfU1dTVFJUX1Jlc2V0ICAgKCh1MzIpMHhGRkFGRkZGRikNCg0KLyogQURDIEpBVVRPIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0pBVVRPX1NldCAgICAgICAgICAgICAgKCh1MzIpMHgwMDAwMDQwMCkNCiNkZWZpbmUgQ1IxX0pBVVRPX1Jlc2V0ICAgICAgICAgICAgKCh1MzIpMHhGRkZGRkJGRikNCg0KLyogQURDIEpESVNDRU4gbWFzayAqLw0KI2RlZmluZSBDUjFfSkRJU0NFTl9TZXQgICAgICAgICAgICAoKHUzMikweDAwMDAxMDAwKQ0KI2RlZmluZSBDUjFfSkRJU0NFTl9SZXNldCAgICAgICAgICAoKHUzMikweEZGRkZFRkZGKQ0KDQovKiBBREMgSkVYVFNFTCBtYXNrICovDQojZGVmaW5lIENSMl9KRVhUU0VMX1Jlc2V0ICAgICAgICAgICgodTMyKTB4RkZGRjhGRkYpDQoNCi8qIEFEQyBKRVhUVFJJRyBtYXNrICovDQojZGVmaW5lIENSMl9KRVhUVFJJR19TZXQgICAgICAgICAgICgodTMyKTB4MDAwMDgwMDApDQojZGVmaW5lIENSMl9KRVhUVFJJR19SZXNldCAgICAgICAgICgodTMyKTB4RkZGRjdGRkYpDQoNCi8qIEFEQyBKU1dTVFJUIG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0pTV1NUUlRfU2V0ICAgICAgICAgICAgKCh1MzIpMHgwMDIwMDAwMCkNCg0KLyogQURDIGluamVjdGVkIHNvZnR3YXJlIHN0YXJ0IG1hc2sgKi8NCiNkZWZpbmUgQ1IyX0pFWFRUUklHX0pTV1NUUlRfU2V0ICAgKCh1MzIpMHgwMDIwODAwMCkNCiNkZWZpbmUgQ1IyX0pFWFRUUklHX0pTV1NUUlRfUmVzZXQgKCh1MzIpMHhGRkRGN0ZGRikNCg0KLyogQURDIEFXRENIIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0FXRENIX1Jlc2V0ICAgICAgICAgICAgKCh1MzIpMHhGRkZGRkZFMCkNCg0KLyogQURDIFNReCBtYXNrICovDQojZGVmaW5lIFNRUjNfU1FfU2V0ICAgICAgICAgICAgICAgICgodTgpMHgxRikNCiNkZWZpbmUgU1FSMl9TUV9TZXQgICAgICAgICAgICAgICAgKCh1OCkweDFGKQ0KI2RlZmluZSBTUVIxX1NRX1NldCAgICAgICAgICAgICAgICAoKHU4KTB4MUYpDQoNCi8qIEFEQyBKU1F4IG1hc2sgKi8NCiNkZWZpbmUgSlNRUl9KU1FfU2V0ICAgICAgICAgICAgICAgKCh1OCkweDFGKQ0KDQovKiBBREMgSkwgbWFzayAqLw0KI2RlZmluZSBKU1FSX0pMX1Jlc2V0ICAgICAgICAgICAgICAoKHUzMikweEZGQ0ZGRkZGKQ0KDQovKiBBREMgU01QeCBtYXNrICovDQojZGVmaW5lIFNNUFIxX1NNUF9TZXQgICAgICAgICAgICAgICgodTgpMHgwNykNCiNkZWZpbmUgU01QUjJfU01QX1NldCAgICAgICAgICAgICAgKCh1OCkweDA3KQ0KDQovKiBBREMgQW5hbG9nIHdhdGNoZG9nIGVuYWJsZSBtb2RlIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0FXRE1vZGVfUmVzZXQgICAgICAgICAgKCh1MzIpMHhGRjNGRkRGRikNCg0KLyogQURDIFRTUEQgbWFzayAqLw0KI2RlZmluZSBDUjJfVFNQRF9TZXQgICAgICAgICAgICAgICAoKHUzMikweDAwODAwMDAwKQ0KI2RlZmluZSBDUjJfVFNQRF9SZXNldCAgICAgICAgICAgICAoKHUzMikweEZGN0ZGRkZGKQ0KDQovKiBBREMgSkRSeCByZWdpc3RlcnM9IG9mZnNldCAqLw0KI2RlZmluZSBKRFJfT2Zmc2V0ICAgICAgICAgICAgICAgICAoKHU4KTB4MjgpDQoNCi8qIEFEQyByZWdpc3RlcnMgTWFza3MgKi8NCiNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgICAgICAgKCh1MzIpMHhGRkYwRkVGRikNCiNkZWZpbmUgQ1IyX0NMRUFSX01hc2sgICAgICAgICAgICAgKCh1MzIpMHhGRkYxRjdGRCkNCiNkZWZpbmUgU1FSMV9DTEVBUl9NYXNrICAgICAgICAgICAgKCh1MzIpMHhGRjBGRkZGRikNCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfRGVJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyB0aGUgQURDeCBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0DQoqICAgICAgICAgICAgICAgICAgcmVzZXQgdmFsdWVzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19EZUluaXQoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIHN3aXRjaCAoKih1MzIqKSZBREN4KQ0KICB7DQogICAgY2FzZSBBREMxX0JBU0U6DQogICAgICAvKiBFbmFibGUgQURDMSByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMxLCBFTkFCTEUpOw0KICAgICAgLyogUmVsZWFzZSBBREMxIGZyb20gcmVzZXQgc3RhdGUgKi8NCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfQURDMSwgRElTQUJMRSk7DQogICAgICBicmVhazsNCiAgICANCiAgICBjYXNlIEFEQzJfQkFTRToNCiAgICAgIC8qIEVuYWJsZSBBREMyIHJlc2V0IHN0YXRlICovDQogICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX0FEQzIsIEVOQUJMRSk7DQogICAgICAvKiBSZWxlYXNlIEFEQzIgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9BREMyLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgQURDeCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzDQoqICAgICAgICAgICAgICAgICAgaW4gdGhlIEFEQ19Jbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBBRENfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEFEQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICAgIEFEQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19Jbml0KEFEQ19UeXBlRGVmKiBBREN4LCBBRENfSW5pdFR5cGVEZWYqIEFEQ19Jbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wcmVnMSA9IDA7DQogIHU4IHRtcHJlZzIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19BRENfTU9ERShBRENfSW5pdFN0cnVjdC0+QURDX01vZGUpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoQURDX0luaXRTdHJ1Y3QtPkFEQ19TY2FuQ29udk1vZGUpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoQURDX0luaXRTdHJ1Y3QtPkFEQ19Db250aW51b3VzQ29udk1vZGUpKTsgIAkJICAgIA0KICBhc3NlcnQoSVNfQURDX0VYVF9UUklHKEFEQ19Jbml0U3RydWN0LT5BRENfRXh0ZXJuYWxUcmlnQ29udikpOyAgIA0KICBhc3NlcnQoSVNfQURDX0RBVEFfQUxJR04oQURDX0luaXRTdHJ1Y3QtPkFEQ19EYXRhQWxpZ24pKTsgDQogIGFzc2VydChJU19BRENfUkVHVUxBUl9MRU5HVEgoQURDX0luaXRTdHJ1Y3QtPkFEQ19OYnJPZkNoYW5uZWwpKTsNCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDeCBDUjEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgQURDeCBDUjEgdmFsdWUgKi8NCiAgdG1wcmVnMSA9IEFEQ3gtPkNSMTsNCiAgLyogQ2xlYXIgRFVBTE1PREUgYW5kIFNDQU4gYml0cyAqLw0KICB0bXByZWcxICY9IENSMV9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgQURDeDogRHVhbCBtb2RlIGFuZCBzY2FuIGNvbnZlcnNpb24gbW9kZSAqLw0KICAvKiBTZXQgRFVBTE1PREUgYml0cyBhY2NvcmRpbmcgdG8gQURDX01vZGUgdmFsdWUgKi8NCiAgLyogU2V0IFNDQU4gYml0IGFjY29yZGluZyB0byBBRENfU2NhbkNvbnZNb2RlIHZhbHVlICovDQogIHRtcHJlZzEgfD0gKHUzMikoQURDX0luaXRTdHJ1Y3QtPkFEQ19Nb2RlIHwgKCh1MzIpQURDX0luaXRTdHJ1Y3QtPkFEQ19TY2FuQ29udk1vZGUgPDwgOCkpOw0KICAvKiBXcml0ZSB0byBBREN4IENSMSAqLw0KICBBREN4LT5DUjEgPSB0bXByZWcxOw0KDQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBREN4IENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogR2V0IHRoZSBBREN4IENSMiB2YWx1ZSAqLw0KICB0bXByZWcxID0gQURDeC0+Q1IyOw0KICAvKiBDbGVhciBDT05ULCBBTElHTiBhbmQgRVhUVFJJRyBiaXRzICovDQogIHRtcHJlZzEgJj0gQ1IyX0NMRUFSX01hc2s7DQogIC8qIENvbmZpZ3VyZSBBREN4OiBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50IGFuZCBjb250aW51b3VzIGNvbnZlcnNpb24gbW9kZSAqLw0KICAvKiBTZXQgQUxJR04gYml0IGFjY29yZGluZyB0byBBRENfRGF0YUFsaWduIHZhbHVlICovDQogIC8qIFNldCBFWFRUUklHIGJpdHMgYWNjb3JkaW5nIHRvIEFEQ19FeHRlcm5hbFRyaWdDb252IHZhbHVlICovDQogIC8qIFNldCBDT05UIGJpdCBhY2NvcmRpbmcgdG8gQURDX0NvbnRpbnVvdXNDb252TW9kZSB2YWx1ZSAqLw0KICB0bXByZWcxIHw9ICh1MzIpKEFEQ19Jbml0U3RydWN0LT5BRENfRGF0YUFsaWduIHwgQURDX0luaXRTdHJ1Y3QtPkFEQ19FeHRlcm5hbFRyaWdDb252IHwNCiAgICAgICAgICAgICgodTMyKUFEQ19Jbml0U3RydWN0LT5BRENfQ29udGludW91c0NvbnZNb2RlIDw8IDEpKTsNCiAgLyogV3JpdGUgdG8gQURDeCBDUjIgKi8NCiAgQURDeC0+Q1IyID0gdG1wcmVnMTsNCg0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQURDeCBTUVIxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBHZXQgdGhlIEFEQ3ggU1FSMSB2YWx1ZSAqLw0KICB0bXByZWcxID0gQURDeC0+U1FSMTsNCiAgLyogQ2xlYXIgTCBiaXRzICovDQogIHRtcHJlZzEgJj0gU1FSMV9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgQURDeDogcmVndWxhciBjaGFubmVsIHNlcXVlbmNlIGxlbmd0aCAqLw0KICAvKiBTZXQgTCBiaXRzIGFjY29yZGluZyB0byBBRENfTmJyT2ZDaGFubmVsIHZhbHVlICovDQogIHRtcHJlZzIgfD0gKEFEQ19Jbml0U3RydWN0LT5BRENfTmJyT2ZDaGFubmVsIC0gMSk7DQogIHRtcHJlZzEgfD0gKCh1MzIpdG1wcmVnMiA8PCAyMCk7DQogIC8qIFdyaXRlIHRvIEFEQ3ggU1FSMSAqLw0KICBBREN4LT5TUVIxID0gdG1wcmVnMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggQURDX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogQURDX0luaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgQURDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19TdHJ1Y3RJbml0KEFEQ19Jbml0VHlwZURlZiogQURDX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFJlc2V0IEFEQyBpbml0IHN0cnVjdHVyZSBwYXJhbWV0ZXJzIHZhbHVlcyAqLw0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfTW9kZSBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19Nb2RlID0gQURDX01vZGVfSW5kZXBlbmRlbnQ7DQoNCiAgLyogaW5pdGlhbGl6ZSB0aGUgQURDX1NjYW5Db252TW9kZSBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19TY2FuQ29udk1vZGUgPSBESVNBQkxFOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19Db250aW51b3VzQ29udk1vZGUgbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfQ29udGludW91c0NvbnZNb2RlID0gRElTQUJMRTsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfRXh0ZXJuYWxUcmlnQ29udiBtZW1iZXIgKi8NCiAgQURDX0luaXRTdHJ1Y3QtPkFEQ19FeHRlcm5hbFRyaWdDb252ID0gQURDX0V4dGVybmFsVHJpZ0NvbnZfVDFfQ0MxOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEFEQ19EYXRhQWxpZ24gbWVtYmVyICovDQogIEFEQ19Jbml0U3RydWN0LT5BRENfRGF0YUFsaWduID0gQURDX0RhdGFBbGlnbl9SaWdodDsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBBRENfTmJyT2ZDaGFubmVsIG1lbWJlciAqLw0KICBBRENfSW5pdFN0cnVjdC0+QURDX05ick9mQ2hhbm5lbCA9IDE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBBREMgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgQURDeCBwZXJpcGhlcmFsLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0NtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogU2V0IHRoZSBBRE9OIGJpdCB0byB3YWtlIHVwIHRoZSBBREMgZnJvbSBwb3dlciBkb3duIG1vZGUgKi8NCiAgICBBREN4LT5DUjIgfD0gQ1IyX0FET05fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBwZXJpcGhlcmFsICovDQogICAgQURDeC0+Q1IyICY9IENSMl9BRE9OX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0RNQUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBBREMgRE1BIHJlcXVlc3QuDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBETUEgdHJhbnNmZXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfRE1BQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBETUEgcmVxdWVzdCAqLw0KICAgIEFEQ3gtPkNSMiB8PSBDUjJfRE1BX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgRE1BIHJlcXVlc3QgKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0RNQV9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19JVENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBBREMgaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0lUOiBzcGVjaWZpZXMgdGhlIEFEQyBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FXRDogQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBtYXNrDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEFEQyBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0lUQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1MTYgQURDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHU4IGl0bWFzayA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgYXNzZXJ0KElTX0FEQ19JVChBRENfSVQpKTsNCg0KICAvKiBHZXQgdGhlIEFEQyBJVCBpbmRleCAqLw0KICBpdG1hc2sgPSAodTgpQURDX0lUOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgaW50ZXJydXB0cyAqLw0KICAgIEFEQ3gtPkNSMSB8PSBpdG1hc2s7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGludGVycnVwdHMgKi8NCiAgICBBREN4LT5DUjEgJj0gKH4odTMyKWl0bWFzayk7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfUmVzZXRDYWxpYnJhdGlvbg0KKiBEZXNjcmlwdGlvbiAgICA6IFJlc2V0cyB0aGUgQURDIGNhbGlicmF0aW9uIHJlZ2lzdGVycy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfUmVzZXRDYWxpYnJhdGlvbihBRENfVHlwZURlZiogQURDeCkNCnsNCiAgLyogUmVzZXRzIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJhcnRpb24gcmVnaXN0ZXJzICovICANCiAgQURDeC0+Q1IyIHw9IENSMl9SU1RDQUxfU2V0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19HZXRSZXNldENhbGlicmF0aW9uU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogR2V0cyB0aGUgQURDIHJlc2V0IGNhbGlicmF0aW9uIHJlZ2lzdGVycyBzdGF0dXMuDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBBREMgUmVzZXQgQ2FsaWJyYXRpb24gcmVnaXN0ZXJzIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldFJlc2V0Q2FsaWJyYXRpb25TdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQoNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiBSU1RDQUwgYml0ICovDQogIGlmICgoQURDeC0+Q1IyICYgQ1IyX1JTVENBTF9TZXQpICE9ICh1MTYpUkVTRVQpDQogIHsNCiAgICAvKiBSU1RDQUwgYml0IGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSU1RDQUwgYml0IGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBSU1RDQUwgYml0IHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfU3RhcnRDYWxpYnJhdGlvbg0KKiBEZXNjcmlwdGlvbiAgICA6IFN0YXJ0cyB0aGUgY2FsaWJyYXRpb24gcHJvY2Vzcy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfU3RhcnRDYWxpYnJhdGlvbihBRENfVHlwZURlZiogQURDeCkNCnsNCiAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY2FsaWJyYXRpb24gcHJvY2VzcyAqLyAgDQogIEFEQ3gtPkNSMiB8PSBDUjJfQ0FMX1NldDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0Q2FsaWJyYXRpb25TdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBBREMgY2FsaWJyYXRpb24gc3RhdHVzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgQURDIGNhbGlicmF0aW9uIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldENhbGlicmF0aW9uU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4KQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBzdGF0dXMgb2YgQ0FMIGJpdCAqLw0KICBpZiAoKEFEQ3gtPkNSMiAmIENSMl9DQUxfU2V0KSAhPSAodTE2KVJFU0VUKQ0KICB7DQogICAgLyogQ0FMIGJpdCBpcyBzZXQ6IGNhbGlicmF0aW9uIG9uIGdvaW5nICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIENBTCBiaXQgaXMgcmVzZXQ6IGVuZCBvZiBjYWxpYnJhdGlvbiAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgQ0FMIGJpdCBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX1NvZnR3YXJlU3RhcnRDb252Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQURDIHNvZnR3YXJlIHN0YXJ0IGNvbnZlcnNpb24gLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBBREMgc29mdHdhcmUgc3RhcnQgY29udmVyc2lvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19Tb2Z0d2FyZVN0YXJ0Q29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KCS8qIFN0YXJ0cyB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gKi8NCglBREN4LT5DUjIgfD0gQ1IyX0VYVFRSSUdfU1dTVFJUX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBTdG9wcyB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gKi8NCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KCUFEQ3gtPkNSMiAmPSBDUjJfRVhUVFJJR19TV1NUUlRfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0U29mdHdhcmVTdGFydENvbnZTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBHZXRzIHRoZSBBREMgU29mdHdhcmUgc3RhcnQgY29udmVyc2lvbiBTdGF0dXMuDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBBREMgc29mdHdhcmUgc3RhcnQgY29udmVyc2lvbiAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIEFEQ19HZXRTb2Z0d2FyZVN0YXJ0Q29udlN0YXR1cyhBRENfVHlwZURlZiogQURDeCkNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIFNXU1RSVCBiaXQgKi8NCiAgaWYgKChBREN4LT5DUjIgJiBDUjJfU1dTVFJUX1NldCkgIT0gKHUzMilSRVNFVCkNCiAgew0KICAgIC8qIFNXU1RSVCBiaXQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNXU1RSVCBiaXQgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIFNXU1RSVCBiaXQgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19EaXNjTW9kZUNoYW5uZWxDb3VudENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBmb3IgdGhlIHNlbGVjdGVkIEFEQyByZWd1bGFyDQoqICAgICAgICAgICAgICAgICAgZ3JvdXAgY2hhbm5lbC4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTnVtYmVyOiBzcGVjaWZpZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSByZWd1bGFyIGNoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgIGNvdW50IHZhbHVlLiBUaGlzIG11bWJlciBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0Rpc2NNb2RlQ2hhbm5lbENvdW50Q29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1OCBOdW1iZXIpDQp7DQogIHUzMiB0bXByZWcxID0gMDsNCiAgdTggdG1wcmVnMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19SRUdVTEFSX0RJU0NfTlVNQkVSKE51bWJlcikpOw0KDQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZzEgPSBBREN4LT5DUjE7DQogIC8qIENsZWFyIHRoZSBvbGQgZGlzY29udGludW91cyBtb2RlIGNoYW5uZWwgY291bnQgKi8NCiAgdG1wcmVnMSAmPSBDUjFfRElTQ05VTV9SZXNldDsNCiAgLyogU2V0IHRoZSBkaXNjb250aW51b3VzIG1vZGUgY2hhbm5lbCBjb3VudCAqLw0KICB0bXByZWcyID0gTnVtYmVyIC0gMTsNCiAgdG1wcmVnMSB8PSAoKHUzMil0bXByZWcyIDw8IDEzKTsNCiAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICBBREN4LT5DUjEgPSB0bXByZWcxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19EaXNjTW9kZUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBvbiByZWd1bGFyIGdyb3VwDQoqICAgICAgICAgICAgICAgICAgY2hhbm5lbCBmb3IgdGhlIHNwZWNpZmllZCBBREMNCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGRpc2NvbnRpbnVvdXMgbW9kZQ0KKiAgICAgICAgICAgICAgICAgICAgb24gcmVndWxhciBncm91cCBjaGFubmVsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0Rpc2NNb2RlQ21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyByZWd1bGFyIGRpc2NvbnRpbnVvdXMgbW9kZSAqLw0KICAgIEFEQ3gtPkNSMSB8PSBDUjFfRElTQ0VOX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBBREMgcmVndWxhciBkaXNjb250aW51b3VzIG1vZGUgKi8NCiAgICBBREN4LT5DUjEgJj0gQ1IxX0RJU0NFTl9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19SZWd1bGFyQ2hhbm5lbENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgZm9yIHRoZSBzZWxlY3RlZCBBREMgcmVndWxhciBjaGFubmVsIGl0cyBjb3JyZXNwb25kaW5nDQoqICAgICAgICAgICAgICAgICAgcmFuayBpbiB0aGUgc2VxdWVuY2VyIGFuZCBpdHMgc2FtcGxlIHRpbWUuDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsOiB0aGUgQURDIGNoYW5uZWwgdG8gY29uZmlndXJlLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xOiBBREMgQ2hhbm5lbDEgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfMjogQURDIENoYW5uZWwyIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF80OiBBREMgQ2hhbm5lbDQgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfNTogQURDIENoYW5uZWw1IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF83OiBBREMgQ2hhbm5lbDcgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfODogQURDIENoYW5uZWw4IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMDogQURDIENoYW5uZWwxMCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMTogQURDIENoYW5uZWwxMSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMzogQURDIENoYW5uZWwxMyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNDogQURDIENoYW5uZWwxNCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNjogQURDIENoYW5uZWwxNiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNzogQURDIENoYW5uZWwxNyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgIC0gUmFuazogVGhlIHJhbmsgaW4gdGhlIHJlZ3VsYXIgZ3JvdXAgc2VxdWVuY2VyLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBiZXR3ZWVuIDEgdG8gMTYuDQoqICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZTogVGhlIHNhbXBsZSB0aW1lIHZhbHVlIHRvIGJlIHNldCBmb3IgdGhlDQoqICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBjaGFubmVsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19TYW1wbGVUaW1lXzFDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAxLjUgY3ljbGVzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19TYW1wbGVUaW1lXzdDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA3LjUgY3ljbGVzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19TYW1wbGVUaW1lXzEzQ3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMTMuNSBjeWNsZXMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfMjhDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAyOC41IGN5Y2xlcwkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfNDFDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA0MS41IGN5Y2xlcwkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfNTVDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA1NS41IGN5Y2xlcwkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfNzFDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byA3MS41IGN5Y2xlcwkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfMjM5Q3ljbGVzNTogU2FtcGxlIHRpbWUgZXF1YWwgdG8gMjM5LjUgY3ljbGVzCQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfUmVndWxhckNoYW5uZWxDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHU4IEFEQ19DaGFubmVsLCB1OCBSYW5rLCB1OCBBRENfU2FtcGxlVGltZSkNCnsNCiAgdTMyIHRtcHJlZzEgPSAwLCB0bXByZWcyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQURDX0NIQU5ORUwoQURDX0NoYW5uZWwpKTsNCiAgYXNzZXJ0KElTX0FEQ19SRUdVTEFSX1JBTksoUmFuaykpOw0KICBhc3NlcnQoSVNfQURDX1NBTVBMRV9USU1FKEFEQ19TYW1wbGVUaW1lKSk7DQoNCiAgLyogaWYgQURDX0NoYW5uZWxfMTAgLi4uIEFEQ19DaGFubmVsXzE3IGlzIHNlbGVjdGVkICovDQogIGlmIChBRENfQ2hhbm5lbCA+IEFEQ19DaGFubmVsXzkpDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMTsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gKHUzMilTTVBSMV9TTVBfU2V0IDw8ICgzICogKEFEQ19DaGFubmVsIC0gMTApKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1MzIpQURDX1NhbXBsZVRpbWUgPDwgKDMgKiAoQURDX0NoYW5uZWwgLSAxMCkpOw0KICAgIC8qIFNldCB0aGUgZGlzY29udGludW91cyBtb2RlIGNoYW5uZWwgY291bnQgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNNUFIxID0gdG1wcmVnMTsNCiAgfQ0KICBlbHNlIC8qIEFEQ19DaGFubmVsIGluY2x1ZGUgaW4gQURDX0NoYW5uZWxfWzAuLjldICovDQogIHsNCiAgICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICAgIHRtcHJlZzEgPSBBREN4LT5TTVBSMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gKHUzMilTTVBSMl9TTVBfU2V0IDw8ICgzICogQURDX0NoYW5uZWwpOw0KICAgIC8qIENsZWFyIHRoZSBvbGQgZGlzY29udGludW91cyBtb2RlIGNoYW5uZWwgY291bnQgKi8NCiAgICB0bXByZWcxICY9IH50bXByZWcyOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQgKi8NCiAgICB0bXByZWcyID0gKHUzMilBRENfU2FtcGxlVGltZSA8PCAoMyAqIEFEQ19DaGFubmVsKTsNCiAgICAvKiBTZXQgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICovDQogICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICBBREN4LT5TTVBSMiA9IHRtcHJlZzE7DQogIH0NCiAgLyogRm9yIFJhbmsgMSB0byA2ICovDQogIGlmIChSYW5rIDwgNykNCiAgew0KICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogICAgdG1wcmVnMSA9IEFEQ3gtPlNRUjM7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQogICAgdG1wcmVnMiA9ICh1MzIpU1FSM19TUV9TZXQgPDwgKDUgKiAoUmFuayAtIDEpKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KICAgIHRtcHJlZzIgPSAodTMyKUFEQ19DaGFubmVsIDw8ICg1ICogKFJhbmsgLSAxKSk7DQogICAgLyogU2V0IHRoZSBTUXggYml0cyBmb3IgdGhlIHNlbGVjdGVkIHJhbmsgKi8NCiAgICB0bXByZWcxIHw9IHRtcHJlZzI7DQogICAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIEFEQ3gtPlNRUjMgPSB0bXByZWcxOw0KICB9DQogIC8qIEZvciBSYW5rIDcgdG8gMTIgKi8NCiAgZWxzZSBpZiAoUmFuayA8IDEzKQ0KICB7DQogICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcxID0gQURDeC0+U1FSMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gKHUzMilTUVIyX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gNykpOw0KICAgIC8qIENsZWFyIHRoZSBvbGQgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1MzIpQURDX0NoYW5uZWwgPDwgKDUgKiAoUmFuayAtIDcpKTsNCiAgICAvKiBTZXQgdGhlIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgfD0gdG1wcmVnMjsNCiAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogICAgQURDeC0+U1FSMiA9IHRtcHJlZzE7DQogIH0NCiAgLyogRm9yIFJhbmsgMTMgdG8gMTYgKi8NCiAgZWxzZQ0KICB7DQogICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcxID0gQURDeC0+U1FSMTsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gY2xlYXIgKi8NCiAgICB0bXByZWcyID0gKHUzMilTUVIxX1NRX1NldCA8PCAoNSAqIChSYW5rIC0gMTMpKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIFNReCBiaXRzIGZvciB0aGUgc2VsZWN0ZWQgcmFuayAqLw0KICAgIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIHNldCAqLw0KICAgIHRtcHJlZzIgPSAodTMyKUFEQ19DaGFubmVsIDw8ICg1ICogKFJhbmsgLSAxMykpOw0KICAgIC8qIFNldCB0aGUgU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICBBREN4LT5TUVIxID0gdG1wcmVnMTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19FeHRlcm5hbFRyaWdDb252Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQURDeCBjb252ZXJzaW9uIHRocm91Z2ggZXh0ZXJuYWwgdHJpZ2dlci4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGV4dGVybmFsIHRyaWdnZXINCiogICAgICAgICAgICAgICAgICAgIHN0YXJ0IG9mIGNvbnZlcnNpb24uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfRXh0ZXJuYWxUcmlnQ29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgY29udmVyc2lvbiBvbiBleHRlcm5hbCBldmVudCAqLw0KICAgIEFEQ3gtPkNSMiB8PSBDUjJfRVhUVFJJR19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gb24gZXh0ZXJuYWwgZXZlbnQgKi8NCiAgICBBREN4LT5DUjIgJj0gQ1IyX0VYVFRSSUdfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0Q29udmVyc2lvblZhbHVlDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgbGFzdCBBREMgY29udmVyc2lvbiByZXN1bHQgZGF0YSBmb3IgcmVndWxhciBjaGFubmVsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBEYXRhIGNvbnZlcnNpb24gdmFsdWUuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IEFEQ19HZXRDb252ZXJzaW9uVmFsdWUoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgQURDIGNvbnZlcnNpb24gdmFsdWUgKi8NCiAgcmV0dXJuICh1MTYpIEFEQ3gtPkRSOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19HZXREdWFsTW9kZUNvbnZlcnNpb25WYWx1ZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIGxhc3QgQURDcyBjb252ZXJzaW9uIHJlc3VsdCBkYXRhIGluIGR1YWwgbW9kZS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgQURDX0dldER1YWxNb2RlQ29udmVyc2lvblZhbHVlKHZvaWQpDQp7DQogIC8qIFJldHVybiB0aGUgZHVhbCBtb2RlIGNvbnZlcnNpb24gdmFsdWUgKi8NCiAgcmV0dXJuIEFEQzEtPkRSOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19BdXRvSW5qZWN0ZWRDb252Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYXV0b21hdGljIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24NCiogICAgICAgICAgICAgICAgICBhZnRlciByZWd1bGFyIG9uZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgQURDIGF1dG8gaW5qZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19BdXRvSW5qZWN0ZWRDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiAqLw0KICAgIEFEQ3gtPkNSMSB8PSBDUjFfSkFVVE9fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBhdXRvbWF0aWMgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiAqLw0KICAgIEFEQ3gtPkNSMSAmPSBDUjFfSkFVVE9fUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfSW5qZWN0ZWREaXNjTW9kZUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBmb3IgaW5qZWN0ZWQgZ3JvdXANCiogICAgICAgICAgICAgICAgICBjaGFubmVsIGZvciB0aGUgc3BlY2lmaWVkIEFEQw0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzZWxlY3RlZCBBREMgZGlzY29udGludW91cyBtb2RlDQoqICAgICAgICAgICAgICAgICAgICBvbiBpbmplY3RlZCBncm91cCBjaGFubmVsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0luamVjdGVkRGlzY01vZGVDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSAqLw0KICAgIEFEQ3gtPkNSMSB8PSBDUjFfSkRJU0NFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGRpc2NvbnRpbnVvdXMgbW9kZSAqLw0KICAgIEFEQ3gtPkNSMSAmPSBDUjFfSkRJU0NFTl9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19FeHRlcm5hbFRyaWdJbmplY3RlZENvbnZDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGZvciBpbmplY3RlZCBjaGFubmVscyBjb252ZXJzaW9uLg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252OiBzcGVjaWZpZXMgdGhlIEFEQyB0cmlnZ2VyIHRvDQoqICAgICAgICAgICAgICAgICAgICBzdGFydCBpbmplY3RlZCBjb252ZXJzaW9uLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfVFJHTzogVGltZXIxIFRSR08gZXZlbnQgDQoqICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDFfQ0M0OiBUaW1lcjEgY2FwdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlNCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QyX1RSR086IFRpbWVyMiBUUkdPIGV2ZW50DQoqICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnZfVDJfQ0MxOiBUaW1lcjIgY2FwdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlMSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X1QzX0NDNDogVGltZXIzIGNhcHR1cmUNCiogICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZTQgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9UNF9UUkdPOiBUaW1lcjQgVFJHTyBldmVudA0KKiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCANCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0V4dGVybmFsVHJpZ0luamVjQ29udl9FeHRfSW50ZXJydXB0MTU6IEV4dGVybmFsDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCAxNSBldmVudCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252X05vbmU6IEluamVjdGVkIGNvbnZlcnNpb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBieSBzb2Z0d2FyZSBhbmQgbm90IGJ5IGV4dGVybmFsIHRyaWdnZXINCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0V4dGVybmFsVHJpZ0luamVjdGVkQ29udkNvbmZpZyhBRENfVHlwZURlZiogQURDeCwgdTMyIEFEQ19FeHRlcm5hbFRyaWdJbmplY0NvbnYpDQp7DQogIHUzMiB0bXByZWcgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19BRENfRVhUX0lOSkVDX1RSSUcoQURDX0V4dGVybmFsVHJpZ0luamVjQ29udikpOw0KDQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZyA9IEFEQ3gtPkNSMjsNCiAgLyogQ2xlYXIgdGhlIG9sZCBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogIHRtcHJlZyAmPSBDUjJfSkVYVFNFTF9SZXNldDsNCiAgLyogU2V0IHRoZSBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogIHRtcHJlZyB8PSBBRENfRXh0ZXJuYWxUcmlnSW5qZWNDb252Ow0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkNSMiA9IHRtcHJlZzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfRXh0ZXJuYWxUcmlnSW5qZWN0ZWRDb252Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQURDeCBpbmplY3RlZCBjaGFubmVscyBjb252ZXJzaW9uDQoqICAgICAgICAgICAgICAgICAgdGhyb3VnaCBleHRlcm5hbCB0cmlnZ2VyDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCB0cmlnZ2VyDQoqICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiBpbmplY3RlZCBjb252ZXJzaW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0V4dGVybmFsVHJpZ0luamVjdGVkQ29udkNtZChBRENfVHlwZURlZiogQURDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBBREMgZXh0ZXJuYWwgZXZlbnQgc2VsZWN0aW9uIGZvciBpbmplY3RlZCBncm91cCAqLw0KICAgIEFEQ3gtPkNSMiB8PSBDUjJfSkVYVFRSSUdfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogICAgQURDeC0+Q1IyICY9IENSMl9KRVhUVFJJR19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19Tb2Z0d2FyZVN0YXJ0SW5qZWN0ZWRDb252Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3RhcnQgb2YgdGhlIGluamVjdGVkIGNoYW5uZWxzIGNvbnZlcnNpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNlbGVjdGVkIEFEQyBzb2Z0d2FyZSBzdGFydA0KKiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgY29udmVyc2lvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19Tb2Z0d2FyZVN0YXJ0SW5qZWN0ZWRDb252Q21kKEFEQ19UeXBlRGVmKiBBREN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEFEQyBleHRlcm5hbCBldmVudCBzZWxlY3Rpb24gZm9yIGluamVjdGVkIGdyb3VwICovDQogICAgLyogU3RhcnRzIHRoZSBzZWxlY3RlZCBBREMgaW5qZWN0ZWQgY29udmVyc2lvbiAqLw0KICAgIEFEQ3gtPkNSMiB8PSBDUjJfSkVYVFRSSUdfSlNXU1RSVF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU3RvcHMgdGhlIHNlbGVjdGVkIEFEQyBpbmplY3RlZCBjb252ZXJzaW9uICovDQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgQURDIGV4dGVybmFsIGV2ZW50IHNlbGVjdGlvbiBmb3IgaW5qZWN0ZWQgZ3JvdXAgKi8NCglBREN4LT5DUjIgJj0gQ1IyX0pFWFRUUklHX0pTV1NUUlRfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0U29mdHdhcmVTdGFydEluamVjdGVkQ29udkNtZFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIEFEQyBTb2Z0d2FyZSBzdGFydCBpbmplY3RlZCBjb252ZXJzaW9uIFN0YXR1cy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEFEQyBzb2Z0d2FyZSBzdGFydCBpbmplY3RlZCBjb252ZXJzaW9uIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgQURDX0dldFNvZnR3YXJlU3RhcnRJbmplY3RlZENvbnZDbWRTdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQoNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiBKU1dTVFJUIGJpdCAqLw0KICBpZiAoKEFEQ3gtPkNSMiAmIENSMl9KU1dTVFJUX1NldCkgIT0gKHUzMilSRVNFVCkNCiAgew0KICAgIC8qIEpTV1NUUlQgYml0IGlzIHNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBKU1dTVFJUIGJpdCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgSlNXU1RSVCBiaXQgc3RhdHVzICovDQogIHJldHVybiAgYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19JbmplY3RlZENoYW5uZWxDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIGZvciB0aGUgc2VsZWN0ZWQgQURDIGluamVjdGVkIGNoYW5uZWwgaXRzIGNvcnJlc3BvbmRpbmcNCiogICAgICAgICAgICAgICAgICByYW5rIGluIHRoZSBzZXF1ZW5jZXIgYW5kIGl0cyBzYW1wbGUgdGltZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWw6IHRoZSBBREMgY2hhbm5lbCB0byBjb25maWd1cmUuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfMDogQURDIENoYW5uZWwwIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzE6IEFEQyBDaGFubmVsMSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8yOiBBREMgQ2hhbm5lbDIgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfMzogQURDIENoYW5uZWwzIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzQ6IEFEQyBDaGFubmVsNCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF81OiBBREMgQ2hhbm5lbDUgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfNjogQURDIENoYW5uZWw2IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzc6IEFEQyBDaGFubmVsNyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF84OiBBREMgQ2hhbm5lbDggc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfOTogQURDIENoYW5uZWw5IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzEwOiBBREMgQ2hhbm5lbDEwIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzExOiBBREMgQ2hhbm5lbDExIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzEyOiBBREMgQ2hhbm5lbDEyIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzEzOiBBREMgQ2hhbm5lbDEzIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzE0OiBBREMgQ2hhbm5lbDE0IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzE1OiBBREMgQ2hhbm5lbDE1IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzE2OiBBREMgQ2hhbm5lbDE2IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzE3OiBBREMgQ2hhbm5lbDE3IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgLSBSYW5rOiBUaGUgcmFuayBpbiB0aGUgaW5qZWN0ZWQgZ3JvdXAgc2VxdWVuY2VyLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBiZXR3ZWVuIDEgdG8gNC4NCiogICAgICAgICAgICAgICAgICAtIEFEQ19TYW1wbGVUaW1lOiBUaGUgc2FtcGxlIHRpbWUgdmFsdWUgdG8gYmUgc2V0IGZvciB0aGUNCiogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGNoYW5uZWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfMUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDEuNSBjeWNsZXMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfN0N5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDcuNSBjeWNsZXMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX1NhbXBsZVRpbWVfMTNDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAxMy41IGN5Y2xlcw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZV8yOEN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDI4LjUgY3ljbGVzCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZV80MUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDQxLjUgY3ljbGVzCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZV81NUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDU1LjUgY3ljbGVzCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZV83MUN5Y2xlczU6IFNhbXBsZSB0aW1lIGVxdWFsIHRvIDcxLjUgY3ljbGVzCQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfU2FtcGxlVGltZV8yMzlDeWNsZXM1OiBTYW1wbGUgdGltZSBlcXVhbCB0byAyMzkuNSBjeWNsZXMJDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19JbmplY3RlZENoYW5uZWxDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHU4IEFEQ19DaGFubmVsLCB1OCBSYW5rLCB1OCBBRENfU2FtcGxlVGltZSkNCnsNCiAgdTMyIHRtcHJlZzEgPSAwLCB0bXByZWcyID0gMDsNCiAgdTggdG1wcmVnMyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19DSEFOTkVMKEFEQ19DaGFubmVsKSk7DQogIGFzc2VydChJU19BRENfSU5KRUNURURfUkFOSyhSYW5rKSk7DQogIGFzc2VydChJU19BRENfU0FNUExFX1RJTUUoQURDX1NhbXBsZVRpbWUpKTsNCg0KICAvKiBpZiBBRENfQ2hhbm5lbF8xMCAuLi4gQURDX0NoYW5uZWxfMTcgaXMgc2VsZWN0ZWQgKi8NCiAgaWYgKEFEQ19DaGFubmVsID4gQURDX0NoYW5uZWxfOSkNCiAgew0KICAgIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogICAgdG1wcmVnMSA9IEFEQ3gtPlNNUFIxOw0KICAgIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhciAqLw0KICAgIHRtcHJlZzIgPSAodTMyKVNNUFIxX1NNUF9TZXQgPDwgKDMqKEFEQ19DaGFubmVsIC0gMTApKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1MzIpQURDX1NhbXBsZVRpbWUgPDwgKDMqKEFEQ19DaGFubmVsIC0gMTApKTsNCiAgICAvKiBTZXQgdGhlIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICovDQogICAgdG1wcmVnMSB8PSB0bXByZWcyOw0KICAgIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICBBREN4LT5TTVBSMSA9IHRtcHJlZzE7DQogIH0NCiAgZWxzZSAvKiBBRENfQ2hhbm5lbCBpbmNsdWRlIGluIEFEQ19DaGFubmVsX1swLi45XSAqLw0KICB7DQogICAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgICB0bXByZWcxID0gQURDeC0+U01QUjI7DQogICAgLyogQ2FsY3VsYXRlIHRoZSBtYXNrIHRvIGNsZWFyICovDQogICAgdG1wcmVnMiA9ICh1MzIpU01QUjJfU01QX1NldCA8PCAoMyAqIEFEQ19DaGFubmVsKTsNCiAgICAvKiBDbGVhciB0aGUgb2xkIGRpc2NvbnRpbnVvdXMgbW9kZSBjaGFubmVsIGNvdW50ICovDQogICAgdG1wcmVnMSAmPSB+dG1wcmVnMjsNCiAgICAvKiBDYWxjdWxhdGUgdGhlIG1hc2sgdG8gc2V0ICovDQogICAgdG1wcmVnMiA9ICh1MzIpQURDX1NhbXBsZVRpbWUgPDwgKDMgKiBBRENfQ2hhbm5lbCk7DQogICAgLyogU2V0IHRoZSBkaXNjb250aW51b3VzIG1vZGUgY2hhbm5lbCBjb3VudCAqLw0KICAgIHRtcHJlZzEgfD0gdG1wcmVnMjsNCiAgICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogICAgQURDeC0+U01QUjIgPSB0bXByZWcxOw0KICB9DQoNCiAgLyogUmFuayBjb25maWd1cmF0aW9uICovDQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZzEgPSBBREN4LT5KU1FSOw0KICAvKiBHZXQgSkwgdmFsdWU6IE51bWJlciA9IEpMKzEgKi8NCiAgdG1wcmVnMyA9ICAodTgpKCh0bXByZWcxICYgKHUzMil+SlNRUl9KTF9SZXNldCk+PiAyMCk7DQogIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBjbGVhcjogKChSYW5rLTEpKyg0LUpMLTEpKSAqLw0KICB0bXByZWcyID0gKHUzMilKU1FSX0pTUV9TZXQgPDwgKDUgKiAoKFJhbmsgKyAzKSAtICh0bXByZWczICsgMSkpKTsNCiAgLyogQ2xlYXIgdGhlIG9sZCBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogIHRtcHJlZzEgJj0gfnRtcHJlZzI7DQogIC8qIENhbGN1bGF0ZSB0aGUgbWFzayB0byBzZXQ6ICgoUmFuay0xKSsoNC1KTC0xKSkgKi8NCiAgdG1wcmVnMiA9ICh1MzIpQURDX0NoYW5uZWwgPDwgKDUgKiAoKFJhbmsgKyAzKSAtICh0bXByZWczICsgMSkpKTsNCiAgLyogU2V0IHRoZSBKU1F4IGJpdHMgZm9yIHRoZSBzZWxlY3RlZCByYW5rICovDQogIHRtcHJlZzEgfD0gdG1wcmVnMjsNCiAgLyogU3RvcmUgdGhlIG5ldyByZWdpc3RlciB2YWx1ZSAqLw0KICBBREN4LT5KU1FSID0gdG1wcmVnMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfSW5qZWN0ZWRTZXF1ZW5jZXJMZW5ndGhDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBzZXF1ZW5jZXIgZm9yIGluamVjdGVkIGNoYW5uZWxzDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIExlbmd0aDogVGhlIHNlcXVlbmNlciBsZW5ndGguIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDEgdG8gNC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0luamVjdGVkU2VxdWVuY2VyTGVuZ3RoQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1OCBMZW5ndGgpDQp7DQogIHUzMiB0bXByZWcxID0gMDsNCiAgdTggdG1wcmVnMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19JTkpFQ1RFRF9MRU5HVEgoTGVuZ3RoKSk7DQogIA0KICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXByZWcxID0gQURDeC0+SlNRUjsNCiAgLyogQ2xlYXIgdGhlIG9sZCBpbmplY3RlZCBzZXF1bmVuY2UgbGVuZ2h0IEpMIGJpdHMgKi8NCiAgdG1wcmVnMSAmPSBKU1FSX0pMX1Jlc2V0Ow0KICAvKiBTZXQgdGhlIGluamVjdGVkIHNlcXVuZW5jZSBsZW5naHQgSkwgYml0cyAqLw0KICB0bXByZWcyID0gTGVuZ3RoIC0gMTsgDQogIHRtcHJlZzEgfD0gKHUzMil0bXByZWcyIDw8IDIwOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkpTUVIgPSB0bXByZWcxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19TZXRJbmplY3RlZE9mZnNldA0KKiBEZXNjcmlwdGlvbiAgICA6IFNldCB0aGUgaW5qZWN0ZWQgY2hhbm5lbHMgY29udmVyc2lvbiB2YWx1ZSBvZmZzZXQNCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjdGVkQ2hhbm5lbDogdGhlIEFEQyBpbmplY3RlZCBjaGFubmVsIHRvIHNldCBpdHMNCiogICAgICAgICAgICAgICAgICAgIG9mZnNldC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSW5qZWN0ZWRDaGFubmVsXzE6IEluamVjdGVkIENoYW5uZWwxIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JbmplY3RlZENoYW5uZWxfMjogSW5qZWN0ZWQgQ2hhbm5lbDIgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjdGVkQ2hhbm5lbF8zOiBJbmplY3RlZCBDaGFubmVsMyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSW5qZWN0ZWRDaGFubmVsXzQ6IEluamVjdGVkIENoYW5uZWw0IHNlbGVjdGVkDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19TZXRJbmplY3RlZE9mZnNldChBRENfVHlwZURlZiogQURDeCwgdTggQURDX0luamVjdGVkQ2hhbm5lbCwgdTE2IE9mZnNldCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19JTkpFQ1RFRF9DSEFOTkVMKEFEQ19JbmplY3RlZENoYW5uZWwpKTsNCiAgYXNzZXJ0KElTX0FEQ19PRkZTRVQoT2Zmc2V0KSk7ICANCg0KICAvKiBTZXQgdGhlIHNlbGVjdGVkIGluamVjdGVkIGNoYW5uZWwgZGF0YSBvZmZzZXQgKi8NCiAgKigodTMyICopKCgqKHUzMiopJkFEQ3gpICsgQURDX0luamVjdGVkQ2hhbm5lbCkpID0gKHUzMilPZmZzZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0dldEluamVjdGVkQ29udmVyc2lvblZhbHVlDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgQURDIGNvbnZlcnNpb24gcmVzdWx0IGRhdGEgZm9yIHRoZSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgIGluamVjdGVkIGNoYW5uZWwNCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjdGVkQ2hhbm5lbDogdGhlIGNvbnZlcnRlZCBBREMgaW5qZWN0ZWQgY2hhbm5lbC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JbmplY3RlZENoYW5uZWxfMTogSW5qZWN0ZWQgQ2hhbm5lbDEgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0luamVjdGVkQ2hhbm5lbF8yOiBJbmplY3RlZCBDaGFubmVsMiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSW5qZWN0ZWRDaGFubmVsXzM6IEluamVjdGVkIENoYW5uZWwzIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JbmplY3RlZENoYW5uZWxfNDogSW5qZWN0ZWQgQ2hhbm5lbDQgc2VsZWN0ZWQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIERhdGEgY29udmVyc2lvbiB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgQURDX0dldEluamVjdGVkQ29udmVyc2lvblZhbHVlKEFEQ19UeXBlRGVmKiBBREN4LCB1OCBBRENfSW5qZWN0ZWRDaGFubmVsKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQURDX0lOSkVDVEVEX0NIQU5ORUwoQURDX0luamVjdGVkQ2hhbm5lbCkpOw0KDQogIC8qIFJldHVybnMgdGhlIHNlbGVjdGVkIGluamVjdGVkIGNoYW5uZWwgY29udmVyc2lvbiBkYXRhIHZhbHVlICovDQogIHJldHVybiAodTE2KSAoKih1MzIqKSAoKCgqKHUzMiopJkFEQ3gpICsgQURDX0luamVjdGVkQ2hhbm5lbCArIEpEUl9PZmZzZXQpKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0FuYWxvZ1dhdGNoZG9nQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYW5hbG9nIHdhdGNoZG9nIG9uIHNpbmdsZS9hbGwgcmVndWxhcg0KKiAgICAgICAgICAgICAgICAgIG9yIGluamVjdGVkIGNoYW5uZWxzDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZzogdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgY29uZmlndXJhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZ19TaW5nbGVSZWdFbmFibGU6IEFuYWxvZyB3YXRjaGRvZyBvbg0KKiAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSByZWd1bGFyIGNoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nX1NpbmdsZUluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgaW5qZWN0ZWQgY2hhbm5lbA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQW5hbG9nV2F0Y2hkb2dfU2luZ2xlUmVnT3JJbmplY0VuYWJsZTogQW5hbG9nIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGRvZyBvbiBhIHNpbmdsZSByZWd1bGFyIG9yIGluamVjdGVkIGNoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0VuYWJsZTogQW5hbG9nIHdhdGNoZG9nIG9uDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCByZWd1bGFyIGNoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nX0FsbEluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cgb24NCiogICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGluamVjdGVkIGNoYW5uZWwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0FuYWxvZ1dhdGNoZG9nX0FsbFJlZ0FsbEluamVjRW5hYmxlOiBBbmFsb2cgd2F0Y2hkb2cNCiogICAgICAgICAgICAgICAgICAgICAgICAgb24gYWxsIHJlZ3VsYXIgYW5kIGluamVjdGVkIGNoYW5uZWxzDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19BbmFsb2dXYXRjaGRvZ19Ob25lOiBObyBjaGFubmVsIGd1YXJkZWQgYnkgdGhlDQoqICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWxvZyB3YXRjaGRvZw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lCSAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dDbWQoQURDX1R5cGVEZWYqIEFEQ3gsIHUzMiBBRENfQW5hbG9nV2F0Y2hkb2cpDQp7DQogIHUzMiB0bXByZWcgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19BRENfQU5BTE9HX1dBVENIRE9HKEFEQ19BbmFsb2dXYXRjaGRvZykpOw0KDQogIC8qIEdldCB0aGUgb2xkIHJlZ2lzdGVyIHZhbHVlICovDQogIHRtcHJlZyA9IEFEQ3gtPkNSMTsNCiAgLyogQ2xlYXIgQVdERU4sIEFXREVOSiBhbmQgQVdEU0dMIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMV9BV0RNb2RlX1Jlc2V0Ow0KICAvKiBTZXQgdGhlIGFuYWxvZyB3YXRjaGRvZyBlbmFibGUgbW9kZSAqLw0KICB0bXByZWcgfD0gQURDX0FuYWxvZ1dhdGNoZG9nOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEFEQ3gtPkNSMSA9IHRtcHJlZzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQW5hbG9nV2F0Y2hkb2dUaHJlc2hvbGRzQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgSGlnaCBhbmQgbG93IHRocmVzaG9sZHMgb2YgdGhlIGFuYWxvZyB3YXRjaGRvZy4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSGlnaFRocmVzaG9sZDogdGhlIEFEQyBhbmFsb2cgd2F0Y2hkb2cgSGlnaCB0aHJlc2hvbGQgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgMTJiaXQgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgLSBMb3dUaHJlc2hvbGQ6IHRoZSBBREMgYW5hbG9nIHdhdGNoZG9nIExvdyB0aHJlc2hvbGQgdmFsdWUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgMTJiaXQgdmFsdWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19BbmFsb2dXYXRjaGRvZ1RocmVzaG9sZHNDb25maWcoQURDX1R5cGVEZWYqIEFEQ3gsIHUxNiBIaWdoVGhyZXNob2xkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBMb3dUaHJlc2hvbGQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19BRENfVEhSRVNIT0xEKEhpZ2hUaHJlc2hvbGQpKTsNCiAgYXNzZXJ0KElTX0FEQ19USFJFU0hPTEQoTG93VGhyZXNob2xkKSk7DQoNCiAgLyogU2V0IHRoZSBBREN4IGhpZ2ggdGhyZXNob2xkICovDQogIEFEQ3gtPkhUUiA9IEhpZ2hUaHJlc2hvbGQ7DQogIC8qIFNldCB0aGUgQURDeCBsb3cgdGhyZXNob2xkICovDQogIEFEQ3gtPkxUUiA9IExvd1RocmVzaG9sZDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQW5hbG9nV2F0Y2hkb2dTaW5nbGVDaGFubmVsQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgYW5hbG9nIHdhdGNoZG9nIGd1YXJkZWQgc2luZ2xlIGNoYW5uZWwNCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWw6IHRoZSBBREMgY2hhbm5lbCB0byBjb25maWd1cmUgZm9yIHRoZSBhbmFsb2cNCiogICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzA6IEFEQyBDaGFubmVsMCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xOiBBREMgQ2hhbm5lbDEgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfMjogQURDIENoYW5uZWwyIHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzM6IEFEQyBDaGFubmVsMyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF80OiBBREMgQ2hhbm5lbDQgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfNTogQURDIENoYW5uZWw1IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzY6IEFEQyBDaGFubmVsNiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF83OiBBREMgQ2hhbm5lbDcgc2VsZWN0ZWQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0NoYW5uZWxfODogQURDIENoYW5uZWw4IHNlbGVjdGVkDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19DaGFubmVsXzk6IEFEQyBDaGFubmVsOSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMDogQURDIENoYW5uZWwxMCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMTogQURDIENoYW5uZWwxMSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMjogQURDIENoYW5uZWwxMiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xMzogQURDIENoYW5uZWwxMyBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNDogQURDIENoYW5uZWwxNCBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNTogQURDIENoYW5uZWwxNSBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNjogQURDIENoYW5uZWwxNiBzZWxlY3RlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfQ2hhbm5lbF8xNzogQURDIENoYW5uZWwxNyBzZWxlY3RlZA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBBRENfQW5hbG9nV2F0Y2hkb2dTaW5nbGVDaGFubmVsQ29uZmlnKEFEQ19UeXBlRGVmKiBBREN4LCB1OCBBRENfQ2hhbm5lbCkNCnsNCiAgdTMyIHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19DSEFOTkVMKEFEQ19DaGFubmVsKSk7DQoNCiAgLyogR2V0IHRoZSBvbGQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgdG1wcmVnID0gQURDeC0+Q1IxOw0KICAvKiBDbGVhciB0aGUgQW5hbG9nIHdhdGNoZG9nIGNoYW5uZWwgc2VsZWN0IGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMV9BV0RDSF9SZXNldDsNCiAgLyogU2V0IHRoZSBBbmFsb2cgd2F0Y2hkb2cgY2hhbm5lbCAqLw0KICB0bXByZWcgfD0gQURDX0NoYW5uZWw7DQogIC8qIFN0b3JlIHRoZSBuZXcgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgQURDeC0+Q1IxID0gdG1wcmVnOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19UZW1wU2Vuc29yQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yLg0KKiBJbnB1dCAgICAgICAgICA6IC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX1RlbXBTZW5zb3JDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgICovDQogICAgQURDMS0+Q1IyIHw9IENSMl9UU1BEX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8NCglBREMxLT5DUjIgJj0gQ1IyX1RTUERfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQURDIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEFEQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEFEQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19BV0Q6IEFuYWxvZyB3YXRjaGRvZyBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX0pTVFJUOiBTdGFydCBvZiBpbmplY3RlZCBncm91cCBjb252ZXJzaW9uIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfU1RSVDogU3RhcnQgb2YgcmVndWxhciBncm91cCBjb252ZXJzaW9uIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBBRENfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIEFEQ19HZXRGbGFnU3RhdHVzKEFEQ19UeXBlRGVmKiBBREN4LCB1OCBBRENfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQURDX0dFVF9GTEFHKEFEQ19GTEFHKSk7DQoNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEFEQyBmbGFnICovDQogIGlmICgoQURDeC0+U1IgJiBBRENfRkxBRykgIT0gKHU4KVJFU0VUKQ0KICB7DQogICAgLyogQURDX0ZMQUcgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEFEQ19GTEFHIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBBRENfRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogQURDX0NsZWFyRmxhZw0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgQURDeCdzIHBlbmRpbmcgZmxhZ3MuDQoqIElucHV0ICAgICAgICAgIDogLSBBREN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBBREMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfQVdEOiBBbmFsb2cgd2F0Y2hkb2cgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0ZMQUdfSkVPQzogRW5kIG9mIGluamVjdGVkIGdyb3VwIGNvbnZlcnNpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfRkxBR19KU1RSVDogU3RhcnQgb2YgaW5qZWN0ZWQgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19GTEFHX1NUUlQ6IFN0YXJ0IG9mIHJlZ3VsYXIgZ3JvdXAgY29udmVyc2lvbiBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEFEQ19DbGVhckZsYWcoQURDX1R5cGVEZWYqIEFEQ3gsIHU4IEFEQ19GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQURDX0NMRUFSX0ZMQUcoQURDX0ZMQUcpKTsNCg0KICAvKiBDbGVhciB0aGUgc2VsZWN0ZWQgQURDIGZsYWdzICovDQogIEFEQ3gtPlNSICY9IH4odTMyKUFEQ19GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEFEQ19HZXRJVFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gQURDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgQURDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBBRENfSVQ6IHNwZWNpZmllcyB0aGUgQURDIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0VPQzogRW5kIG9mIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAgICAgIC0gQURDX0lUX0FXRDogQW5hbG9nIHdhdGNoZG9nIGludGVycnVwdCBtYXNrDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9KRU9DOiBFbmQgb2YgaW5qZWN0ZWQgY29udmVyc2lvbiBpbnRlcnJ1cHQgbWFzaw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEFEQ19JVCAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBBRENfR2V0SVRTdGF0dXMoQURDX1R5cGVEZWYqIEFEQ3gsIHUxNiBBRENfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1OCBpdG1hc2sgPSAwLCBlbmFibGVzdGF0dXM7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0FEQ19HRVRfSVQoQURDX0lUKSk7DQoNCiAgLyogR2V0IHRoZSBBREMgSVQgaW5kZXggKi8NCiAgaXRtYXNrID0gKHU4KShBRENfSVQgPj4gOCk7DQoNCiAgLyogR2V0IHRoZSBBRENfSVQgZW5hYmxlIGJpdCBzdGF0dXMgKi8NCiAgZW5hYmxlc3RhdHVzID0gKEFEQ3gtPkNSMSAmICh1OClBRENfSVQpIDsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgQURDIGludGVycnVwdCAqLw0KICBpZiAoKChBREN4LT5TUiAmIGl0bWFzaykgIT0gKHU4KVJFU0VUKSAmJiBlbmFibGVzdGF0dXMpDQogIHsNCiAgICAvKiBBRENfSVQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEFEQ19JVCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgQURDX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBBRENfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIEFEQ5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBBRENfSVQ6IHNwZWNpZmllcyB0aGUgQURDIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9FT0M6IEVuZCBvZiBjb252ZXJzaW9uIGludGVycnVwdCBtYXNrDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEFEQ19JVF9BV0Q6IEFuYWxvZyB3YXRjaGRvZyBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBBRENfSVRfSkVPQzogRW5kIG9mIGluamVjdGVkIGNvbnZlcnNpb24gaW50ZXJydXB0IG1hc2sNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgQURDX0NsZWFySVRQZW5kaW5nQml0KEFEQ19UeXBlRGVmKiBBREN4LCB1MTYgQURDX0lUKQ0Kew0KICB1OCBpdG1hc2sgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19BRENfSVQoQURDX0lUKSk7DQoNCiAgLyogR2V0IHRoZSBBREMgSVQgaW5kZXggKi8NCiAgaXRtYXNrID0gKHU4KShBRENfSVQgPj4gOCk7DQoNCiAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEFEQyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzICovDQogIEFEQ3gtPlNSICY9IH4odTMyKWl0bWFzazsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA3IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==