LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMgDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBSVENfQUxBUk0gVGVtcGxhdGUuDQogICoNCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGUgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQ0KICAqICAgICAgICAgIHRvIHVzZSB0aGUgUlRDIEFMQVJNIGZvciB0aW1lIGJhc2UgZ2VuZXJhdGlvbjoNCiAgKiAgICAgICAgICAgKyBJbnRpYWxpemVzIHRoZSBSVEMgcGVyaXBoZXJhbCB0byBpbmNyZW1lbnQgdGhlIHNlY29uZHMgcmVnaXN0ZXJzIGVhY2ggMW1zDQogICogICAgICAgICAgICsgVGhlIGFsYXJtIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IGFuIGludGVycnVwdCB3aGVuIHRoZSBSVEMgcmVhY2hlcyAxbXMgDQogICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGF0IGVhY2ggQWxhcm0gZXZlbnQgYW5kIHRoZSB0aW1lIGlzIHJlc2V0IHRvIDAwOjAwOjAwDQogICogICAgICAgICAgICsgSFNFIChkZWZhdWx0KSwgTFNFIG9yIExTSSBjYW4gYmUgc2VsZWN0ZWQgYXMgUlRDIGNsb2NrIHNvdXJjZSAgDQogQHZlcmJhdGltDQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICBbLi5dDQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6DQogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJmNHh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm0uYycNCiAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudA0KICAgICAgIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgZGVmaW5lIGluIHN0bTMyZjR4eF9oYWxfY29uZi5oIA0KDQogICAgWy4uXQ0KICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6DQogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUNCiAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4NCiAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQgDQogICAgKEApIFRoZSBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMNCiAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzDQoNCiAgQGVuZHZlcmJhdGltDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBhdHRlbnRpb24NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqDQogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwNCiAgKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KICAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KICAqICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQogICogICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFNUTWljcm9lbGVjdHJvbmljcyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KICAqICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQogICoNCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCiAgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFDQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQogICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1INCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUg0KICAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksDQogICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UNCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KICAqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjR4eF9oYWwuaCINCi8qKiBAYWRkdG9ncm91cCBTVE0zMkY0eHhfSEFMX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19BbGFybV9UZW1wbGF0ZSAgSEFMIFRpbWVCYXNlIFJUQyBBbGFybSBUZW1wbGF0ZQ0KICAqIEB7DQogICovIA0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgUlRDIENsb2NrIHNvdXJjZSBmb3IgeW91ciBhcHBsaWNhdGlvbjogDQogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLg0KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uDQogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4NCiAgKi8NCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UNCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8NCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8NCg0KI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfSFNFDQogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgOTlVDQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgOVUNCiAgI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFogICAoKHVpbnQzMl90KSgodWludDMyX3QpUkNDX0JEQ1JfUlRDU0VMIHwgKHVpbnQzMl90KSgoSFNFX1ZBTFVFLzEwMDAwMDBVKSA8PCAxNlUpKSkNCiNlbHNlIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFIHx8IFJUQ19DTE9DS19TT1VSQ0VfTFNJICovDQogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUNCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUNCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0hTRSAqLw0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NClJUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsNCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpOw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQ19BTEFSTUEgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiANCiAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZCANCiAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiANCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcg0KICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4NCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQ0Kew0KICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsNCg0KICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0Ow0KICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7DQoNCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQ0KICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7DQogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOw0KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7DQojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkNCiAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8NCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7DQogIFJDQ19Pc2NJbml0U3RydWN0LkxTSVN0YXRlID0gUkNDX0xTSV9PTjsNCiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOw0KI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpDQogIC8qIENvbmZpZ3VlIEhTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovDQogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047DQogIC8qIEVuc3VyZSB0aGF0IFJUQyBpcyBjbG9ja2VkIGJ5IDFNSHogKi8NCiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfMU1IWjsNCiNlbHNlDQojZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQ0KI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovDQoNCiAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spDQogIHsNCiAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7DQogICAgaWYoSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCkgPT0gSEFMX09LKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8NCiAgICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7DQogICAgICAvKiBUaGUgdGltZSBiYXNlIHNob3VsZCBiZSAxbXMNCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLIA0KICAgICAgICAgSFNFIGFzIFJUQyBjbG9jayANCiAgICAgICAgICAgVGltZSBiYXNlID0gKCg5OSArIDEpICogKDkgKyAxKSkgLyAxTUh6DQogICAgICAgICAgICAgICAgICAgICA9IDFtcw0KICAgICAgICAgTFNFIGFzIFJUQyBjbG9jayANCiAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMi43NjhLSHoNCiAgICAgICAgICAgICAgICAgICAgID0gfjFtcw0KICAgICAgICAgTFNJIGFzIFJUQyBjbG9jayANCiAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktIeg0KICAgICAgICAgICAgICAgICAgICAgPSAxbXMNCiAgICAgICovDQogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsNCiAgICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0Ow0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsNCiAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOw0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7DQogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOw0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsNCiAgICAgIEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOw0KDQogICAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsNCg0KICAgICAgLyogRGlzYWJsZSB0aGUgQWxhcm0gQSBpbnRlcnJ1cHQgKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRSgmaFJUQ19IYW5kbGUpOw0KDQogICAgICAvKiBDbGVhciBmbGFnIGFsYXJtIEEgKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpOw0KDQogICAgICBjb3VudGVyID0gMFU7DQogICAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovDQogICAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IFJFU0VUKQ0KICAgICAgew0KICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8NCiAgICAgICAgew0KICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCkweDAxVTsNCg0KICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovDQogICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOw0KICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBpbnRlcnJ1cHQgKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7DQoNCiAgICAgIC8qIFJUQyBBbGFybSBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovDQogICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsNCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOw0KDQogICAgICAvKiBDaGVjayBpZiB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSBpcyBzZXQgKi8NCiAgICAgIGlmKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgICAgew0KICAgICAgICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8NCiAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOw0KICAgICAgICBjb3VudGVyID0gMFU7DQogICAgICAgIHdoaWxlKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQ0KICAgICAgICB7DQogICAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovDQogICAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5EUiA9IDBVOw0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPlRSID0gMFU7DQoNCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7DQoNCiAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsNCg0KICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOw0KICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19BbGFybV9JUlFuKTsNCiAgICAgIHJldHVybiBIQUxfT0s7DQogICAgfQ0KICB9DQogIHJldHVybiBIQUxfRVJST1I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4NCiAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkNCnsNCiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsNCiAgLyogRGlzYWJsZSBSVEMgQUxBUk0gdXBkYXRlIEludGVycnVwdCAqLw0KICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsNCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50Lg0KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQ0Kew0KICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOw0KICAvKiBFbmFibGUgUlRDIEFMQVJNIFVwZGF0ZSBpbnRlcnJ1cHQgKi8NCiAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsNCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQ0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUNCiAgKiBSVENfQUxBUk1fSVJRSGFuZGxlcigpLiBJdCBtYWtlcyBhIGRpcmVjdCBjYWxsIHRvIEhBTF9JbmNUaWNrKCkgdG8gaW5jcmVtZW50DQogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuDQogICogQHBhcmFtICBocnRjICBSVEMgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykNCnsNCiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7DQoNCiAgSEFMX0luY1RpY2soKTsNCg0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7DQoNCiAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovDQogIGhydGMtPkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsNCg0KICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGlmKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC80OFUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLw0KICAgIHsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogIGhydGMtPkluc3RhbmNlLT5EUiA9IDBVOw0KICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsNCg0KICBocnRjLT5JbnN0YW5jZS0+SVNSICY9ICh1aW50MzJfdCl+UlRDX0lTUl9JTklUOw0KDQogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKQ0Kew0KICBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K