LyoqIEBmaWxlDQogIEVGSSBNdWx0aWNhc3QgVHJpdmlhbCBGaWxlIFRyYW5mZXIgUHJvdG9jb2wgRGVmaW5pdGlvbg0KDQogIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0KICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0ICAgICAgICANCiAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuICAgICAgICAgICAgIA0KDQogIE1vZHVsZSBOYW1lOiAgTXRmdHA0LmgNCg0KKiovDQoNCiNpZm5kZWYgX19FRklfTVRGVFA0X1BST1RPQ09MX0hfXw0KI2RlZmluZSBfX0VGSV9NVEZUUDRfUFJPVE9DT0xfSF9fDQoNCiNkZWZpbmUgRUZJX01URlRQNF9TRVJWSUNFX0JJTkRJTkdfUFJPVE9DT0xfR1VJRCBcDQogIHsgXA0KICAgIDB4MkZFODAwQkUsIDB4OEYwMSwgMHg0YWE2LCB7MHg5NCwgMHg2QiwgMHhENywgMHgxMywgMHg4OCwgMHhFMSwgMHg4MywgMHgzRiB9IFwNCiAgfQ0KDQojZGVmaW5lIEVGSV9NVEZUUDRfUFJPVE9DT0xfR1VJRCBcDQogIHsgXA0KICAgIDB4M2FkOWRmMjksIDB4NDUwMSwgMHg0NzhkLCB7MHhiMSwgMHhmOCwgMHg3ZiwgMHg3ZiwgMHhlNywgMHgwZSwgMHg1MCwgMHhmMyB9IFwNCiAgfQ0KDQp0eXBlZGVmIHN0cnVjdCBfRUZJX01URlRQNF9QUk9UT0NPTCBFRklfTVRGVFA0X1BST1RPQ09MOw0KdHlwZWRlZiBzdHJ1Y3QgX0VGSV9NVEZUUDRfVE9LRU4gRUZJX01URlRQNF9UT0tFTjsNCg0KLy8NCi8vTVRGVFA0IHBhY2tldCBvcGNvZGUgZGVmaW5pdGlvbg0KLy8NCiNkZWZpbmUgRUZJX01URlRQNF9PUENPREVfUlJRICAgICAgICAgICAgICAgICAgICAgMQ0KI2RlZmluZSBFRklfTVRGVFA0X09QQ09ERV9XUlEgICAgICAgICAgICAgICAgICAgICAyDQojZGVmaW5lIEVGSV9NVEZUUDRfT1BDT0RFX0RBVEEgICAgICAgICAgICAgICAgICAgIDMNCiNkZWZpbmUgRUZJX01URlRQNF9PUENPREVfQUNLICAgICAgICAgICAgICAgICAgICAgNA0KI2RlZmluZSBFRklfTVRGVFA0X09QQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgICA1DQojZGVmaW5lIEVGSV9NVEZUUDRfT1BDT0RFX09BQ0sgICAgICAgICAgICAgICAgICAgIDYNCiNkZWZpbmUgRUZJX01URlRQNF9PUENPREVfRElSICAgICAgICAgICAgICAgICAgICAgNw0KI2RlZmluZSBFRklfTVRGVFA0X09QQ09ERV9EQVRBOCAgICAgICAgICAgICAgICAgICA4DQojZGVmaW5lIEVGSV9NVEZUUDRfT1BDT0RFX0FDSzggICAgICAgICAgICAgICAgICAgIDkNCg0KLy8NCi8vIE1URlRQNCBlcnJvciBjb2RlIGRlZmluaXRpb24NCi8vDQojZGVmaW5lIEVGSV9NVEZUUDRfRVJST1JDT0RFX05PVF9ERUZJTkVEICAgICAgICAgIDANCiNkZWZpbmUgRUZJX01URlRQNF9FUlJPUkNPREVfRklMRV9OT1RfRk9VTkQgICAgICAgMQ0KI2RlZmluZSBFRklfTVRGVFA0X0VSUk9SQ09ERV9BQ0NFU1NfVklPTEFUSU9OICAgICAyDQojZGVmaW5lIEVGSV9NVEZUUDRfRVJST1JDT0RFX0RJU0tfRlVMTCAgICAgICAgICAgIDMNCiNkZWZpbmUgRUZJX01URlRQNF9FUlJPUkNPREVfSUxMRUdBTF9PUEVSQVRJT04gICAgNA0KI2RlZmluZSBFRklfTVRGVFA0X0VSUk9SQ09ERV9VTktOT1dOX1RSQU5TRkVSX0lEICA1DQojZGVmaW5lIEVGSV9NVEZUUDRfRVJST1JDT0RFX0ZJTEVfQUxSRUFEWV9FWElTVFMgIDYNCiNkZWZpbmUgRUZJX01URlRQNF9FUlJPUkNPREVfTk9fU1VDSF9VU0VSICAgICAgICAgNw0KI2RlZmluZSBFRklfTVRGVFA0X0VSUk9SQ09ERV9SRVFVRVNUX0RFTklFRCAgICAgICA4DQoNCi8vDQovLyBNVEZUUDQgcGFjZWt0IGRlZmluaXRpb25zDQovLw0KI3ByYWdtYSBwYWNrKDEpDQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgT3BDb2RlOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICBGaWxlbmFtZVsxXTsNCn0gRUZJX01URlRQNF9SRVFfSEVBREVSOw0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgIE9wQ29kZTsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgRGF0YVsxXTsNCn0gRUZJX01URlRQNF9PQUNLX0hFQURFUjsNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBPcENvZGU7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgIEJsb2NrOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICBEYXRhWzFdOw0KfSBFRklfTVRGVFA0X0RBVEFfSEVBREVSOw0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgIE9wQ29kZTsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgQmxvY2tbMV07DQp9IEVGSV9NVEZUUDRfQUNLX0hFQURFUjsNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBPcENvZGU7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEJsb2NrOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICBEYXRhWzFdOw0KfSBFRklfTVRGVFA0X0RBVEE4X0hFQURFUjsNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBPcENvZGU7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgIEJsb2NrWzFdOw0KfSBFRklfTVRGVFA0X0FDSzhfSEVBREVSOw0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgIE9wQ29kZTsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2VbMV07DQp9IEVGSV9NVEZUUDRfRVJST1JfSEVBREVSOw0KDQp0eXBlZGVmIHVuaW9uIHsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgT3BDb2RlOw0KICBFRklfTVRGVFA0X1JFUV9IRUFERVIgICBScnE7DQogIEVGSV9NVEZUUDRfUkVRX0hFQURFUiAgIFdycTsNCiAgRUZJX01URlRQNF9PQUNLX0hFQURFUiAgT2FjazsNCiAgRUZJX01URlRQNF9EQVRBX0hFQURFUiAgRGF0YTsNCiAgRUZJX01URlRQNF9BQ0tfSEVBREVSICAgQWNrOw0KICBFRklfTVRGVFA0X0RBVEE4X0hFQURFUiBEYXRhODsNCiAgRUZJX01URlRQNF9BQ0s4X0hFQURFUiAgQWNrODsNCiAgRUZJX01URlRQNF9FUlJPUl9IRUFERVIgRXJyb3I7DQp9IEVGSV9NVEZUUDRfUEFDS0VUOw0KDQojcHJhZ21hIHBhY2soKQ0KDQovLw0KLy8gTVRGVFA0IG9wdGlvbiBkZWZpbml0aW9uDQovLw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAqT3B0aW9uU3RyOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAqVmFsdWVTdHI7DQp9IEVGSV9NVEZUUDRfT1BUSU9OOw0KDQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgVXNlRGVmYXVsdFNldHRpbmc7DQogIEVGSV9JUHY0X0FERFJFU1MgICAgICAgIFN0YXRpb25JcDsNCiAgRUZJX0lQdjRfQUREUkVTUyAgICAgICAgU3VibmV0TWFzazsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0Ow0KICBFRklfSVB2NF9BRERSRVNTICAgICAgICBHYXRld2F5SXA7DQogIEVGSV9JUHY0X0FERFJFU1MgICAgICAgIFNlcnZlcklwOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBJbml0aWFsU2VydmVyUG9ydDsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgVHJ5Q291bnQ7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgIFRpbWVvdXRWYWx1ZTsNCn0gRUZJX01URlRQNF9DT05GSUdfREFUQTsNCg0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9NVEZUUDRfQ09ORklHX0RBVEEgIENvbmZpZ0RhdGE7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZE9wdGlvbkNvdW50OyAgDQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICoqU3VwcG9ydGVkT3B0b2luczsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWRPcHRpb25Db3VudDsgIA0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAqKlVuc3VwcG9ydGVkT3B0b2luczsNCn0gRUZJX01URlRQNF9NT0RFX0RBVEE7DQoNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfSVB2NF9BRERSRVNTICAgICAgICBHYXRld2F5SXA7DQogIEVGSV9JUHY0X0FERFJFU1MgICAgICAgIFNlcnZlcklwOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBTZXJ2ZXJQb3J0Ow0KICBVSU5UMTYgICAgICAgICAgICAgICAgICBUcnlDb3VudDsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgVGltZW91dFZhbHVlOw0KfSBFRklfTVRGVFA0X09WRVJSSURFX0RBVEE7DQoNCi8vDQovLyBQcm90b2NvbCBpbnRlcmZhY2VzIGRlZmluaXRpb24NCi8vDQoNCi8qKg0KICBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciB0byBpbnRlcmNlcHQgICAgICAgICAgICAgICANCiAgdGhlIEVGSV9NVEZUUDRfT1BDT0RFX0RBVEEgb3IgRUZJX01URlRQNF9PUENPREVfREFUQTggcGFja2V0cyBwcm9jZXNzZWQgaW4gdGhlDQogIEVGSV9NVEZUUDRfUFJPVE9DT0wuUmVhZEZpbGUoKSBmdW5jdGlvbiwgYW5kIGFsdGVybmF0aXZlbHkgdG8gaW50ZXJjZXB0ICAgICAgIA0KICBFRklfTVRGVFA0X09QQ09ERV9PQUNLIG9yIEVGSV9NVEZUUDRfT1BDT0RFX0VSUk9SIHBhY2tldHMgZHVyaW5nIGEgY2FsbCB0byAgICANCiAgRUZJX01URlRQNF9QUk9UT0NPTC5SZWFkRmlsZSgpLCBXcml0ZUZpbGUoKSBvciBSZWFkRGlyZWN0b3J5KCkuICAgICAgICAgICAgICAgICAgIA0KDQogIEBwYXJhbSAgVGhpcyAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBUb2tlbiAgICAgICBUaGUgdG9rZW4gdGhhdCB0aGUgY2FsbGVyIHByb3ZpZGVkIGluIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgIEVGSV9NVEZUUDRfUFJPVE9DT0wuUmVhZEZpbGUoKSwgV3JpdGVGaWxlKCkNCiAgICAgICAgICAgICAgICAgICAgICBvciBSZWFkRGlyZWN0b3J5KCkgZnVuY3Rpb24uDQogIEBwYXJhbSAgUGFja2V0TGVuICAgSW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldC4NCiAgQHBhcmFtICBQYWNrZXQgICAgICBQb2ludGVyIHRvIGFuIE1URlRQdjQgcGFja2V0Lg0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgT3BlcmF0aW9uIHN1Y2Vzcw0KICBAcmV0dmFsIE90aGVycyAgICAgIEFib3J0IHRyYW5zZmVyIHByb2Nlc3MNCg0KKiovDQp0eXBlZGVmIA0KRUZJX1NUQVRVUyANCihFRklBUEkgKkVGSV9NVEZUUDRfQ0hFQ0tfUEFDS0VUKSggDQogIElOIEVGSV9NVEZUUDRfUFJPVE9DT0wgICpUaGlzLA0KICBJTiBFRklfTVRGVFA0X1RPS0VOICAgICAqVG9rZW4sDQogIElOIFVJTlQxNiAgICAgICAgICAgICAgIFBhY2tldExlbiwNCiAgSU4gRUZJX01URlRQNF9QQUNLRVQgICAgKlBha2V0DQogICkNCjsNCg0KLyoqDQogIFRpbWVvdXQgY2FsbGJhY2sgZnVudGlvbi4gICAgICAgICAgICANCg0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9NVEZUUDRfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgVG9rZW4gICAgICAgICAgVGhlIHRva2VuIHRoYXQgaXMgcHJvdmlkZWQgaW4gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgRUZJX01URlRQNF9QUk9UT0NPTC5SZWFkRmlsZSgpIG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgRUZJX01URlRQNF9QUk9UT0NPTC5Xcml0ZUZpbGUoKSBvcg0KICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9NVEZUUDRfUFJPVE9DT0wuUmVhZERpcmVjdG9yeSgpIGZ1bmN0aW9ucw0KICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjYWxsZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICBPcGVyYXRpb24gc3VjZXNzDQogIEByZXR2YWwgT3RoZXJzICAgICAgICBBYm9ydHMgZG93bmxvYWQgcHJvY2Vzcy4NCg0KKiovDQp0eXBlZGVmIA0KRUZJX1NUQVRVUyANCihFRklBUEkgKkVGSV9NVEZUUDRfVElNRU9VVF9DQUxMQkFDSykoIA0KICBJTiBFRklfTVRGVFA0X1BST1RPQ09MICAqVGhpcywNCiAgSU4gRUZJX01URlRQNF9UT0tFTiAgICAgKlRva2VuDQogICkNCjsNCg0KLyoqDQogIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUgY2FsbGVyIHByb3ZpZGVzIHRvIGZlZWQgZGF0YSB0byB0aGUNCiAgRUZJX01URlRQNF9QUk9UT0NPTC5Xcml0ZUZpbGUoKSBmdW5jdGlvbi4NCg0KICBAcGFyYW0gIFRoaXMgICBQb2ludGVyIHRvIHRoZSBFRklfTVRGVFA0X1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIFRva2VuICBUaGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlDQogICAgICAgICAgICAgICAgIEVGSV9NVEZUUDRfUFJPVE9DT0wuV3JpdGVGaWxlKCkgYnkgdGhlIGNhbGxlci4NCiAgQHBhcmFtICBMZW5ndGggSW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgdGhlIHJhdyBkYXRhIHdhbnRlZCBvbiBpbnB1dCwgYW5kIHRoZQ0KICAgICAgICAgICAgICAgICBsZW5ndGggdGhlIGRhdGEgYXZhaWxhYmxlIG9uIG91dHB1dC4NCiAgQHBhcmFtICBCdWZmZXIgUG9pbnRlciB0byB0aGUgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGlzIHN0b3JlZC4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTIE9wZXJhdGlvbiBzdWNlc3MNCiAgQHJldHZhbCBPdGhlcnMgICAgICBBYm9ydHMgc2Vzc2lvbi4NCg0KKiovDQp0eXBlZGVmIA0KRUZJX1NUQVRVUyANCihFRklBUEkgKkVGSV9NVEZUUDRfUEFDS0VUX05FRURFRCkoIA0KICBJTiAgRUZJX01URlRQNF9QUk9UT0NPTCAqVGhpcywNCiAgSU4gIEVGSV9NVEZUUDRfVE9LRU4gICAgKlRva2VuLA0KICBJTiAgT1VUIFVJTlQxNiAgICAgICAgICAqTGVuZ3RoLA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAqKkJ1ZmZlcg0KICApDQo7DQoNCg0KLyoqDQogIFN1Ym1pdHMgYW4gYXN5bmNocm9ub3VzIGludGVycnVwdCB0cmFuc2ZlciB0byBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQgb2YgYSBVU0IgZGV2aWNlLg0KDQogIEBwYXJhbSAgVGhpcyAgICAgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBNb2RlRGF0YSBQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBFRkkgTVRGVFB2NCBQcm90b2NvbCBkcml2ZXIgbW9kZSBkYXRhLg0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBjb25maWd1cmF0aW9uIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIHJlcXVpcmVkIG1vZGUgZGF0YSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGlzIGlzIE5VTEwgb3IgTW9kZURhdGEgaXMgTlVMTC4NCg0KKiovDQp0eXBlZGVmIA0KRUZJX1NUQVRVUyANCihFRklBUEkgKkVGSV9NVEZUUDRfR0VUX01PREVfREFUQSkoDQogIElOICBFRklfTVRGVFA0X1BST1RPQ09MICAgICAqVGhpcywNCiAgT1VUIEVGSV9NVEZUUDRfTU9ERV9EQVRBICAgICpNb2RlRGF0YQ0KICApDQo7DQoNCg0KLyoqDQogIEluaXRpYWxpemVzLCBjaGFuZ2VzLCBvciByZXNldHMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uYWwgc2V0dGluZyBmb3IgdGhpcyANCiAgRUZJIE1URlRQdjQgUHJvdG9jb2wgZHJpdmVyIGluc3RhbmNlLg0KDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEVGSV9NVEZUUDRfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgTXRmdHBDb25maWdEYXRhIFBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmUuDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIEVGSSBNVEZUUHY0IFByb3RvY29sIGRyaXZlciB3YXMgY29uZmlndXJlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgIFRoZSBFRkkgY29uZmlndXJhdGlvbiBjb3VsZCBub3QgYmUgY2hhbmdlZCBhdCB0aGlzIHRpbWUgYmVjYXVzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBvbmUgTVRGVFAgYmFja2dyb3VuZCBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MuDQogIEByZXR2YWwgRUZJX05PX01BUFBJTkcgICAgICAgIFdoZW4gdXNpbmcgYSBkZWZhdWx0IGFkZHJlc3MsIGNvbmZpZ3VyYXRpb24gKERIQ1AsIEJPT1RQLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVJQLCBldGMuKSBoYXMgbm90IGZpbmlzaGVkIHlldC4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgQSBjb25maWd1cmF0aW9uIHByb3RvY29sIChESENQLCBCT09UUCwgUkFSUCwgZXRjLikgY291bGQgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGxvY2F0ZWQgd2hlbiBjbGllbnRzIGNob29zZSB0byB1c2UgdGhlIGRlZmF1bHQgYWRkcmVzcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIEVGSSBNVEZUUHY0IFByb3RvY29sIGRyaXZlciBpbnN0YW5jZSBkYXRhIGNvdWxkIG5vdCBiZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEFuIHVuZXhwZWN0ZWQgc3lzdGVtIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIFRoZSBFRkkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1URlRQdjQgUHJvdG9jb2wgZHJpdmVyIGluc3RhbmNlIGlzIG5vdCBjb25maWd1cmVkLg0KDQoqKi8NCnR5cGVkZWYgDQpFRklfU1RBVFVTIA0KKEVGSUFQSSAqRUZJX01URlRQNF9DT05GSUdVUkUpKA0KICBJTiBFRklfTVRGVFA0X1BST1RPQ09MICAgICAgICpUaGlzLA0KICBJTiBFRklfTVRGVFA0X0NPTkZJR19EQVRBICAgICpNdGZ0cENvbmZpZ0RhdGEgT1BUSU9OQUwNCiAgKQ0KOyAgIA0KICAgIA0KICAgIA0KLyoqDQogIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGZyb20gYW4gTVRGVFB2NCBzZXJ2ZXIuDQoNCiAgQHBhcmFtICBUaGlzICAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBPdmVycmlkZURhdGEgRGF0YSB0aGF0IGlzIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIHBhcmFtZXRlcnMuIElmIE5VTEwsDQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHNldCBpbiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgRUZJX01URlRQNF9QUk9UT0NPTC5Db25maWd1cmUoKSBmdW5jdGlvbiBhcmUgdXNlZC4NCiAgQHBhcmFtICBGaWxlbmFtZSAgICAgUG9pbnRlciB0byBBU0NJSVogZmlsZSBuYW1lIHN0cmluZy4NCiAgQHBhcmFtICBNb2RlU3RyICAgICAgUG9pbnRlciB0byBBU0NJSVogbW9kZSBzdHJpbmcuIElmIE5VTEwsIKGwb2N0ZXShsSB3aWxsIGJlIHVzZWQuDQogIEBwYXJhbSAgT3B0aW9uQ291bnQgIE51bWJlciBvZiBvcHRpb24vdmFsdWUgc3RyaW5nIHBhaXJzIGluIE9wdGlvbkxpc3QuDQogIEBwYXJhbSAgT3B0aW9uTGlzdCAgIFBvaW50ZXIgdG8gYXJyYXkgb2Ygb3B0aW9uL3ZhbHVlIHN0cmluZyBwYWlycy4gSWdub3JlZCBpZg0KICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25Db3VudCBpcyB6ZXJvLg0KICBAcGFyYW0gIFBhY2tldExlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXR1cm5lZCBwYWNrZXQuDQogIEBwYXJhbSAgUGFja2V0ICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSByZWNlaXZlZCBwYWNrZXQuIFRoaXMgYnVmZmVyIG11c3QgYmUgZnJlZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlci4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBBbiBNVEZUUHY0IE9BQ0sgcGFja2V0IHdhcyByZWNlaXZlZCBhbmQgaXMgaW4gdGhlIEJ1ZmZlci4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgT25lIG9yIG1vcmUgb3B0aW9ucyBpbiB0aGUgT3B0aW9uTGlzdCBhcmUgaW4gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkIGxpc3Qgb2Ygc3RydWN0dXJlIEVGSV9NVEZUUDRfTU9ERV9EQVRBLg0KICANCiAgQHJldHZhbCBFRklfTk9UX1NUQVJURUQgICAgICAgVGhlIEVGSSBNVEZUUHY0IFByb3RvY29sIGRyaXZlciBoYXMgbm90IGJlZW4gc3RhcnRlZC4NCiAgQHJldHZhbCBFRklfTk9fTUFQUElORyAgICAgICAgV2hlbiB1c2luZyBhIGRlZmF1bHQgYWRkcmVzcywgY29uZmlndXJhdGlvbiAoREhDUCwgQk9PVFAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBUlAsIGV0Yy4pIGhhcyBub3QgZmluaXNoZWQgeWV0Lg0KICBAcmV0dmFsIEVGSV9BQ0NFU1NfREVOSUVEICAgICBUaGUgcHJldmlvdXMgb3BlcmF0aW9uIGhhcyBub3QgY29tcGxldGVkIHlldC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgUmVxdWlyZWQgc3lzdGVtIHJlc291cmNlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9URlRQX0VSUk9SICAgICAgICBBbiBNVEZUUHY0IEVSUk9SIHBhY2tldCB3YXMgcmVjZWl2ZWQgYW5kIGlzIGluIHRoZSBidWZmZXIuDQogIEByZXR2YWwgRUZJX0lDTVBfRVJST1IgICAgICAgIEFuIElDTVAgRVJST1IgcGFja2V0IHdhcyByZWNlaXZlZCBhbmQgaXMgaW4gdGhlIEJ1ZmZlci4NCiAgQHJldHZhbCBFRklfUFJPVE9DT0xfRVJST1IgICAgQW4gdW5leHBlY3RlZCBNVEZUUHY0IHBhY2tldCB3YXMgcmVjZWl2ZWQgYW5kIGlzIGluIHRoZSBidWZmZXIuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIE5vIHJlc3BvbnNlcyB3ZXJlIHJlY2VpdmVkIGZyb20gdGhlIE1URlRQdjQgc2VydmVyLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBBbiB1bmV4cGVjdGVkIG5ldHdvcmsgZXJyb3Igb3Igc3lzdGVtIGVycm9yIG9jY3VycmVkLg0KDQoqKi8NCnR5cGVkZWYgDQpFRklfU1RBVFVTIA0KKEVGSUFQSSAqRUZJX01URlRQNF9HRVRfSU5GTykoDQogIElOICBFRklfTVRGVFA0X1BST1RPQ09MICAgICAgKlRoaXMsDQogIElOICBFRklfTVRGVFA0X09WRVJSSURFX0RBVEEgKk92ZXJyaWRlRGF0YSAgIE9QVElPTkFMLA0KICBJTiAgVUlOVDggICAgICAgICAgICAgICAgICAgICpGaWxlbmFtZSwNCiAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAqTW9kZVN0ciAgICAgICAgT1BUSU9OQUwsDQogIElOICBVSU5UOCAgICAgICAgICAgICAgICAgICAgT3B0aW9uQ291bnQsDQogIElOICBFRklfTVRGVFA0X09QVElPTiAgICAgICAgKk9wdGlvbkxpc3QsDQogIE9VVCBVSU5UMzIgICAgICAgICAgICAgICAgICAgKlBhY2tldExlbmd0aCwNCiAgT1VUIEVGSV9NVEZUUDRfUEFDS0VUICAgICAgICAqKlBhY2tldCAgICAgICAgT1BUSU9OQUwNCiAgKQ0KOw0KDQovKioNCiAgUGFyc2VzIHRoZSBvcHRpb25zIGluIGFuIE1URlRQdjQgT0FDSyBwYWNrZXQuDQoNCiAgQHBhcmFtICBUaGlzICAgICAgICAgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBQYWNrZXRMZW4gICAgTGVuZ3RoIG9mIHRoZSBPQUNLIHBhY2tldCB0byBiZSBwYXJzZWQuDQogIEBwYXJhbSAgUGFja2V0ICAgICAgIFBvaW50ZXIgdG8gdGhlIE9BQ0sgcGFja2V0IHRvIGJlIHBhcnNlZC4NCiAgQHBhcmFtICBPcHRpb25Db3VudCAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG9wdGlvbnMgaW4gZm9sbG93aW5nIE9wdGlvbkxpc3QuDQogIEBwYXJhbSAgT3B0aW9uTGlzdCAgIFBvaW50ZXIgdG8gRUZJX01URlRQNF9PUFRJT04gc3RvcmFnZS4gQ2FsbCB0aGUgRUZJIEJvb3QNCiAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBGcmVlUG9vbCgpIHRvIHJlbGVhc2UgZWFjaCBvcHRpb24gaWYgdGhleSBhcmUgbm90DQogICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBhbnkgbW9yZS4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgT0FDSyBwYWNrZXQgd2FzIHZhbGlkIGFuZCB0aGUgT3B0aW9uQ291bnQgYW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbkxpc3QgcGFyYW1ldGVycyBoYXZlIGJlZW4gdXBkYXRlZC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIFRSVUU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFja2V0TGVuIGlzIDAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFja2V0IGlzIE5VTEwgb3IgUGFja2V0IGlzIG5vdCBhIHZhbGlkIE1URlRQdjQgcGFja2V0Lg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIE9wdGlvbkNvdW50IGlzIE5VTEwuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIE5vIG9wdGlvbnMgd2VyZSBmb3VuZCBpbiB0aGUgT0FDSyBwYWNrZXQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFN0b3JhZ2UgZm9yIHRoZSBPcHRpb25MaXN0IGFycmF5IGNhbm5vdCBiZSBhbGxvY2F0ZWQuDQogIEByZXR2YWwgRUZJX1BST1RPQ09MX0VSUk9SICAgIE9uZSBvciBtb3JlIG9mIHRoZSBvcHRpb24gZmllbGRzIGlzIGludmFsaWQuDQoNCioqLw0KdHlwZWRlZiANCkVGSV9TVEFUVVMgDQooRUZJQVBJICpFRklfTVRGVFA0X1BBUlNFX09QVElPTlMpKA0KICBJTiAgRUZJX01URlRQNF9QUk9UT0NPTCAgICAgICpUaGlzLA0KICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgICAgIFBhY2tldExlbiwNCiAgSU4gIEVGSV9NVEZUUDRfUEFDS0VUICAgICAgICAqUGFja2V0LA0KICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICpPcHRpb25Db3VudCwNCiAgT1VUIEVGSV9NVEZUUDRfT1BUSU9OICAgICAgICAqKk9wdGlvbkxpc3QgT1BUSU9OQUwNCiAgKQ0KOyAgDQoNCg0KLyoqDQogIERvd25sb2FkcyBhIGZpbGUgZnJvbSBhbiBNVEZUUHY0IHNlcnZlci4NCg0KICBAcGFyYW0gIFRoaXMgIFBvaW50ZXIgdG8gdGhlIEVGSV9NVEZUUDRfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgVG9rZW4gUG9pbnRlciB0byB0aGUgdG9rZW4gc3RydWN0dXJlIHRvIHByb3ZpZGUgdGhlIHBhcmFtZXRlcnMgdGhhdCBhcmUNCiAgICAgICAgICAgICAgICB1c2VkIGluIHRoaXMgb3BlcmF0aW9uLg0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgVGhlIGRhdGEgZmlsZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgUmVxdWlyZWQgc3lzdGVtIHJlc291cmNlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMIEJ1ZmZlclNpemUgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBkb3dubG9hZGVkIGRhdGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkb3dubG9hZGluZyBwcm9jZXNzLg0KICBAcmV0dmFsIEVGSV9BQk9SVEVEICAgICAgICAgIEN1cnJlbnQgb3BlcmF0aW9uIGlzIGFib3J0ZWQgYnkgdXNlci4NCiAgQHJldHZhbCBFRklfSUNNUF9FUlJPUiAgICAgICBBbiBJQ01QIEVSUk9SIHBhY2tldCB3YXMgcmVjZWl2ZWQuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgTm8gcmVzcG9uc2VzIHdlcmUgcmVjZWl2ZWQgZnJvbSB0aGUgTVRGVFB2NCBzZXJ2ZXIuDQogIEByZXR2YWwgRUZJX1RGVFBfRVJST1IgICAgICAgQW4gTVRGVFB2NCBFUlJPUiBwYWNrZXQgd2FzIHJlY2VpdmVkLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgIEFuIHVuZXhwZWN0ZWQgbmV0d29yayBlcnJvciBvciBzeXN0ZW0gZXJyb3Igb2NjdXJyZWQuDQoNCioqLw0KdHlwZWRlZiANCkVGSV9TVEFUVVMgDQooRUZJQVBJICpFRklfTVRGVFA0X1JFQURfRklMRSkoDQogIElOIEVGSV9NVEZUUDRfUFJPVE9DT0wgICAgICAgKlRoaXMsDQogIElOIEVGSV9NVEZUUDRfVE9LRU4gICAgICAgICAgKlRva2VuDQogICkNCjsgIA0KICANCg0KDQovKioNCiAgU2VuZHMgYSBmaWxlIHRvIGFuIE1URlRQdjQgc2VydmVyLg0KDQogIEBwYXJhbSAgVGhpcyBQb2ludGVyIHRvIHRoZSBFRklfTVRGVFA0X1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIFRva2VuIFBvaW50ZXIgdG8gdGhlIHRva2VuIHN0cnVjdHVyZSB0byBwcm92aWRlIHRoZSBwYXJhbWV0ZXJzIHRoYXQgYXJlDQogIHVzZWQgaW4gdGhpcyBvcGVyYXRpb24uDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHVwbG9hZCBzZXNzaW9uIGhhcyBzdGFydGVkLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgT25lIG9yIG1vcmUgb3B0aW9ucyBpbiB0aGUgVG9rZW4uT3B0aW9uTGlzdCBhcmUgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVuc3VwcG9ydGVkIGxpc3Qgb2Ygc3RydWN0dXJlIEVGSV9NVEZUUDRfTU9ERV9EQVRBLg0KICBAcmV0dmFsIEVGSV9OT1RfU1RBUlRFRCAgICAgICBUaGUgRUZJIE1URlRQdjQgUHJvdG9jb2wgZHJpdmVyIGhhcyBub3QgYmVlbiBzdGFydGVkLg0KICBAcmV0dmFsIEVGSV9OT19NQVBQSU5HICAgICAgICBXaGVuIHVzaW5nIGEgZGVmYXVsdCBhZGRyZXNzLCBjb25maWd1cmF0aW9uIChESENQLCBCT09UUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFSUCwgZXRjLikgaXMgbm90IGZpbmlzaGVkIHlldC4NCiAgQHJldHZhbCBFRklfQUxSRUFEWV9TVEFSVEVEICAgVGhpcyBUb2tlbiBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgaW4gYW5vdGhlciBNVEZUUHY0IHNlc3Npb24uDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFJlcXVpcmVkIHN5c3RlbSByZXNvdXJjZXMgY291bGQgbm90IGJlIGFsbG9jYXRlZC4NCiAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRCAgICAgVGhlIHByZXZpb3VzIG9wZXJhdGlvbiBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEFuIHVuZXhwZWN0ZWQgbmV0d29yayBlcnJvciBvciBzeXN0ZW0gZXJyb3Igb2NjdXJyZWQuDQoNCioqLw0KdHlwZWRlZiANCkVGSV9TVEFUVVMgDQooRUZJQVBJICpFRklfTVRGVFA0X1dSSVRFX0ZJTEUpKA0KICBJTiBFRklfTVRGVFA0X1BST1RPQ09MICAgICAgICpUaGlzLA0KICBJTiBFRklfTVRGVFA0X1RPS0VOICAgICAgICAgICpUb2tlbg0KICApDQo7ICANCiAgDQoNCi8qKg0KICBEb3dubG9hZHMgYSBkYXRhIGZpbGUgobBkaXJlY3RvcnmhsSBmcm9tIGFuIE1URlRQdjQgc2VydmVyLiBNYXkgYmUgdW5zdXBwb3J0ZWQgaW4gc29tZSBFRkkNCiAgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogIEBwYXJhbSAgVGhpcyAgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBUb2tlbiBQb2ludGVyIHRvIHRoZSB0b2tlbiBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZQ0KICAgICAgICAgICAgICAgIHVzZWQgaW4gdGhpcyBvcGVyYXRpb24uDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIE1URlRQdjQgcmVsYXRlZCBmaWxlICJkaXJlY3RvcnkiIGhhcyBiZWVuIGRvd25sb2FkZWQuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBPbmUgb3IgbW9yZSBvcHRpb25zIGluIHRoZSBUb2tlbi5PcHRpb25MaXN0IGFyZSBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdW5zdXBwb3J0ZWQgbGlzdCBvZiBzdHJ1Y3R1cmUgRUZJX01URlRQNF9NT0RFX0RBVEEuDQogIEByZXR2YWwgRUZJX05PVF9TVEFSVEVEICAgICAgIFRoZSBFRkkgTVRGVFB2NCBQcm90b2NvbCBkcml2ZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuDQogIEByZXR2YWwgRUZJX05PX01BUFBJTkcgICAgICAgIFdoZW4gdXNpbmcgYSBkZWZhdWx0IGFkZHJlc3MsIGNvbmZpZ3VyYXRpb24gKERIQ1AsIEJPT1RQLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVJQLCBldGMuKSBpcyBub3QgZmluaXNoZWQgeWV0Lg0KICBAcmV0dmFsIEVGSV9BTFJFQURZX1NUQVJURUQgICBUaGlzIFRva2VuIGlzIGFscmVhZHkgYmVpbmcgdXNlZCBpbiBhbm90aGVyIE1URlRQdjQgc2Vzc2lvbi4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgUmVxdWlyZWQgc3lzdGVtIHJlc291cmNlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9BQ0NFU1NfREVOSUVEICAgICBUaGUgcHJldmlvdXMgb3BlcmF0aW9uIGhhcyBub3QgY29tcGxldGVkIHlldC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQW4gdW5leHBlY3RlZCBuZXR3b3JrIGVycm9yIG9yIHN5c3RlbSBlcnJvciBvY2N1cnJlZC4NCg0KKiovDQp0eXBlZGVmIA0KRUZJX1NUQVRVUyANCihFRklBUEkgKkVGSV9NVEZUUDRfUkVBRF9ESVJFQ1RPUlkpKA0KICBJTiBFRklfTVRGVFA0X1BST1RPQ09MICAgICAgICpUaGlzLA0KICBJTiBFRklfTVRGVFA0X1RPS0VOICAgICAgICAgICpUb2tlbg0KICApDQo7ICAgIA0KDQovKioNCiAgUG9sbHMgZm9yIGluY29taW5nIGRhdGEgcGFja2V0cyBhbmQgcHJvY2Vzc2VzIG91dGdvaW5nIGRhdGEgcGFja2V0cy4NCg0KICBAcGFyYW0gIFRoaXMgUG9pbnRlciB0byB0aGUgRUZJX01URlRQNF9QUk9UT0NPTCBpbnN0YW5jZS4NCg0KICBAcmV0dmFsICBFRklfU1VDQ0VTUyAgICAgICAgICAgSW5jb21pbmcgb3Igb3V0Z29pbmcgZGF0YSB3YXMgcHJvY2Vzc2VkLg0KICBAcmV0dmFsICBFRklfTk9UX1NUQVJURUQgICAgICAgVGhpcyBFRkkgTVRGVFB2NCBQcm90b2NvbCBpbnN0YW5jZSBoYXMgbm90IGJlZW4gc3RhcnRlZC4NCiAgQHJldHZhbCAgRUZJX05PX01BUFBJTkcgICAgICAgIFdoZW4gdXNpbmcgYSBkZWZhdWx0IGFkZHJlc3MsIGNvbmZpZ3VyYXRpb24gKERIQ1AsIEJPT1RQLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFSUCwgZXRjLikgaXMgbm90IGZpbmlzaGVkIHlldC4NCiAgQHJldHZhbCAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFRoaXMgaXMgTlVMTC4NCiAgQHJldHZhbCAgRUZJX0RFVklDRV9FUlJPUiAgICAgIEFuIHVuZXhwZWN0ZWQgc3lzdGVtIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuDQogIEByZXR2YWwgIEVGSV9USU1FT1VUICAgICAgICAgICBEYXRhIHdhcyBkcm9wcGVkIG91dCBvZiB0aGUgdHJhbnNtaXQgYW5kL29yIHJlY2VpdmUgcXVldWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaWRlciBpbmNyZWFzaW5nIHRoZSBwb2xsaW5nIHJhdGUuDQoNCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX01URlRQNF9QT0xMKSAoDQogIElOIEVGSV9NVEZUUDRfUFJPVE9DT0wgICAgICAgKlRoaXMNCiAgKQ0KOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQpzdHJ1Y3QgX0VGSV9NVEZUUDRfUFJPVE9DT0wgew0KICBFRklfTVRGVFA0X0dFVF9NT0RFX0RBVEEgICAgIEdldE1vZGVEYXRhOw0KICBFRklfTVRGVFA0X0NPTkZJR1VSRSAgICAgICAgIENvbmZpZ3VyZTsNCiAgRUZJX01URlRQNF9HRVRfSU5GTyAgICAgICAgICBHZXRJbmZvOw0KICBFRklfTVRGVFA0X1BBUlNFX09QVElPTlMgICAgIFBhcnNlT3B0aW9uczsNCiAgRUZJX01URlRQNF9SRUFEX0ZJTEUgICAgICAgICBSZWFkRmlsZTsNCiAgRUZJX01URlRQNF9XUklURV9GSUxFICAgICAgICBXcml0ZUZpbGU7DQogIEVGSV9NVEZUUDRfUkVBRF9ESVJFQ1RPUlkgICAgUmVhZERpcmVjdG9yeTsNCiAgRUZJX01URlRQNF9QT0xMICAgICAgICAgICAgICBQb2xsOw0KfTsNCg0Kc3RydWN0IF9FRklfTVRGVFA0X1RPS0VOIHsNCiAgT1VUIEVGSV9TVEFUVVMgICAgICAgICAgICAgICAgICBTdGF0dXM7DQogIElOICBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgRXZlbnQ7DQogIElOICBFRklfTVRGVFA0X09WRVJSSURFX0RBVEEgICAgKk92ZXJyaWRlRGF0YTsNCiAgSU4gIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAqRmlsZW5hbWU7DQogIElOICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgKk1vZGVTdHI7DQogIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uQ291bnQ7DQogIElOICBFRklfTVRGVFA0X09QVElPTiAgICAgICAgICAgKk9wdGlvbkxpc3Q7DQogIElOICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgQnVmZmVyU2l6ZTsNCiAgSU4gIE9VVCBWT0lEICAgICAgICAgICAgICAgICAgICAqQnVmZmVyOw0KICBJTiAgRUZJX01URlRQNF9DSEVDS19QQUNLRVQgICAgIENoZWNrUGFja2V0Ow0KICBJTiAgRUZJX01URlRQNF9USU1FT1VUX0NBTExCQUNLIFRpbWVvdXRDYWxsYmFjazsNCiAgSU4gIEVGSV9NVEZUUDRfUEFDS0VUX05FRURFRCAgICBQYWNrZXROZWVkZWQ7DQp9Ow0KDQpleHRlcm4gRUZJX0dVSUQgZ0VmaU10ZnRwNFNlcnZpY2VCaW5kaW5nUHJvdG9jb2xHdWlkOw0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlNdGZ0cDRQcm90b2NvbEd1aWQ7ICANCg0KI2VuZGlmDQoNCg==