LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9zZGlvLmMNCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KICAqIEB2ZXJzaW9uIFYzLjQuMA0KICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCiAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBTRElPIGZpcm13YXJlIGZ1bmN0aW9ucy4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGNvcHkNCiAgKg0KICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQogICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCiAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQogICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICovIA0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjEweF9zZGlvLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU8gDQogICogQGJyaWVmIFNESU8gZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLyANCg0KLyoqIEBkZWZncm91cCBTRElPX1ByaXZhdGVfVHlwZXNEZWZpbml0aW9ucw0KICAqIEB7DQogICovIA0KDQovKiAtLS0tLS0tLS0tLS0gU0RJTyByZWdpc3RlcnMgYml0IGFkZHJlc3MgaW4gdGhlIGFsaWFzIHJlZ2lvbiAtLS0tLS0tLS0tLSAqLw0KI2RlZmluZSBTRElPX09GRlNFVCAgICAgICAgICAgICAgICAoU0RJT19CQVNFIC0gUEVSSVBIX0JBU0UpDQoNCi8qIC0tLSBDTEtDUiBSZWdpc3RlciAtLS0qLw0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgQ0xLRU4gYml0ICovDQojZGVmaW5lIENMS0NSX09GRlNFVCAgICAgICAgICAgICAgKFNESU9fT0ZGU0VUICsgMHgwNCkNCiNkZWZpbmUgQ0xLRU5fQml0TnVtYmVyICAgICAgICAgICAweDA4DQojZGVmaW5lIENMS0NSX0NMS0VOX0JCICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENMS0NSX09GRlNFVCAqIDMyKSArIChDTEtFTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogLS0tIENNRCBSZWdpc3RlciAtLS0qLw0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgU0RJT1NVU1BFTkQgYml0ICovDQojZGVmaW5lIENNRF9PRkZTRVQgICAgICAgICAgICAgICAgKFNESU9fT0ZGU0VUICsgMHgwQykNCiNkZWZpbmUgU0RJT1NVU1BFTkRfQml0TnVtYmVyICAgICAweDBCDQojZGVmaW5lIENNRF9TRElPU1VTUEVORF9CQiAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENNRF9PRkZTRVQgKiAzMikgKyAoU0RJT1NVU1BFTkRfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBFTkNNRENPTVBMIGJpdCAqLw0KI2RlZmluZSBFTkNNRENPTVBMX0JpdE51bWJlciAgICAgIDB4MEMNCiNkZWZpbmUgQ01EX0VOQ01EQ09NUExfQkIgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoQ01EX09GRlNFVCAqIDMyKSArIChFTkNNRENPTVBMX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgTklFTiBiaXQgKi8NCiNkZWZpbmUgTklFTl9CaXROdW1iZXIgICAgICAgICAgICAweDBEDQojZGVmaW5lIENNRF9OSUVOX0JCICAgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENNRF9PRkZTRVQgKiAzMikgKyAoTklFTl9CaXROdW1iZXIgKiA0KSkNCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIEFUQUNNRCBiaXQgKi8NCiNkZWZpbmUgQVRBQ01EX0JpdE51bWJlciAgICAgICAgICAweDBFDQojZGVmaW5lIENNRF9BVEFDTURfQkIgICAgICAgICAgICAgKFBFUklQSF9CQl9CQVNFICsgKENNRF9PRkZTRVQgKiAzMikgKyAoQVRBQ01EX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0gRENUUkwgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQWxpYXMgd29yZCBhZGRyZXNzIG9mIERNQUVOIGJpdCAqLw0KI2RlZmluZSBEQ1RSTF9PRkZTRVQgICAgICAgICAgICAgIChTRElPX09GRlNFVCArIDB4MkMpDQojZGVmaW5lIERNQUVOX0JpdE51bWJlciAgICAgICAgICAgMHgwMw0KI2RlZmluZSBEQ1RSTF9ETUFFTl9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoRE1BRU5fQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSV1NUQVJUIGJpdCAqLw0KI2RlZmluZSBSV1NUQVJUX0JpdE51bWJlciAgICAgICAgIDB4MDgNCiNkZWZpbmUgRENUUkxfUldTVEFSVF9CQiAgICAgICAgICAoUEVSSVBIX0JCX0JBU0UgKyAoRENUUkxfT0ZGU0VUICogMzIpICsgKFJXU1RBUlRfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBSV1NUT1AgYml0ICovDQojZGVmaW5lIFJXU1RPUF9CaXROdW1iZXIgICAgICAgICAgMHgwOQ0KI2RlZmluZSBEQ1RSTF9SV1NUT1BfQkIgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoUldTVE9QX0JpdE51bWJlciAqIDQpKQ0KDQovKiBBbGlhcyB3b3JkIGFkZHJlc3Mgb2YgUldNT0QgYml0ICovDQojZGVmaW5lIFJXTU9EX0JpdE51bWJlciAgICAgICAgICAgMHgwQQ0KI2RlZmluZSBEQ1RSTF9SV01PRF9CQiAgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoUldNT0RfQml0TnVtYmVyICogNCkpDQoNCi8qIEFsaWFzIHdvcmQgYWRkcmVzcyBvZiBTRElPRU4gYml0ICovDQojZGVmaW5lIFNESU9FTl9CaXROdW1iZXIgICAgICAgICAgMHgwQg0KI2RlZmluZSBEQ1RSTF9TRElPRU5fQkIgICAgICAgICAgIChQRVJJUEhfQkJfQkFTRSArIChEQ1RSTF9PRkZTRVQgKiAzMikgKyAoU0RJT0VOX0JpdE51bWJlciAqIDQpKQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gcmVnaXN0ZXJzIGJpdCBtYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiAtLS0gQ0xLQ1IgUmVnaXN0ZXIgLS0tKi8NCg0KLyogQ0xLQ1IgcmVnaXN0ZXIgY2xlYXIgbWFzayAqLw0KI2RlZmluZSBDTEtDUl9DTEVBUl9NQVNLICAgICAgICAgKCh1aW50MzJfdCkweEZGRkY4MTAwKSANCg0KLyogLS0tIFBXUkNUUkwgUmVnaXN0ZXIgLS0tKi8NCg0KLyogU0RJTyBQV1JDVFJMIE1hc2sgKi8NCiNkZWZpbmUgUFdSX1BXUkNUUkxfTUFTSyAgICAgICAgICgodWludDMyX3QpMHhGRkZGRkZGQykNCg0KLyogLS0tIERDVFJMIFJlZ2lzdGVyIC0tLSovDQoNCi8qIFNESU8gRENUUkwgQ2xlYXIgTWFzayAqLw0KI2RlZmluZSBEQ1RSTF9DTEVBUl9NQVNLICAgICAgICAgKCh1aW50MzJfdCkweEZGRkZGRjA4KQ0KDQovKiAtLS0gQ01EIFJlZ2lzdGVyIC0tLSovDQoNCi8qIENNRCBSZWdpc3RlciBjbGVhciBtYXNrICovDQojZGVmaW5lIENNRF9DTEVBUl9NQVNLICAgICAgICAgICAoKHVpbnQzMl90KTB4RkZGRkY4MDApDQoNCi8qIFNESU8gUkVTUCBSZWdpc3RlcnMgQWRkcmVzcyAqLw0KI2RlZmluZSBTRElPX1JFU1BfQUREUiAgICAgICAgICAgKCh1aW50MzJfdCkoU0RJT19CQVNFICsgMHgxNCkpDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU0RJT19Qcml2YXRlX0RlZmluZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9NYWNyb3MNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9WYXJpYWJsZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNESU9fUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIFNESU8gcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fRGVJbml0KHZvaWQpDQp7DQogIFNESU8tPlBPV0VSID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+Q0xLQ1IgPSAweDAwMDAwMDAwOw0KICBTRElPLT5BUkcgPSAweDAwMDAwMDAwOw0KICBTRElPLT5DTUQgPSAweDAwMDAwMDAwOw0KICBTRElPLT5EVElNRVIgPSAweDAwMDAwMDAwOw0KICBTRElPLT5ETEVOID0gMHgwMDAwMDAwMDsNCiAgU0RJTy0+RENUUkwgPSAweDAwMDAwMDAwOw0KICBTRElPLT5JQ1IgPSAweDAwQzAwN0ZGOw0KICBTRElPLT5NQVNLID0gMHgwMDAwMDAwMDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgU0RJT19Jbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgU0RJT19Jbml0U3RydWN0IDogcG9pbnRlciB0byBhIFNESU9fSW5pdFR5cGVEZWYgc3RydWN0dXJlIA0KICAqICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNESU8gcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19Jbml0KFNESU9fSW5pdFR5cGVEZWYqIFNESU9fSW5pdFN0cnVjdCkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQ0xPQ0tfRURHRShTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tFZGdlKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0NMT0NLX0JZUEFTUyhTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tCeXBhc3MpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQ0xPQ0tfUE9XRVJfU0FWRShTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tQb3dlclNhdmUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQlVTX1dJREUoU0RJT19Jbml0U3RydWN0LT5TRElPX0J1c1dpZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fSEFSRFdBUkVfRkxPV19DT05UUk9MKFNESU9fSW5pdFN0cnVjdC0+U0RJT19IYXJkd2FyZUZsb3dDb250cm9sKSk7IA0KICAgDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBDTEtDUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCiAgLyogR2V0IHRoZSBTRElPIENMS0NSIHZhbHVlICovDQogIHRtcHJlZyA9IFNESU8tPkNMS0NSOw0KICANCiAgLyogQ2xlYXIgQ0xLRElWLCBQV1JTQVYsIEJZUEFTUywgV0lEQlVTLCBORUdFREdFLCBIV0ZDX0VOIGJpdHMgKi8NCiAgdG1wcmVnICY9IENMS0NSX0NMRUFSX01BU0s7DQogIA0KICAvKiBTZXQgQ0xLRElWIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tEaXYgdmFsdWUgKi8NCiAgLyogU2V0IFBXUlNBViBiaXQgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tQb3dlclNhdmUgdmFsdWUgKi8NCiAgLyogU2V0IEJZUEFTUyBiaXQgYWNjb3JkaW5nIHRvIFNESU9fQ2xvY2tCeXBhc3MgdmFsdWUgKi8NCiAgLyogU2V0IFdJREJVUyBiaXRzIGFjY29yZGluZyB0byBTRElPX0J1c1dpZGUgdmFsdWUgKi8NCiAgLyogU2V0IE5FR0VER0UgYml0cyBhY2NvcmRpbmcgdG8gU0RJT19DbG9ja0VkZ2UgdmFsdWUgKi8NCiAgLyogU2V0IEhXRkNfRU4gYml0cyBhY2NvcmRpbmcgdG8gU0RJT19IYXJkd2FyZUZsb3dDb250cm9sIHZhbHVlICovDQogIHRtcHJlZyB8PSAoU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRGl2ICB8IFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja1Bvd2VyU2F2ZSB8DQogICAgICAgICAgICAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrQnlwYXNzIHwgU0RJT19Jbml0U3RydWN0LT5TRElPX0J1c1dpZGUgfA0KICAgICAgICAgICAgIFNESU9fSW5pdFN0cnVjdC0+U0RJT19DbG9ja0VkZ2UgfCBTRElPX0luaXRTdHJ1Y3QtPlNESU9fSGFyZHdhcmVGbG93Q29udHJvbCk7IA0KICANCiAgLyogV3JpdGUgdG8gU0RJTyBDTEtDUiAqLw0KICBTRElPLT5DTEtDUiA9IHRtcHJlZzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIFNESU9fSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gIFNESU9fSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBTRElPX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCANCiAgKiAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fU3RydWN0SW5pdChTRElPX0luaXRUeXBlRGVmKiBTRElPX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFNESU9fSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCiAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRGl2ID0gMHgwMDsNCiAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrRWRnZSA9IFNESU9fQ2xvY2tFZGdlX1Jpc2luZzsNCiAgU0RJT19Jbml0U3RydWN0LT5TRElPX0Nsb2NrQnlwYXNzID0gU0RJT19DbG9ja0J5cGFzc19EaXNhYmxlOw0KICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fQ2xvY2tQb3dlclNhdmUgPSBTRElPX0Nsb2NrUG93ZXJTYXZlX0Rpc2FibGU7DQogIFNESU9fSW5pdFN0cnVjdC0+U0RJT19CdXNXaWRlID0gU0RJT19CdXNXaWRlXzFiOw0KICBTRElPX0luaXRTdHJ1Y3QtPlNESU9fSGFyZHdhcmVGbG93Q29udHJvbCA9IFNESU9fSGFyZHdhcmVGbG93Q29udHJvbF9EaXNhYmxlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNESU8gQ2xvY2suDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTRElPIENsb2NrLiBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0Nsb2NrQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBDTEtDUl9DTEtFTl9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBwb3dlciBzdGF0dXMgb2YgdGhlIGNvbnRyb2xsZXIuDQogICogQHBhcmFtICBTRElPX1Bvd2VyU3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgUG93ZXIgc3RhdGUuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBTRElPX1Bvd2VyU3RhdGVfT0ZGDQogICogICAgIEBhcmcgU0RJT19Qb3dlclN0YXRlX09ODQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fU2V0UG93ZXJTdGF0ZSh1aW50MzJfdCBTRElPX1Bvd2VyU3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX1BPV0VSX1NUQVRFKFNESU9fUG93ZXJTdGF0ZSkpOw0KICANCiAgU0RJTy0+UE9XRVIgJj0gUFdSX1BXUkNUUkxfTUFTSzsNCiAgU0RJTy0+UE9XRVIgfD0gU0RJT19Qb3dlclN0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEdldHMgdGhlIHBvd2VyIHN0YXR1cyBvZiB0aGUgY29udHJvbGxlci4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIFBvd2VyIHN0YXR1cyBvZiB0aGUgY29udHJvbGxlci4gVGhlIHJldHVybmVkIHZhbHVlIGNhbg0KICAqICAgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6DQogICogLSAweDAwOiBQb3dlciBPRkYNCiAgKiAtIDB4MDI6IFBvd2VyIFVQDQogICogLSAweDAzOiBQb3dlciBPTiANCiAgKi8NCnVpbnQzMl90IFNESU9fR2V0UG93ZXJTdGF0ZSh2b2lkKQ0Kew0KICByZXR1cm4gKFNESU8tPlBPV0VSICYgKH5QV1JfUFdSQ1RSTF9NQVNLKSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU0RJTyBpbnRlcnJ1cHRzLg0KICAqIEBwYXJhbSAgU0RJT19JVDogc3BlY2lmaWVzIHRoZSBTRElPIGludGVycnVwdCBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgU0RJT19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EVElNRU9VVDogRGF0YSB0aW1lb3V0IGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhVTkRFUlI6IFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gZXJyb3IgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9SWEFDVDogICAgRGF0YSByZWNlaXZlIGluIHByb2dyZXNzIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPSEU6IFRyYW5zbWl0IEZJRk8gSGFsZiBFbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1JYRklGT0hGOiBSZWNlaXZlIEZJRk8gSGFsZiBGdWxsIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRjogIFRyYW5zbWl0IEZJRk8gZnVsbCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1JYRklGT0Y6ICBSZWNlaXZlIEZJRk8gZnVsbCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1RYRklGT0U6ICBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTyBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ0VBVEFFTkQ6IENFLUFUQSBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsIHJlY2VpdmVkIGZvciBDTUQ2MSBpbnRlcnJ1cHQNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBTRElPIGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZSANCiAgKi8NCnZvaWQgU0RJT19JVENvbmZpZyh1aW50MzJfdCBTRElPX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX0lUKFNESU9fSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBTRElPIGludGVycnVwdHMgKi8NCiAgICBTRElPLT5NQVNLIHw9IFNESU9fSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgU0RJTyBpbnRlcnJ1cHRzICovDQogICAgU0RJTy0+TUFTSyAmPSB+U0RJT19JVDsNCiAgfSANCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTRElPIERNQSByZXF1ZXN0Lg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgU0RJTyBETUEgcmVxdWVzdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fRE1BQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9ETUFFTl9CQiA9ICh1aW50MzJfdClOZXdTdGF0ZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBDb21tYW5kIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgU0RJT19DbWRJbml0U3RydWN0IGFuZCBzZW5kIHRoZSBjb21tYW5kLg0KICAqIEBwYXJhbSAgU0RJT19DbWRJbml0U3RydWN0IDogcG9pbnRlciB0byBhIFNESU9fQ21kSW5pdFR5cGVEZWYgDQogICogICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFNESU8gY29tbWFuZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZW5kQ29tbWFuZChTRElPX0NtZEluaXRUeXBlRGVmICpTRElPX0NtZEluaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDA7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19DTURfSU5ERVgoU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NtZEluZGV4KSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX1JFU1BPTlNFKFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19XQUlUKFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0KSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0NQU00oU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU00pKTsNCiAgDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0RJTyBBUkcgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgdGhlIFNESU8gQXJndW1lbnQgdmFsdWUgKi8NCiAgU0RJTy0+QVJHID0gU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0FyZ3VtZW50Ow0KICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIENNRCBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCiAgLyogR2V0IHRoZSBTRElPIENNRCB2YWx1ZSAqLw0KICB0bXByZWcgPSBTRElPLT5DTUQ7DQogIC8qIENsZWFyIENNRElOREVYLCBXQUlUUkVTUCwgV0FJVElOVCwgV0FJVFBFTkQsIENQU01FTiBiaXRzICovDQogIHRtcHJlZyAmPSBDTURfQ0xFQVJfTUFTSzsNCiAgLyogU2V0IENNRElOREVYIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ21kSW5kZXggdmFsdWUgKi8NCiAgLyogU2V0IFdBSVRSRVNQIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fUmVzcG9uc2UgdmFsdWUgKi8NCiAgLyogU2V0IFdBSVRJTlQgYW5kIFdBSVRQRU5EIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fV2FpdCB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BTTUVOIGJpdHMgYWNjb3JkaW5nIHRvIFNESU9fQ1BTTSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KVNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19DbWRJbmRleCB8IFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZQ0KICAgICAgICAgICB8IFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0IHwgU0RJT19DbWRJbml0U3RydWN0LT5TRElPX0NQU007DQogIA0KICAvKiBXcml0ZSB0byBTRElPIENNRCAqLw0KICBTRElPLT5DTUQgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBTRElPX0NtZEluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBTRElPX0NtZEluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYW4gU0RJT19DbWRJbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0NtZFN0cnVjdEluaXQoU0RJT19DbWRJbml0VHlwZURlZiogU0RJT19DbWRJbml0U3RydWN0KQ0Kew0KICAvKiBTRElPX0NtZEluaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19Bcmd1bWVudCA9IDB4MDA7DQogIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19DbWRJbmRleCA9IDB4MDA7DQogIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19SZXNwb25zZSA9IFNESU9fUmVzcG9uc2VfTm87DQogIFNESU9fQ21kSW5pdFN0cnVjdC0+U0RJT19XYWl0ID0gU0RJT19XYWl0X05vOw0KICBTRElPX0NtZEluaXRTdHJ1Y3QtPlNESU9fQ1BTTSA9IFNESU9fQ1BTTV9EaXNhYmxlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgY29tbWFuZCBpbmRleCBvZiBsYXN0IGNvbW1hbmQgZm9yIHdoaWNoIHJlc3BvbnNlIHJlY2VpdmVkLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgUmV0dXJucyB0aGUgY29tbWFuZCBpbmRleCBvZiB0aGUgbGFzdCBjb21tYW5kIHJlc3BvbnNlIHJlY2VpdmVkLg0KICAqLw0KdWludDhfdCBTRElPX0dldENvbW1hbmRSZXNwb25zZSh2b2lkKQ0Kew0KICByZXR1cm4gKHVpbnQ4X3QpKFNESU8tPlJFU1BDTUQpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2FyZCBmb3IgdGhlIGxhc3QgY29tbWFuZC4NCiAgKiBAcGFyYW0gIFNESU9fUkVTUDogU3BlY2lmaWVzIHRoZSBTRElPIHJlc3BvbnNlIHJlZ2lzdGVyLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgU0RJT19SRVNQMTogUmVzcG9uc2UgUmVnaXN0ZXIgMQ0KICAqICAgICBAYXJnIFNESU9fUkVTUDI6IFJlc3BvbnNlIFJlZ2lzdGVyIDINCiAgKiAgICAgQGFyZyBTRElPX1JFU1AzOiBSZXNwb25zZSBSZWdpc3RlciAzDQogICogICAgIEBhcmcgU0RJT19SRVNQNDogUmVzcG9uc2UgUmVnaXN0ZXIgNA0KICAqIEByZXR2YWwgVGhlIENvcnJlc3BvbmRpbmcgcmVzcG9uc2UgcmVnaXN0ZXIgdmFsdWUuDQogICovDQp1aW50MzJfdCBTRElPX0dldFJlc3BvbnNlKHVpbnQzMl90IFNESU9fUkVTUCkNCnsNCiAgX19JTyB1aW50MzJfdCB0bXAgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX1JFU1AoU0RJT19SRVNQKSk7DQoNCiAgdG1wID0gU0RJT19SRVNQX0FERFIgKyBTRElPX1JFU1A7DQogIA0KICByZXR1cm4gKCooX19JTyB1aW50MzJfdCAqKSB0bXApOyANCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgU0RJTyBkYXRhIHBhdGggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBTRElPX0RhdGFJbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgU0RJT19EYXRhSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBTRElPX0RhdGFJbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KICAqICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBTRElPIGNvbW1hbmQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fRGF0YUNvbmZpZyhTRElPX0RhdGFJbml0VHlwZURlZiogU0RJT19EYXRhSW5pdFN0cnVjdCkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX0RBVEFfTEVOR1RIKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUxlbmd0aCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19CTE9DS19TSVpFKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUJsb2NrU2l6ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19UUkFOU0ZFUl9ESVIoU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19UcmFuc2ZlckRpcikpOw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19UUkFOU0ZFUl9NT0RFKFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19TRElPX0RQU00oU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EUFNNKSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTRElPIERUSU1FUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFNldCB0aGUgU0RJTyBEYXRhIFRpbWVPdXQgdmFsdWUgKi8NCiAgU0RJTy0+RFRJTUVSID0gU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhVGltZU91dDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gRExFTiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IHRoZSBTRElPIERhdGFMZW5ndGggdmFsdWUgKi8NCiAgU0RJTy0+RExFTiA9IFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YUxlbmd0aDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNESU8gRENUUkwgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KICAvKiBHZXQgdGhlIFNESU8gRENUUkwgdmFsdWUgKi8NCiAgdG1wcmVnID0gU0RJTy0+RENUUkw7DQogIC8qIENsZWFyIERFTiwgRFRNT0RFLCBEVERJUiBhbmQgREJDS1NJWkUgYml0cyAqLw0KICB0bXByZWcgJj0gRENUUkxfQ0xFQVJfTUFTSzsNCiAgLyogU2V0IERFTiBiaXQgYWNjb3JkaW5nIHRvIFNESU9fRFBTTSB2YWx1ZSAqLw0KICAvKiBTZXQgRFRNT0RFIGJpdCBhY2NvcmRpbmcgdG8gU0RJT19UcmFuc2Zlck1vZGUgdmFsdWUgKi8NCiAgLyogU2V0IERURElSIGJpdCBhY2NvcmRpbmcgdG8gU0RJT19UcmFuc2ZlckRpciB2YWx1ZSAqLw0KICAvKiBTZXQgREJDS1NJWkUgYml0cyBhY2NvcmRpbmcgdG8gU0RJT19EYXRhQmxvY2tTaXplIHZhbHVlICovDQogIHRtcHJlZyB8PSAodWludDMyX3QpU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EYXRhQmxvY2tTaXplIHwgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19UcmFuc2ZlckRpcg0KICAgICAgICAgICB8IFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJNb2RlIHwgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19EUFNNOw0KDQogIC8qIFdyaXRlIHRvIFNESU8gRENUUkwgKi8NCiAgU0RJTy0+RENUUkwgPSB0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBTRElPX0RhdGFJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgU0RJT19EYXRhSW5pdFN0cnVjdDogcG9pbnRlciB0byBhbiBTRElPX0RhdGFJbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiAgKiAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fRGF0YVN0cnVjdEluaXQoU0RJT19EYXRhSW5pdFR5cGVEZWYqIFNESU9fRGF0YUluaXRTdHJ1Y3QpDQp7DQogIC8qIFNESU9fRGF0YUluaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fRGF0YVRpbWVPdXQgPSAweEZGRkZGRkZGOw0KICBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFMZW5ndGggPSAweDAwOw0KICBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RhdGFCbG9ja1NpemUgPSBTRElPX0RhdGFCbG9ja1NpemVfMWI7DQogIFNESU9fRGF0YUluaXRTdHJ1Y3QtPlNESU9fVHJhbnNmZXJEaXIgPSBTRElPX1RyYW5zZmVyRGlyX1RvQ2FyZDsNCiAgU0RJT19EYXRhSW5pdFN0cnVjdC0+U0RJT19UcmFuc2Zlck1vZGUgPSBTRElPX1RyYW5zZmVyTW9kZV9CbG9jazsgIA0KICBTRElPX0RhdGFJbml0U3RydWN0LT5TRElPX0RQU00gPSBTRElPX0RQU01fRGlzYWJsZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIG51bWJlciBvZiByZW1haW5pbmcgZGF0YSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZC4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE51bWJlciBvZiByZW1haW5pbmcgZGF0YSBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZA0KICAqLw0KdWludDMyX3QgU0RJT19HZXREYXRhQ291bnRlcih2b2lkKQ0KeyANCiAgcmV0dXJuIFNESU8tPkRDT1VOVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZWFkIG9uZSBkYXRhIHdvcmQgZnJvbSBSeCBGSUZPLg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgRGF0YSByZWNlaXZlZA0KICAqLw0KdWludDMyX3QgU0RJT19SZWFkRGF0YSh2b2lkKQ0KeyANCiAgcmV0dXJuIFNESU8tPkZJRk87DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JpdGUgb25lIGRhdGEgd29yZCB0byBUeCBGSUZPLg0KICAqIEBwYXJhbSAgRGF0YTogMzItYml0IGRhdGEgd29yZCB0byB3cml0ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19Xcml0ZURhdGEodWludDMyX3QgRGF0YSkNCnsgDQogIFNESU8tPkZJRk8gPSBEYXRhOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBsZWZ0IHRvIGJlIHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIEZJRk8uCQ0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgUmVtYWluaW5nIG51bWJlciBvZiB3b3Jkcy4NCiAgKi8NCnVpbnQzMl90IFNESU9fR2V0RklGT0NvdW50KHZvaWQpDQp7IA0KICByZXR1cm4gU0RJTy0+RklGT0NOVDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydHMgdGhlIFNEIEkvTyBSZWFkIFdhaXQgb3BlcmF0aW9uLgkNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFN0YXJ0IFNESU8gUmVhZCBXYWl0IG9wZXJhdGlvbi4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTRElPX1N0YXJ0U0RJT1JlYWRXYWl0KEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgRENUUkxfUldTVEFSVF9CQiA9ICh1aW50MzJfdCkgTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3RvcHMgdGhlIFNEIEkvTyBSZWFkIFdhaXQgb3BlcmF0aW9uLgkNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFN0b3AgU0RJTyBSZWFkIFdhaXQgb3BlcmF0aW9uLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fU3RvcFNESU9SZWFkV2FpdChGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgKihfX0lPIHVpbnQzMl90ICopIERDVFJMX1JXU1RPUF9CQiA9ICh1aW50MzJfdCkgTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyBvbmUgb2YgdGhlIHR3byBvcHRpb25zIG9mIGluc2VydGluZyByZWFkIHdhaXQgaW50ZXJ2YWwuDQogICogQHBhcmFtICBTRElPX1JlYWRXYWl0TW9kZTogU0QgSS9PIFJlYWQgV2FpdCBvcGVyYXRpb24gbW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldHJlIGNhbiBiZToNCiAgKiAgICAgQGFyZyBTRElPX1JlYWRXYWl0TW9kZV9DTEs6IFJlYWQgV2FpdCBjb250cm9sIGJ5IHN0b3BwaW5nIFNESU9DTEsNCiAgKiAgICAgQGFyZyBTRElPX1JlYWRXYWl0TW9kZV9EQVRBMjogUmVhZCBXYWl0IGNvbnRyb2wgdXNpbmcgU0RJT19EQVRBMg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTRElPX1NldFNESU9SZWFkV2FpdE1vZGUodWludDMyX3QgU0RJT19SZWFkV2FpdE1vZGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX1JFQURXQUlUX01PREUoU0RJT19SZWFkV2FpdE1vZGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBEQ1RSTF9SV01PRF9CQiA9IFNESU9fUmVhZFdhaXRNb2RlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNEIEkvTyBNb2RlIE9wZXJhdGlvbi4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgU0RJTyBzcGVjaWZpYyBvcGVyYXRpb24uIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZXRTRElPT3BlcmF0aW9uKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgRENUUkxfU0RJT0VOX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNEIEkvTyBNb2RlIHN1c3BlbmQgY29tbWFuZCBzZW5kaW5nLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU0QgSS9PIE1vZGUgc3VzcGVuZCBjb21tYW5kLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZW5kU0RJT1N1c3BlbmRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBDTURfU0RJT1NVU1BFTkRfQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBTRElPX0NvbW1hbmRDb21wbGV0aW9uQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgQ01EX0VOQ01EQ09NUExfQkIgPSAodWludDMyX3QpTmV3U3RhdGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQ0UtQVRBIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgQ0UtQVRBIGludGVycnVwdC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19DRUFUQUlUQ21kKEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICAqKF9fSU8gdWludDMyX3QgKikgQ01EX05JRU5fQkIgPSAodWludDMyX3QpKCh+KCh1aW50MzJfdClOZXdTdGF0ZSkpICYgKCh1aW50MzJfdCkweDEpKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZW5kcyBDRS1BVEEgY29tbWFuZCAoQ01ENjEpLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiBDRS1BVEEgY29tbWFuZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19TZW5kQ0VBVEFDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogICooX19JTyB1aW50MzJfdCAqKSBDTURfQVRBQ01EX0JCID0gKHVpbnQzMl90KU5ld1N0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU0RJTyBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBTRElPX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFNESU9fRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ1RJTUVPVVQ6IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dA0KICAqICAgICBAYXJnIFNESU9fRkxBR19EVElNRU9VVDogRGF0YSB0aW1lb3V0DQogICogICAgIEBhcmcgU0RJT19GTEFHX1RYVU5ERVJSOiBUcmFuc21pdCBGSUZPIHVuZGVycnVuIGVycm9yDQogICogICAgIEBhcmcgU0RJT19GTEFHX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3INCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpDQogICogICAgIEBhcmcgU0RJT19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZS4NCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfREJDS0VORDogIERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIHBhc3NlZCkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ01EQUNUOiAgIENvbW1hbmQgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfUlhBQ1Q6ICAgIERhdGEgcmVjZWl2ZSBpbiBwcm9ncmVzcw0KICAqICAgICBAYXJnIFNESU9fRkxBR19UWEZJRk9IRTogVHJhbnNtaXQgRklGTyBIYWxmIEVtcHR5DQogICogICAgIEBhcmcgU0RJT19GTEFHX1JYRklGT0hGOiBSZWNlaXZlIEZJRk8gSGFsZiBGdWxsDQogICogICAgIEBhcmcgU0RJT19GTEFHX1RYRklGT0Y6ICBUcmFuc21pdCBGSUZPIGZ1bGwNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfUlhGSUZPRjogIFJlY2VpdmUgRklGTyBmdWxsDQogICogICAgIEBhcmcgU0RJT19GTEFHX1RYRklGT0U6ICBUcmFuc21pdCBGSUZPIGVtcHR5DQogICogICAgIEBhcmcgU0RJT19GTEFHX1JYRklGT0U6ICBSZWNlaXZlIEZJRk8gZW1wdHkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfVFhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHRyYW5zbWl0IEZJRk8NCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTw0KICAqICAgICBAYXJnIFNESU9fRkxBR19TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZA0KICAqICAgICBAYXJnIFNESU9fRkxBR19DRUFUQUVORDogQ0UtQVRBIGNvbW1hbmQgY29tcGxldGlvbiBzaWduYWwgcmVjZWl2ZWQgZm9yIENNRDYxDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFNESU9fRkxBRyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgU0RJT19HZXRGbGFnU3RhdHVzKHVpbnQzMl90IFNESU9fRkxBRykNCnsgDQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0RJT19GTEFHKFNESU9fRkxBRykpOw0KICANCiAgaWYgKChTRElPLT5TVEEgJiBTRElPX0ZMQUcpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgU0RJTydzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBTRElPX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFNESU9fRkxBR19DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfRENSQ0ZBSUw6IERhdGEgYmxvY2sgc2VudC9yZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkNCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ1RJTUVPVVQ6IENvbW1hbmQgcmVzcG9uc2UgdGltZW91dA0KICAqICAgICBAYXJnIFNESU9fRkxBR19EVElNRU9VVDogRGF0YSB0aW1lb3V0DQogICogICAgIEBhcmcgU0RJT19GTEFHX1RYVU5ERVJSOiBUcmFuc21pdCBGSUZPIHVuZGVycnVuIGVycm9yDQogICogICAgIEBhcmcgU0RJT19GTEFHX1JYT1ZFUlI6ICBSZWNlaXZlZCBGSUZPIG92ZXJydW4gZXJyb3INCiAgKiAgICAgQGFyZyBTRElPX0ZMQUdfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpDQogICogICAgIEBhcmcgU0RJT19GTEFHX0NNRFNFTlQ6ICBDb21tYW5kIHNlbnQgKG5vIHJlc3BvbnNlIHJlcXVpcmVkKQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19EQVRBRU5EOiAgRGF0YSBlbmQgKGRhdGEgY291bnRlciwgU0RJRENPVU5ULCBpcyB6ZXJvKQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXMgbW9kZQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKQ0KICAqICAgICBAYXJnIFNESU9fRkxBR19TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZA0KICAqICAgICBAYXJnIFNESU9fRkxBR19DRUFUQUVORDogQ0UtQVRBIGNvbW1hbmQgY29tcGxldGlvbiBzaWduYWwgcmVjZWl2ZWQgZm9yIENNRDYxDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFNESU9fQ2xlYXJGbGFnKHVpbnQzMl90IFNESU9fRkxBRykNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19TRElPX0NMRUFSX0ZMQUcoU0RJT19GTEFHKSk7DQogICANCiAgU0RJTy0+SUNSID0gU0RJT19GTEFHOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU0RJTyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gIFNESU9fSVQ6IHNwZWNpZmllcyB0aGUgU0RJTyBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgU0RJT19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EVElNRU9VVDogRGF0YSB0aW1lb3V0IGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhVTkRFUlI6IFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gZXJyb3IgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EQkNLRU5EOiAgRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgcGFzc2VkKSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NNREFDVDogICBDb21tYW5kIHRyYW5zZmVyIGluIHByb2dyZXNzIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhBQ1Q6ICAgIERhdGEgdHJhbnNtaXQgaW4gcHJvZ3Jlc3MgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9SWEFDVDogICAgRGF0YSByZWNlaXZlIGluIHByb2dyZXNzIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPSEU6IFRyYW5zbWl0IEZJRk8gSGFsZiBFbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1JYRklGT0hGOiBSZWNlaXZlIEZJRk8gSGFsZiBGdWxsIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhGSUZPRjogIFRyYW5zbWl0IEZJRk8gZnVsbCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1JYRklGT0Y6ICBSZWNlaXZlIEZJRk8gZnVsbCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1RYRklGT0U6ICBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfUlhGSUZPRTogIFJlY2VpdmUgRklGTyBlbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1RYREFWTDogICBEYXRhIGF2YWlsYWJsZSBpbiB0cmFuc21pdCBGSUZPIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfUlhEQVZMOiAgIERhdGEgYXZhaWxhYmxlIGluIHJlY2VpdmUgRklGTyBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX1NESU9JVDogICBTRCBJL08gaW50ZXJydXB0IHJlY2VpdmVkIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ0VBVEFFTkQ6IENFLUFUQSBjb21tYW5kIGNvbXBsZXRpb24gc2lnbmFsIHJlY2VpdmVkIGZvciBDTUQ2MSBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgU0RJT19JVCAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCklUU3RhdHVzIFNESU9fR2V0SVRTdGF0dXModWludDMyX3QgU0RJT19JVCkNCnsgDQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fR0VUX0lUKFNESU9fSVQpKTsNCiAgaWYgKChTRElPLT5TVEEgJiBTRElPX0lUKSAhPSAodWludDMyX3QpUkVTRVQpICANCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgU0RJT5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBTRElPX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgU0RJT19JVF9DQ1JDRkFJTDogQ29tbWFuZCByZXNwb25zZSByZWNlaXZlZCAoQ1JDIGNoZWNrIGZhaWxlZCkgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EQ1JDRkFJTDogRGF0YSBibG9jayBzZW50L3JlY2VpdmVkIChDUkMgY2hlY2sgZmFpbGVkKSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NUSU1FT1VUOiBDb21tYW5kIHJlc3BvbnNlIHRpbWVvdXQgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9EVElNRU9VVDogRGF0YSB0aW1lb3V0IGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfVFhVTkRFUlI6IFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gZXJyb3IgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9SWE9WRVJSOiAgUmVjZWl2ZWQgRklGTyBvdmVycnVuIGVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EUkVORDogIENvbW1hbmQgcmVzcG9uc2UgcmVjZWl2ZWQgKENSQyBjaGVjayBwYXNzZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfQ01EU0VOVDogIENvbW1hbmQgc2VudCAobm8gcmVzcG9uc2UgcmVxdWlyZWQpIGludGVycnVwdA0KICAqICAgICBAYXJnIFNESU9fSVRfREFUQUVORDogIERhdGEgZW5kIChkYXRhIGNvdW50ZXIsIFNESURDT1VOVCwgaXMgemVybykgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9TVEJJVEVSUjogU3RhcnQgYml0IG5vdCBkZXRlY3RlZCBvbiBhbGwgZGF0YSBzaWduYWxzIGluIHdpZGUgDQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1vZGUgaW50ZXJydXB0DQogICogICAgIEBhcmcgU0RJT19JVF9TRElPSVQ6ICAgU0QgSS9PIGludGVycnVwdCByZWNlaXZlZCBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBTRElPX0lUX0NFQVRBRU5EOiBDRS1BVEEgY29tbWFuZCBjb21wbGV0aW9uIHNpZ25hbCByZWNlaXZlZCBmb3IgQ01ENjENCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU0RJT19DbGVhcklUUGVuZGluZ0JpdCh1aW50MzJfdCBTRElPX0lUKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1NESU9fQ0xFQVJfSVQoU0RJT19JVCkpOw0KICAgDQogIFNESU8tPklDUiA9IFNESU9fSVQ7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=