LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICBzdG0zMmYxMHhfZnNtYy5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiAgVjMuMC4wDQogICogQGRhdGUgIDA0LzA2LzIwMDkNCiAgKiBAYnJpZWYgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIEZTTUMgZmlybXdhcmUgZnVuY3Rpb25zLg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAY29weQ0KICAqDQogICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQogICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCiAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQogICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCiAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMDkgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X2ZzbWMuaCINCiNpbmNsdWRlICJzdG0zMmYxMHhfcmNjLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTdGRQZXJpcGhfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBGU01DIA0KICAqIEBicmllZiBGU01DIGRyaXZlciBtb2R1bGVzDQogICogQHsNCiAgKi8gDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCiAgKiBAew0KICAqLyANCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX0RlZmluZXMNCiAgKiBAew0KICAqLw0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRlNNQyByZWdpc3RlcnMgYml0IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiBGU01DIEJDUnggTWFzayAqLw0KI2RlZmluZSBCQ1JfTUJLRU5fU2V0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDEpDQojZGVmaW5lIEJDUl9NQktFTl9SZXNldCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBGRkZGRSkNCiNkZWZpbmUgQkNSX0ZBQ0NFTl9TZXQgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KDQovKiBGU01DIFBDUnggTWFzayAqLw0KI2RlZmluZSBQQ1JfUEJLRU5fU2V0ICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwMDAwMDQpDQojZGVmaW5lIFBDUl9QQktFTl9SZXNldCAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDBGRkZGQikNCiNkZWZpbmUgUENSX0VDQ0VOX1NldCAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkweDAwMDAwMDQwKQ0KI2RlZmluZSBQQ1JfRUNDRU5fUmVzZXQgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KTB4MDAwRkZGQkYpDQojZGVmaW5lIFBDUl9NZW1vcnlUeXBlX05BTkQgICAgICAgICAgICAgICAgICgodWludDMyX3QpMHgwMDAwMDAwOCkNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX01hY3Jvcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX0Z1bmN0aW9uUHJvdG90eXBlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRlNNQ19Qcml2YXRlX0Z1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBOT1IvU1JBTSBCYW5rcyByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCANCiAgKiAgIHJlc2V0IHZhbHVlcy4NCiAgKiBAcGFyYW0gRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMTogRlNNQyBCYW5rMSBOT1IvU1JBTTEgIA0KICAqIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMjogRlNNQyBCYW5rMSBOT1IvU1JBTTIgDQogICogQGFyZyBGU01DX0JhbmsxX05PUlNSQU0zOiBGU01DIEJhbmsxIE5PUi9TUkFNMyANCiAgKiBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTQ6IEZTTUMgQmFuazEgTk9SL1NSQU00IA0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfTk9SU1JBTURlSW5pdCh1aW50MzJfdCBGU01DX0JhbmspDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTk9SU1JBTV9CQU5LKEZTTUNfQmFuaykpOw0KICANCiAgLyogRlNNQ19CYW5rMV9OT1JTUkFNMSAqLw0KICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMV9OT1JTUkFNMSkNCiAgew0KICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSA9IDB4MDAwMDMwREI7ICAgIA0KICB9DQogIC8qIEZTTUNfQmFuazFfTk9SU1JBTTIsICBGU01DX0JhbmsxX05PUlNSQU0zIG9yIEZTTUNfQmFuazFfTk9SU1JBTTQgKi8NCiAgZWxzZQ0KICB7ICAgDQogICAgRlNNQ19CYW5rMS0+QlRDUltGU01DX0JhbmtdID0gMHgwMDAwMzBEMjsgDQogIH0NCiAgRlNNQ19CYW5rMS0+QlRDUltGU01DX0JhbmsgKyAxXSA9IDB4MEZGRkZGRkY7DQogIEZTTUNfQmFuazFFLT5CV1RSW0ZTTUNfQmFua10gPSAweDBGRkZGRkZGOyAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGVpbml0aWFsaXplcyB0aGUgRlNNQyBOQU5EIEJhbmtzIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IA0KICAqICAgcmVzZXQgdmFsdWVzLg0KICAqIEBwYXJhbSBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EIA0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfTkFORERlSW5pdCh1aW50MzJfdCBGU01DX0JhbmspDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXIgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfQmFuaykpOw0KICANCiAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgew0KICAgIC8qIFNldCB0aGUgRlNNQ19CYW5rMiByZWdpc3RlcnMgdG8gdGhlaXIgcmVzZXQgdmFsdWVzICovDQogICAgRlNNQ19CYW5rMi0+UENSMiA9IDB4MDAwMDAwMTg7DQogICAgRlNNQ19CYW5rMi0+U1IyID0gMHgwMDAwMDA0MDsNCiAgICBGU01DX0JhbmsyLT5QTUVNMiA9IDB4RkNGQ0ZDRkM7DQogICAgRlNNQ19CYW5rMi0+UEFUVDIgPSAweEZDRkNGQ0ZDOyAgDQogIH0NCiAgLyogRlNNQ19CYW5rM19OQU5EICovICANCiAgZWxzZQ0KICB7DQogICAgLyogU2V0IHRoZSBGU01DX0JhbmszIHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMgKi8NCiAgICBGU01DX0JhbmszLT5QQ1IzID0gMHgwMDAwMDAxODsNCiAgICBGU01DX0JhbmszLT5TUjMgPSAweDAwMDAwMDQwOw0KICAgIEZTTUNfQmFuazMtPlBNRU0zID0gMHhGQ0ZDRkNGQzsNCiAgICBGU01DX0JhbmszLT5QQVRUMyA9IDB4RkNGQ0ZDRkM7IA0KICB9ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBGU01DIFBDQ0FSRCBCYW5rIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IA0KICAqICAgcmVzZXQgdmFsdWVzLg0KICAqIEBwYXJhbSAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19QQ0NBUkREZUluaXQodm9pZCkNCnsNCiAgLyogU2V0IHRoZSBGU01DX0Jhbms0IHJlZ2lzdGVycyB0byB0aGVpciByZXNldCB2YWx1ZXMgKi8NCiAgRlNNQ19CYW5rNC0+UENSNCA9IDB4MDAwMDAwMTg7IA0KICBGU01DX0Jhbms0LT5TUjQgPSAweDAwMDAwMDAwOwkNCiAgRlNNQ19CYW5rNC0+UE1FTTQgPSAweEZDRkNGQ0ZDOw0KICBGU01DX0Jhbms0LT5QQVRUNCA9IDB4RkNGQ0ZDRkM7DQogIEZTTUNfQmFuazQtPlBJTzQgPSAweEZDRkNGQ0ZDOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIE5PUi9TUkFNIEJhbmtzIGFjY29yZGluZyB0byB0aGUgDQogICogICBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC4NCiAgKiBAcGFyYW0gRlNNQ19OT1JTUkFNSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBGU01DX05PUlNSQU1Jbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIA0KICAqICAgdGhlIEZTTUMgTk9SL1NSQU0gc3BlY2lmaWVkIEJhbmtzLiAgICAgICAgICAgICAgICAgICAgICAgDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19OT1JTUkFNSW5pdChGU01DX05PUlNSQU1Jbml0VHlwZURlZiogRlNNQ19OT1JTUkFNSW5pdFN0cnVjdCkNCnsgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19GU01DX05PUlNSQU1fQkFOSyhGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTVVYKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfRGF0YUFkZHJlc3NNdXgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTUVNT1JZKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19NRU1PUllfV0lEVEgoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQlVSU1RNT0RFKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQnVyc3RBY2Nlc3NNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1dBSVRfUE9MQVJJVFkoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsUG9sYXJpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV1JBUF9NT0RFKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JhcE1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9TSUdOQUxfQUNUSVZFKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbEFjdGl2ZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XUklURV9PUEVSQVRJT04oRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZU9wZXJhdGlvbikpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlURV9TSUdOQUwoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0VYVEVOREVEX01PREUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19FeHRlbmRlZE1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV1JJVEVfQlVSU1QoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZUJ1cnN0KSk7ICANCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUREUkVTU19TRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUREUkVTU19IT0xEX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0RBVEFTRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfVFVSTkFST1VORF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0J1c1R1cm5Bcm91bmREdXJhdGlvbikpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19DTEtfRElWKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0RBVEFfTEFURU5DWShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BQ0NFU1NfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BY2Nlc3NNb2RlKSk7IA0KICANCiAgLyogQmFuazEgTk9SL1NSQU0gY29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uICovIA0KICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFua10gPSANCiAgICAgICAgICAgICh1aW50MzJfdClGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0RhdGFBZGRyZXNzTXV4IHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0J1cnN0QWNjZXNzTW9kZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxQb2xhcml0eSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyYXBNb2RlIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbEFjdGl2ZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlT3BlcmF0aW9uIHwNCiAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV2FpdFNpZ25hbCB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSB8DQogICAgICAgICAgICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlQnVyc3Q7DQogIGlmKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfTWVtb3J5VHlwZSA9PSBGU01DX01lbW9yeVR5cGVfTk9SKQ0KICB7DQogICAgRlNNQ19CYW5rMS0+QlRDUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdIHw9ICh1aW50MzJfdClCQ1JfRkFDQ0VOX1NldDsNCiAgfQ0KICAvKiBCYW5rMSBOT1IvU1JBTSB0aW1pbmcgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAqLw0KICBGU01DX0JhbmsxLT5CVENSW0ZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfQmFuaysxXSA9IA0KICAgICAgICAgICAgKHVpbnQzMl90KUZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgfA0KICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NIb2xkVGltZSA8PCA0KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YVNldHVwVGltZSA8PCA4KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQnVzVHVybkFyb3VuZER1cmF0aW9uIDw8IDE2KSB8DQogICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCiAgICAgICAgICAgIChGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSA8PCAyNCkgfA0KICAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0FjY2Vzc01vZGU7DQogICAgICAgICAgICANCiAgICANCiAgLyogQmFuazEgTk9SL1NSQU0gdGltaW5nIHJlZ2lzdGVyIGZvciB3cml0ZSBjb25maWd1cmF0aW9uLCBpZiBleHRlbmRlZCBtb2RlIGlzIHVzZWQgKi8NCiAgaWYoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19FeHRlbmRlZE1vZGUgPT0gRlNNQ19FeHRlbmRlZE1vZGVfRW5hYmxlKQ0KICB7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQUREUkVTU19TRVRVUF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc1NldHVwVGltZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19GU01DX0FERFJFU1NfSE9MRF9USU1FKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWRkcmVzc0hvbGRUaW1lKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQVNFVFVQX1RJTUUoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfQ0xLX0RJVihGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfREFUQV9MQVRFTkNZKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19BQ0NFU1NfTU9ERShGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FjY2Vzc01vZGUpKTsNCiAgICBGU01DX0JhbmsxRS0+QldUUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gDQogICAgICAgICAgICAgICh1aW50MzJfdClGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NTZXR1cFRpbWUgfA0KICAgICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUgPDwgNCApfA0KICAgICAgICAgICAgICAoRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPDwgMjApIHwNCiAgICAgICAgICAgICAgKEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kgPDwgMjQpIHwNCiAgICAgICAgICAgICAgIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBGU01DX0JhbmsxRS0+QldUUltGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0JhbmtdID0gMHgwRkZGRkZGRjsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIE5BTkQgQmFua3MgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBGU01DX05BTkRJbml0U3RydWN0Lg0KICAqIEBwYXJhbSBGU01DX05BTkRJbml0U3RydWN0IDogcG9pbnRlciB0byBhIEZTTUNfTkFOREluaXRUeXBlRGVmIA0KICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIA0KICAqICAgdGhlIEZTTUMgTkFORCBzcGVjaWZpZWQgQmFua3MuICAgICAgICAgICAgICAgICAgICAgICANCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05BTkRJbml0KEZTTUNfTkFOREluaXRUeXBlRGVmKiBGU01DX05BTkRJbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXBwY3IgPSAweDAwMDAwMDAwLCB0bXBwbWVtID0gMHgwMDAwMDAwMCwgdG1wcGF0dCA9IDB4MDAwMDAwMDA7IA0KICAgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfV0FJVF9GRUFUVVJFKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfV2FpdGZlYXR1cmUpKTsNCiAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX0RBVEFfV0lEVEgoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGgpKTsNCiAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX0VDQ19TVEFURShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQykpOw0KICBhc3NlcnRfcGFyYW0oIElTX0ZTTUNfRUNDUEFHRV9TSVpFKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfRUNDUGFnZVNpemUpKTsNCiAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX1RDTFJfVElNRShGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1RDTFJTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKCBJU19GU01DX1RBUl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19IT0xEX1RJTUUoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lKSk7DQogIA0KICAvKiBTZXQgdGhlIHRtcHBjciB2YWx1ZSBhY2NvcmRpbmcgdG8gRlNNQ19OQU5ESW5pdFN0cnVjdCBwYXJhbWV0ZXJzICovDQogIHRtcHBjciA9ICh1aW50MzJfdClGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlIHwNCiAgICAgICAgICAgIFBDUl9NZW1vcnlUeXBlX05BTkQgfA0KICAgICAgICAgICAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggfA0KICAgICAgICAgICAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19FQ0MgfA0KICAgICAgICAgICAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19FQ0NQYWdlU2l6ZSB8DQogICAgICAgICAgICAoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19UQ0xSU2V0dXBUaW1lIDw8IDkgKXwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1RBUlNldHVwVGltZSA8PCAxMyk7DQogICAgICAgICAgICANCiAgLyogU2V0IHRtcHBtZW0gdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3R1cmUgcGFyYW1ldGVycyAqLw0KICB0bXBwbWVtID0gKHVpbnQzMl90KUZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lIHwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPDwgOCkgfA0KICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA8PCAxNil8DQogICAgICAgICAgICAoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPDwgMjQpOyANCiAgICAgICAgICAgIA0KICAvKiBTZXQgdG1wcGF0dCB2YWx1ZSBhY2NvcmRpbmcgdG8gRlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdHVyZSBwYXJhbWV0ZXJzICovDQogIHRtcHBhdHQgPSAodWludDMyX3QpRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgfA0KICAgICAgICAgICAgKEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA8PCA4KSB8DQogICAgICAgICAgICAoRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lIDw8IDE2KXwNCiAgICAgICAgICAgIChGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA8PCAyNCk7DQogIA0KICBpZihGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICB7DQogICAgLyogRlNNQ19CYW5rMl9OQU5EIHJlZ2lzdGVycyBjb25maWd1cmF0aW9uICovDQogICAgRlNNQ19CYW5rMi0+UENSMiA9IHRtcHBjcjsNCiAgICBGU01DX0JhbmsyLT5QTUVNMiA9IHRtcHBtZW07DQogICAgRlNNQ19CYW5rMi0+UEFUVDIgPSB0bXBwYXR0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEZTTUNfQmFuazNfTkFORCByZWdpc3RlcnMgY29uZmlndXJhdGlvbiAqLw0KICAgIEZTTUNfQmFuazMtPlBDUjMgPSB0bXBwY3I7DQogICAgRlNNQ19CYW5rMy0+UE1FTTMgPSB0bXBwbWVtOw0KICAgIEZTTUNfQmFuazMtPlBBVFQzID0gdG1wcGF0dDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBGU01DIFBDQ0FSRCBCYW5rIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgRlNNQ19QQ0NBUkRJbml0U3RydWN0Lg0KICAqIEBwYXJhbSBGU01DX1BDQ0FSREluaXRTdHJ1Y3QgOiBwb2ludGVyIHRvIGEgRlNNQ19QQ0NBUkRJbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIA0KICAqICAgdGhlIEZTTUMgUENDQVJEIEJhbmsuICAgICAgICAgICAgICAgICAgICAgICANCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGU01DX1BDQ0FSREluaXQoRlNNQ19QQ0NBUkRJbml0VHlwZURlZiogRlNNQ19QQ0NBUkRJbml0U3RydWN0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX0ZFQVRVUkUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX1RDTFJfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19UQVJfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lKSk7DQogDQogIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCiAgDQogIGFzc2VydF9wYXJhbShJU19GU01DX1NFVFVQX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19XQUlUX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lKSk7DQogIGFzc2VydF9wYXJhbShJU19GU01DX0hJWl9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfU0VUVVBfVElNRShGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfV0FJVF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSE9MRF9USU1FKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSElaX1RJTUUoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lKSk7DQogIA0KICAvKiBTZXQgdGhlIFBDUjQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfUENDQVJESW5pdFN0cnVjdCBwYXJhbWV0ZXJzICovDQogIEZTTUNfQmFuazQtPlBDUjQgPSAodWludDMyX3QpRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlIHwNCiAgICAgICAgICAgICAgICAgICAgIEZTTUNfTWVtb3J5RGF0YVdpZHRoXzE2YiB8ICANCiAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSA8PCA5KSB8DQogICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1RBUlNldHVwVGltZSA8PCAxMyk7DQogICAgICAgICAgICANCiAgLyogU2V0IFBNRU00IHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyB0byBGU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCiAgRlNNQ19CYW5rNC0+UE1FTTQgPSAodWludDMyX3QpRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSB8DQogICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KICAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lIDw8IDI0KTsgDQogICAgICAgICAgICANCiAgLyogU2V0IFBBVFQ0IHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyB0byBGU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0dXJlIHBhcmFtZXRlcnMgKi8NCiAgRlNNQ19CYW5rNC0+UEFUVDQgPSAodWludDMyX3QpRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSB8DQogICAgICAgICAgICAgICAgICAgICAgKEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgICAgICAgICAgICAoRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPDwgMTYpfA0KICAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lIDw8IDI0KTsJDQogICAgICAgICAgICANCiAgLyogU2V0IFBJTzQgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIHRvIEZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdHVyZSBwYXJhbWV0ZXJzICovDQogIEZTTUNfQmFuazQtPlBJTzQgPSAodWludDMyX3QpRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfU2V0dXBUaW1lIHwNCiAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lIDw8IDgpIHwNCiAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lIDw8IDE2KXwNCiAgICAgICAgICAgICAgICAgICAgIChGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19IaVpTZXR1cFRpbWUgPDwgMjQpOyAgICAgICAgICAgICANCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBGU01DX05PUlNSQU1Jbml0VHlwZURlZiANCiAgKiAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfTk9SU1JBTVN0cnVjdEluaXQoRlNNQ19OT1JTUkFNSW5pdFR5cGVEZWYqIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QpDQp7ICANCiAgLyogUmVzZXQgTk9SL1NSQU0gSW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19CYW5rID0gRlNNQ19CYW5rMV9OT1JTUkFNMTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19EYXRhQWRkcmVzc011eCA9IEZTTUNfRGF0YUFkZHJlc3NNdXhfRW5hYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX01lbW9yeVR5cGUgPSBGU01DX01lbW9yeVR5cGVfU1JBTTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19NZW1vcnlEYXRhV2lkdGggPSBGU01DX01lbW9yeURhdGFXaWR0aF84YjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19CdXJzdEFjY2Vzc01vZGUgPSBGU01DX0J1cnN0QWNjZXNzTW9kZV9EaXNhYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWxQb2xhcml0eSA9IEZTTUNfV2FpdFNpZ25hbFBvbGFyaXR5X0xvdzsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XcmFwTW9kZSA9IEZTTUNfV3JhcE1vZGVfRGlzYWJsZTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19XYWl0U2lnbmFsQWN0aXZlID0gRlNNQ19XYWl0U2lnbmFsQWN0aXZlX0JlZm9yZVdhaXRTdGF0ZTsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZU9wZXJhdGlvbiA9IEZTTUNfV3JpdGVPcGVyYXRpb25fRW5hYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dhaXRTaWduYWwgPSBGU01DX1dhaXRTaWduYWxfRW5hYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX0V4dGVuZGVkTW9kZSA9IEZTTUNfRXh0ZW5kZWRNb2RlX0Rpc2FibGU7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVCdXJzdCA9IEZTTUNfV3JpdGVCdXJzdF9EaXNhYmxlOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzU2V0dXBUaW1lID0gMHhGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzSG9sZFRpbWUgPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0RhdGFTZXR1cFRpbWUgPSAweEZGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb24gPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfUmVhZFdyaXRlVGltaW5nU3RydWN0LT5GU01DX0NMS0RpdmlzaW9uID0gMHhGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1JlYWRXcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhTGF0ZW5jeSA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19SZWFkV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZSA9IEZTTUNfQWNjZXNzTW9kZV9BOyANCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19BZGRyZXNzU2V0dXBUaW1lID0gMHhGOw0KICBGU01DX05PUlNSQU1Jbml0U3RydWN0LT5GU01DX1dyaXRlVGltaW5nU3RydWN0LT5GU01DX0FkZHJlc3NIb2xkVGltZSA9IDB4RjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19EYXRhU2V0dXBUaW1lID0gMHhGRjsNCiAgRlNNQ19OT1JTUkFNSW5pdFN0cnVjdC0+RlNNQ19Xcml0ZVRpbWluZ1N0cnVjdC0+RlNNQ19CdXNUdXJuQXJvdW5kRHVyYXRpb24gPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQ0xLRGl2aXNpb24gPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfRGF0YUxhdGVuY3kgPSAweEY7DQogIEZTTUNfTk9SU1JBTUluaXRTdHJ1Y3QtPkZTTUNfV3JpdGVUaW1pbmdTdHJ1Y3QtPkZTTUNfQWNjZXNzTW9kZSA9IEZTTUNfQWNjZXNzTW9kZV9BOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggRlNNQ19OQU5ESW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiAgKiBAcGFyYW0gRlNNQ19OQU5ESW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEZTTUNfTkFOREluaXRUeXBlRGVmIA0KICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19OQU5EU3RydWN0SW5pdChGU01DX05BTkRJbml0VHlwZURlZiogRlNNQ19OQU5ESW5pdFN0cnVjdCkNCnsgDQogIC8qIFJlc2V0IE5BTkQgSW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19CYW5rID0gRlNNQ19CYW5rMl9OQU5EOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlID0gRlNNQ19XYWl0ZmVhdHVyZV9EaXNhYmxlOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX01lbW9yeURhdGFXaWR0aCA9IEZTTUNfTWVtb3J5RGF0YVdpZHRoXzhiOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0VDQyA9IEZTTUNfRUNDX0Rpc2FibGU7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfRUNDUGFnZVNpemUgPSBGU01DX0VDQ1BhZ2VTaXplXzI1NkJ5dGVzOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX1RDTFJTZXR1cFRpbWUgPSAweDA7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfVEFSU2V0dXBUaW1lID0gMHgwOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfV2FpdFNldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSG9sZFNldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfTkFOREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19OQU5ESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19TZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX05BTkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hpWlNldHVwVGltZSA9IDB4RkM7CSAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBGU01DX1BDQ0FSREluaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtIEZTTUNfUENDQVJESW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEZTTUNfUENDQVJESW5pdFR5cGVEZWYgDQogICogICBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGU01DX1BDQ0FSRFN0cnVjdEluaXQoRlNNQ19QQ0NBUkRJbml0VHlwZURlZiogRlNNQ19QQ0NBUkRJbml0U3RydWN0KQ0Kew0KICAvKiBSZXNldCBQQ0NBUkQgSW5pdCBzdHJ1Y3R1cmUgcGFyYW1ldGVycyB2YWx1ZXMgKi8NCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1dhaXRmZWF0dXJlID0gRlNNQ19XYWl0ZmVhdHVyZV9EaXNhYmxlOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfVENMUlNldHVwVGltZSA9IDB4MDsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX1RBUlNldHVwVGltZSA9IDB4MDsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19Db21tb25TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0NvbW1vblNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQ29tbW9uU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19BdHRyaWJ1dGVTcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19XYWl0U2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0F0dHJpYnV0ZVNwYWNlVGltaW5nU3RydWN0LT5GU01DX0hvbGRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfQXR0cmlidXRlU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsJDQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1NldHVwVGltZSA9IDB4RkM7DQogIEZTTUNfUENDQVJESW5pdFN0cnVjdC0+RlNNQ19JT1NwYWNlVGltaW5nU3RydWN0LT5GU01DX1dhaXRTZXR1cFRpbWUgPSAweEZDOw0KICBGU01DX1BDQ0FSREluaXRTdHJ1Y3QtPkZTTUNfSU9TcGFjZVRpbWluZ1N0cnVjdC0+RlNNQ19Ib2xkU2V0dXBUaW1lID0gMHhGQzsNCiAgRlNNQ19QQ0NBUkRJbml0U3RydWN0LT5GU01DX0lPU3BhY2VUaW1pbmdTdHJ1Y3QtPkZTTUNfSGlaU2V0dXBUaW1lID0gMHhGQzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgTk9SL1NSQU0gTWVtb3J5IEJhbmsuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTE6IEZTTUMgQmFuazEgTk9SL1NSQU0xICANCiAgKiBAYXJnIEZTTUNfQmFuazFfTk9SU1JBTTI6IEZTTUMgQmFuazEgTk9SL1NSQU0yIA0KICAqIEBhcmcgRlNNQ19CYW5rMV9OT1JTUkFNMzogRlNNQyBCYW5rMSBOT1IvU1JBTTMgDQogICogQGFyZyBGU01DX0JhbmsxX05PUlNSQU00OiBGU01DIEJhbmsxIE5PUi9TUkFNNCANCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQ19CYW5rLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGU01DX05PUlNSQU1DbWQodWludDMyX3QgRlNNQ19CYW5rLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGFzc2VydF9wYXJhbShJU19GU01DX05PUlNSQU1fQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBOT1IvU1JBTSBCYW5rIGJ5IHNldHRpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgQkNSeCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSB8PSBCQ1JfTUJLRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIE5PUi9TUkFNIEJhbmsgYnkgY2xlYXJpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgQkNSeCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazEtPkJUQ1JbRlNNQ19CYW5rXSAmPSBCQ1JfTUJLRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgTkFORCBNZW1vcnkgQmFuay4NCiAgKiBAcGFyYW0gRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQogICogQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqIEBwYXJhbSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBGU01DX0JhbmsuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfTkFORENtZCh1aW50MzJfdCBGU01DX0JhbmssIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBieSBzZXR0aW5nIHRoZSBQQktFTiBiaXQgaW4gdGhlIFBDUnggcmVnaXN0ZXIgKi8NCiAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazItPlBDUjIgfD0gUENSX1BCS0VOX1NldDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazMtPlBDUjMgfD0gUENSX1BCS0VOX1NldDsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgTkFORCBCYW5rIGJ5IGNsZWFyaW5nIHRoZSBQQktFTiBiaXQgaW4gdGhlIFBDUnggcmVnaXN0ZXIgKi8NCiAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICAgIHsNCiAgICAgIEZTTUNfQmFuazItPlBDUjIgJj0gUENSX1BCS0VOX1Jlc2V0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgRlNNQ19CYW5rMy0+UENSMyAmPSBQQ1JfUEJLRU5fUmVzZXQ7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgUENDQVJEIE1lbW9yeSBCYW5rLg0KICAqIEBwYXJhbSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBQQ0NBUkQgTWVtb3J5IEJhbmsuICANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19QQ0NBUkRDbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFBDQ0FSRCBCYW5rIGJ5IHNldHRpbmcgdGhlIFBCS0VOIGJpdCBpbiB0aGUgUENSNCByZWdpc3RlciAqLw0KICAgIEZTTUNfQmFuazQtPlBDUjQgfD0gUENSX1BCS0VOX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBQQ0NBUkQgQmFuayBieSBjbGVhcmluZyB0aGUgUEJLRU4gYml0IGluIHRoZSBQQ1I0IHJlZ2lzdGVyICovDQogICAgRlNNQ19CYW5rNC0+UENSNCAmPSBQQ1JfUEJLRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBGU01DIE5BTkQgRUNDIGZlYXR1cmUuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRlNNQyBOQU5EIEVDQyBmZWF0dXJlLiAgDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfTkFOREVDQ0NtZCh1aW50MzJfdCBGU01DX0JhbmssIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfTkFORF9CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBFQ0MgZnVuY3Rpb24gYnkgc2V0dGluZyB0aGUgRUNDRU4gYml0IGluIHRoZSBQQ1J4IHJlZ2lzdGVyICovDQogICAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmsyLT5QQ1IyIHw9IFBDUl9FQ0NFTl9TZXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5QQ1IzIHw9IFBDUl9FQ0NFTl9TZXQ7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIE5BTkQgQmFuayBFQ0MgZnVuY3Rpb24gYnkgY2xlYXJpbmcgdGhlIEVDQ0VOIGJpdCBpbiB0aGUgUENSeCByZWdpc3RlciAqLw0KICAgIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogICAgew0KICAgICAgRlNNQ19CYW5rMi0+UENSMiAmPSBQQ1JfRUNDRU5fUmVzZXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5QQ1IzICY9IFBDUl9FQ0NFTl9SZXNldDsNCiAgICB9DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBlcnJvciBjb3JyZWN0aW9uIGNvZGUgcmVnaXN0ZXIgdmFsdWUuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAcmV0dmFsIDogVGhlIEVycm9yIENvcnJlY3Rpb24gQ29kZSAoRUNDKSB2YWx1ZS4NCiAgKi8NCnVpbnQzMl90IEZTTUNfR2V0RUNDKHVpbnQzMl90IEZTTUNfQmFuaykNCnsNCiAgdWludDMyX3QgZWNjdmFsID0gMHgwMDAwMDAwMDsNCiAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICAvKiBHZXQgdGhlIEVDQ1IyIHJlZ2lzdGVyIHZhbHVlICovDQogICAgZWNjdmFsID0gRlNNQ19CYW5rMi0+RUNDUjI7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogR2V0IHRoZSBFQ0NSMyByZWdpc3RlciB2YWx1ZSAqLw0KICAgIGVjY3ZhbCA9IEZTTUNfQmFuazMtPkVDQ1IzOw0KICB9DQogIC8qIFJldHVybiB0aGUgZXJyb3IgY29ycmVjdGlvbiBjb2RlIHZhbHVlICovDQogIHJldHVybihlY2N2YWwpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBGU01DIGludGVycnVwdHMuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KICAqIEBwYXJhbSBGU01DX0lUOiBzcGVjaWZpZXMgdGhlIEZTTUMgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUNCiAgKiAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRlNNQ19JVF9SaXNpbmdFZGdlOiBSaXNpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0LiANCiAgKiBAYXJnIEZTTUNfSVRfTGV2ZWw6IExldmVsIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4NCiAgKiBAYXJnIEZTTUNfSVRfRmFsbGluZ0VkZ2U6IEZhbGxpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KICAqIEBwYXJhbSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgRlNNQyBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIDogTm9uZQ0KICAqLw0Kdm9pZCBGU01DX0lUQ29uZmlnKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVF9CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVChGU01DX0lUKSk7CQ0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEZTTUNfQmFuazIgaW50ZXJydXB0cyAqLw0KICAgIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogICAgew0KICAgICAgRlNNQ19CYW5rMi0+U1IyIHw9IEZTTUNfSVQ7DQogICAgfQ0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rMyBpbnRlcnJ1cHRzICovDQogICAgZWxzZSBpZiAoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5TUjMgfD0gRlNNQ19JVDsNCiAgICB9DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBGU01DX0Jhbms0IGludGVycnVwdHMgKi8NCiAgICBlbHNlDQogICAgew0KICAgICAgRlNNQ19CYW5rNC0+U1I0IHw9IEZTTUNfSVQ7ICAgIA0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGU01DX0JhbmsyIGludGVycnVwdHMgKi8NCiAgICBpZihGU01DX0JhbmsgPT0gRlNNQ19CYW5rMl9OQU5EKQ0KICAgIHsNCiAgICAgIA0KICAgICAgRlNNQ19CYW5rMi0+U1IyICY9ICh1aW50MzJfdCl+RlNNQ19JVDsNCiAgICB9DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgRlNNQ19CYW5rMyBpbnRlcnJ1cHRzICovDQogICAgZWxzZSBpZiAoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgICB7DQogICAgICBGU01DX0JhbmszLT5TUjMgJj0gKHVpbnQzMl90KX5GU01DX0lUOw0KICAgIH0NCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBGU01DX0Jhbms0IGludGVycnVwdHMgKi8NCiAgICBlbHNlDQogICAgew0KICAgICAgRlNNQ19CYW5rNC0+U1I0ICY9ICh1aW50MzJfdCl+RlNNQ19JVDsgICAgDQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBGU01DIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiAgKiBAcGFyYW0gRlNNQ19CYW5rOiBzcGVjaWZpZXMgdGhlIEZTTUMgQmFuayB0byBiZSB1c2VkDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRlNNQ19CYW5rMl9OQU5EOiBGU01DIEJhbmsyIE5BTkQgDQogICogQGFyZyBGU01DX0JhbmszX05BTkQ6IEZTTUMgQmFuazMgTkFORA0KICAqIEBhcmcgRlNNQ19CYW5rNF9QQ0NBUkQ6IEZTTUMgQmFuazQgUENDQVJEDQogICogQHBhcmFtIEZTTUNfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfRkxBR19SaXNpbmdFZGdlOiBSaXNpbmcgZWdkZSBkZXRlY3Rpb24gRmxhZy4NCiAgKiBAYXJnIEZTTUNfRkxBR19MZXZlbDogTGV2ZWwgZGV0ZWN0aW9uIEZsYWcuDQogICogQGFyZyBGU01DX0ZMQUdfRmFsbGluZ0VkZ2U6IEZhbGxpbmcgZWdkZSBkZXRlY3Rpb24gRmxhZy4NCiAgKiBAYXJnIEZTTUNfRkxBR19GRU1QVDogRmlmbyBlbXB0eSBGbGFnLiANCiAgKiBAcmV0dmFsIDogVGhlIG5ldyBzdGF0ZSBvZiBGU01DX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIEZTTUNfR2V0RmxhZ1N0YXR1cyh1aW50MzJfdCBGU01DX0JhbmssIHVpbnQzMl90IEZTTUNfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgdWludDMyX3QgdG1wc3IgPSAweDAwMDAwMDAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfR0VURkxBR19CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19HRVRfRkxBRyhGU01DX0ZMQUcpKTsNCiAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICB0bXBzciA9IEZTTUNfQmFuazItPlNSMjsNCiAgfSAgDQogIGVsc2UgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgew0KICAgIHRtcHNyID0gRlNNQ19CYW5rMy0+U1IzOw0KICB9DQogIC8qIEZTTUNfQmFuazRfUENDQVJEKi8NCiAgZWxzZQ0KICB7DQogICAgdG1wc3IgPSBGU01DX0Jhbms0LT5TUjQ7DQogIH0gDQogIA0KICAvKiBHZXQgdGhlIGZsYWcgc3RhdHVzICovDQogIGlmICgodG1wc3IgJiBGU01DX0ZMQUcpICE9ICh1aW50MTZfdClSRVNFVCApDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBmbGFnIHN0YXR1cyAqLw0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgRlNNQ5JzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KICAqIEBwYXJhbSBGU01DX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBGU01DX0ZMQUdfUmlzaW5nRWRnZTogUmlzaW5nIGVnZGUgZGV0ZWN0aW9uIEZsYWcuDQogICogQGFyZyBGU01DX0ZMQUdfTGV2ZWw6IExldmVsIGRldGVjdGlvbiBGbGFnLg0KICAqIEBhcmcgRlNNQ19GTEFHX0ZhbGxpbmdFZGdlOiBGYWxsaW5nIGVnZGUgZGV0ZWN0aW9uIEZsYWcuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgRlNNQ19DbGVhckZsYWcodWludDMyX3QgRlNNQ19CYW5rLCB1aW50MzJfdCBGU01DX0ZMQUcpDQp7DQogLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfR0VURkxBR19CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19DTEVBUl9GTEFHKEZTTUNfRkxBRykpIDsNCiAgICANCiAgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazJfTkFORCkNCiAgew0KICAgIEZTTUNfQmFuazItPlNSMiAmPSB+RlNNQ19GTEFHOyANCiAgfSAgDQogIGVsc2UgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgew0KICAgIEZTTUNfQmFuazMtPlNSMyAmPSB+RlNNQ19GTEFHOw0KICB9DQogIC8qIEZTTUNfQmFuazRfUENDQVJEKi8NCiAgZWxzZQ0KICB7DQogICAgRlNNQ19CYW5rNC0+U1I0ICY9IH5GU01DX0ZMQUc7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEZTTUMgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQogICogQHBhcmFtIEZTTUNfQmFuazogc3BlY2lmaWVzIHRoZSBGU01DIEJhbmsgdG8gYmUgdXNlZA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiBAYXJnIEZTTUNfQmFuazJfTkFORDogRlNNQyBCYW5rMiBOQU5EIA0KICAqIEBhcmcgRlNNQ19CYW5rM19OQU5EOiBGU01DIEJhbmszIE5BTkQNCiAgKiBAYXJnIEZTTUNfQmFuazRfUENDQVJEOiBGU01DIEJhbms0IFBDQ0FSRA0KICAqIEBwYXJhbSBGU01DX0lUOiBzcGVjaWZpZXMgdGhlIEZTTUMgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBGU01DX0lUX1Jpc2luZ0VkZ2U6IFJpc2luZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuIA0KICAqIEBhcmcgRlNNQ19JVF9MZXZlbDogTGV2ZWwgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KICAqIEBhcmcgRlNNQ19JVF9GYWxsaW5nRWRnZTogRmFsbGluZyBlZGdlIGRldGVjdGlvbiBpbnRlcnJ1cHQuIA0KICAqIEByZXR2YWwgOiBUaGUgbmV3IHN0YXRlIG9mIEZTTUNfSVQgKFNFVCBvciBSRVNFVCkuDQogICovDQpJVFN0YXR1cyBGU01DX0dldElUU3RhdHVzKHVpbnQzMl90IEZTTUNfQmFuaywgdWludDMyX3QgRlNNQ19JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIHVpbnQzMl90IHRtcHNyID0gMHgwLCBpdHN0YXR1cyA9IDB4MCwgaXRlbmFibGUgPSAweDA7IA0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfSVRfQkFOSyhGU01DX0JhbmspKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZTTUNfR0VUX0lUKEZTTUNfSVQpKTsNCiAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICB0bXBzciA9IEZTTUNfQmFuazItPlNSMjsNCiAgfSAgDQogIGVsc2UgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgew0KICAgIHRtcHNyID0gRlNNQ19CYW5rMy0+U1IzOw0KICB9DQogIC8qIEZTTUNfQmFuazRfUENDQVJEKi8NCiAgZWxzZQ0KICB7DQogICAgdG1wc3IgPSBGU01DX0Jhbms0LT5TUjQ7DQogIH0gDQogIA0KICBpdHN0YXR1cyA9IHRtcHNyICYgRlNNQ19JVDsNCiAgDQogIGl0ZW5hYmxlID0gdG1wc3IgJiAoRlNNQ19JVCA+PiAzKTsNCiAgaWYgKChpdHN0YXR1cyAhPSAodWludDMyX3QpUkVTRVQpICAmJiAoaXRlbmFibGUgIT0gKHVpbnQzMl90KVJFU0VUKSkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOyANCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIEZTTUOScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KICAqIEBwYXJhbSBGU01DX0Jhbms6IHNwZWNpZmllcyB0aGUgRlNNQyBCYW5rIHRvIGJlIHVzZWQNCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogQGFyZyBGU01DX0JhbmsyX05BTkQ6IEZTTUMgQmFuazIgTkFORCANCiAgKiBAYXJnIEZTTUNfQmFuazNfTkFORDogRlNNQyBCYW5rMyBOQU5EDQogICogQGFyZyBGU01DX0Jhbms0X1BDQ0FSRDogRlNNQyBCYW5rNCBQQ0NBUkQNCiAgKiBAcGFyYW0gRlNNQ19JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqIEBhcmcgRlNNQ19JVF9SaXNpbmdFZGdlOiBSaXNpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0LiANCiAgKiBAYXJnIEZTTUNfSVRfTGV2ZWw6IExldmVsIGVkZ2UgZGV0ZWN0aW9uIGludGVycnVwdC4NCiAgKiBAYXJnIEZTTUNfSVRfRmFsbGluZ0VkZ2U6IEZhbGxpbmcgZWRnZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIEZTTUNfQ2xlYXJJVFBlbmRpbmdCaXQodWludDMyX3QgRlNNQ19CYW5rLCB1aW50MzJfdCBGU01DX0lUKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVF9CQU5LKEZTTUNfQmFuaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlNNQ19JVChGU01DX0lUKSk7DQogICAgDQogIGlmKEZTTUNfQmFuayA9PSBGU01DX0JhbmsyX05BTkQpDQogIHsNCiAgICBGU01DX0JhbmsyLT5TUjIgJj0gfihGU01DX0lUID4+IDMpOyANCiAgfSAgDQogIGVsc2UgaWYoRlNNQ19CYW5rID09IEZTTUNfQmFuazNfTkFORCkNCiAgew0KICAgIEZTTUNfQmFuazMtPlNSMyAmPSB+KEZTTUNfSVQgPj4gMyk7DQogIH0NCiAgLyogRlNNQ19CYW5rNF9QQ0NBUkQqLw0KICBlbHNlDQogIHsNCiAgICBGU01DX0Jhbms0LT5TUjQgJj0gfihGU01DX0lUID4+IDMpOw0KICB9DQp9DQoNCi8qKg0KICAqIEB9DQogICovIA0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDkgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K