LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDR4eF9oYWxfc3dwbWkuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjEuNi4wDQogICogQGRhdGUgICAgMjgtT2N0b2Jlci0yMDE2DQogICogQGJyaWVmICAgU1dQTUkgSEFMIG1vZHVsZSBkcml2ZXIuDQogICogICAgICAgICAgVGhpcyBmaWxlIHByb3ZpZGVzIGZpcm13YXJlIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvbGxvd2luZw0KICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU2luZ2xlIFdpcmUgUHJvdG9jb2wgTWFzdGVyIEludGVyZmFjZSAoU1dQTUkpLg0KICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uDQogICogICAgICAgICAgICsgRGF0YSB0cmFuc2ZlcnMgZnVuY3Rpb25zDQogICogICAgICAgICAgICsgRE1BIHRyYW5zZmVycyBtYW5hZ2VtZW50DQogICogICAgICAgICAgICsgSW50ZXJydXB0cyBhbmQgZmxhZ3MgbWFuYWdlbWVudA0KICBAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICBbLi5dDQogICAgIFRoZSBTV1BNSSBIQUwgZHJpdmVyIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6DQoNCiAgICAoIykgRGVjbGFyZSBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNXUE1JX0hhbmRsZVR5cGVEZWYgaHN3cG1pKS4NCg0KICAgICgjKSBJbml0aWFsaXplIHRoZSBTV1BNSSBsb3cgbGV2ZWwgcmVzb3VyY2VzIGJ5IGltcGxlbWVudGluZyB0aGUgSEFMX1NXUE1JX01zcEluaXQoKSBBUEk6DQogICAgICAgICgjIykgRW5hYmxlIHRoZSBTV1BNSXggaW50ZXJmYWNlIGNsb2NrIHdpdGggX19IQUxfUkNDX1NXUE1JeF9DTEtfRU5BQkxFKCkuDQogICAgICAgICgjIykgU1dQTUkgSU8gY29uZmlndXJhdGlvbjoNCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgY2xvY2sgZm9yIHRoZSBTV1BNSSBHUElPLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFNXUE1JIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuDQogICAgICAgICgjIykgTlZJQyBjb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBpbnRlcnJ1cHQgcHJvY2VzcyAoSEFMX1NXUE1JX1RyYW5zbWl0X0lUKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKSBBUElzKToNCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1dQTUl4IGludGVycnVwdCBwcmlvcml0eSB3aXRoIEhBTF9OVklDX1NldFByaW9yaXR5KCkuDQogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIE5WSUMgU1dQTUkgSVJRIGhhbmRsZSB3aXRoIEhBTF9OVklDX0VuYWJsZUlSUSgpLg0KDQogICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKCkNCiAgICAgICAgICAgICBhbmQgSEFMX1NXUE1JX1JlY2VpdmVfRE1BKCkgQVBJcyk6DQogICAgICAgICAgICAoKysrKSBEZWNsYXJlIGEgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBUeC9SeCBjaGFubmVscy4NCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suDQogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIGRlY2xhcmVkIERNQSBoYW5kbGUgc3RydWN0dXJlIHdpdGggdGhlIHJlcXVpcmVkDQogICAgICAgICAgICAgICAgICBUeC9SeCBwYXJhbWV0ZXJzLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbHMgYW5kIHJlcXVlc3RzLg0KICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBTV1BNSSBETUEgVHgvUnggaGFuZGxlLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBwcmlvcml0eSBhbmQgZW5hYmxlIHRoZSBOVklDIGZvciB0aGUgdHJhbnNmZXIgY29tcGxldGUNCiAgICAgICAgICAgICAgICAgIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWxzLg0KDQogICAgKCMpIFByb2dyYW0gdGhlIEJpdGUgUmF0ZSwgVHggQnVmZmVyaW5nIG1vZGUsIFJ4IEJ1ZmZlcmluZyBtb2RlIGluIHRoZSBJbml0IHN0cnVjdHVyZS4NCg0KICAgICgjKSBFbmFibGUgdGhlIFNXUE1JIHBlcmlwaGVyYWwgYnkgY2FsbGluZyB0aGUgSEFMX1NXUE1JX0luaXQoKSBmdW5jdGlvbi4NCiAgICANCiAgQGVuZHZlcmJhdGltDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBhdHRlbnRpb24NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNiBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqDQogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogICoNCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCiAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQogICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1INCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksDQogICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMybDR4eF9oYWwuaCINCg0KI2lmIGRlZmluZWQoU1RNMzJMNDMxeHgpIHx8IGRlZmluZWQoU1RNMzJMNDMyeHgpIHx8IGRlZmluZWQoU1RNMzJMNDMzeHgpIHx8IGRlZmluZWQoU1RNMzJMNDQyeHgpIHx8IGRlZmluZWQoU1RNMzJMNDQzeHgpIHx8IFwNCiAgICBkZWZpbmVkKFNUTTMyTDQ3MXh4KSB8fCBkZWZpbmVkKFNUTTMyTDQ3NXh4KSB8fCBkZWZpbmVkKFNUTTMyTDQ3Nnh4KSB8fCBkZWZpbmVkKFNUTTMyTDQ4NXh4KSB8fCBkZWZpbmVkKFNUTTMyTDQ4Nnh4KQ0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JIFNXUE1JDQogICogQGJyaWVmIEhBTCBTV1BNSSBtb2R1bGUgZHJpdmVyDQogICogQHsNCiAgKi8NCiNpZmRlZiBIQUxfU1dQTUlfTU9EVUxFX0VOQUJMRUQNCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyoqIEBhZGR0b2dyb3VwIFNXUE1JX1ByaXZhdGVfQ29uc3RhbnRzIFNXUE1JIFByaXZhdGUgQ29uc3RhbnRzDQogICogQHsNCiAgKi8NCiNkZWZpbmUgU1dQTUlfVElNRU9VVF9WQUxVRSAgICAgICAoKHVpbnQzMl90KSAyMjAwMCkNCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogUHJpdmF0ZSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1RyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKTsNCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kUmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFRyYW5zbWl0UmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCBGbGFnLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpOw0KDQovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0Z1bmN0aW9ucyBTV1BNSSBFeHBvcnRlZCBGdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwMSBJbml0aWFsaXphdGlvbi9kZS1pbml0aWFsaXphdGlvbiBtZXRob2RzDQogICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCiAgKg0KQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBTV1BNSSBwZXJpcGhlcmFsLg0KICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIFNXUE1JIHBlcmlwaGVyYWwuDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBJbml0aWFsaXplIHRoZSBTV1BNSSBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIFNXUE1JX0luaXRUeXBlRGVmLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0luaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQogIF9fSU8gdWludDMyX3Qgd2FpdF9sb29wX2luZGV4ID0gMDsNCg0KICAvKiBDaGVjayB0aGUgU1dQTUkgaGFuZGxlIGFsbG9jYXRpb24gKi8NCiAgaWYoaHN3cG1pID09IE5VTEwpDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfVk9MVEFHRV9DTEFTUyhoc3dwbWktPkluaXQuVm9sdGFnZUNsYXNzKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1NXUE1JX0JJVFJBVEVfVkFMVUUoaHN3cG1pLT5Jbml0LkJpdFJhdGUpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfVFhfQlVGRkVSSU5HX01PREUoaHN3cG1pLT5Jbml0LlR4QnVmZmVyaW5nTW9kZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9SWF9CVUZGRVJJTkdfTU9ERShoc3dwbWktPkluaXQuUnhCdWZmZXJpbmdNb2RlKSk7DQoNCiAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRVNFVCkNCiAgICB7DQogICAgICAvKiBBbGxvY2F0ZSBsb2NrIHJlc291cmNlIGFuZCBpbml0aWFsaXplIGl0ICovDQogICAgICBoc3dwbWktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7DQogICAgfQ0KDQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOw0KDQogICAgLyogRGlzYWJsZSBTV1BNSSBpbnRlcmZhY2UgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQoNCiAgICAvKiBDbGVhciBhbGwgU1dQTUkgaW50ZXJmYWNlIGZsYWdzICovDQogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgMHgwMTlGKTsNCg0KICAgIC8qIEFwcGx5IFZvbHRhZ2UgY2xhc3Mgc2VsZWN0aW9uICovDQogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5PUiwgU1dQTUlfT1JfQ0xBU1MsIGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpOw0KDQogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlIDogR1BJTywgQ0xPQ0ssIENPUlRFWCAqLw0KICAgIEhBTF9TV1BNSV9Nc3BJbml0KGhzd3BtaSk7DQoNCiAgICAvKiBJZiBWb2x0YWdlIGNsYXNzIEIsIGFwcGx5IDMwMCC1cyBkZWxheSAqLw0KICAgIGlmKGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MgPT0gU1dQTUlfVk9MVEFHRV9DTEFTU19CKQ0KICAgIHsNCiAgICAgIC8qIEluc3VyZSAzMDAgtXMgd2FpdCB0byBpbnN1cmUgU1dQTUlfSU8gb3V0cHV0IG5vdCBoaWdoZXIgdGhhbiAxLjhWICovDQogICAgICAvKiBXYWl0IGxvb3AgaW5pdGlhbGl6YXRpb24gYW5kIGV4ZWN1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KICAgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSA0IHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5IENQVSBwcm9jZXNzaW5nIGN5Y2xlcy4gKi8NCiAgICAgIHdhaXRfbG9vcF9pbmRleCA9ICgzMDAgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMDAgKiA0KSkpICsgMTUwOw0KICAgICAgd2hpbGUod2FpdF9sb29wX2luZGV4ICE9IDApDQogICAgICB7DQogICAgICAgIHdhaXRfbG9vcF9pbmRleC0tOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8qIENvbmZpZ3VyZSB0aGUgQlJSIHJlZ2lzdGVyIChCaXRyYXRlKSAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5CUlIsIGhzd3BtaS0+SW5pdC5CaXRSYXRlKTsNCg0KICAgIC8qIEFwcGx5IFNXUE1JIENSIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBNT0RJRllfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBcDQogICAgICAgICAgICAgICBTV1BNSV9DUl9SWERNQSB8IFNXUE1JX0NSX1RYRE1BICB8IFNXUE1JX0NSX1JYTU9ERSB8IFNXUE1JX0NSX1RYTU9ERSwgXA0KICAgICAgICAgICAgICAgaHN3cG1pLT5Jbml0LlR4QnVmZmVyaW5nTW9kZSB8IGhzd3BtaS0+SW5pdC5SeEJ1ZmZlcmluZ01vZGUpOw0KDQogICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgLyogRW5hYmxlIFNXUE1JIHBlcmlwaGVyYWwgaWYgbm90ICovDQogICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBEZS1pbml0aWFsaXplIHRoZSBTV1BNSSBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0RlSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICAvKiBDaGVjayB0aGUgU1dQTUkgaGFuZGxlIGFsbG9jYXRpb24gKi8NCiAgaWYoaHN3cG1pID09IE5VTEwpDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfSU5TVEFOQ0UoaHN3cG1pLT5JbnN0YW5jZSkpOw0KDQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOw0KDQogICAgLyogRGlzYWJsZSBTV1BNSSBpbnRlcmZhY2UgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQoNCiAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSAqLw0KICAgIEhBTF9TV1BNSV9Nc3BEZUluaXQoaHN3cG1pKTsNCg0KICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUOw0KDQogICAgLyogUmVsZWFzZSBMb2NrICovDQogICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgTVNQLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX01zcEluaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfTXNwSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmIERlSW5pdGlhbGl6ZSB0aGUgU1dQTUkgTVNQLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX01zcERlSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXAyIElPIG9wZXJhdGlvbiBtZXRob2RzDQogICogIEBicmllZiBTV1BNSSBUcmFuc21pdC9SZWNlaXZlIGZ1bmN0aW9ucw0KICAqDQpAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIG1ldGhvZHMgIyMjIyMNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogWy4uXQ0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBTV1BNSQ0KICAgICBkYXRhIHRyYW5zZmVycy4NCg0KICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOg0KICAgICAgICgrKykgQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIGluIHBvbGxpbmcgbW9kZS4NCiAgICAgICAgICAgIFRoZSBIQUwgc3RhdHVzIG9mIGFsbCBkYXRhIHByb2Nlc3NpbmcgaXMgcmV0dXJuZWQgYnkgdGhlIHNhbWUgZnVuY3Rpb24NCiAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4NCiAgICAgICAoKyspIE5vbi1CbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgdXNpbmcgSW50ZXJydXB0cw0KICAgICAgICAgICBvciBETUEuIFRoZSBlbmQgb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyB3aWxsIGJlIGluZGljYXRlZCB0aHJvdWdoIHRoZQ0KICAgICAgICAgICBkZWRpY2F0ZWQgU1dQTUkgSW50ZXJydXB0IGhhbmRsZXIgKEhBTF9TV1BNSV9JUlFIYW5kbGVyKCkpIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3INCiAgICAgICAgICAgdGhlIHNlbGVjdGVkIERNQSBjaGFubmVsIGludGVycnVwdCBoYW5kbGVyIHdoZW4gdXNpbmcgRE1BIG1vZGUuDQogICAgICAgICAgIFRoZSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKSwgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkgdXNlciBjYWxsYmFja3MNCiAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBwcm9jZXNzLg0KICAgICAgICAgICBUaGUgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKSB1c2VyIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIGNvbW11bmljYXRpb24gZXJyb3IgaXMgZGV0ZWN0ZWQuDQoNCiAgICAoIykgQmxvY2tpbmcgbW9kZSBBUEkncyBhcmU6DQogICAgICAgICgrKykgSEFMX1NXUE1JX1RyYW5zbWl0KCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfUmVjZWl2ZSgpDQoNCiAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJJ3Mgd2l0aCBJbnRlcnJ1cHQgYXJlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UcmFuc21pdF9JVCgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9JUlFIYW5kbGVyKCkNCg0KICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmU6DQogICAgICAgICgrKykgSEFMX1NXUE1JX1RyYW5zbWl0X0RNQSgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmVfRE1BKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BUGF1c2UoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9ETUFSZXN1bWUoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9ETUFTdG9wKCkNCg0KICAgICgjKSBBIHNldCBvZiBUcmFuc2ZlciBDb21wbGV0ZSBDYWxsYmFja3MgYXJlIHByb3ZpZGVkIGluIE5vbi1CbG9ja2luZyBtb2RlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjaygpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpDQoNCiAgICAoIykgVGhlIGNhcGFiaWxpdHkgdG8gbGF1bmNoIHRoZSBhYm92ZSBJTyBvcGVyYXRpb25zIGluIGxvb3BiYWNrIG1vZGUgZm9yIA0KICAgICAgICB1c2VyIGFwcGxpY2F0aW9uIHZlcmlmaWNhdGlvbjogICAgDQogICAgICAgICgrKykgSEFMX1NXUE1JX0VuYWJsZUxvb3BiYWNrKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRGlzYWJsZUxvb3BiYWNrKCkNCiAgICAgICAgDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWk6IHBvaW50ZXIgdG8gYSBTV1BNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNXUE1JIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfVHJhbnNtaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCogcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpDQp7DQogIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDApKQ0KICB7DQogICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkpDQogICAgew0KICAgICAgLyogQ2hlY2sgaWYgYSBub24tYmxvY2tpbmcgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOw0KDQogICAgICAgIC8qIERpc2FibGUgYW55IHRyYW5zbWl0dGVyIGludGVycnVwdHMgKi8NCiAgICAgICAgX19IQUxfU1dQTUlfRElTQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1RDSUUgfCBTV1BNSV9JVF9USUUgfCBTV1BNSV9JVF9UWFVOUklFIHwgU1dQTUlfSVRfVFhCRUlFKTsNCg0KICAgICAgICAvKiBEaXNhYmxlIGFueSB0cmFuc21pdHRlciBmbGFncyAqLw0KICAgICAgICBfX0hBTF9TV1BNSV9DTEVBUl9GTEFHKGhzd3BtaSwgU1dQTUlfRkxBR19UWEJFRiB8IFNXUE1JX0ZMQUdfVFhVTlJGIHwgU1dQTUlfRkxBR19UQ0YpOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIGRvDQogICAgICB7DQogICAgICAgIC8qIFdhaXQgdGhlIFRYRSB0byB3cml0ZSBkYXRhICovDQogICAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgU1dQTUlfRkxBR19UWEUpKQ0KICAgICAgICB7DQogICAgICAgICAgaHN3cG1pLT5JbnN0YW5jZS0+VERSID0gKCpwRGF0YSsrKTsNCiAgICAgICAgICBTaXplLS07DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQogICAgICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIGlmKChUaW1lb3V0ID09IDApIHx8ICgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7DQogICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSB3aGlsZShTaXplICE9IDApOw0KDQogICAgICAvKiBXYWl0IG9uIFRYQkVGIGZsYWcgdG8gYmUgYWJsZSB0byBzdGFydCBhIHNlY29uZCB0cmFuc2ZlciAqLw0KICAgICAgaWYoU1dQTUlfV2FpdE9uRmxhZ1NldFVudGlsVGltZW91dChoc3dwbWksIFNXUE1JX0ZMQUdfVFhCRUYsIHRpY2tzdGFydCwgVGltZW91dCkgIT0gSEFMX09LKQ0KICAgICAgew0KICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsNCiAgICAgIH0NCg0KICAgICAgaWYoc3RhdHVzID09IEhBTF9PSykNCiAgICAgIHsNCiAgICAgICAgLyogQ2hlY2sgaWYgYSBub24tYmxvY2tpbmcgcmVjZWl2ZSBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgICAgIHsNCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQogICAgfQ0KICB9DQoNCiAgaWYoKHN0YXR1cyAhPSBIQUxfT0spICYmIChzdGF0dXMgIT0gSEFMX0JVU1kpKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTV1BNSSBtb2R1bGUuDQogICogQHBhcmFtICBwRGF0YTogUG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KICAqIEBwYXJhbSAgU2l6ZTogQW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQ0Kew0KICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpKQ0KICAgIHsNCiAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQoNCiAgICAgICAgLyogRGlzYWJsZSBhbnkgcmVjZWl2ZXIgaW50ZXJydXB0cyAqLw0KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9TUklFIHwgU1dQTUlfSVRfUklFIHwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIGRvDQogICAgICB7DQogICAgICAgIC8qIFdhaXQgdGhlIFJYTkUgdG8gcmVhZCBkYXRhICovDQogICAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgU1dQTUlfRkxBR19SWE5FKSkNCiAgICAgICAgew0KICAgICAgICAgICgqcERhdGErKykgPSBoc3dwbWktPkluc3RhbmNlLT5SRFI7DQogICAgICAgICAgU2l6ZS0tOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBpZigoVGltZW91dCA9PSAwKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gd2hpbGUoU2l6ZSAhPSAwKTsNCiAgICAgIA0KICAgICAgaWYoc3RhdHVzID09IEhBTF9PSykNCiAgICAgIHsNCiAgICAgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHN3cG1pLT5JbnN0YW5jZS0+SVNSLCBTV1BNSV9GTEFHX1JYQkZGKSkNCiAgICAgICAgew0KICAgICAgICAgIC8qIENsZWFyIFJYQkZGIGF0IGVuZCBvZiByZWNlcHRpb24gKi8NCiAgICAgICAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYQkZGKTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHRyYW5zbWl0IFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkNCiAgICAgICAgew0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgICB9DQogIH0NCg0KICBpZigoc3RhdHVzICE9IEhBTF9PSykgJiYgKHN0YXR1cyAhPSBIQUxfQlVTWSkpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICB9DQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4NCiAgKiBAcGFyYW0gIGhzd3BtaTogcG9pbnRlciB0byBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1dQTUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemU6IEFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9UcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkpDQogICAgew0KICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICAgICAgaHN3cG1pLT5wVHhCdWZmUHRyID0gcERhdGE7DQogICAgICBoc3dwbWktPlR4WGZlclNpemUgPSBTaXplOw0KICAgICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IFNpemU7DQogICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOw0KDQogICAgICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IHVuZGVycnVuIGVycm9yICovDQogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9UWFVOUklFKTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgaW50ZXJydXB0czogICAgICAqLw0KICAgICAgLyogLSBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5ICAgICovDQogICAgICAvKiAtIFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSAgICAgICAgICAgKi8NCiAgICAgIC8qIC0gVHJhbnNtaXQvUmVjZXB0aW9uIGNvbXBsZXRpb24gICAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhCRUlFIHwgU1dQTUlfSVRfVENJRSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBzdGF0dXMgPSAgSEFMX0JVU1k7DQogICAgICANCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggaW50ZXJydXB0Lg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEBwYXJhbSBwRGF0YTogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KICAqIEBwYXJhbSBTaXplOiBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1JlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDApKQ0KICB7DQogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgICAgIGhzd3BtaS0+cFJ4QnVmZlB0ciA9IHBEYXRhOw0KICAgICAgaHN3cG1pLT5SeFhmZXJTaXplID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+UnhYZmVyQ291bnQgPSBTaXplOw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCg0KICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHNsYXZlIHJlc3VtZSAqLw0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSBEYXRhIFJlZ2lzdGVyIG5vdCBlbXB0eSBJbnRlcnJ1cHQsIHJlY2VpdmUgQ1JDIEVycm9yLCByZWNlaXZlIG92ZXJydW4gYW5kIFJ4QnVmIEludGVycnVwdCAqLw0KICAgICAgLyogIEVuYWJsZSB0aGUgU1dQTUkgVHJhbnNtaXQvUmVjZXB0aW9uIGNvbXBsZXRpb24gICAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfUklFIHwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQogICAgICANCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBpbnRlcnJ1cHQuDQogICogQHBhcmFtIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHBhcmFtIHBEYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtIFNpemU6IGFtb3VudCBvZiBkYXRhIHRvIGJlIHNlbnQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9UcmFuc21pdF9ETUEoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDApKQ0KICB7DQogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlgpKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgICAgIGhzd3BtaS0+cFR4QnVmZlB0ciA9IHBEYXRhOw0KICAgICAgaHN3cG1pLT5UeFhmZXJTaXplID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+VHhYZmVyQ291bnQgPSBTaXplOw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCg0KICAgICAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQoNCiAgICAgICAgLyogRW5hYmxlIFNXUE1JIHBlcmlwaGVyYWwgaWYgbm90ICovDQogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWDsNCiAgICAgIH0NCg0KICAgICAgLyogU2V0IHRoZSBTV1BNSSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8NCiAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1dQTUlfRE1BVHJhbnNtaXRDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFUeEhhbGZDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJFcnJvckNhbGxiYWNrID0gU1dQTUlfRE1BRXJyb3I7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgdHJhbnNtaXQgRE1BIENoYW5uZWwgKi8NCiAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHN3cG1pLT5oZG1hdHgsICh1aW50MzJfdCloc3dwbWktPnBUeEJ1ZmZQdHIsICh1aW50MzJfdCkmaHN3cG1pLT5JbnN0YW5jZS0+VERSLCBTaXplKTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgdHJhbnNtaXQgdW5kZXJydW4gZXJyb3IgKi8NCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1RYVU5SSUUpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBUWERNQSBiaXQNCiAgICAgICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLw0KICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfVFhETUEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQogICAgICANCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIGludGVycnVwdC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gcERhdGE6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gU2l6ZTogYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlX0RNQShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFByb2Nlc3MgTG9ja2VkICovDQogICAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogICAgaWYoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkpDQogICAgew0KICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICAgICAgaHN3cG1pLT5wUnhCdWZmUHRyID0gcERhdGE7DQogICAgICBoc3dwbWktPlJ4WGZlclNpemUgPSBTaXplOw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCg0KICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIC8qIFNldCB0aGUgU1dQTUkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVJlY2VpdmVDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckhhbGZDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFSeEhhbGZDcGx0Ow0KDQogICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hcngtPlhmZXJFcnJvckNhbGxiYWNrID0gU1dQTUlfRE1BRXJyb3I7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHJlcXVlc3QgKi8NCiAgICAgIEhBTF9ETUFfU3RhcnRfSVQoaHN3cG1pLT5oZG1hcngsICh1aW50MzJfdCkmaHN3cG1pLT5JbnN0YW5jZS0+UkRSLCAodWludDMyX3QpaHN3cG1pLT5wUnhCdWZmUHRyLCBTaXplKTsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgcmVjZWl2ZSBDUkMgRXJyb3IgYW5kIHJlY2VpdmUgb3ZlcnJ1biBpbnRlcnJ1cHRzICovDQogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhPVlJJRSk7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBSWERNQSBiaXQNCiAgICAgICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLw0KICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBTdG9wIGFsbCBETUEgdHJhbnNmZXJzLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMX09LDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRE1BU3RvcChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByb2Nlc3MgTG9ja2VkICovDQogIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAvKiBEaXNhYmxlIHRoZSBTV1BNSSBUeC9SeCBETUEgcmVxdWVzdHMgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCAoU1dQTUlfQ1JfVFhETUEgfCBTV1BNSV9DUl9SWERNQSkpOw0KDQogIC8qIEFib3J0IHRoZSBTV1BNSSBETUEgdHggY2hhbm5lbCAqLw0KICBpZihoc3dwbWktPmhkbWF0eCAhPSBOVUxMKQ0KICB7DQogICAgSEFMX0RNQV9BYm9ydChoc3dwbWktPmhkbWF0eCk7DQogIH0NCiAgLyogQWJvcnQgdGhlIFNXUE1JIERNQSByeCBjaGFubmVsICovDQogIGlmKGhzd3BtaS0+aGRtYXJ4ICE9IE5VTEwpDQogIHsNCiAgICBIQUxfRE1BX0Fib3J0KGhzd3BtaS0+aGRtYXJ4KTsNCiAgfQ0KDQogIC8qIERpc2FibGUgU1dQTUkgaW50ZXJmYWNlICovDQogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCg0KICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgRW5hYmxlIHRoZSBMb29wYmFjayBtb2RlLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEBub3RlICBMb29wYmFjayBtb2RlIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgdGVzdCBwdXJwb3Nlcw0KICAqIEByZXR2YWwgSEFMX09LIC8gSEFMX0JVU1kNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9FbmFibGVMb29wYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmICBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoc3dwbWkpOw0KDQogIC8qIENoZWNrIFNXUE1JIG5vdCBlbmFibGVkICovDQogIGlmKFJFQURfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpICE9IFJFU0VUKQ0KICB7DQogICAgc3RhdHVzID0gSEFMX0JVU1k7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU2V0IExvb3BiYWNrICovDQogICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfTFBCSyk7DQogIH0NCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiBEaXNhYmxlIHRoZSBMb29wYmFjayBtb2RlLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEBub3RlICBMb29wYmFjayBtb2RlIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgdGVzdCBwdXJwb3Nlcw0KICAqIEByZXR2YWwgSEFMX09LIC8gSEFMX0JVU1kNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9EaXNhYmxlTG9vcGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOw0KDQogIC8qIFByb2Nlc3MgTG9ja2VkICovDQogIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAvKiBDaGVjayBTV1BNSSBub3QgZW5hYmxlZCAqLw0KICBpZihSRUFEX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKSAhPSBSRVNFVCkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFJlc2V0IExvb3BiYWNrICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9MUEJLKTsNCiAgfQ0KDQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTV1BNSV9FeHBvcnRlZF9Hcm91cDMgU1dQTUkgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcw0KICogIEBicmllZiAgU1dQTUkgIElSUSBoYW5kbGVyLg0KICoNCkB2ZXJiYXRpbSAgIA0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBTV1BNSSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzICAjIyMjIw0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIFNXUE1JIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFjayBmdW5jdGlvbnMgY2FsbGVkIHdpdGhpbiANCiAgICAgIHRoZSBJUlEgaGFuZGxlci4NCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmIEhhbmRsZSBTV1BNSSBpbnRlcnJ1cHQgcmVxdWVzdC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgSEFMX1NXUE1JX0lSUUhhbmRsZXIoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICB1aW50MzJfdCByZWdpc3IgPSBSRUFEX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JU1IpOw0KICB1aW50MzJfdCByZWdpZXIgPSBSRUFEX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JRVIpOw0KICB1aW50MzJfdCBlcnJjb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgLyogU1dQTUkgQ1JDIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19SWEJFUkYpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1JYQkVSSUUpICE9IFJFU0VUKSkNCiAgew0KICAgIC8qIERpc2FibGUgUmVjZWl2ZSBDUkMgaW50ZXJydXB0ICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYQkZJRSk7DQogICAgLyogQ2xlYXIgUmVjZWl2ZSBDUkMgYW5kIFJlY2VpdmUgYnVmZmVyIGZ1bGwgZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRVJGIHwgU1dQTUlfRkxBR19SWEJGRik7DQoNCiAgICBlcnJjb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9DUkM7DQogIH0NCg0KICAvKiBTV1BNSSBPdmVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhPVlJGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWE9WUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIFJlY2VpdmUgb3ZlcnJ1biBpbnRlcnJ1cHQgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SWE9WUklFKTsNCiAgICAvKiBDbGVhciBSZWNlaXZlIG92ZXJydW4gZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhPVlJGKTsNCg0KICAgIGVycmNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX09WUjsNCiAgfQ0KDQogIC8qIFNXUE1JIFVuZGVyLVJ1biBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVFhVTlJGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9UWFVOUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIFRyYW5zbWl0IHVuZGVyIHJ1biBpbnRlcnJ1cHQgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9UWFVOUklFKTsNCiAgICAvKiBDbGVhciBUcmFuc21pdCB1bmRlciBydW4gZmxhZyAqLw0KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfVFhVTlJGKTsNCg0KICAgIGVycmNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX1VEUjsNCiAgfQ0KDQogICAvKiBDYWxsIFNXUE1JIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZihlcnJjb2RlICE9IEhBTF9TV1BNSV9FUlJPUl9OT05FKQ0KICB7DQogICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gZXJyY29kZTsNCiAgICANCiAgICBpZigoZXJyY29kZSAmIEhBTF9TV1BNSV9FUlJPUl9VRFIpICE9IFJFU0VUKQ0KICAgIHsNCiAgICAgIC8qIENoZWNrIFRYRE1BIHRyYW5zZmVyIHRvIGFib3J0ICovDQogICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfVFhETUEpKQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIERNQSBUWCBhdCBTV1BNSSBsZXZlbCAqLw0KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1RYRE1BKTsNCiAgICAgICAgDQogICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgVHggY2hhbm5lbCAqLw0KICAgICAgICBpZihoc3dwbWktPmhkbWF0eCAhPSBOVUxMKQ0KICAgICAgICB7DQogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBUeCBETUEgQWJvcnQgY2FsbGJhY2sgOiANCiAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovDQogICAgICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrID0gU1dQTUlfRE1BQWJvcnRPbkVycm9yOw0KICAgICAgICAgIC8qIEFib3J0IERNQSBUWCAqLw0KICAgICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHN3cG1pLT5oZG1hdHgpICE9IEhBTF9PSykNCiAgICAgICAgICB7DQogICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzd3BtaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovDQogICAgICAgICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaHN3cG1pLT5oZG1hdHgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8NCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8NCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogQ2hlY2sgUlhETUEgdHJhbnNmZXIgdG8gYWJvcnQgKi8NCiAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9SWERNQSkpDQogICAgICB7DQogICAgICAgIC8qIERpc2FibGUgRE1BIFJYIGF0IFNXUE1JIGxldmVsICovDQogICAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpOw0KICAgICAgICANCiAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBSeCBjaGFubmVsICovDQogICAgICAgIGlmKGhzd3BtaS0+aGRtYXJ4ICE9IE5VTEwpDQogICAgICAgIHsNCiAgICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIFJ4IERNQSBBYm9ydCBjYWxsYmFjayA6IA0KICAgICAgICAgICAgIHdpbGwgbGVhZCB0byBjYWxsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgYXQgZW5kIG9mIERNQSBhYm9ydCBwcm9jZWR1cmUgKi8NCiAgICAgICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTV1BNSV9ETUFBYm9ydE9uRXJyb3I7DQogICAgICAgICAgLyogQWJvcnQgRE1BIFJYICovDQogICAgICAgICAgaWYoSEFMX0RNQV9BYm9ydF9JVChoc3dwbWktPmhkbWFyeCkgIT0gSEFMX09LKQ0KICAgICAgICAgIHsNCiAgICAgICAgICAgIC8qIENhbGwgRGlyZWN0bHkgaHN3cG1pLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8NCiAgICAgICAgICAgIGhzd3BtaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayhoc3dwbWktPmhkbWFyeCk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiAgICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLw0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgICAgIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLyogU1dQTUkgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhORSkgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfUklFKSAgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfUmVjZWl2ZV9JVChoc3dwbWkpOw0KICB9DQoNCiAgLyogU1dQTUkgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVFhFKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9USUUpICE9IFJFU0VUKSkNCiAgew0KICAgIFNXUE1JX1RyYW5zbWl0X0lUKGhzd3BtaSk7DQogIH0NCg0KICAvKiBTV1BNSSBpbiBtb2RlIFRyYW5zbWl0dGVyIChUcmFuc21pdCBidWZmZXIgZW1wdHkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19UWEJFRikgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVFhCRUlFKSAhPSBSRVNFVCkpDQogIHsNCiAgICBTV1BNSV9FbmRUcmFuc21pdF9JVChoc3dwbWkpOw0KICB9DQoNCiAgLyogU1dQTUkgaW4gbW9kZSBSZWNlaXZlciAoUmVjZWl2ZSBidWZmZXIgZnVsbCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhCRkYpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1JYQkZJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfRW5kUmVjZWl2ZV9JVChoc3dwbWkpOw0KICB9DQoNCiAgLyogQm90aCBUcmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBjb21wbGV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVENGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9UQ0lFKSAhPSBSRVNFVCkpDQogIHsNCiAgICBTV1BNSV9FbmRUcmFuc21pdFJlY2VpdmVfSVQoaHN3cG1pKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgVHggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgIHRoZSBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiBSeCBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQogICogQHBhcmFtIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmICBSeCBIYWxmIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCiAgKiBAcGFyYW0gIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmIFNXUE1JIGVycm9yIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwNCBQZXJpcGhlcmFsIENvbnRyb2wgbWV0aG9kcw0KICAqICBAYnJpZWYgICBTV1BNSSBjb250cm9sIGZ1bmN0aW9ucw0KICAqDQpAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIG1ldGhvZHMgIyMjIyMNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgWy4uXQ0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgU1dQTUkuDQogICAgICgrKSBIQUxfU1dQTUlfR2V0U3RhdGUoKSBBUEkgaXMgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgc3RhdGUgb2YgdGhlIFNXUE1JIHBlcmlwaGVyYWwNCiAgICAgKCspIEhBTF9TV1BNSV9HZXRFcnJvcigpIEFQSSBpcyBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBlcnJvciBzdGF0ZSBvZiB0aGUgU1dQTUkgcGVyaXBoZXJhbA0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmIFJldHVybiB0aGUgU1dQTUkgaGFuZGxlIHN0YXRlLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXRlDQogICovDQpIQUxfU1dQTUlfU3RhdGVUeXBlRGVmIEhBTF9TV1BNSV9HZXRTdGF0ZShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFJldHVybiBTV1BNSSBoYW5kbGUgc3RhdGUgKi8NCiAgcmV0dXJuIGhzd3BtaS0+U3RhdGU7DQp9DQoNCi8qKg0KKiBAYnJpZWYgIFJldHVybiB0aGUgU1dQTUkgZXJyb3IgY29kZS4NCiogQHBhcmFtICBoc3dwbWkgOiBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBTV1BNSS4NCiogQHJldHZhbCBTV1BNSSBFcnJvciBDb2RlDQoqLw0KdWludDMyX3QgSEFMX1NXUE1JX0dldEVycm9yKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgcmV0dXJuIGhzd3BtaS0+RXJyb3JDb2RlOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX1ByaXZhdGVfRnVuY3Rpb25zIFNXUE1JIFByaXZhdGUgRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLg0KICAqIEBub3RlICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU1dQTUlfVHJhbnNtaXRfSVQoKQ0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9UcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZiAoKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKSkNCiAgew0KICAgIGlmKGhzd3BtaS0+VHhYZmVyQ291bnQgPT0gMCkNCiAgICB7DQogICAgICAvKiBEaXNhYmxlIHRoZSBTV1BNSSBUWEUgYW5kIFVuZGVycnVuIEludGVycnVwdHMgKi8NCiAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIChTV1BNSV9JVF9USUUgfCBTV1BNSV9JVF9UWFVOUklFKSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBoc3dwbWktPkluc3RhbmNlLT5URFIgPSAodWludDMyX3QpKCpoc3dwbWktPnBUeEJ1ZmZQdHIrKyk7DQogICAgICBoc3dwbWktPlR4WGZlckNvdW50LS07DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICB9DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBXcmFwcyB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFRyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogQ2xlYXIgdGhlIFNXUE1JIFRyYW5zbWl0IGJ1ZmZlciBlbXB0eSBGbGFnICovDQogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfVFhCRUYpOw0KICAvKiBEaXNhYmxlIHRoZSBhbGwgU1dQTUkgVHJhbnNtaXQgSW50ZXJydXB0cyAgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhVTlJJRSB8IFNXUE1JX0lUX1RYQkVJRSk7DQoNCiAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICB9DQogIA0KICBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4NCiAgKiBAbm90ZSAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKQ0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkpDQogIHsNCiAgICAqaHN3cG1pLT5wUnhCdWZmUHRyKysgPSAodWludDMyX3QpKGhzd3BtaS0+SW5zdGFuY2UtPlJEUik7DQoNCiAgICBpZigtLWhzd3BtaS0+UnhYZmVyQ291bnQgPT0gMCkNCiAgICB7DQogICAgICAvKiBXYWl0IGZvciBSWEJGRiBmbGFnIHRvIHVwZGF0ZSBzdGF0ZSAqLw0KICAgICAgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICB9DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBXcmFwcyB1cCByZWNlcHRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFJlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBDbGVhciB0aGUgU1dQTUkgUmVjZWl2ZSBidWZmZXIgZnVsbCBGbGFnICovDQogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRkYpOw0KICAvKiBEaXNhYmxlIHRoZSBhbGwgU1dQTUkgUmVjZWl2ZSBJbnRlcnJ1cHRzICAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SSUUgfCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhPVlJJRSB8IFNXUE1JX0lUX1JYQkZJRSk7DQoNCiAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JhcHMgdXAgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX0VuZFRyYW5zbWl0UmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIENsZWFyIHRoZSBTV1BNSSBUcmFuc21pc3Npb24gQ29tcGxldGUgRmxhZyAqLw0KICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1RDRik7DQogIC8qIERpc2FibGUgdGhlIFNXUE1JIFRyYW5zbWlzc2lvbiAgQ29tcGxldGUgSW50ZXJydXB0ICovDQogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIFNXUE1JX0lUX1RDSUUpOw0KDQogIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQogIH0NCiAgZWxzZSBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYTogRE1BIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHJhbnNtaXRDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQ0Kew0KICBTV1BNSV9IYW5kbGVUeXBlRGVmKiBoc3dwbWkgPSAoIFNXUE1JX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCg0KICAvKiBETUEgTm9ybWFsIG1vZGUqLw0KICBpZigoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgIT0gU0VUKQ0KICB7DQogICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQoNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgVFhETUEgYml0DQogICAgaW4gdGhlIFNXUE1JIENSIHJlZ2lzdGVyICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSk7DQoNCiAgICAvKiBJbml0IHRpY2tzdGFydCBmb3IgdGltZW91dCBtYW5hZ21lbnQqLw0KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQoNCiAgICAvKiBXYWl0IHRoZSBUWEJFRiAqLw0KICAgIGlmKFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGLCB0aWNrc3RhcnQsIFNXUE1JX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykNCiAgICB7DQogICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovDQogICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgLyogTm8gVGltZW91dCAqLw0KICAgICAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICAgIH0NCg0KICAgICAgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQogICAgfQ0KICB9DQogIC8qIERNQSBDaXJjdWxhciBtb2RlICovDQogIGVsc2UNCiAgew0KICAgIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hIDogRE1BIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKFNXUE1JX0hhbmRsZVR5cGVEZWYqKSgoRE1BX0hhbmRsZVR5cGVEZWYqKWhkbWEpLT5QYXJlbnQ7DQoNCiAgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgcmVjZWl2ZSBwcm9jZXNzIGNvbXBsZXRlIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hOiBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQoNCiAgLyogRE1BIE5vcm1hbCBtb2RlKi8NCiAgaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpID09IFJFU0VUKQ0KICB7DQogICAgaHN3cG1pLT5SeFhmZXJDb3VudCA9IDA7DQoNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFJYRE1BIGJpdA0KICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpOw0KDQogICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkNCiAgICB7DQogICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KICAgIH0NCiAgfQ0KICBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSByZWNlaXZlIHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYSA6IERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVJ4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9IChTV1BNSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50Ow0KDQogIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSBjb21tdW5pY2F0aW9uIGVycm9yIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hOiBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQoNCiAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICBoc3dwbWktPlJ4WGZlckNvdW50ID0gMDsNCiAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+U3RhdGU9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0RNQTsNCg0KICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNXUE1JIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2suDQogICogQHBhcmFtIGhkbWE6IERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQoNCiAgLyogVXBkYXRlIGhhbmRsZSAqLw0KICBoc3dwbWktPlJ4WGZlckNvdW50ID0gMDsNCiAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+U3RhdGU9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEhhbmRsZSBTV1BNSSBDb21tdW5pY2F0aW9uIFRpbWVvdXQuDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEBwYXJhbSAgRmxhZzogc3BlY2lmaWVzIHRoZSBTV1BNSSBmbGFnIHRvIGNoZWNrLg0KICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUNCiAgKiBAcGFyYW0gIFRpbWVvdXQgdGltZW91dCBkdXJhdGlvbi4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgRmxhZywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgLyogV2FpdCB1bnRpbCBmbGFnIGlzIHNldCAqLw0KICB3aGlsZSghKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgRmxhZykpKQ0KICB7DQogICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovDQogICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQ0KICAgIHsNCiAgICAgIGlmKChUaW1lb3V0ID09IDApIHx8ICgoSEFMX0dldFRpY2soKS1UaWNrc3RhcnQpID4gVGltZW91dCkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCiNlbmRpZiAvKiBIQUxfU1dQTUlfTU9EVUxFX0VOQUJMRUQgKi8NCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCiNlbmRpZiAvKiBTVE0zMkw0MzF4eCB8fCBTVE0zMkw0MzJ4eCB8fCBTVE0zMkw0MzN4eCB8fCBTVE0zMkw0NDJ4eCB8fCBTVE0zMkw0NDN4eCB8fCAqLw0KICAgICAgIC8qIFNUTTMyTDQ3MXh4IHx8IFNUTTMyTDQ3NXh4IHx8IFNUTTMyTDQ3Nnh4IHx8IFNUTTMyTDQ4NXh4IHx8IFNUTTMyTDQ4Nnh4ICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=