LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFByZXZpb3VzbHkgbGljZW5zZWQgdW5kZXIgdGhlIElTQyBsaWNlbnNlIGJ5IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICoKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IKICogYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUKICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsCiAqIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTAogKiBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVECiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCiAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIFF1YWxjb21tIEF0aGVyb3MgQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KICoKICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgogICAgICAgICAgICAgICAgICAgICAgIFcgTCBBIE4gXyBRIEMgVCBfIFQgTCAuIEMKCiAgT1ZFUlZJRVc6CgogIFRoaXMgc29mdHdhcmUgdW5pdCBob2xkcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFdMQU4gVHJhbnNwb3J0IExheWVyLgoKICBUaGUgZnVuY3Rpb25zIGV4dGVybmFsaXplZCBieSB0aGlzIG1vZHVsZSBhcmUgdG8gYmUgY2FsbGVkIE9OTFkgYnkgb3RoZXIKICBXTEFOIG1vZHVsZXMgdGhhdCBwcm9wZXJseSByZWdpc3RlciB3aXRoIHRoZSBUcmFuc3BvcnQgTGF5ZXIgaW5pdGlhbGx5LgoKICBERVBFTkRFTkNJRVM6CgogIEFyZSBsaXN0ZWQgZm9yIGVhY2ggQVBJIGJlbG93LgoKCiAgQ29weXJpZ2h0IChjKSAyMDA4IFFVQUxDT01NIEluY29ycG9yYXRlZC4KICBBbGwgUmlnaHRzIFJlc2VydmVkLgogIFF1YWxjb21tIENvbmZpZGVudGlhbCBhbmQgUHJvcHJpZXRhcnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBGSUxFCgoKICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgoKCiAgICRIZWFkZXIkJERhdGVUaW1lJCRBdXRob3IkCgoKICB3aGVuICAgICAgICB3aG8gICAgIHdoYXQsIHdoZXJlLCB3aHkKLS0tLS0tLS0tLSAgICAtLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMjAxMC0wNy0xMyAgICBjX3NoaW5kZSBGaXhlZCBhbiBpc3N1ZSB3aGVyZSBXQVBJIHJla2V5aW5nIHdhcyBmYWlsaW5nIGJlY2F1c2UgCiAgICAgICAgICAgICAgICAgICAgICBXQUkgZnJhbWUgc2VudCBvdXQgZHVyaW5nIHJla2V5aW5nIGhhZCB0aGUgcHJvdGVjdGVkIGJpdAogICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDEuCjIwMTAtMDUtMDYgICAgcm5haXIgICBDaGFuZ2VkIG5hbWUgb2YgdmFyaWFibGUgZnJvbSB1c0xsY1R5cGUgdG8gdXNFdGhlclR5cGUKICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZnVuY3Rpb24gbmFtZSBmcm9tIEdldExMQ1R5cGUgdG8gR2V0RXRoZXJUeXBlCiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCA4MDIuMyB0byA4MDIuMTEgZnJhbWUgdHJhbnNsYXRpb24gaXNzdWUgd2hlcmUgdHdvIAogICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIExMQyBoZWFkZXIgd2FzIGdldHRpbmcgb3ZlcndyaXR0ZW4gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICBub24tUW9zIHBhdGgKMjAxMC0wNS0wNiAgICBybmFpciAgIFJ4QXV0aCBwYXRoIGZpeCBmb3IgbW9kaWZ5aW5nIHRoZSBoZWFkZXIgYmVmb3JlIGV0aGVyCiAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHJldHJlaXZlZCAoRGV0ZWN0ZWQgd2hpbGUgdGVzdGluZyByZWtleWluZwogICAgICAgICAgICAgICAgICAgICAgaW4gV0FQSSBWb2xhbnMpCjIwMTAtMDItMTkgICAgYmFkICAgICBGaXhlZCA4MDIuMTEgdG8gODAyLjMgZnQgaXNzdWVzIHdpdGggV0FQSQoyMDEwLTAyLTE5ICAgIHJuYWlyICAgV0FQSTogSWYgZnJhbWUgaXMgYSBXQUkgZnJhbWUgaW4gVHhDb25uIGFuZCBUeEF1dGgsIFRMIAogICAgICAgICAgICAgICAgICAgICAgZG9lcyBmcmFtZSB0cmFuc2xhdGlvbi4gCjIwMTAtMDItMDEgICAgcm5haXIgICBXQVBJOiBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgdmFsdWUgb2YgdWNJc1dhcGlTdGEgd2FzIG5vdCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNldCBpbiB0aGUgVEwgY29udHJvbCBibG9jayBpbiB0aGUgUmVnaXN0ZXJTVEEgZnVuYy4gCjIwMTAtMDEtMDggICAgbHRpICAgICBBZGRlZCBUTCBEYXRhIENhY2hpbmcgCjIwMDktMTEtMDQgICAgcm5haXIgICBXQVBJOiBNb3ZpbmcgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gYSBzZXBlcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIFdMQU5UTF9HZXRMTENUeXBlCjIwMDktMTAtMTUgICAgcm5haXIgICBXQVBJOiBGZWF0dXJpemluZyBXQVBJIGNvZGUKMjAwOS0xMC0wOSAgICBybmFpciAgIFdBUEk6IE1vZGlmaWNhdGlvbnMgdG8gYXV0aGVudGljYXRlZCBzdGF0ZSBoYW5kbGluZyBvZiBSeCBkYXRhCjIwMDktMTAtMDYgICAgcm5haXIgICBBZGRpbmcgc3VwcG9ydCBmb3IgV0FQSSAKMjAwOS0wOS0yMiAgICBsdGkgICAgIEFkZCBkZXJlZ2lzdHJhdGlvbiBBUEkgZm9yIG1hbmFnZW1lbnQgY2xpZW50CjIwMDktMDctMTYgICAgcm5haXIgICBUZW1wb3JhcnkgZml4IHRvIGxldCBUTCBmZXRjaCBwYWNrZXRzIHdoZW4gbXVsdGlwbGUgCiAgICAgICAgICAgICAgICAgICAgICBwZWVycyBleGlzdCBpbiBhbiBJQlNTCjIwMDktMDYtMTAgICAgbHRpICAgICBGaXggZm9yIGNoZWNraW5nIFRJRCB2YWx1ZSBvZiBtZXRhIGluZm8gb24gVFggLSBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3ZlcndyaXRlIAogICAgICAgICAgICAgICAgICAgICAgRml4IGZvciBwcm9wZXJseSBjaGVja2luZyB0aGUgc3RhIGlkIGZvciByZXN1bWluZyB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBnZW5lcmF0aW9uCjIwMDktMDUtMTQgICAgbHRpICAgICBGaXggZm9yIHNlbmRpbmcgb3V0IHRyaWdnZXIgZnJhbWVzCjIwMDktMDUtMTUgICAgbHRpICAgICBBZGRyMyBmaWx0ZXJpbmcgCjIwMDktMDQtMTMgICAgbHRpICAgICBBc3NlcnQgaWYgcGFja2V0IGxhcmdlciB0aGVuIGFsbG93ZWQKICAgICAgICAgICAgICAgICAgICAgIERyb3AgcGFja2V0IHRoYXQgZmFpbHMgZmxhdHRlbgoyMDA5LTA0LTAyICAgIGx0aSAgICAgUGVyZm9ybWFuY2UgZml4ZXMgZm9yIFRMIAoyMDA5LTAyLTE5ICAgIGx0aSAgICAgQWRkZWQgZml4IGZvciBMTEMgbWFuYWdlbWVudCBvbiBSeCBDb25uZWN0IAoyMDA5LTAxLTE2ICAgIGx0aSAgICAgUmVwbGFjZWQgcGVlayBkYXRhIHdpdGggZXh0cmFjdCBkYXRhIGZvciBub24gQkQgb3BlcnRpb25zCiAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0ZWQgZnJhbWUgY29udHJvbCBpbiBUbCBhbmQgcGFzcyB0byBIQUwgZm9yIGZyYW1lIAogICAgICAgICAgICAgICAgICAgICAgdHlwZSBldmFsdWF0aW9uCjIwMDktMDItMDIgICAgc2NoICAgICBBZGQgaGFuZG9mZiBzdXBwb3J0CjIwMDgtMTItMDkgICAgbHRpICAgICBGaXhlcyBmb3IgQU1TUyBjb21waWxhdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgYXNzZXJ0IG9uIHJlY2VpdmUgd2hlbiB0aGVyZSBpcyBubyBzdGF0aW9uCjIwMDgtMTItMDIgICAgbHRpICAgICBGaXggZm8gdHJpZ2dlciBmcmFtZSBnZW5lcmF0aW9uIAoyMDA4LTEwLTMxICAgIGx0aSAgICAgRml4IGZvIFRMIHR4IHN1c3BlbmQKMjAwOC0xMC0wMSAgICBsdGkgICAgIE1lcmdlZCBpbiBmaXhlcyBmcm9tIHJlb3JkZXJpbmcKICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkIHBhcnQgb2YgVUFQU0QgZnVuY3Rpb25hbGl0eSBpbiBUTAogICAgICAgICAgICAgICAgICAgICAgKHdpbGwgYmUgcmUtZW5hYmxlZCBvbmNlIFVBUFNEIGlzIHRlc3RlZCkKICAgICAgICAgICAgICAgICAgICAgIEZpeCBmb3IgVUFQU0QgbXVsdGlwbGUgZW5hYmxlCjIwMDgtMDgtMTAgICAgbHRpICAgICBGaXhlcyBmb2xsb3dpbmcgVUFQU0QgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgaW5maW5pdGUgbG9vcCBvbiBtYXNrIGNvbXB1dGF0aW9uIHdoZW4gU1RBIG5vIHJlZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgRml4ZXMgYWZ0ZXIgUU9TIHVuaXQgdGVzdGluZwoyMDA4LTA4LTA2ICAgIGx0aSAgICAgQWRkZWQgUU9TIHN1cHBvcnQKMjAwOC0wNy0yMyAgICBsdGkgICAgIEZpeCBmb3Igdm9zIHBhY2tldCBkcmFpbmluZwoyMDA4LTA3LTE3ICAgIGx0aSAgICAgRml4IGZvciBkYXRhIHR5cGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZyYW1lIHRyYW5zbGF0aW9uIGNvZGUgaW4gVEwKICAgICAgICAgICAgICAgICAgICAgIEF2b2lkIHJldHVybmluZyBmYWlsdXJlIHRvIFBFIGluIGNhc2UgcHJldmlvdXMgZnJhbWUgaXMKICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIHBlbmRpbmc7IGZhaWwgcHJldmlvdXMgYW5kIGNhY2hlIG5ldyBvbmUgZm9yIHR4CiAgICAgICAgICAgICAgICAgICAgICBHZXQgZnJhbWVzIHJldHVybmluZyBib29sZWFuIHRydWUgaWYgbW9yZSBmcmFtZXMgYXJlIHBlbmRpbmcKMjAwOC0wNy0wMyAgICBsdGkgICAgIEZpeGVzIGZvbGxvd2luZyBwcmUtaW50ZWdyYXRpb24gdGVzdGluZwoyMDA4LTA2LTI2ICAgIGx0aSAgICAgRml4ZXMgZm9sbG93aW5nIHVuaXQgdGVzdGluZwogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWxsb2MgYW5kIGZyZWUgZm9yIFRMIGNvbnRleHQKICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIGF0b21pYyBzZXQgdTggaW5zdGVhZCBvZiB1MzIKMjAwOC0wNS0xNiAgICBsdGkgICAgIENyZWF0ZWQgbW9kdWxlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEluY2x1ZGUgRmlsZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJ3bGFuX3FjdF90bC5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3dkYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsaV9iYS5oIiAKI2luY2x1ZGUgIndsYW5fcWN0X3RsX2hvc3VwcG9ydC5oIgojaW5jbHVkZSAidGxEZWJ1Zy5oIgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKLypJbmNsdWRlZCB0byBhY2Nlc3MgV0RJX1J4QmRUeXBlICovCiNpbmNsdWRlICJ3bGFuX3FjdF93ZGlfYmQuaCIKI2VuZGlmCi8qRW5hYmxlcyBkZWJ1Z2dpbmcgYmVoYXZpb3IgaW4gVEwqLwojZGVmaW5lIFRMX0RFQlVHCi8qRW5hYmxlcyBkZWJ1Z2dpbmcgRkMgY29udHJvbCBmcmFtZSBpbiBUTCovCi8vI2RlZmluZSBUTF9ERUJVR19GQwovLyNkZWZpbmUgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KLy8jZGVmaW5lIEJUQU1QX1RFU1QKI2lmZGVmIFRMX0RFQlVHX0ZDCiNpbmNsdWRlIDx3bGFuX3FjdF9wYWxfc3RhdHVzLmg+CiNpbmNsdWRlIDx3bGFuX3FjdF9wYWxfZGV2aWNlLmg+IC8vIHdwYWxSZWFkUmVnaXN0ZXIKI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogUHJlcHJvY2Vzc29yIERlZmluaXRpb25zIGFuZCBDb25zdGFudHMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qTExDIGhlYWRlciB2YWx1ZSovCnN0YXRpYyB2X1U4X3QgV0xBTlRMX0xMQ19IRUFERVJbXSA9ICB7MHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKLypBaXJvbmV0IFNOQVAgaGVhZGVyIHZhbHVlKi8Kc3RhdGljIHZfVThfdCBXTEFOVExfQUlST05FVF9TTkFQX0hFQURFUltdID0gIHsweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwIH07CiNlbmRpZiAvL0ZFQVRVUkVfV0xBTl9DQ1gKCi8qQlQtQU1QIHBhY2tldCBMTEMgT1VJIHZhbHVlKi8KY29uc3Qgdl9VOF90IFdMQU5UTF9CVF9BTVBfT1VJW10gPSAgezB4MDAsIDB4MTksIDB4NTggfTsKCiNkZWZpbmUgV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTIDIwCgojaWZkZWYgVk9MQU5TX1BFUkYKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEICAxMjAKI2RlZmluZSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEICAxMjAKCi8qIFRMIEJEL1BEVSB0aHJlc2hvbGQgdG8gZW5hYmxlIGludGVycnVwdCAqLwppbnQgYmRQZHVJbnRlcnJ1cHRFbmFibGVUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9FTkFCTEVfVEhSRVNIT0xEOwppbnQgYmRQZHVJbnRlcnJ1cHRHZXRUaHJlc2hvbGQgPSBXTEFOVExfQkRfUERVX0lOVEVSUlVQVF9HRVRfVEhSRVNIT0xEOwojZW5kaWYgLyogVk9MQU5TX1BFUkYgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCiB8ICAgVHlwZSgyYikgICB8ICAgICBTdWItdHlwZSg0YikgICB8CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojZGVmaW5lIFdMQU5UTF9JU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAoIFdMQU5UTF9EQVRBX0ZSQU1FX1RZUEUgPT0gKCAoX3R5cGVfc3ViKSAmIDB4MzAgKSkKCiNkZWZpbmUgV0xBTlRMX0lTX1FPU19EQVRBX0ZSQU1FKF90eXBlX3N1YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCggV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKSAmJiAgICAgXAogICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHhGICkpKSAKCiNkZWZpbmUgV0xBTlRMX0lTX01HTVRfRlJBTUUoX3R5cGVfc3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICggV0xBTlRMX01HTVRfRlJBTUVfVFlQRSA9PSAoIChfdHlwZV9zdWIpICYgMHgzMCApKQoKI2RlZmluZSBXTEFOVExfSVNfQ1RSTF9GUkFNRShfdHlwZV9zdWIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfQ1RSTF9GUkFNRV9UWVBFID09ICggKF90eXBlX3N1YikgJiAweDMwICkpCgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKI2RlZmluZSBXTEFOVExfSVNfVERMU19GUkFNRShfZXRoX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgKCBXTEFOVExfTExDX1RETFNfVFlQRSA9PSAoIF9ldGhfdHlwZSkpCiNlbmRpZgoKLypNQVggQWxsb3dlZCBsZW4gcHJvY2Vzc2VkIGJ5IFRMIC0gTUF4IE1UVSArIDgwMi4zIGhlYWRlciArIEJEK0RYRStYVEwqLwojZGVmaW5lIFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4gICAgKDE1MTQgKyAxMDApCgojZGVmaW5lIFdMQU5UTF9NQVNLX0FDICAweDAzCgovL3NvbWUgZmxvd19jb250cm9sIGRlZmluZQovL0xXTSBtb2RlIHdpbGwgYmUgZW5hYmxlZCBmb3IgdGhpcyBzdGF0aW9uIGlmIHRoZSBlZ3Jlc3MvaW5ncmVzcyBmYWxscyBiZWxvdyB0aGlzIHJhdGlvCiNkZWZpbmUgV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQgKDAuNzUpCgovL0dldCBlbm91Z2ggc2FtcGxlIHRvIGRvIHRoZSBMV00gcmVsYXRlZCBjYWxjdWxhdGlvbgojZGVmaW5lIFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEICg2NCkKCi8vTWF4aW1hbCBvbi1mbHkgcGFja2V0IHBlciBzdGF0aW9uIGluIExXTSBtb2RlCiNkZWZpbmUgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAoMjU2KQoKI2RlZmluZSBXTEFOVExfQUNfTUFTSyAoMHg3KQojZGVmaW5lIFdMQU5UTF9TVEFJRF9PRkZTRVQgKDB4NikKCi8qIFVJTlQzMiB0eXBlIGVuZGlhbiBzd2FwICovCiNkZWZpbmUgU1dBUF9FTkRJQU5fVUlOVDMyKGEpICAgICAgICAgICgoYSkgPSAoKGEpID4+IDB4MTggKSB8KCgoYSkgJiAweEZGMDAwMCkgPj4gMHgwOCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgJiAweEZGMDApIDw8IDB4MDgpICB8ICgoKGEpICYgMHhGRikgPDwgMHgxOCkpCgovKiBNYXhpbXVtIHZhbHVlIG9mIFNOUiB0aGF0IGNhbiBiZSBjYWxjdWxhdGVkIGJ5IHRoZSBIVyAqLwojZGVmaW5lIFdMQU5UTF9NQVhfSFdfU05SIDM1CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogVHlwZSBEZWNsYXJhdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgVExfTElUVExFX0JJVF9FTkRJQU4KCnR5cGVkZWYgc3RydWN0CnsKCgogICB2X1U4X3QgcHJvdFZlciA6MjsKICAgdl9VOF90IHR5cGUgOjI7CiAgIHZfVThfdCBzdWJUeXBlIDo0OwoKICAgdl9VOF90IHRvRFMgOjE7CiAgIHZfVThfdCBmcm9tRFMgOjE7CiAgIHZfVThfdCBtb3JlRnJhZyA6MTsKICAgdl9VOF90IHJldHJ5IDoxOwogICB2X1U4X3QgcG93ZXJNZ210IDoxOwogICB2X1U4X3QgbW9yZURhdGEgOjE7CiAgIHZfVThfdCB3ZXAgOjE7CiAgIHZfVThfdCBvcmRlciA6MTsKCgp9IFdMQU5UTF9NQUNGQ1R5cGU7CgovKiA4MDIuMTEgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIEZyYW1lIGNvbnRyb2wgZmllbGQgKi8KIFdMQU5UTF9NQUNGQ1R5cGUgIHdGcm1DdHJsOwoKIC8qIER1cmF0aW9uIElEICovCiB2X1UxNl90ICB1c0R1cmF0aW9uSWQ7CgogLyogQWRkcmVzcyAxIGZpZWxkICAqLwogdl9VOF90ICAgdkExW1ZPU19NQUNfQUREUl9TSVpFXTsKCiAvKiBBZGRyZXNzIDIgZmllbGQgKi8KIHZfVThfdCAgIHZBMltWT1NfTUFDX0FERFJfU0laRV07CgogLyogQWRkcmVzcyAzIGZpZWxkICovCiB2X1U4X3QgICB2QTNbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIFNlcXVlbmNlIGNvbnRyb2wgZmllbGQgKi8KIHZfVTE2X3QgIHVzU2VxQ3RybDsKCiAvLyBGaW5kIHRoZSBzaXplIG9mIHRoZSBtYW5kYXRvcnkgaGVhZGVyIHNpemUuCiNkZWZpbmUgV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRSBcCiAgICAoc2l6ZW9mKFdMQU5UTF9NQUNGQ1R5cGUpICsgc2l6ZW9mKHZfVTE2X3QpICsgXAogICAgKDMgKiAoc2l6ZW9mKHZfVThfdCkgKiBWT1NfTUFDX0FERFJfU0laRSkpICArIFwKICAgIHNpemVvZih2X1UxNl90KSkKCiAvKiBPcHRpb25hbCBBNCBhZGRyZXNzICovCiB2X1U4X3QgICBvcHR2QTRbVk9TX01BQ19BRERSX1NJWkVdOwoKIC8qIE9wdGlvbmFsIFFPUyBjb250cm9sIGZpZWxkICovCiB2X1UxNl90ICB1c1Fvc0N0cmw7Cn1XTEFOVExfODAyMTFIZWFkZXJUeXBlOwoKLyogODAyLjMgaGVhZGVyICovCnR5cGVkZWYgc3RydWN0CnsKIC8qIERlc3RpbmF0aW9uIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZEQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogU291cmNlIGFkZHJlc3MgZmllbGQgKi8KIHZfVThfdCAgIHZTQVtWT1NfTUFDX0FERFJfU0laRV07CgogLyogTGVuZ3RoIGZpZWxkICovCiB2X1UxNl90ICB1c0xlblR5cGU7Cn1XTEFOVExfODAyM0hlYWRlclR5cGU7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNkZWZpbmUgV0xBTl9UTF9JTlZBTElEX1VfU0lHIDI1NQojZGVmaW5lIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAyNTUKI2RlZmluZSBFTlRFUigpIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJFbnRlcjolcyIsIF9fZnVuY19fKQoKI2RlZmluZSBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggX3BTVEEsIF91Y0FDTWFzaywgaSApIFwKICBkb1wKICB7XAogICAgX3VjQUNNYXNrID0gMDsgXAogICAgZm9yICggaSA9IDA7IGkgPCBXTEFOVExfTUFYX0FDOyBpKysgKSBcCiAgICB7IFwKICAgICAgaWYgKCAwICE9IChfcFNUQSktPmF1Y0FDTWFza1tpXSApIFwKICAgICAgeyBcCiAgICAgICAgX3VjQUNNYXNrIHw9ICggMSA8PCBpICk7IFwKICAgICAgfSBcCiAgICB9IFwKICB9IHdoaWxlICgwKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBTdGF0aWMgVmFyaWFibGUgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogU3RhdGljIEZ1bmN0aW9uIERlY2xhcmF0aW9ucyBhbmQgRGVmaW5pdGlvbnMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpzdGF0aWMgVk9TX1NUQVRVUyAKV0xBTlRMX0dldEV0aGVyVHlwZQooCiAgdl9VOF90ICAgICAgICAgICAgICAgKiBhdWNCREhlYWRlciwKICB2b3NfcGt0X3QgICAgICAgICAgICAqIHZvc0RhdGFCdWZmLAogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNNUERVSExlbiwKICB2X1UxNl90ICAgICAgICAgICAgICAqIHVzRXRoZXJUeXBlCik7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwKLyogRklYTUVfTVVTVDogZHVyaW5nIFRETFMgaW50ZWdyYXRpb24gdG8gbWFpbi9sYXRlc3QsIFdMQU5UTF9HZXRFdGhlclR5cGUoKSBjb25mbGljdHMuCkJ1dCB0aGVyZSBpcyBkaWZmZXJlbmNlLiBleGlzdGluZyBXTEFOVExfR2V0RXRoZXJUeXBlKCkgZXhwZWN0cyB2b3NEYXRhQnVmZi0+b2Zmc2V0IHBvaW50cyB0byBNUERVIEhlYWRlciwKd2hlcmVhc2UgVERMUyBleHBlY3Qgdm9zRGF0YUJ1ZmYtPm9mZnNldCBzaG91bGQgc3RpbGwgcG9pbnRzIHRvIFJ4QmQuIApTbyBmYXIsIGRhdGEgZnJtYWUgc3RyaXBwZWQgUnhCRCBhbmQgcGFzc2VkIHRvIGRhdGEgZnJhbWUgaGFuZGxlci4KKFJ4QmQgc2hvdWxkIG5vdCBiZSBzdHJpcHBlZCBpbiBjYXNlIFRETFMsIGJlY2F1c2UgaXQgd2lsbCBiZSBldmVudHVhbGx5IHJvdXRlZCB0byBtZ210IHBhY2tldCAKaGFuZGxlciwgd2hlcmUgUlggQkQgc2hvdWxkIGJlIHByZXNlcnZlZCkKVG8gYXZvaWQgYnJlYWtpbmcgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eSwgZm9yIG5vdywgSSB0ZW1wb3JhcmlseSByZW5hbWUgdG8KV0xBTlRMX0dldEV0aGVyVHlwZV8yKCkuIEV2ZW50dWFsbHkgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBhbmQgbWVyZ2VkIHRvIFdMQU5UTF9HZXRFdGhlclR5cGUoKQoqLwpzdGF0aWMgVk9TX1NUQVRVUyAKV0xBTlRMX0dldEV0aGVyVHlwZV8yCigKICB2X1U4X3QgICAgICAgICAgICAgICAqIGF1Y0JESGVhZGVyLAogIHZvc19wa3RfdCAgICAgICAgICAgICogdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogIHZfVTE2X3QgICAgICAgICAgICAgICogdXNFdGhlclR5cGUKKTsKI2VuZGlmCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBBZGRpbmcgYSBnbG9iYWwgdmFyaWFibGUgdG8gYmUgdXNlZCB3aGVuIGRvaW5nIGZyYW1lIHRyYW5zbGF0aW9uIGluIFR4QXV0aAogKiBzdGF0ZSBzbyBhcyB0byBub3Qgc2V0IHRoZSBwcm90ZWN0ZWQgYml0IHRvIDEgaW4gdGhlIGNhc2Ugb2YgV0FJIGZyYW1lcwogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZfVThfdCBnVWNJc1dhaTsKI2VuZGlmCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRXh0ZXJuYWxpemVkIEZ1bmN0aW9uIERlZmluaXRpb25zCiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnVuY3Rpb24gRGVjbGFyYXRpb25zIGFuZCBEb2N1bWVudGF0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgICAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeQoKICBERVNDUklQVElPTgogIEl0IGZyZWVzIHVwIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIGFsbCB0aGUgU1RBIGNsaWVudHMgaW4gVExDQiBibG9jawogIENhbiBiZSBjYWxsZWQgaW5zaWRlIENsb3NlLCBTdG9wIG9yIHdoZW4gc29tZSBGQVVMVCBvY2N1cnMKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgSU4KICBwQ2xpZW50U1RBOiAgICBQb2ludGVyIHRvIHRoZSBnbG9iYWwgY2xpZW50IHBvaW50ZXIgYXJyYXkKCiAgUkVUVVJOIFZBTFVFCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkKKFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBW1dMQU5fTUFYX1NUQV9DT1VOVF0pCnsKICAgIHZfVTMyX3QgaSA9IDA7CiAgICBmb3IoaSA9MDsgaSA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrKQogICAgewogICAgICAgIGlmKCBOVUxMICE9IHBDbGllbnRTVEFbaV0gKQogICAgICAgIHsKICAgICAgICAgICB2b3NfbWVtX2ZyZWUocENsaWVudFNUQVtpXSk7CiAgICAgICAgfQogICAgICAgIHBDbGllbnRTVEFbaV0gPSBOVUxMOwogICAgfQogICAgcmV0dXJuOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9PcGVuCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgSEREIGF0IGRyaXZlciBpbml0aWFsaXphdGlvbi4gVEwgd2lsbCBpbml0aWFsaXplIGFsbCBpdHMKICAgIGludGVybmFsIHJlc291cmNlcyBhbmQgd2lsbCB3YWl0IGZvciB0aGUgY2FsbCB0byBzdGFydCB0byByZWdpc3RlcgogICAgd2l0aCB0aGUgb3RoZXIgbW9kdWxlcy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwVExDb25maWc6ICAgICAgVEwgQ29uZmlndXJhdGlvbgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9PcGVuCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfQ29uZmlnSW5mb1R5cGUqICBwVExDb25maWcKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsgCiAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIHRIYWxIYW5kbGUgICAgICBzbWVDb250ZXh0OwogIHZfVTMyX3QgaSA9IDA7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgVk9TX1NUQVRVUyAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKI2VuZGlmCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgdm9zX2FsbG9jX2NvbnRleHQoIHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCAKICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBUTENiLCBzaXplb2YoV0xBTlRMX0NiVHlwZSkpOwoKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gcFRMQ29uZmlnICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfT3BlbiBUTCAlcCBDb25maWcgJXAiLCBwVExDYiwgcFRMQ29uZmlnICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qIFNldCB0aGUgZGVmYXVsdCBsb2cgbGV2ZWwgdG8gVk9TX1RSQUNFX0xFVkVMX0VSUk9SICovCiAgdm9zX3RyYWNlX3NldExldmVsKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUik7CgogIHNtZUNvbnRleHQgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qIFplcm8gb3V0IHRoZSBtZW1vcnkgc28gd2UgYXJlIE9LLCB3aGVuIENsZWFuQ0IgaXMgY2FsbGVkLiovCiAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKXBUTENiLCBzaXplb2YoV0xBTlRMX0NiVHlwZSkpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW4gdXAgVEwgY29udHJvbCBibG9jaywgaW5pdGlhbGl6ZSBhbGwgdmFsdWVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9PcGVuIikpOwoKICBmb3IgKCBpID0wOyBpPFdMQU5fTUFYX1NUQV9DT1VOVDsgaSsrICkKICB7CiAgICAgIGlmICggaSA8IFdMQU5fTk9OMzJfU1RBX0NPVU5UICkKICAgICAgewogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICAgICAgICAgIC8qIEFsbG9jYXRpbmcgbWVtb3J5IGZvciBMRUdBQ1kgU1RBIENPVU5UIHNvIGFzIHRvIGF2b2lkIHJlZ3Jlc3Npb24gaXNzdWVzLiAgKi8KICAgICAgICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldICkKICAgICAgICAgewogICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOiBTdGFDbGllbnQgYWxsb2NhdGlvbiBmYWlsZWQiKSk7CiAgICAgICAgICAgICBXTEFOVExfRnJlZUNsaWVudE1lbW9yeShwVExDYi0+YXRsU1RBQ2xpZW50cyk7CiAgICAgICAgICAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgICAgICB9CiAgICAgICAgIHZvc19tZW1femVybygodl9WT0lEX3QgKikgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0sIHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gPSBOVUxMOwogICAgICB9CiAgfQoKICBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YoV0xBTlRMX1JFT1JERVJfQlVGRkVSX1QpICogV0xBTlRMX01BWF9CQV9TRVNTSU9OKTsKICBpZiAoTlVMTCA9PSBwVExDYi0+cmVvcmRlckJ1ZmZlclBvb2wpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJXTEFOIFRMOiBSZW9yZGVyIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIpKTsKICAgIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKICAgIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopcFRMQ2ItPnJlb3JkZXJCdWZmZXJQb29sLCBzaXplb2YoV0xBTlRMX1JFT1JERVJfQlVGRkVSX1QpICogV0xBTlRMX01BWF9CQV9TRVNTSU9OKTsKCiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDAgLypkbyBub3QgZW1wdHkqLyk7CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcFRMQ29uZmlnLT51Y0FjV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjUmVvcmRlckFnaW5nVGltZVt1Y0luZGV4XSA9IHBUTENvbmZpZy0+dWNSZW9yZGVyQWdpbmdUaW1lW3VjSW5kZXhdOwogIH0KCiAgLy8gc2NoZWR1bGluZyBpbml0IHRvIGJlIHRoZSBsYXN0IG9uZSBvZiBwcmV2aW91cyByb3VuZAogIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfQks7CiAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9IDE7CiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVC0xOwoKI2lmIDAKICAvL2Zsb3cgY29udHJvbCBmaWVsZCBpbml0CiAgdm9zX21lbV96ZXJvKCZwVExDYi0+dGxGQ0luZm8sIHNpemVvZih0RmNUeFBhcmFtc190eXBlKSk7CiAgLy9iaXQgMDogc2V0IChCZC9wZHUgY291bnQpIGJpdCAxOiBzZXQgKHJlcXVlc3Qgc3RhdGlvbiBQUyBjaGFuZ2Ugbm90aWZpY2F0aW9uKQogIHBUTENiLT50bEZDSW5mby5mY0NvbmZpZyA9IDB4MTsKI2VuZGlmCgogIHBUTENiLT52b3NUeEZDQnVmID0gTlVMTDsKICBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMgPQogICAgICAgICAgICAgICAgcFRMQ29uZmlnLT51TWluRnJhbWVzUHJvY1RocmVzOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCA9IDA7CiNlbmRpZgoKICBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludCA9CiAgICAgICAgICAgICAgICBwVExDb25maWctPnVEZWxheWVkVHJpZ2dlckZybUludDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFsbG9jYXRlIGludGVybmFsIHJlc291cmNlcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19wa3RfZ2V0X3BhY2tldCgmcFRMQ2ItPnZvc0R1bW15QnVmLCBWT1NfUEtUX1RZUEVfUlhfUkFXLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAxLyp0cnVlKi8sTlVMTCwgTlVMTCk7CgogIFdMQU5UTF9Jbml0QkFSZW9yZGVyQnVmZmVyKHB2b3NHQ3R4KTsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgLyogSW5pdGlhbGl6ZSBIYW5kb2ZmIHN1cHBvcnQgbW9kdWUKICAgICogUlNTSSBtZWFzdXJlIGFuZCBUcmFmZmljIHN0YXRlIG1vbml0b3JpbmcgKi8KICBzdGF0dXMgPSBXTEFOVExfSFNJbml0KHB2b3NHQ3R4KTsKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHN0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkhhbmRvZmYgc3VwcG9ydCBtb2R1bGUgaW5pdCBmYWlsIikpOwogICAgV0xBTlRMX0ZyZWVDbGllbnRNZW1vcnkocFRMQ2ItPmF0bFNUQUNsaWVudHMpOwogICAgdm9zX21lbV9mcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CiAgICB2b3NfZnJlZV9jb250ZXh0KHB2b3NHQ3R4LCBWT1NfTU9EVUxFX0lEX1RMLCBwVExDYik7CiAgICByZXR1cm4gc3RhdHVzOwogIH0KI2VuZGlmCgogIHBUTENiLT5pc0JNUFMgPSBWT1NfRkFMU0U7CiAgcG1jUmVnaXN0ZXJEZXZpY2VTdGF0ZVVwZGF0ZUluZCggc21lQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfUG93ZXJTdGF0ZUNoYW5nZWRDQiwgcHZvc0dDdHggKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9PcGVuICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhERCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHN0YXJ0IHByb2NlZHVyZS4gVEwgd2lsbCB1c2UgdGhpcwogICAgY2FsbCB0byByZWdpc3RlciB3aXRoIEJBTCBhcyBhIHRyYW5zcG9ydCBsYXllciBlbnRpdHkuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGNvZGVzIGNhbiBiZSByZXR1cm5lZCBhcyBhIHJlc3VsdCBvZiBhIEJBTCBmYWlsdXJlOyBzZWUgQkFMIEFQSQogICAgZm9yIG1vcmUgaW5mbwoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TdGFydAooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiICAgICAgPSBOVUxMOwogIHZfVTMyX3QgICAgICAgICAgICAgdVJlc0NvdW50ID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1N0YXJ0IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciB3aXRoIFdEQSBhcyB0cmFuc3BvcnQgbGF5ZXIgY2xpZW50CiAgICBSZXF1ZXN0IHJlc291cmNlcyBmb3IgdHggZnJvbSBidXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOIFRMOldMQU5UTF9TdGFydCIpKTsKCiAgdm9zU3RhdHVzID0gV0RBX0RTX1JlZ2lzdGVyKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1R4Q29tcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX1J4RnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9HZXRGcmFtZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9SZXNvdXJjZUNCLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdEQV9UTElfTUlOX1JFU19EQVRBLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgJnVSZXNDb3VudCApOyAKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAogICAgICAgICAgICAgICAiV0xBTiBUTDpUTCBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBCQUwvV0RBLCBFcnI6ICVkIiwKICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLyogRW5hYmxlIHRyYW5zbWlzc2lvbiAqLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDApOwoKICBwVExDYi0+dVJlc0NvdW50ID0gdVJlc0NvdW50OwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3RhcnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1N0b3AKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgdG8gc3RvcCBvcGVyYXRpb24gaW4gVEwsIGJlZm9yZSBjbG9zZS4gVEwgd2lsbCBzdXNwZW5kIGFsbAogICAgZnJhbWUgdHJhbnNmZXIgb3BlcmF0aW9uIGFuZCB3aWxsIHdhaXQgZm9yIHRoZSBjbG9zZSByZXF1ZXN0IHRvIGNsZWFuIHVwCiAgICBpdHMgcmVzb3VyY2VzLgoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0CiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU3RvcAooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHZfVThfdCAgICAgIHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEVOVEVSKCk7CiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdG9wIFRMIGFuZCBlbXB0eSBTdGF0aW9uIGxpc3QKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX1N0b3AiKSk7CgogIC8qIERpc2FibGUgdHJhbnNtaXNzaW9uICovCiAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CgogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKTsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKICB9CgogIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmID0gTlVMTDsKICB9CgojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXTEFOVExfSFNTdG9wKHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIkhhbmRvZmYgU3VwcG9ydCBtb2R1bGUgc3RvcCBmYWlsIikpOwogIH0KI2VuZGlmCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYW4gY2xpZW50IHN0YXRpb25zCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfU1RBX0NPVU5UOyB1Y0luZGV4KyspCiAgewogICAgaWYgKCBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdICkKICAgIHsKICAgICAgICBXTEFOVExfQ2xlYW5TVEEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0sIDEgLyplbXB0eSBhbGwgcXVldWVzKi8pOwogICAgfQogIH0KCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU3RvcCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xvc2UKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBIREQgZHVyaW5nIGdlbmVyYWwgZHJpdmVyIGNsb3NlIHByb2NlZHVyZS4gVEwgd2lsbCBjbGVhbiB1cAogICAgYWxsIHRoZSBpbnRlcm5hbCByZXNvdXJjZXMuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9DbG9zZQooCiAgdl9QVk9JRF90ICBwdm9zR0N0eAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIHRIYWxIYW5kbGUgc21lQ29udGV4dDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRGVyZWdpc3RlciBmcm9tIFBNQwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHNtZUNvbnRleHQgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9TTUUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gc21lQ29udGV4dCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHNtZUNvbnRleHQiLCBfX2Z1bmNfXykpOwogICAgLy8gY29udGludWUgc28gdGhhdCB3ZSBjYW4gY2xlYW51cCBhcyBtdWNoIGFzIHBvc3NpYmxlCiAgfQogIGVsc2UKICB7CiAgICBwbWNEZXJlZ2lzdGVyRGV2aWNlU3RhdGVVcGRhdGVJbmQoIHNtZUNvbnRleHQsIFdMQU5UTF9Qb3dlclN0YXRlQ2hhbmdlZENCICk7CiAgfQoKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICBpZihWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0xBTlRMX0hTRGVJbml0KHB2b3NHQ3R4KSkKICB7CiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgIkhhbmRvZmYgU3VwcG9ydCBtb2R1bGUgRGVJbml0IGZhaWwiKSk7CiAgfQojZW5kaWYKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsZWFudXAgVEwgY29udHJvbCBibG9jay4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9DbG9zZSIpKTsKICBXTEFOVExfQ2xlYW5DQihwVExDYiwgMSAvKiBlbXB0eSBxdWV1ZXMvbGlzdHMvcGt0cyBpZiBhbnkqLyk7CgogIFdMQU5UTF9GcmVlQ2xpZW50TWVtb3J5KHBUTENiLT5hdGxTVEFDbGllbnRzKTsKCiAgdm9zX21lbV9mcmVlKHBUTENiLT5yZW9yZGVyQnVmZmVyUG9vbCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGcmVlIFRMIGNvbnRleHQgZnJvbSBWT1NTIGdsb2JhbAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19mcmVlX2NvbnRleHQocHZvc0dDdHgsIFZPU19NT0RVTEVfSURfVEwsIHBUTENiKTsKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0Nsb3NlICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggSERECiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Db25maWd1cmVTd0ZyYW1lVFhYbGF0aW9uRm9yQWxsCgogIERFU0NSSVBUSU9OCiAgICAgRnVuY3Rpb24gdG8gZGlzYWJsZS9lbmFibGUgZnJhbWUgdHJhbnNsYXRpb24gZm9yIGFsbCBhc3NvY2lhdGlvbiBzdGF0aW9ucy4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKICAgSU4KICAgIHB2b3NHQ3R4OiBWT1MgY29udGV4dCAKICAgIEVuYWJsZUZyYW1lWGxhdGlvbiBUUlVFIG1lYW5zIGVuYWJsZSBTVyB0cmFuc2xhdGlvbiBmb3IgYWxsIHN0YXRpb25zLgogICAgLgoKICBSRVRVUk4gVkFMVUUKCiAgIHZvaWQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfQ29uZmlndXJlU3dGcmFtZVRYWGxhdGlvbkZvckFsbAooCiAgdl9QVk9JRF90IHB2b3NHQ3R4LCAKICB2X0JPT0xfdCBlbmFibGVGcmFtZVhsYXRpb24KKQp7CiAgdl9VOF90IHVjSW5kZXg7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uICIKICAgICAgICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGwiKSk7CiAgICByZXR1cm47CiAgfQoKICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAiV0xBTlRMX0NvbmZpZ3VyZVN3RnJhbWVUWFhsYXRpb25Gb3JBbGw6IENvbmZpZ3VyZSBTVyBmcmFtZVhsYXRpb24gJWQiLCAKICAgICAgZW5hYmxlRnJhbWVYbGF0aW9uKSk7CgogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTl9NQVhfVElEOyB1Y0luZGV4KyspIAogIHsKICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XTsKICAgIGlmICggTlVMTCAhPSBwQ2xpZW50U1RBICYmIDAgIT0gcENsaWVudFNUQS0+dWNFeGlzdHMgKQogICAgewojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgICAgIC8vIGlmIHRoaXMgc3RhdGlvbiB3YXMgbm90IGFsbG9jYXRlZCByZXNvdXJjZXMgdG8gcGVyZm9ybSBIVy1iYXNlZAogICAgICAvLyBUWCBmcmFtZSB0cmFuc2xhdGlvbiB0aGVuIGZvcmNlIFNXLWJhc2VkIFRYIGZyYW1lIHRyYW5zbGF0aW9uCiAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKICAgICAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHVjSW5kZXgpKQogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gMTsKICAgICAgfQogICAgICBlbHNlCiNlbmRpZgogICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IGVuYWJsZUZyYW1lWGxhdGlvbjsKICAgIH0KICB9Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TdGFydEZvcndhcmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXNrIHNlcmlhbGl6YXRpb24gdGhyb3VnaCBUWCB0aHJlYWQgb2YgdGhlICAgCiAgICBjYWNoZWQgZnJhbWUgZm9yd2FyZGluZyAoaWYgc3RhdGF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW4gd2hpbGUpIAogICAgb3IgZmx1c2hpbmcgKGlmIHN0YXRpb24gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlIHRpbWUpCgogICAgSW4gY2FzZSBvZiBmb3J3YXJkaW5nLCB1cHBlciBsYXllciBpcyBvbmx5IHJlcXVpcmVkIHRvIGNhbGwgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkKICAgIGFuZCBkb2Vzbid0IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkuIFRMIHdpbGwgaGFuZGxlIHRoaXMgaW5zaWRlIAogICAgV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50KCkuIAogICAgCiAgICBJbiBjYXNlIG9mIGZsdXNoaW5nLCB1cHBlciBsYXllciBpcyByZXF1aXJlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseQogICAgCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAKICBQQVJBTUVURVJTCgogICB1Y1NUQUlkOiAgIHN0YXRpb24gaWQgCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCiAgICBQbGVhc2UgY2hlY2sgcmV0dXJuIHZhbHVlcyBvZiB2b3NfdHhfbXFfc2VyaWFsaXplLgoKICBTSURFIEVGRkVDVFMKICAgIElmIFRMIHdhcyBhc2tlZCB0byBwZXJmb3JtIFdMQU5UTF9DYWNoZVNUQUZyYW1lKCkgaW4gV0xBTlRMX1J4RnJhbWVzKCksIAogICAgZWl0aGVyIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCgpIG9yIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgCiAgICB3aXRoaW4gcmVhc29uYWJsZSB0aW1lLiBPdGhlcndpc2UsIFRMIHdpbGwga2VlcCBjYWNoZWQgdm9zIGJ1ZmZlciB1bnRpbAogICAgb25lIG9mIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgbWF5IGVuZCB1cCB3aXRoIHN5c3RlbSBidWZmZXIgZXhoYXN1dGlvbi4gCgogICAgSXQncyBhbiB1cHBlciBsYXllcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBpbiBjYXNlIG9mCiAgICBmbHVzaGluZwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTIApXTEFOVExfU3RhcnRGb3J3YXJkaW5nCigKICB2X1U4X3QgdWNTVEFJZCwKICB2X1U4X3QgdWNVY2FzdFNpZywgCiAgdl9VOF90IHVjQmNhc3RTaWcgCikKewogIHZvc19tc2dfdCAgICAgIHNNZXNzYWdlOwogIHZfVTMyX3QgICAgICAgIHVEYXRhOyAgICAgICAgICAgICAKIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCgogIC8qIFNpZ25hbCB0aGUgT1MgdG8gc2VyaWFsaXplIG91ciBldmVudCAqLwogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAiU2VyaWFsaXppbmcgVEwgU3RhcnQgRm9yd2FyZGluZyBDYWNoZWQgZm9yIGNvbnRyb2wgU1RBICVkIiwgCiAgICAgICAgICAgICAgdWNTVEFJZCApOwoKICB2b3NfbWVtX3plcm8oICZzTWVzc2FnZSwgc2l6ZW9mKHZvc19tc2dfdCkgKTsKCiAgdURhdGEgPSB1Y1NUQUlkIHwgKHVjVWNhc3RTaWcgPDwgOCApIHwgKHVjQmNhc3RTaWcgPDwgMTYpOyAKICBzTWVzc2FnZS5ib2R5dmFsID0gdURhdGE7CiAgc01lc3NhZ2UudHlwZSAgICA9IFdMQU5UTF9UWF9GV0RfQ0FDSEVEOwoKICByZXR1cm4gdm9zX3R4X21xX3NlcmlhbGl6ZShWT1NfTVFfSURfVEwsICZzTWVzc2FnZSk7Cgp9IC8qIFdMQU5UTF9TdGFydEZvcndhcmRpbmcoKSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0Fzc29jRmFpbGVkCgogIERFU0NSSVBUSU9OCgogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IFBFIHRvIG5vdGlmeSBUTCB0aGF0IGNhY2hlIG5lZWRzIHRvIGZsdXNoZWQnIAogICAgd2hlbiBhc3NvY2lhdGlvbiBpcyBub3Qgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAKCiAgICBJbnRlcm5hbGx5LCBUTCBwb3N0IGEgbWVzc2FnZSB0byBUWF9UaHJlYWQgdG8gc2VyaWFsaXplIHRoZSByZXF1ZXN0IHRvIAogICAga2VlcCBsb2NrLWZyZWUgbWVjaGFuaXNtLgoKICAgCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAKICBQQVJBTUVURVJTCgogICB1Y1NUQUlkOiAgIHN0YXRpb24gaWQgCgogIFJFVFVSTiBWQUxVRQoKICAgbm9uZQogICAKICBTSURFIEVGRkVDVFMKICAgVGhlcmUgbWF5IGJlIHJhY2UgY29uZGl0aW9uIHRoYXQgUEUgY2FsbCB0aGlzIEFQSSBhbmQgc2VuZCBhbm90aGVyIGFzc29jaWF0aW9uCiAgIHJlcXVlc3QgaW1tZWRpYXRlbHkgd2l0aCBzYW1lIHN0YUlkIGJlZm9yZSBUWF90aHJlYWQgY2FuIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCgogICBUbyBhdm9pZCB0aGlzLCB3ZSBtaWdodCBuZWVkIFBFIHRvIHdhaXQgZm9yIFRYX3RocmVhZCBwcm9jZXNzIHRoZSBtZXNzYWdlLAogICBidXQgdGhpcyBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAKICAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2b2lkIFdMQU5UTF9Bc3NvY0ZhaWxlZCh2X1U4X3Qgc3RhSWQpCnsKICAvLyBmbHVzaGluZyBmcmFtZXMgYW5kIGZvcndhcmRpbmcgZnJhbWVzIHVzZXMgdGhlIHNhbWUgbWVzc2FnZQogIC8vIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2hhdCBoYXBwZW5zIHdoZW4gdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCiAgLy8gaWYgdGhlIFNUQSBleGlzdCwgdGhlIGZyYW1lcyB3aWxsIGJlIGZvcndhcmRlZAogIC8vIGFuZCBpZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGUgZnJhbWVzIHdpbGwgYmUgZmx1c2hlZAogIC8vIGluIHRoaXMgY2FzZSB3ZSBrbm93IGl0IHdvbid0IGV4aXN0IHNvIHRoZSBEUFUgaW5kZXggc2lnbmF0dXJlIHZhbHVlcyBkb24ndCBtYXR0ZXIKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKFdMQU5UTF9TdGFydEZvcndhcmRpbmcoc3RhSWQsMCwwKSkpCiAgewogICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICIgJXMgZmFpbHMgdG8gc3RhcnQgZm9yd2FyZGluZyIsIF9fZnVuY19fKTsKICB9Cn0KICAKICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgV0xBTlRMX0ZpbmlzaF9VTEEKCiAgREVTQ1JJUFRJT04KICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIG5vdGlmeSBUTCB0byBmaW5pc2ggVXBwZXIgbGF5ZXIgYXV0aGVudGljYXRpb24KICAgICBpbmNhc2UgdGhlIGxhc3QgRUFQT0wgcGFja2V0IGlzIHBlbmRpbmcgaW4gdGhlIFRMIHF1ZXVlLiAKICAgICBUbyBhdm9pZCB0aGUgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBzbWUgc2V0IGtleSBhbmQgdGhlIGxhc3QgRUFQT0wgcGFja2V0IAogICAgIHRoZSBIREQgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24ganVzdCBiZWZvcmUgY2FsbGluZyB0aGUgc21lX1JvYW1TZXRLZXkuCgogIERFUEVOREVOQ0lFUwoKICAgICBUTCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBnZXRzIGNhbGxlZC4KICAKICBQQVJBTUVURVJTCgogICBjYWxsYmFja1JvdXRpbmU6ICAgSEREIENhbGxiYWNrIGZ1bmN0aW9uLgogICBjYWxsYmFja0NvbnRleHQgOiBIREQgdXNlcmRhdGEgY29udGV4dC4KICAKICAgUkVUVVJOIFZBTFVFCgogICBWT1NfU1RBVFVTX1NVQ0NFU1MvVk9TX1NUQVRVU19GQUlMVVJFCiAgIAogIFNJREUgRUZGRUNUUwogICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTIFdMQU5UTF9GaW5pc2hfVUxBKCB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0KQp7CiAgIHJldHVybiBXREFfRFNfRmluaXNoVUxBKCBjYWxsYmFja1JvdXRpbmUsIGNhbGxiYWNrQ29udGV4dCk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSEREIHRvIHJlZ2lzdGVyIGFzIGEgY2xpZW50IGZvciBkYXRhIHNlcnZpY2VzCiAgICB3aXRoIFRMLiBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIGZvciBlYWNoIG5ldyBzdGF0aW9uIHRoYXQgaXQgYWRkcywKICAgIHRodXMgaGF2aW5nIHRoZSBmbGV4aWJpbGl0eSBvZiByZWdpc3RlcmluZyBkaWZmZXJlbnQgY2FsbGJhY2sgZm9yIGVhY2gKICAgIFNUQSBpdCBzZXJ2aWNlcy4KCiAgREVQRU5ERU5DSUVTCgogICAgVEwgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogICAgUmVzdHJpY3Rpb246CiAgICAgIE1haW4gdGhyZWFkIHdpbGwgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhdCBUeCBhbmQgUnggdGhyZWFkcyB0aHVzCiAgICAgIGd1YXJhbnRlZWluZyB0aGF0IGEgc3RhdGlvbiB3aWxsIGJlIGFkZGVkIGJlZm9yZSBhbnkgZGF0YSBjYW4gYmUKICAgICAgcmVjZWl2ZWQgZm9yIGl0LiAoVGhpcyBlbmFibGVzIFRMIHRvIGJlIGxvY2sgZnJlZSkKCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICBwZm5TdEFSeDogICAgICAgIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgcGFja2V0IGhhbmRsZXIgZnJvbSBIREQKICAgcGZuU1RBVHhDb21wOiAgICBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBjb21wbGV0ZSBjb25maXJtYXRpb24KICAgICAgICAgICAgICAgICAgICBoYW5kbGVyIGZyb20gSERECiAgIHBmblNUQUZldGNoUGt0OiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcGFja2V0IHJldHJpZXZhbCByb3V0aW5lIGluIEhERAogICB3U1RBRGVzY1R5cGU6ICAgIFNUQSBEZXNjcmlwdG9yLCBjb250YWlucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgIG5ldyBhZGRlZCBTVEEKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6IElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX1NUQVJ4Q0JUeXBlICAgICAgICBwZm5TVEFSeCwKICBXTEFOVExfVHhDb21wQ0JUeXBlICAgICAgIHBmblNUQVR4Q29tcCwKICBXTEFOVExfU1RBRmV0Y2hQa3RDQlR5cGUgIHBmblNUQUZldGNoUGt0LAogIFdMQU5fU1RBRGVzY1R5cGUqICAgICAgICAgcHdTVEFEZXNjVHlwZSwKICB2X1M3X3QgICAgICAgICAgICAgICAgICAgIHJzc2kKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgdl9VOF90ICAgIHVjVGlkID0gMDsvKkxvY2FsIHZhcmlhYmxlIHRvIGNsZWFyIHByZXZpb3VzIHJlcGxheSBjb3VudGVycyBvZiBTVEEgb24gYWxsIFRJRHMqLwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgRU5URVIoKTsKICBpZiAoKCBOVUxMID09IHB3U1RBRGVzY1R5cGUgKSB8fCAoIE5VTEwgPT0gcGZuU1RBUnggKSB8fAogICAgICAoIE5VTEwgPT0gcGZuU1RBRmV0Y2hQa3QgKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL0NvZGUgZm9yIGNoZWNraW5nIGFuZCBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgbmV3IFNUQQogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSApewogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSA9IHZvc19tZW1fbWFsbG9jKHNpemVvZihXTEFOVExfU1RBQ2xpZW50VHlwZSkpOwogICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF0gKXsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBpbiBXTEFOVExfUmVnaXN0ZXJTVEFDbGllbnQiKSk7CiAgICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgICAgIH0KICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IG1lbW9yeSBhbGxvY2F0aW9uIGluIFdMQU5UTF9SZWdpc3RlclNUQUNsaWVudCIpKTsKICAgICAgdm9zX21lbV96ZXJvKCh2X1ZPSURfdCAqKSBwVExDYi0+YXRsU1RBQ2xpZW50c1twd1NUQURlc2NUeXBlLT51Y1NUQUlkXSxzaXplb2YoV0xBTlRMX1NUQUNsaWVudFR5cGUpKTsKICB9CgogIC8vQXNzaWduaW5nIHRoZSBwb2ludGVyIHRvIGxvY2FsIHZhcmlhYmxlIGZvciBlYXN5IGFjY2VzcyBpbiBmdXR1cmUKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbcHdTVEFEZXNjVHlwZS0+dWNTVEFJZF07CiAgaWYgKCAwICE9IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBwQ2xpZW50U1RBLT51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIiwgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCApKTsKCiAgcENsaWVudFNUQS0+cGZuU1RBUnggICAgICAgPSBwZm5TVEFSeDsKICBwQ2xpZW50U1RBLT5wZm5TVEFGZXRjaFBrdCA9IHBmblNUQUZldGNoUGt0OwoKICAvKiBPbmx5IHJlZ2lzdGVyIGlmIGRpZmZlcmVudCBmcm9tIE5VTEwgLSBUTCBkZWZhdWx0IFR4IENvbXAgQ2Igd2lsbAogICAgcmVsZWFzZSB0aGUgdm9zIHBhY2tldCAqLwogIGlmICggTlVMTCAhPSBwZm5TVEFUeENvbXAgKQogIHsKICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCAgID0gcGZuU1RBVHhDb21wOwogIH0KCiAgcENsaWVudFNUQS0+dGxTdGF0ZSAgPSBXTEFOVExfU1RBX0lOSVQ7CiAgcENsaWVudFNUQS0+dGxQcmkgICAgPSBXTEFOVExfU1RBX1BSSV9OT1JNQUw7CiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTVEFJZCAgPSBwd1NUQURlc2NUeXBlLT51Y1NUQUlkOwogIHBDbGllbnRTVEEtPnB0a0luc3RhbGxlZCA9IDA7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBTVEEgQ2xpZW50IElEOiAlZCB3aXRoIFVDICVkIGFuZCBCQyAlZCIsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNTVEFJZCwgCiAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgcHdTVEFEZXNjVHlwZS0+dWNCY2FzdFNpZykpOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSA9IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlOwoKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQgPSBwd1NUQURlc2NUeXBlLT51Y1Fvc0VuYWJsZWQ7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQWRkUm12TExDID0gcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEM7CgogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWUgPSBwd1NUQURlc2NUeXBlLT51Y1Byb3RlY3RlZEZyYW1lOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1gKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzQ2N4U3RhID0gcHdTVEFEZXNjVHlwZS0+dWNJc0NjeFN0YTsKCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIFFvUyAlZCBBZGQgTExDICVkIFByb3RGcmFtZSAlZCBDY3hTdGEgJWQiLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQsIAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNRb3NFbmFibGVkLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNBZGRSbXZMTEMsCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1Byb3RlY3RlZEZyYW1lLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNJc0NjeFN0YSkpOwojZWxzZQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmVnaXN0ZXJpbmcgU1RBIENsaWVudCBJRDogJWQgUW9TICVkIEFkZCBMTEMgJWQgUHJvdEZyYW1lICVkIiwgCiAgICAgICAgICAgICBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQWRkUm12TExDLAogICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNQcm90ZWN0ZWRGcmFtZSkpOwoKI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0NDWAojaWZkZWYgV0xBTl9TT0ZUQVBfVlNUQV9GRUFUVVJFCiAgLy8gaWYgdGhpcyBzdGF0aW9uIHdhcyBub3QgYWxsb2NhdGVkIHJlc291cmNlcyB0byBwZXJmb3JtIEhXLWJhc2VkCiAgLy8gVFggZnJhbWUgdHJhbnNsYXRpb24gdGhlbiBmb3JjZSBTVy1iYXNlZCBUWCBmcmFtZSB0cmFuc2xhdGlvbgogIC8vIG90aGVyd2lzZSB1c2UgdGhlIGZyYW1lIHRyYW5zbGF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQKCiAgaWYgKCFXREFfSXNId0ZyYW1lVHhUcmFuc2xhdGlvbkNhcGFibGUocHZvc0dDdHgsIHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQpCiAgICAgIHx8ICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlKSkKICB7CiAgICAgIHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVRYWGxhdGlvbiA9IDE7CiAgfQojZW5kaWYKCiAgcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lVFhYbGF0aW9uID0gcHdTVEFEZXNjVHlwZS0+dWNTd0ZyYW1lVFhYbGF0aW9uOwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVJYWGxhdGlvbiA9IHB3U1RBRGVzY1R5cGUtPnVjU3dGcmFtZVJYWGxhdGlvbjsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNXYXBpU3RhID0gcHdTVEFEZXNjVHlwZS0+dWNJc1dhcGlTdGE7CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICB2b3NfY29weV9tYWNhZGRyKCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U1RBTUFDQWRkcmVzcyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52QlNTSURmb3JJQlNTLCAmcHdTVEFEZXNjVHlwZS0+dkJTU0lEZm9ySUJTUyk7CgogIHZvc19jb3B5X21hY2FkZHIoICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U2VsZk1BQ0FkZHJlc3MsICZwd1NUQURlc2NUeXBlLT52U2VsZk1BQ0FkZHJlc3MpOwoKICAvKiBJbiB2b2xhbnMgcmVsZWFzZSBMIHJlcGxheSBjaGVjayBpcyBkb25lIGF0IFRMICovCiAgcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQgPSBwd1NUQURlc2NUeXBlLT51Y0lzUmVwbGF5Q2hlY2tWYWxpZDsKICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkID0gIDA7Ci8qQ2xlYXIgcmVwbGF5IGNvdW50ZXJzIG9mIHRoZSBTVEEgb24gYWxsIFRJRHMqLwogIGZvcih1Y1RpZCA9IDA7IHVjVGlkIDwgV0xBTlRMX01BWF9USUQgOyB1Y1RpZCsrKQogIHsKICAgIHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdID0gIDA7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFNldCB0aGUgQUMgZm9yIHRoZSByZWdpc3RlcmVkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgICBtYWRlIGluIHRoZSBtYWluIFRMIGxvb3AgYWZ0ZXIgdGhlIHN1cHBvcnRlZCBtYXNrIGlzIHByb3Blcmx5CiAgICAgIHVwZGF0ZWQgaW4gdGhlIHBlbmRpbmcgcGFja2V0cyBjYWxsCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcENsaWVudFNUQS0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogIHBDbGllbnRTVEEtPnVjQ3VycmVudFdlaWdodCA9IDA7CiAgcENsaWVudFNUQS0+dWNTZXJ2aWNlZEFDICAgID0gV0xBTlRMX0FDX0JLOwogIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMDsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdWNBQ01hc2ssIHNpemVvZihwQ2xpZW50U1RBLT5hdWNBQ01hc2spKTsKCiAgdm9zX21lbV96ZXJvKCAmcENsaWVudFNUQS0+d1VBUFNESW5mbywgc2l6ZW9mKHBDbGllbnRTVEEtPndVQVBTREluZm8pKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVvcmRlcmluZyBpbmZvIGFuZCBBTVNEVSBkZS1hZ2dyZWdhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1femVybyggcENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mbywKICAgICBzaXplb2YocENsaWVudFNUQS0+YXRsQkFSZW9yZGVySW5mb1swXSkqCiAgICAgV0xBTl9NQVhfVElEKTsKCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdWNNUERVSGVhZGVyLAogICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CgogIHBDbGllbnRTVEEtPnVjTVBEVUhlYWRlckxlbiAgID0gMDsKICBwQ2xpZW50U1RBLT52b3NBTVNEVUNoYWluICAgICA9IE5VTEw7CiAgcENsaWVudFNUQS0+dm9zQU1TRFVDaGFpblJvb3QgPSBOVUxMOwoKCiAgLyogUmVvcmRlciBMT0NLCiAgICogRHVyaW5nIGhhbmRsZSBub3JtYWwgUlggZnJhbWUgd2l0aGluIFJYIHRocmVhZCwKICAgKiBpZiBNQyB0aHJlYWQgdHJ5IHRvIHByZWVtcHQsIEFEREJBLCBERUxCQSwgVElNRVIKICAgKiBDb250ZXh0IHNob3VsZCBiZSBwcm90ZWN0ZWQgZnJvbSByYWNlICovCiAgZm9yICh1Y1RpZCA9IDA7IHVjVGlkIDwgV0xBTl9NQVhfVElEIDsgdWNUaWQrKykKICB7CiAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUygKICAgICAgICB2b3NfbG9ja19pbml0KCZwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS5yZW9yZGVyTG9jaykpKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkxvY2sgSW5pdCBGYWlsIikpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICAgfQogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zX21lbV96ZXJvKCBwQ2xpZW50U1RBLT5hdVJ4Q291bnQsCiAgICAgIHNpemVvZihwQ2xpZW50U1RBLT5hdVJ4Q291bnRbMF0pKgogICAgICBXTEFOX01BWF9USUQpOwoKICB2b3NfbWVtX3plcm8oIHBDbGllbnRTVEEtPmF1VHhDb3VudCwKICAgICAgc2l6ZW9mKHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkqCiAgICAgIFdMQU5fTUFYX1RJRCk7CiAgLyogSW5pdGlhbCBSU1NJIGlzIGFsd2F5cyByZXBvcnRlZCBhcyB6ZXJvIGJlY2F1c2UgVEwgZG9lc250IGhhdmUgZW5vdWdoCiAgICAgZGF0YSB0byBjYWxjdWxhdGUgUlNTSS4gU28gdG8gYXZvaWQgcmVwb3J0aW5nIHplcm8sIHdlIGFyZSBpbml0aWFsaXppbmcKICAgICBSU1NJIHdpdGggUlNTSSBzYXZlZCBpbiBCc3NEZXNjcmlwdGlvbiBkdXJpbmcgc2Nhbm5pbmcuICovCiAgcENsaWVudFNUQS0+cnNzaUF2ZyA9IHJzc2k7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgewogICAgLyogSWYgY2xpZW50IGlzIFRETFMsIHVzZSBURExTIHNwZWNpZmljIGFscGhhICovCiAgICBwQ2xpZW50U1RBLT5yc3NpQWxwaGEgPSBXTEFOVExfSE9fVERMU19BTFBIQTsKICB9CiAgZWxzZQogIHsKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwogIH0KI2Vsc2UKICAgIHBDbGllbnRTVEEtPnJzc2lBbHBoYSA9IFdMQU5UTF9IT19ERUZBVUxUX0FMUEhBOwojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCiAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogIHZvc19hdG9taWNfc2V0X1U4KAogICAgICAgICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwKTsKCiAgLyogVXNlZCB1bnRpbCBtdWx0aXBsZSBzdGF0aW9uIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCovCiAgcFRMQ2ItPnVjUmVnaXN0ZXJlZFN0YUlkID0gcHdTVEFEZXNjVHlwZS0+dWNTVEFJZDsKCiAgLyogU2F2ZSB0aGUgQkFQIHN0YXRpb24gSUQgZm9yIGZ1dHVyZSB1c2FnZSAqLwogIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZCA9IHB3U1RBRGVzY1R5cGUtPnVjU1RBSWQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU3RhdGlzdGljcyBpbmZvIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIG1lbXNldCgmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGFydCB3aXRoIHRoZSBzdGF0ZSBzdWdnZXN0ZWQgYnkgY2xpZW50IGNhbGxlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnRsU3RhdGUgPSBwd1NUQURlc2NUeXBlLT51Y0luaXRTdGF0ZTsKICBwQ2xpZW50U1RBLT51Y1J4QmxvY2tlZCA9IDE7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWZ0ZXIgYWxsIHRoZSBpbml0IGlzIGNvbXBsZXRlIHdlIGNhbiBtYXJrIHRoZSBleGlzdGFuY2UgZmxhZyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjRXhpc3RzKys7CgogIC8vZmxvdyBjb250cm9sIGZpZWxkcyBpbml0CiAgcENsaWVudFNUQS0+dWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPnVjTHdtRXZlbnRSZXBvcnRlZCA9IEZBTFNFOwogIHBDbGllbnRTVEEtPmJtdU1lbUNvbnN1bWVkID0gMDsKICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggPSAwOwogIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWDsKCiAgcENsaWVudFNUQS0+dUx3bVRocmVzaG9sZCA9IFdMQU5UTF9TVEFfQk1VX1RIUkVTSE9MRF9NQVggLyAzOwoKICAvL0BAQCBIRERTT0ZUQVAgZG9lcyBub3QgcXVldWUgdW5yZWdpc3RlcmVkIHBhY2tldCBmb3Igbm93CiAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgIT0gcHdTVEFEZXNjVHlwZS0+d1NUQVR5cGUgKQogIHsgCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBGb3J3YXJkIHJlY2VpdmVkIGZyYW1lcyB3aGlsZSBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZCAKICAgIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyhXTEFOVExfU3RhcnRGb3J3YXJkaW5nKCBwd1NUQURlc2NUeXBlLT51Y1NUQUlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdTVEFEZXNjVHlwZS0+dWNVY2FzdFNpZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3U1RBRGVzY1R5cGUtPnVjQmNhc3RTaWcpKSkKICAgIHsKICAgICAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIiAlcyBmYWlscyB0byBzdGFydCBmb3J3YXJkaW5nIiwgX19mdW5jX18pOwogICAgfQojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgIGlmKCBXTEFOX1NUQV9URExTID09IHB3U1RBRGVzY1R5cGUtPndTVEFUeXBlICkKICAgICAgICBwVExDYi0+dWNUZGxzUGVlckNvdW50Kys7CiNlbmRpZgogIH0KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyU1RBQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYXJTVEFDbGllbnQKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIGRhdGEgc2VydmljZXMgZm9yIHRoZQogICAgcGFydGljdWxhciBzdGF0aW9uLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNsZWFyIHJlZ2lzdHJhdGlvbiBpcwogICAgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBwdm9zR0N0eDogICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHVjU1RBSWQ6ICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFNUQSB0byBiZSBjbGVhcmVkCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0NsZWFyU1RBQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7IAogIHZfVThfdCAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgRU5URVIoKTsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NsZWFyU1RBQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2xlYXJTVEFDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9DbGVhclNUQUNsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyogRGVsZXRlIEJBIHNlc3Npb25zIG9uIGFsbCBUSUQncyAqLwogIGZvciAodWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCiAgewogICAgIFdMQU5UTF9CYVNlc3Npb25EZWwocHZvc0dDdHgsIHVjU1RBSWQsIHVjSW5kZXgpOwogICAgIHZvc19sb2NrX2Rlc3Ryb3koJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJMb2NrKTsKICB9CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAvKiBkZWNyZW1lbnQgdWNUZGxzUGVlckNvdW50IG9ubHkgaWYgaXQgaXMgbm9uLXplcm8gKi8gIAogIGlmKFdMQU5fU1RBX1RETFMgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlCiAgICAgICYmIHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiAgICAgIHBUTENiLT51Y1RkbHNQZWVyQ291bnQtLTsKI2VuZGlmCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDbGVhciBzdGF0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNsZWFyaW5nIFNUQSBDbGllbnQgSUQ6ICVkIiwgdWNTVEFJZCApKTsKICBXTEFOVExfQ2xlYW5TVEEocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0sIDEgLyplbXB0eSBwYWNrZXRzKi8pOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2xlYXJpbmcgU1RBIFJlc2V0IEhpc3RvcnkgUlNTSSBhbmQgUmVnaW9uIG51bWJlciIpKTsKICBwVExDYi0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLmhpc3RvcnlSU1NJID0gMDsKICBwVExDYi0+aG9TdXBwb3J0LmN1cnJlbnRIT1N0YXRlLnJlZ2lvbk51bWJlciA9IDA7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfQ2xlYXJTVEFDbGllbnQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZQoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIG1ha2UgdGhpcyBub3RpZmljYXRpb24gd2hlbmV2ZXIgYSBjaGFuZ2Ugb2NjdXJzIGluIHRoZQogICAgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2hhbmdlIHN0YXRlIGNhbiBiZQogICAgY2FsbGVkLgoKICAgIFJFU1RSSUNUSU9OOiBBIHN0YXRpb24gaXMgYmVpbmcgbm90aWZpZWQgYXMgYXV0aGVudGljYXRlZCBiZWZvcmUgdGhlCiAgICAgICAgICAgICAgICAga2V5cyBhcmUgaW5zdGFsbGVkIGluIEhXLiBUaGlzIHdheSBpZiBhIGZyYW1lIGlzIHJlY2VpdmVkCiAgICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBrZXlzIGFyZSBpbnN0YWxsZWQgRFBVIHdpbGwgZHJvcCB0aGF0IGZyYW1lLgoKICAgIE1haW4gdGhyZWFkIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhdCBUeCBhbmQgUnggdGhyZWFkcyB0aHVzIGd1YXJhbnRlZWluZwogICAgdGhlIGZvbGxvd2luZzoKICAgICAgICAtIGEgc3RhdGlvbiB3aWxsIGJlIGluIGFzc29jIHN0YXRlIGluIFRMIGJlZm9yZSBUTCByZWNlaXZlcyBhbnkgZGF0YQogICAgICAgICAgZm9yIGl0CgogIFBBUkFNRVRFUlMKCiAgIHB2b3NHQ3R4OiAgICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KICAgdGxTVEFTdGF0ZTogICAgIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGdpdmVuIHN0YXRpb24KCgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAgVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2hhbmdlU1RBU3RhdGUKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfU1RBU3RhdGVUeXBlICAgdGxTVEFTdGF0ZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCB0bFNUQVN0YXRlID49IFdMQU5UTF9TVEFfTUFYX1NUQVRFICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hhbmdlIFNUQSBzdGF0ZQogICAgTm8gbmVlZCB0byBsb2NrIHRoaXMgb3BlcmF0aW9uLCBzZWUgcmVzdHJpY3Rpb25zIGFib3ZlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkNoYW5naW5nIHN0YXRlIGZvciBTVEEgQ2xpZW50IElEOiAlZCBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlLCB0bFNUQVN0YXRlKSk7CgogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlID0gdGxTVEFTdGF0ZTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVB0a0luc3RhbGxlZAoKICBERVNDUklQVElPTgoKICAgIEhERCB3aWxsIG1ha2UgdGhpcyBub3RpZmljYXRpb24gd2hlbmV2ZXIgUFRLIGlzIGluc3RhbGxlZCBmb3IgdGhlIFNUQQoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBzdGF0ZSBjYW4gYmUKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgcHZvc0dDdHg6ICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgZm9yIHdoaWNoIFBhaXJ3aXNlIGtleSBpcwogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZAoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVB0a0luc3RhbGxlZAooCiAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgICB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHgiKSkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICBGTCgiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIikpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIEZMKCJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQiKSkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+cHRrSW5zdGFsbGVkID0gMTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TVEFQdGtJbnN0YWxsZWQgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRTVEFTdGF0ZQoKICBERVNDUklQVElPTgoKICAgIFJldHVybnMgY29ubmVjdGl2aXR5IHN0YXRlIG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSBpdHMgc3RhdGUgY2FuIGJlIHJldHJpZXZlZC4KCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgoKICAgIE9VVAogICAgcHRsU1RBU3RhdGU6ICAgIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBnaXZlbiBzdGF0aW9uCgoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldFNUQVN0YXRlCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1NUQVN0YXRlVHlwZSAgICpwdGxTVEFTdGF0ZQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB0bFNUQVN0YXRlICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICJXTEFOIFRMOlN0YXRpb24gd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX0dldFNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IFNUQSBzdGF0ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdGxTVEFTdGF0ZSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT50bFN0YXRlOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNUQVN0YXRlICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfVXBkYXRlU1RBQnNzSWRmb3JJQlNTCgogIERFU0NSSVBUSU9OCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHRvIHVwZGF0ZSB0aGUgQlNTSUQgZm9yIHRoaXMgU3RhdGlvbi4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgSEREIFNob3VsZCByZWdpc3RlcmVkIHRoZSBzdGFJRCB3aXRoIFRMIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFdEQSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBJTgogICAgdWNTVEFJZCAgICAgICBUaGUgU3RhdGlvbiBJRCBmb3IgQnNzaWQgdG8gYmUgdXBkYXRlZAogICAgSU4KICAgIHBCc3NpZCAgICAgICAgICBCU1NJRCB0byBiZSB1cGRhdGVkCgogIFJFVFVSTiBWQUxVRQogICAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCgpWT1NfU1RBVFVTCldMQU5UTF9VcGRhdGVTVEFCc3NJZGZvcklCU1MKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICAgICAqcEJzc2lkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0aGUgSUJTUyBCU1NJRAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19tZW1fY29weSggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy52QlNTSURmb3JJQlNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJzc2lkLCBzaXplb2Yodl9NQUNBRERSX3QpKTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVBrdFBlbmRpbmcKCiAgREVTQ1JJUFRJT04KCiAgICBIREQgd2lsbCBjYWxsIHRoaXMgQVBJIHdoZW4gYSBwYWNrZXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24gaW4gaXRzCiAgICBxdWV1ZXMuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgcGFja2V0IHBlbmRpbmcKICAgIG5vdGlmaWNhdGlvbiBjYW4gYmUgc2VudC4KCiAgICBSRVNUUklDVElPTjogVEwgd2lsbCBub3QgY291bnQgcGFja2V0cyBmb3IgcGVuZGluZyBub3RpZmljYXRpb24uCiAgICAgICAgICAgICAgICAgSEREIGlzIGV4cGVjdGVkIHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvbmx5IHdoZW4KICAgICAgICAgICAgICAgICBub24tZW1wdHkgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQuIFdvcnN0IGNhc2Ugc2NlbmFyaW8KICAgICAgICAgICAgICAgICBpcyB0aGF0IFRMIG1pZ2h0IGVuZCB1cCBtYWtpbmcgYSBjYWxsIHdoZW4gSGRkcwogICAgICAgICAgICAgICAgIHF1ZXVlcyBhcmUgYWN0dWFsbHkgZW1wdHkuCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eDogICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICBpZGVudGlmaWVyIGZvciB0aGUgU1RBIHRoYXQgaXMgcGVuZGluZyB0cmFuc21pc3Npb24KCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFQa3RQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICAgIHVjQWMKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICJXTEFOIFRMOlBhY2tldCBwZW5kaW5nIGluZGljYXRpb24gZm9yIFNUQTogJWQgQUM6ICVkIiwgdWNTVEFJZCwgdWNBYyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFQa3RQZW5kaW5nIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfU1RBUGt0UGVuZGluZyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRlbXBvcmFyeSBmaXggdG8gZW5hYmxlIFRMIHRvIGZldGNoIHBhY2tldHMgd2hlbiBtdWx0aXBsZSBwZWVycyBqb2luCiAgICBhbiBJQlNTLiBUbyBmaXggQ1IxNzczMDEuIE5lZWRzIHRvIGdvIGF3YXkgd2hlbiB0aGUgYWN0dWFsIGZpeCBvZgogICAgZ29pbmcgdGhyb3VnaCBhbGwgU1RBJ3MgaW4gcm91bmQgcm9iaW4gZmFzaGlvbiBnZXRzIG1lcmdlZCBpbiBmcm9tCiAgICBCVCBBTVAgYnJhbmNoLgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT51Y1JlZ2lzdGVyZWRTdGFJZCA9IHVjU1RBSWQ7CgogIGlmKCBXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlICkKICB7IC8qIEVBUE9MX0hJX1BSSU9SSVRZIDogbmVlZCB0byBmaW5kIG91dCB3aGV0aGVyIEVBUE9MIGlzIHBlbmRpbmcgYmVmb3JlCiAgICAgICBXTEFOVExfRmV0Y2hQYWNrZXQoKS9XTEFOVExfVHhDb25uKCkgaXMgY2FsbGVkLgogICAgICAgY2hhbmdlIFNUQV9BVVRIRU5USUNBVEVEICE9IHRsU3RhdGUgdG8gQ09OTkVDVEVEID09IHRsU3RhdGUKICAgICAgIHRvIG1ha2Ugc3VyZSBUTCBpcyBpbmRlZWQgd2FpdGluZyBmb3IgRUFQT0wuCiAgICAgICBKdXN0IGluIHRoZSBjYXNlIHdoZW4gU1RBIGdvdCBkaXNjb25uZWN0ZWQgc2hvcnRseSBhZnRlciBjb25uZWN0ZWN0aW9uICovCiAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZyA9IDE7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiV0xBTiBUTDpQYWNrZXQgcGVuZGluZyBpbmRpY2F0aW9uIGZvciBTVEE6ICVkIEFDOiAlZCBTdGF0ZTogJWQiLCAKICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBYywgcENsaWVudFNUQS0+dGxTdGF0ZSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbmFibGUgdGhpcyBBQyBpbiB0aGUgQUMgbWFzayBpbiBvcmRlciBmb3IgVEwgdG8gc3RhcnQgc2VydmljaW5nIGl0CiAgICBTZXQgcGFja2V0IHBlbmRpbmcgZmxhZyAKICAgIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLCBzZXJpYWxpemUgdGhlIHVwZGF0aW9uIG9mIEFDIGFuZCBBQyBtYXNrIAogICAgdGhyb3VnaCBXTEFOVExfVFhfU1RBSURfQUNfSU5EIG1lc3NhZ2UuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgcENsaWVudFNUQS0+YXVjQUNNYXNrW3VjQWNdID0gMTsKCiAgICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nLCAxKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgQ2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCByZXNvdXJjZXMgZm9yIHRyYW5zbWlzc2lvbiBhbmQgdHggaXMgbm90CiAgICAgICAgc3VzcGVuZGVkLgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfREFUQSApICYmCiAgICAgICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICAgICAgewogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCIpKTsKICAgICAgICAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBidXQgY29uZGl0aW9uIG5vdCBtZXQuIFJlczogJWQsU3VzcGVuZDogJWQiLAogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQsIHBUTENiLT51Y1R4U3VzcGVuZGVkICk7CiAgICAgIH0KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVBrdFBlbmRpbmcgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1NldFNUQVByaW9yaXR5CgogIERFU0NSSVBUSU9OCgogICAgVEwgZXhwb3NlcyB0aGlzIEFQSSB0byBhbGxvdyB1cHBlciBsYXllcnMgYSByb3VnaCBjb250cm9sIG92ZXIgdGhlCiAgICBwcmlvcml0eSBvZiB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gc3RhdGlvbiB3aGVuIHN1cHBvcnRpbmcgbXVsdGlwbGUKICAgIGNvbm5lY3Rpb25zLgoKICBERVBFTkRFTkNJRVMKCiAgICBBIHN0YXRpb24gbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNoYW5nZSBpbiBwcmlvcml0eSBjYW4gYmUKICAgIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgZm9yIHRoZSBTVEEgdGhhdCBoYXMgdG8gY2hhbmdlIHByaW9yaXR5CgogIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU2V0U1RBUHJpb3JpdHkKKAogIHZfUFZPSURfdCAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgV0xBTlRMX1NUQVByaW9yaXR5VHlwZSAgIHRsU1RBUHJpCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqIHBDbGllbnRTVEEgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU2V0U1RBUHJpb3JpdHkiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9TZXRTVEFQcmlvcml0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlLWFuYWxpemUgaWYgbG9jayBpcyBuZWVkZWQgd2hlbiBhZGRpbmcgbXVsdGlwbGUgc3RhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6Q2hhbmdpbmcgc3RhdGUgZm9yIFNUQSBQcmkgSUQ6ICVkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxQcmksIHRsU1RBUHJpKSk7CiAgcENsaWVudFNUQS0+dGxQcmkgPSB0bFNUQVByaTsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9TZXRTVEFQcmlvcml0eSAqLwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBCQVAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFNNRSB0byByZWdpc3RlciBpdHNlbGYgYXMgY2xpZW50IGZvciBub24tZGF0YSBCVC1BTVAgcGFja2V0cy4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIFNNRSdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwZm5UbEJBUFJ4RnJtOiAgcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIG5vbi1kYXRhCiAgICAgICAgICAgICAgICAgICAgQlQtQU1QIHBhY2tldHMKICAgIHBmbkZsdXNoT3BDb21wbGV0ZUNiOgogICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNhbGwgYmFjayBmdW5jdGlvbiwgZm9yIHRoZSBGbHVzaCBvcGVyYXRpb24KICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogQkFMIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX0JBUFJ4Q0JUeXBlICAgICBwZm5UbEJBUFJ4RnJtLAogIFdMQU5UTF9GbHVzaE9wQ29tcENCVHlwZSAgcGZuRmx1c2hPcENvbXBsZXRlQ2IKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwZm5UbEJBUFJ4RnJtICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKCBOVUxMID09IHBmbkZsdXNoT3BDb21wbGV0ZUNiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJJbnZhbGlkIEZsdXNoIENvbXBsZXRlIENiIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZWdpc3RlckJBUENsaWVudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBhdHRlbXB0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwICE9IHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnVjRXhpc3RzKys7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkFQIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVnaXN0ZXIgc3RhdGlvbiB3aXRoIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlZ2lzdGVyaW5nIEJBUCBDbGllbnQiICkpOwoKICBwVExDYi0+dGxCQVBDbGllbnQudWNFeGlzdHMrKzsKCiAgaWYgKCBOVUxMICE9IHBmblRsQkFQUnhGcm0gKSAKICB7CiAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCAgICAgICAgICAgICA9IHBmblRsQkFQUnhGcm07CiAgfQoKICBwVExDYi0+dGxCQVBDbGllbnQucGZuRmx1c2hPcENvbXBsZXRlQ2IgICA9IHBmbkZsdXNoT3BDb21wbGV0ZUNiOwoKICBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICAgICA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJCQVBDbGllbnQgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeEJBUEZybQoKICBERVNDUklQVElPTgogICAgQkFQIGNhbGxzIHRoaXMgd2hlbiBpdCB3YW50cyB0byBzZW5kIGEgZnJhbWUgdG8gdGhlIG1vZHVsZQoKICBERVBFTkRFTkNJRVMKICAgIEJBUCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICAgIFJFU1RSSUNUSU9OOiBCQVAgQ0FOTk9UIHB1c2ggYW55IHBhY2tldHMgdG8gVEwgdW50aWwgaXQgZGlkIG5vdCByZWNlaXZlCiAgICAgICAgICAgICAgICAgYSB0eCBjb21wbGV0ZSBmcm9tIHRoZSBwcmV2aW91cyBwYWNrZXQsIHRoYXQgbWVhbnMgQkFQCiAgICAgICAgICAgICAgICAgc2VuZHMgb25lIHBhY2tldCwgd2FpdCBmb3IgdHggY29tcGxldGUgYW5kIHRoZW4KICAgICAgICAgICAgICAgICBzZW5kcyBhbm90aGVyIG9uZQoKICAgICAgICAgICAgICAgICBJZiBCQVAgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZQoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQVAncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgcGFja2V0IHRvIGJlCiAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQKICAgIHBNZXRhSW5mbzogICAgICBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQKICAgIHBmblRsQkFQVHhDb21wOiBwb2ludGVyIHRvIGEgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZSBmb3Igbm90aWZ5aW5nCiAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIG92ZXIgdGhlIGJ1cwoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IEJBTCBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIEJULUFNUCBwYWNrZXQgd2FzIG5vdCB5ZXQgdHJhbnNtaXR0ZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGZhaWx1cmUgbWVzc2FnZXMgbWF5IGJlIHJldHVybmVkIGZyb20gdGhlIEJEIGhlYWRlciBoYW5kbGluZwogICAgcm91dGluZXMsIHBsZWFzZSBjaGVjayBhcHJvcHJpYXRlIEFQSSBmb3IgbW9yZSBpbmZvLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeEJBUEZybQooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgV0xBTlRMX01ldGFJbmZvVHlwZSogICAgcE1ldGFJbmZvLAogIFdMQU5UTF9UeENvbXBDQlR5cGUgICAgIHBmblRsQkFQVHhDb21wCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgICAgID0gTlVMTDsKICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB2X01BQ0FERFJfdCAgICAgdkRlc3RNYWNBZGRyOwogIHZfVTE2X3QgICAgICAgICB1c1BrdExlbjsKICB2X1U4X3QgICAgICAgICAgdWNTdGFJZCA9IDA7CiAgdl9VOF90ICAgICAgICAgIGV4dHJhSGVhZFNwYWNlID0gMDsKICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkID0gMDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1R4QkFQRnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbnN1cmUgdGhhdCBCQVAgY2xpZW50IHdhcyByZWdpc3RlcmVkIHByZXZpb3VzbHkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyApIHx8CiAgICAgICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKHBUTENiLT50bEJBUENsaWVudC51Y0JBUFNUQUlkKSApKQogIHsKICAgIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpCQVAgY2xpZW50IG5vdCByZWdpc3RlciBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIENoZWNrIGlmIGFueSBCVC1BTVAgRnJtIGlzIHBlbmRpbmcKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6QlQtQU1QIEZyYW1lIGFscmVhZHkgcGVuZGluZyB0eCBpbiBUTCBvbiBXTEFOVExfVHhCQVBGcm0iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JVU1k7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBidWZmZXIgYW5kIG5vdGlmeSBCQUw7IG5vIGxvY2sgaXMgbmVlZGVkIGlmIHRoZSBhYm92ZSByZXN0cmljdGlvbgogICAgaXMgbWV0CiAgICBTYXZlIHRoZSB0eCBjb21wbGV0ZSBmbmN0IHBvaW50ZXIgYXMgdGwgc3BlY2lmaWMgZGF0YSBpbiB0aGUgdm9zIGJ1ZmZlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVHJhbnNsYXRlIDgwMi4zIGZyYW1lIHRvIDgwMi4xMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjU3RhSWQgPSBwVExDYi0+dGxCQVBDbGllbnQudWNCQVBTVEFJZDsKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0gKQogIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CiAgaWYgKCggMCA9PSBwTWV0YUluZm8tPnVjRGlzYWJsZUZybVh0bCApICYmIAogICAgICAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiApKQogIHsKICAgIHZvc1N0YXR1cyA9ICBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsICZ1Y1N0YUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfVHhCQVBGcm0iKSk7CgogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIHBNZXRhSW5mby0+dWNEaXNhYmxlRnJtWHRsID0gMTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2FsbCBIQUwgdG8gZmlsbCBCRCBoZWFkZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogIC8qIEFkZGluZyBUeXBlLCBTdWJUeXBlIHdoaWNoIHdhcyBtaXNzaW5nIGZvciBFQVBPTCBmcm9tIEJBUCAqLwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwogIHBNZXRhSW5mby0+dWNUeXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CgogIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0RhdGFCdWZmICwgCiAgICAgICAgICAgICAgICAgICAgJnZEZXN0TWFjQWRkciwgcE1ldGFJbmZvLT51Y0Rpc2FibGVGcm1YdGwsIAogICAgICAgICAgICAgICAgICAgICZ1c1BrdExlbiwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF0tPndTVEFEZXNjLnVjUW9zRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQsIGV4dHJhSGVhZFNwYWNlLCBwTWV0YUluZm8tPnVjVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1N0YUlkXS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNUSUQsIDAgLyogTm8gQUNLICovLCBwTWV0YUluZm8tPnVzVGltZVN0YW1wLAogICAgICAgICAgICAgICAgICAgIHBNZXRhSW5mby0+dWNJc0VhcG9sIHx8IHBNZXRhSW5mby0+dWNJc1dhaSwgcE1ldGFJbmZvLT51Y1VQICk7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYnVpbGRpbmcgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgaWYgKCBOVUxMICE9IHBmblRsQkFQVHhDb21wICkKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBmblRsQkFQVHhDb21wKTsKICB9CiAgZWxzZQogIHsKICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CgogIH0KCiAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCl2b3NEYXRhQnVmZik7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aHJlIGFyZSBlbm91Z2ggcmVzb3VyY2VzIGZvciB0cmFuc21pc3Npb24gYW5kIHR4IGlzIG5vdAogICAgc3VzcGVuZGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19CQVAgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICB9CiAgZWxzZQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIE5vIGVycm9yIGNvZGUgaXMgc2VudCBiZWNhdXNlIFRMIHdpbGwgcmVzdW1lIHR4IGF1dG9ub21vdXNseSBpZgogICAgICByZXNvdXJjZXMgYmVjb21lIGF2YWlsYWJsZSBvciB0eCBnZXRzIHJlc3VtZWQKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmcm9tIEJBUCBidXQgY29uZGl0aW9uIG5vdCBtZXQuUmVzOiAlZCwiCiAgICAgICAgICAgICAgICAgIlN1c3BlbmQ6ICVkIiwgcFRMQ2ItPnVSZXNDb3VudCwgcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1R4QkFQRnJtICovCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBJTlRFUkFDVElPTiBXSVRIIFNNRQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0dldFJzc2kKCiAgREVTQ1JJUFRJT04KICAgIFRMIHdpbGwgZXh0cmFjdCB0aGUgUlNTSSBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcHVSc3NpOiAgICAgICAgIHRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSBSU1NJCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0UnNzaQooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgIHVjU1RBSWQsCiAgdl9TN190KiAgICAgICAgICBwUnNzaQopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwUnNzaSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0UnNzaSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRSc3NpIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29weSB3aWxsIG5vdCBiZSBsb2NrZWQ7IHBsZWFzZSByZWFkIHJlc3RyaWN0aW9uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYocFRMQ2ItPmlzQk1QUyB8fCBJU19BQ1RJVkVNT0RFX09GRkxPQURfRkVBVFVSRV9FTkFCTEUpCiAgewogICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2Z0JtcHM7CiAgICAvKiBDaGVjayBJZiBSU1NJIGlzIHplcm8gYmVjYXVzZSB3ZSBhcmUgcmVhZGluZyByc3NBdmdCbXBzIHVwZGF0ZWQgYnkgSEFMIGluIAogICAgcHJldmlvdXMgR2V0U3RhdHNSZXF1ZXN0LiBJdCBtYXkgYmUgdXBkYXRlZCBhcyB6ZXJvIGJ5IEhhbCBiZWNhdXNlIEVudGVyQm1wcyAKICAgIG1pZ2h0IG5vdCBoYXZlIGhhcHBlbmQgYnkgdGhhdCB0aW1lLiBIZW5jZSByZWFkaW5nIHRoZSBtb3N0IHJlY2VudCBSc3NpIAogICAgY2FsY2x1YXRlZCBieSBUTCovCiAgICBpZigwID09ICpwUnNzaSkKICAgIHsKICAgICAgKnBSc3NpID0gcENsaWVudFNUQS0+cnNzaUF2ZzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgICpwUnNzaSA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9HZXRSc3NpIGZvciBTVEE6ICVkIFJTU0k6ICVkJXMiLAogICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsICpwUnNzaSwKICAgICAgICAgICAgICAgICAgICBwVExDYi0+aXNCTVBTID8gIiBpbiBCTVBTIiA6ICIiKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0UnNzaSAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0U25yCgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIGV4dHJhY3QgdGhlIFNOUiBpbmZvcm1hdGlvbiBmcm9tIGV2ZXJ5IGRhdGEgcGFja2V0IGZyb20gdGhlCiAgICBvbmdvaW5nIHRyYWZmaWMgYW5kIHdpbGwgc3RvcmUgaXQuIEl0IHdpbGwgcHJvdmlkZSB0aGUgcmVzdWx0IHRvIFNNRQogICAgdXBvbiByZXF1ZXN0LgoKICBERVBFTkRFTkNJRVMKCiAgICBXQVJOSU5HOiB0aGUgcmVhZCBhbmQgd3JpdGUgb2YgdGhpcyB2YWx1ZSB3aWxsIG5vdCBiZSBwcm90ZWN0ZWQKICAgICAgICAgICAgIGJ5IGxvY2tzLCB0aGVyZWZvcmUgdGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGFmdGVyIGEgcmVhZAogICAgICAgICAgICAgbWlnaHQgbm90IGFsd2F5cyBiZSBjb25zaXN0ZW50LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQoKICAgIE9VVAogICAgcFNucjogICAgICAgICB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgU05SCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgU3RhdGlvbiBJRCBpcyBvdXRzaWRlIGFycmF5IGJvdW5kYXJpZXMgb3IgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IFNUQSB3YXMgbm90IHlldCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfR2V0U25yCigKICB0QU5JX1U4ICAgICAgICAgICB1Y1NUQUlkLAogIHRBTklfUzgqICAgICAgICAgIHBTbnIKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwU25yKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgaWYgKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQih2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KFZPU19NT0RVTEVfSURfVEwsIE5VTEwpKTsKICBpZiAoTlVMTCA9PSBwVExDYikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKE5VTEwgPT0gcENsaWVudFNUQSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICgwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDb3B5IHdpbGwgbm90IGJlIGxvY2tlZDsgcGxlYXNlIHJlYWQgcmVzdHJpY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAocFRMQ2ItPmlzQk1QUykKICB7CiAgICAqcFNuciA9IHBDbGllbnRTVEEtPnNuckF2Z0JtcHM7CiAgfQogIGVsc2UKICB7CiAgICAvKiBTTlIgaXMgYXZlcmFnZWQgb3ZlciBXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoCiAgICAgKiBkYXRhIHNhbXBsZXMgKHNucmlkeCkgdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHRoZW4gcmV0dXJuIHRoZQogICAgICogYXZlcmFnZSBmb3IgdGhlIHdpbmRvdyBvZiBwcmV2b2l1cyAyMCBwYWNrZXRzLiBBbmQgaWYgdGhlcmUgYXJlbid0CiAgICAgKiBlbm91Z2ggc2FtcGxlcyBhbmQgdGhlIGF2ZXJhZ2UgZm9yIHByZXZpb3VzIHdpbmRvdyBvZiAyMCBwYWNrZXRzIGlzCiAgICAgKiBub3QgYXZhaWxhYmxlIHRoZW4gcmV0dXJuIGEgcHJlZGVmaW5lZCB2YWx1ZQogICAgICoKICAgICAqIE5PVEU6IHRoZSBTTlJfSEFDS19CTVBTIHZhbHVlIGlzIGRlZmluZWQgdG8gMTI3LCBkb2N1bWVudHMgZnJvbSBIVwogICAgICogdGVhbSByZXZlYWwgdGhhdCB0aGUgU05SIHZhbHVlIGhhcyBhIGNlaWxpbmcgd2VsbCBiZWxvdyAxMjcgZEJtLAogICAgICogc28gaWYgU05SIGhhcyB2YWx1ZSBvZiAxMjcgdGhlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMgY2FuIGtub3cgdGhhdAogICAgICogdGhlIFNOUiBoYXMgbm90IGJlZW4gY29tcHV0ZWQgeWV0IGJlY2F1c2UgZW5vdWdoIGRhdGEgd2FzIG5vdAogICAgICogYXZhaWxhYmxlIGZvciBTTlIgY2FsY3VsYXRpb24KICAgICAqLwogICAgaWYgKHBDbGllbnRTVEEtPnNucklkeCA+IChXTEFOVExfTUFYX1NOUl9EQVRBX1NBTVBMRVMvMikKICAgICAgICB8fCAhKHBDbGllbnRTVEEtPnByZXZTbnJBdmcpKQogICAgewogICAgICAgKnBTbnIgPSBwQ2xpZW50U1RBLT5zbnJTdW0gLyBwQ2xpZW50U1RBLT5zbnJJZHg7CiAgICB9CiAgICBlbHNlIGlmIChwQ2xpZW50U1RBLT5wcmV2U25yQXZnKQogICAgewogICAgICAgKnBTbnIgPSBwQ2xpZW50U1RBLT5wcmV2U25yQXZnOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgKnBTbnIgPSBTTlJfSEFDS19CTVBTOwogICAgfQogIH0KCiAgVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9HZXRTbnIgZm9yIFNUQTogJWQgU05SOiAlZCVzIiwKICAgICAgICAgICAgdWNTVEFJZCwgKnBTbnIsCiAgICAgICAgICAgIHBUTENiLT5pc0JNUFMgPyAiIGluIEJNUFMiIDogIiIpOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFNuciAqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRMaW5rUXVhbGl0eQoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBleHRyYWN0IHRoZSBTTlIgaW5mb3JtYXRpb24gZnJvbSBldmVyeSBkYXRhIHBhY2tldCBmcm9tIHRoZQogICAgb25nb2luZyB0cmFmZmljIGFuZCB3aWxsIHN0b3JlIGl0LiBJdCB3aWxsIHByb3ZpZGUgdGhlIHJlc3VsdCB0byBTTUUKICAgIHVwb24gcmVxdWVzdC4KCiAgREVQRU5ERU5DSUVTCgogICAgV0FSTklORzogdGhlIHJlYWQgYW5kIHdyaXRlIG9mIHRoaXMgdmFsdWUgd2lsbCBub3QgYmUgcHJvdGVjdGVkCiAgICAgICAgICAgICBieSBsb2NrcywgdGhlcmVmb3JlIHRoZSBpbmZvcm1hdGlvbiBvYnRhaW5lZCBhZnRlciBhIHJlYWQKICAgICAgICAgICAgIG1pZ2h0IG5vdCBhbHdheXMgYmUgY29uc2lzdGVudC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgdmFsdWUKCiAgICBPVVQKICAgIHB1TGlua1F1YWxpdHk6ICAgICAgICAgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIFNOUgoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBTVEEgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0dldExpbmtRdWFsaXR5CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgdl9VMzJfdCogICAgICAgICAgICAgIHB1TGlua1F1YWxpdHkKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVMaW5rUXVhbGl0eSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0dldExpbmtRdWFsaXR5IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJTdGF0aW9uIHdhcyBub3QgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIFdMQU5UTF9HZXRMaW5rUXVhbGl0eSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENvcHkgd2lsbCBub3QgYmUgbG9ja2VkOyBwbGVhc2UgcmVhZCByZXN0cmljdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdUxpbmtRdWFsaXR5ID0gcENsaWVudFNUQS0+dUxpbmtRdWFsaXR5QXZnOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTlRMX0dldExpbmtRdWFsaXR5IGZvciBTVEE6ICVkIExpbmtRdWFsaXR5OiAlZCIsIHVjU1RBSWQsICpwdUxpbmtRdWFsaXR5KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0TGlua1F1YWxpdHkgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoU3RhVElECgogIERFU0NSSVBUSU9OCiAgICBUTCBwcm92aWRlcyB0aGlzIEFQSSBhcyBhbiBpbnRlcmZhY2UgdG8gU01FIChCQVApIGxheWVyLiBUTCBpbnR1cm4gcG9zdHMgYQogICAgbWVzc2FnZSB0byBIQUwuIFRoaXMgQVBJIGlzIGNhbGxlZCBieSB0aGUgU01FIGlub3JkZXIgdG8gcGVyZm9ybSBhIGZsdXNoCiAgICBvcGVyYXRpb24uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBTTUUncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIHN0YXRpb24gaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCB2YWx1ZQogICAgdWNUaWQ6ICAgICAgICAgIFRzcGVjIElEIGZvciB0aGUgbmV3IEJBIHNlc3Npb24KCiAgICBPVVQKICAgIFRoZSByZXNwb25zZSBmb3IgdGhpcyBwb3N0IGlzIHJlY2VpdmVkIGluIHRoZSBtYWluIHRocmVhZCwgdmlhIGEgcmVzcG9uc2UKICAgIG1lc3NhZ2UgZnJvbSBIQUwgdG8gVEwuCgogIFJFVFVSTiBWQUxVRQogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRmx1c2hTdGFUSUQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB0cEZsdXNoQUNSZXEgRmx1c2hBQ1JlcVB0ciA9IE5VTEw7CiAgdm9zX21zZ190IHZvc01lc3NhZ2U7CgoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0ZsdXNoU3RhVElEIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9GbHVzaFN0YVRJRCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNFeGlzdHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiU3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfRmx1c2hTdGFUSUQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgV2UgbmVlZCB0byBwb3N0IGEgbWVzc2FnZSB3aXRoIHRoZSBTVEEsIFRJRCB2YWx1ZSB0byBIQUwuIEhBTCBwZXJmb3JtcyB0aGUgZmx1c2gKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIEZsdXNoQUNSZXFQdHIgPSB2b3NfbWVtX21hbGxvYyhzaXplb2YodEZsdXNoQUNSZXEpKTsKCiAgaWYgKCBOVUxMID09IEZsdXNoQUNSZXFQdHIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEZsdXNoIFJlcSBzdHJ1Y3R1cmUiKSk7CiAgICBWT1NfQVNTRVJUKDApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9OT01FTTsKICB9CgogIC8vIFN0YXJ0IGNvbnN0cnVjdGluZyB0aGUgbWVzc2FnZSBmb3IgSEFMCiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ1R5cGUgICAgPSBTSVJfVExfSEFMX0ZMVVNIX0FDX1JFUTsKICBGbHVzaEFDUmVxUHRyLT5tZXNnTGVuICAgICA9IHNpemVvZih0Rmx1c2hBQ1JlcSk7CiAgRmx1c2hBQ1JlcVB0ci0+bWVzZ0xlbiAgICAgPSBzaXplb2YodEZsdXNoQUNSZXEpOwogIEZsdXNoQUNSZXFQdHItPnVjU1RBSWQgPSB1Y1NUQUlkOwogIEZsdXNoQUNSZXFQdHItPnVjVGlkID0gdWNUaWQ7CgogIHZvc01lc3NhZ2UudHlwZSAgICAgICAgICAgID0gV0RBX1RMX0ZMVVNIX0FDX1JFUTsKICB2b3NNZXNzYWdlLmJvZHlwdHIgPSAodm9pZCAqKUZsdXNoQUNSZXFQdHI7CgogIHZvc19tcV9wb3N0X21lc3NhZ2UoVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UpOwogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElOVEVSQUNUSU9OIFdJVEggUEUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZWdpc3Rlck1nbXRGcm1DbGllbnQKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBQRSB0byByZWdpc3RlciBhcyBhIGNsaWVudCBmb3IgbWFuYWdlbWVudCBmcmFtZXMgZGVsaXZlcnkuCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgVEwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgcGZuVGxNZ210RnJtUng6ICAgICBwb2ludGVyIHRvIHRoZSByZWNlaXZlIHByb2Nlc3Npbmcgcm91dGluZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCBmcmFtZXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiBNZ210IEZyYW1lIGNsaWVudCB3YXMgYWxyZWFkeSByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgICBwdm9zR0N0eCwKICBXTEFOVExfTWdtdEZybVJ4Q0JUeXBlICBwZm5UbE1nbXRGcm1SeAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgIT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cysrOwogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0VYSVNUUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZWdpc3RlciBzdGF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpSZWdpc3RlcmluZyBNYW5hZ2VtZW50IEZyYW1lIENsaWVudCIgKSk7CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKCiAgaWYgKCBOVUxMICE9IHBmblRsTWdtdEZybVJ4ICkKICB7CiAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gcGZuVGxNZ210RnJtUng7CiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiA9IE5VTEw7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUmVnaXN0ZXJNZ210RnJtQ2xpZW50ICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9EZVJlZ2lzdGVyTWdtdEZybUNsaWVudAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFBFIHRvIGRlcmVnaXN0ZXIgYXMgYSBjbGllbnQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGRlbGl2ZXJ5LgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgQVBJIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIFRMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6IE1nbXQgRnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRGVSZWdpc3Rlck1nbXRGcm1DbGllbnQKKAogIHZfUFZPSURfdCAgICAgICAgICAgICAgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYWtlIHN1cmUgdGhpcyBpcyB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGF0dGVtcHQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIDAgPT0gcFRMQ2ItPnRsTWdtdEZybUNsaWVudC51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgZnJhbWUgY2xpZW50IHdhcyBuZXZlciByZWdpc3RlcmVkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgcmVnaXN0cmF0aW9uIHdpdGggVEwKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAiV0xBTiBUTDpEZXJlZ2lzdGVyaW5nIE1hbmFnZW1lbnQgRnJhbWUgQ2xpZW50IiApKTsKCiAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCA9IFdMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2I7CiAgaWYgKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgY2FjaGUgYnVmZmVyIG5vdCBlbXB0eSBvbiBkZXJlZ2lzdGVyaW5nIgogICAgICAgICAgICAgICAiIC0gZHJvcHBpbmcgcGFja2V0IiApKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CgogICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgPSBOVUxMOyAKICB9CgogIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgPSAwOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1JlZ2lzdGVyTWdtdEZybUNsaWVudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhNZ210RnJtCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgUEUgd2hlbiBpdCB3YW50IHRvIHNlbmQgb3V0IGEgbWFuYWdlbWVudCBmcmFtZS4KICAgIEhBTCB3aWxsIGFsc28gdXNlIHRoaXMgQVBJIGZvciB0aGUgZmV3IGZyYW1lcyBpdCBzZW5kcyBvdXQsIHRoZXkgYXJlIG5vdAogICAgbWFuYWdlbWVudCBmcmFtZXMgaG93ZXZlcmUgaXQgaXMgYWNjZXB0ZWQgdGhhdCBhbiBleGNlcHRpb24gd2lsbCBiZQogICAgYWxsb3dlZCBPTkxZIGZvciB0aGUgdXNhZ2Ugb2YgSEFMLgogICAgR2VuZXJpYyBkYXRhIGZyYW1lcyBTSE9VTEQgTk9UIHRyYXZlbCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCgogIERFUEVOREVOQ0lFUwogICAgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBBUEkgY2FuIGJlIGNhbGxlZC4KCiAgICBSRVNUUklDVElPTjogSWYgUEUgc2VuZHMgYW5vdGhlciBwYWNrZXQgYmVmb3JlIFRMIG1hbmFnZXMgdG8gcHJvY2VzcyB0aGUKICAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNlbnQgcGFja2V0IGNhbGwgd2lsbCBlbmQgaW4gZmFpbHVyZQoKICAgICAgICAgICAgICAgICBGcmFtZXMgY29tbWluZyB0aHJvdWdoIGhlcmUgbXVzdCBiZSA4MDIuMTEgZnJhbWVzLCBmcmFtZQogICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uIGluIFVNQSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDthIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHZvc0ZybUJ1ZjogICAgICBwb2ludGVyIHRvIGEgdk9TUyBidWZmZXIgY29udGFpbmluZyB0aGUgbWFuYWdlbWVudAogICAgICAgICAgICAgICAgICAgIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkCiAgICB1c0ZybUxlbjogICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQ7IGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgdk9TUyBidWZmZXIKICAgIHdGcm1UeXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZnJhbWUgYmVpbmcgdHJhbnNtaXR0ZWQKICAgIHRpZDogICAgICAgICAgICB0aWQgdXNlZCB0byB0cmFuc21pdCB0aGlzIGZyYW1lCiAgICBwZm5Db21wVHhGdW5jOiAgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgY29tcGxldGUgcm91dGluZQogICAgcHZCREhlYWRlcjogICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlciwgaWYgTlVMTCBpdCBtZWFucyBpdCB3YXMgbm90CiAgICAgICAgICAgICAgICAgICAgeWV0IGNvbnN0cnVjdGVkIGFuZCBpdCBsaWVzIHdpdGhpbiBUTCdzIHJlc3BvbnNpYmlsaXR5CiAgICAgICAgICAgICAgICAgICAgdG8gZG8gc287IGlmIG5vdCBOVUxMIGl0IGlzIGV4cGVjdGVkIHRoYXQgaXQgd2FzCiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBwYWNrZWQgaW5zaWRlIHRoZSB2b3MgcGFja2V0CiAgICB1Y0Fja1Jlc3BvbnNlOiAgZmxhZyBub3RpZnlpbmcgaXQgYW4gaW50ZXJydXB0IGlzIG5lZWRlZCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgYWNrbm93bGVkZ2VtZW50IHJlY2VpdmVkIHdoZW4gdGhlIGZyYW1lIGlzIHNlbnQgb3V0CiAgICAgICAgICAgICAgICAgICAgdGhlIGFpciBhbmQgOyB0aGUgaW50ZXJydXB0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IEhBTCwKICAgICAgICAgICAgICAgICAgICBvbmx5IG9uZSBzdWNoIGZyYW1lIGNhbiBiZSBwZW5kaW5nIGluIHRoZSBzeXN0ZW0gYXQKICAgICAgICAgICAgICAgICAgICBvbmUgdGltZS4KCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogTWdtdCBGcmFtZSBjbGllbnQgd2FzIG5vdCB5ZXQgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19FX0JVU1k6ICAgVGhlIHByZXZpb3VzIE1nbXQgcGFja2V0IHdhcyBub3QgeWV0IHRyYW5zbWl0dGVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgICBPdGhlciBmYWlsdXJlIG1lc3NhZ2VzIG1heSBiZSByZXR1cm5lZCBmcm9tIHRoZSBCRCBoZWFkZXIgaGFuZGxpbmcKICAgIHJvdXRpbmVzLCBwbGVhc2UgY2hlY2sgYXByb3ByaWF0ZSBBUEkgZm9yIG1vcmUgaW5mby4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhNZ210RnJtCigKICB2X1BWT0lEX3QgICAgICAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICAgICAgICB2b3NGcm1CdWYsCiAgdl9VMTZfdCAgICAgICAgICAgICAgdXNGcm1MZW4sCiAgdl9VOF90ICAgICAgICAgICAgICAgd0ZybVR5cGUsCiAgdl9VOF90ICAgICAgICAgICAgICAgdWNUaWQsCiAgV0xBTlRMX1R4Q29tcENCVHlwZSAgcGZuQ29tcFR4RnVuYywKICB2X1BWT0lEX3QgICAgICAgICAgICBwdkJESGVhZGVyLAogIHZfVTMyX3QgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2X01BQ0FERFJfdCAgICAgdkRlc3RNYWNBZGRyOwogIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgdl9VMTZfdCAgICAgICAgIHVzUGt0TGVuOwogIHZfVTMyX3QgICAgICAgICB1c1RpbWVTdGFtcCA9IDA7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRnJtQnVmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1R4TWdtdEZybSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFbnN1cmUgdGhhdCBtYW5hZ2VtZW50IGZyYW1lIGNsaWVudCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwID09IHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMgKQogIHsKICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQudWNFeGlzdHMrKzsKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICJXTEFOIFRMOk1hbmFnZW1lbnQgRnJhbWUgY2xpZW50IG5vdCByZWdpc3RlciBvbiBXTEFOVExfVHhNZ210RnJtIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIGFueSBNZ210IEZybSBpcyBwZW5kaW5nCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy92b3NUZW1wQnVmZiA9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmOwogIGlmICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApCiAgewoKICAgIFRMTE9HUChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpNYW5hZ2VtZW50IEZyYW1lIGFscmVhZHkgcGVuZGluZyB0eCBpbiBUTDogZmFpbGluZyBvbGQgb25lIikpOwoKCiAgICAvKkZhaWxpbmcgdGhlIHR4IGZvciB0aGUgcHJldmlvdXMgcGFja2V0IGVucXVlZCBieSBQRSovCiAgICAvL3Zvc19hdG9taWNfc2V0X1UzMiggKHZfVTMyX3QqKSZwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgIC8vICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKCiAgICAvL3Zvc19wa3RfZ2V0X3VzZXJfZGF0YV9wdHIoIHZvc1RlbXBCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcGZuVHhDb21wKTsKCiAgICAvKml0IHNob3VsZCBuZXZlciBiZSBOVUxMIC0gZGVmYXVsdCBoYW5kbGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGlmIG5vbmUqLwogICAgLy9pZiAoIE5VTEwgPT0gcGZuVHhDb21wICkKICAgIC8vewogICAgLy8gIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgLy8gICAgICAgICAgICAiTlVMTCBwb2ludGVyIHRvIFR4IENvbXBsZXRlIG9uIFdMQU5UTF9UeE1nbXRGcm0iKTsKICAgIC8vICBWT1NfQVNTRVJUKDApOwogICAgLy8gIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICAvL30KCiAgICAvL3BmblR4Q29tcCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmLCBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTICk7CiAgICAvL3JldHVybiBWT1NfU1RBVFVTX0VfQlVTWTsKCgogICAgLy9wZm5Db21wVHhGdW5jKCBwdm9zR0N0eCwgdm9zRnJtQnVmLCBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfUkVTT1VSQ0VTOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBCRCBoZWFkZXIgd2FzIGJ1aWxkLCBpZiBub3QgY29uc3RydWN0CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB2QkRIZWFkZXIgKQogIHsKICAgICB2X01BQ0FERFJfdCogICAgIHB2QWRkcjJNYWNBZGRyOwogICAgIHZfVThfdCAgIHVRb3NIZHIgPSBWT1NfRkFMU0U7CgogICAgIC8qIEdldCBhZGRyZXNzIDIgb2YgTWFuZ2VtZW50IEZyYW1lIHRvIGdpdmUgdG8gV0xBTkhBTF9GaWxsVHhCZCAqLwogICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKCB2b3NGcm1CdWYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFDX0FERFJfQUxJR04oMSkgKyBWT1NfTUFDX0FERFJfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZBZGRyMk1hY0FkZHIsIFZPU19NQUNfQUREUl9TSVpFKTsKCiAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgICB7CiAgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgYWRkcjIgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgfQoKICAgIC8qIENDWCBJQVBQL1RETFMgRnJhbWUgd2hpY2ggYXJlIGRhdGEgZnJhbWVzIGJ1dCB0ZWNobmljYWxseSB1c2VkCiAgICAgKiBmb3IgbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5IGNvbWVzIHRocm91Z2ggcm91dGUuCiAgICAgKi8KICAgIGlmIChXTEFOVExfSVNfUU9TX0RBVEFfRlJBTUUod0ZybVR5cGUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgewogICAgICAgIHVRb3NIZHIgPSBWT1NfVFJVRTsKICAgIH0KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxsIFdEQSB0byBidWlsZCBUWCBoZWFkZXIKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19CdWlsZFR4UGFja2V0SW5mbyggcHZvc0dDdHgsIHZvc0ZybUJ1ZiAsICZ2RGVzdE1hY0FkZHIsIAogICAgICAgICAgICAgICAgICAgMSAvKiBhbHdheXMgODAyLjExIGZyYW1lcyovLCAmdXNQa3RMZW4sIHVRb3NIZHIgLypxb3Mgbm90IGVuYWJsZWQgISEhKi8sIAogICAgICAgICAgICAgICAgICAgMCAvKiBXRFMgb2ZmICovLCAwLCB3RnJtVHlwZSwgcHZBZGRyMk1hY0FkZHIsIHVjVGlkLCAKICAgICAgICAgICAgICAgICAgIHVjQWNrUmVzcG9uc2UsIHVzVGltZVN0YW1wLCAwLCAwICk7CgoKICAgIGlmICggIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICAgIHsKICAgICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYnVpbGQgVFggaGVhZGVyICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiAgIH0vKiBpZiBCRCBoZWFkZXIgbm90IHByZXNlbnQgKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgYnVmZmVyIGFuZCBub3RpZnkgQkFMOyBubyBsb2NrIGlzIG5lZWRlZCBpZiB0aGUgYWJvdmUgcmVzdHJpY3Rpb24KICAgIGlzIG1ldAogICAgU2F2ZSB0aGUgdHggY29tcGxldGUgZm5jdCBwb2ludGVyIGFzIHRsIHNwZWNpZmljIGRhdGEgaW4gdGhlIHZvcyBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgIT0gcGZuQ29tcFR4RnVuYyApCiAgewogICAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRnJtQnVmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpcGZuQ29tcFR4RnVuYyk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NGcm1CdWYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClXTEFOVExfVHhDb21wRGVmYXVsdENiKTsKCiAgfQoKICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdCl2b3NGcm1CdWYpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhyZSBhcmUgZW5vdWdoIHJlc291cmNlcyBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0eCBpcyBub3QKICAgIHN1c3BlbmRlZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19NRiApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpJc3N1aW5nIFhtaXQgc3RhcnQgcmVxdWVzdCB0byBCQUwgZm9yIE1HTVQiKSk7CiAgICB2b3NTdGF0dXMgPSBXREFfRFNfU3RhcnRYbWl0KHB2b3NHQ3R4KTsKICAgIGlmKFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpCiAgICB7CiAgICAgICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAgIldMQU4gVEw6V0RBX0RTX1N0YXJ0WG1pdCBmYWlscy4gdm9zU3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CiAgICAgICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsMCk7IAogICAgfQogICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIAogIH0KICBlbHNlCiAgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgTm8gZXJyb3IgY29kZSBpcyBzZW50IGJlY2F1c2UgVEwgd2lsbCByZXN1bWUgdHggYXV0b25vbW91c2x5IGlmCiAgICAgIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlIG9yIHR4IGdldHMgcmVzdW1lZAogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICJXTEFOIFRMOlJlcXVlc3QgdG8gc2VuZCBmb3IgTWdtdCBGcm0gYnV0IGNvbmRpdGlvbiBub3QgbWV0LiBSZXM6ICVkIiwKICAgICAgICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCkpOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9UeE1nbXRGcm0gKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgSU5URVJBQ1RJT04gV0lUSCBIQUwKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgoKICBERVNDUklQVElPTgogICAgSEFMIG5vdGlmaWVzIFRMIHdoZW4gdGhlIG1vZHVsZSBpcyBiZWluZyByZXNldC4KICAgIEN1cnJlbnRseSBub3QgdXNlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SZXNldE5vdGlmaWNhdGlvbgooCiAgdl9QVk9JRF90ICAgcHZvc0dDdHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfUmVzZXROb3RpZmljYXRpb24iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgV0xBTlRMX0NsZWFuQ0IocFRMQ2IsIDEgLyplbXB0eSBhbGwgcXVldWVzIGFuZCBwZW5kaW5nIHBhY2tldHMqLyk7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9SZXNldE5vdGlmaWNhdGlvbiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU3VzcGVuZERhdGFUeAoKICBERVNDUklQVElPTgogICAgSEFMIGNhbGxzIHRoaXMgQVBJIHdoZW4gaXQgd2lzaGVzIHRvIHN1c3BlbmQgdHJhbnNtaXNzaW9uIGZvciBhCiAgICBwYXJ0aWN1bGFyIFNUQS4KCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgU1RBIGZvciB3aGljaCB0aGUgcmVxdWVzdCBpcyBtYWRlIG11c3QgYmUgZmlyc3QgcmVnaXN0ZXJlZCB3aXRoCiAgICBUTCBieSBIREQuCgogICAgUkVTVFJJQ1RJT046ICBJbiBjYXNlIG9mIGEgc3VzcGVuZCwgdGhlIGZsYWcgd3JpdGUgYW5kIHJlYWQgd2lsbCBub3QgYmUKICAgICAgICAgICAgICAgICAgbG9ja2VkOiB3b3JzdCBjYXNlIHNjZW5hcmlvIG9uZSBtb3JlIHBhY2tldCBjYW4gZ2V0CiAgICAgICAgICAgICAgICAgIHRocm91Z2ggYmVmb3JlIHRoZSBmbGFnIGdldHMgdXBkYXRlZCAod2UgY2FuIG1ha2UgdGhpcwogICAgICAgICAgICAgICAgICB3cml0ZSBhdG9taWMgYXMgd2VsbCB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kpCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBmb3Igd2hpY2ggdGhlIHJlcXVlc3QgaXMgbWFkZTsKICAgICAgICAgICAgICAgICAgICBhIHZhbHVlIG9mIE5VTEwgYXNzdW1lcyBzdXNwZW5kIG9uIGFsbCBhY3RpdmUgc3RhdGlvbgogICAgcGZuU3VzcGVuZFR4Q0I6IHBvaW50ZXIgdG8gdGhlIHN1c3BlbmQgcmVzdWx0IG5vdGlmaWNhdGlvbiBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgIGNhbGwgaXMgYXN5bmNocm9ub3VzCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIFN0YXRpb24gSUQgaXMgb3V0c2lkZSBhcnJheSBib3VuZGFyaWVzIG9yIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogIFN0YXRpb24gd2FzIG5vdCByZWdpc3RlcmVkCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpWT1NfU1RBVFVTCldMQU5UTF9TdXNwZW5kRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICAgICAgICAgICAgcHVjU1RBSWQsCiAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgICBwZm5TdXNwZW5kVHgKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICB2b3NfbXNnX3QgICAgICAgdm9zTXNnOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0aGUgdHlwZSBvZiByZXF1ZXN0OiBnZW5lcmljIHN1c3BlbmQsIG9yIHBlciBzdGF0aW9uIHN1c3BlbmQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwdWNTVEFJZCkKICB7CiAgICAvKiBHZW5lcmFsIFN1c3BlbmQgUmVxdWVzdCByZWNlaXZlZCAqLwogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAiV0xBTiBUTDpHZW5lcmFsIHN1c3BlbmQgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMSk7CiAgICB2b3NNc2cucmVzZXJ2ZWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQgcmVxdWVzdGVkIG9uIFdMQU5UTF9TdXNwZW5kRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0gKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcFRMQ2ItPmF0bFNUQUNsaWVudHMgcG9pbnRlciBmb3IgU1RBIElkIDolZCBvbiAiCiAgICAgICAgICAgICJXTEFOVExfU3VzcGVuZERhdGFUeCIsICpwdWNTVEFJZCkpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIGlmICggMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0V4aXN0cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOlN0YXRpb24gJWQgd2FzIG5vdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb24gV0xBTlRMX1N1c3BlbmREYXRhVHgiLCAqcHVjU1RBSWQpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6U3VzcGVuZCByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsICpwdWNTVEFJZCkpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y1R4U3VzcGVuZGVkLCAxKTsKICAgIHZvc01zZy5yZXNlcnZlZCA9ICpwdWNTVEFJZDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTZXJpYWxpemUgcmVxdWVzdCB0aHJvdWdoIFRYIHRocmVhZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc01zZy50eXBlICAgICA9IFdMQU5UTF9UWF9TSUdfU1VTUEVORDsKICB2b3NNc2cuYm9keXB0ciAgICAgPSAodl9QVk9JRF90KXBmblN1c3BlbmRUeDsKCiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1N1c3BlbmREYXRhVHggKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1Jlc3VtZURhdGFUeAoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IEhBTCB0byByZXN1bWUgZGF0YSB0cmFuc21pc3Npb24gZm9yIGEgZ2l2ZW4gU1RBLgoKICAgIFdBUk5JTkc6IElmIGEgc3RhdGlvbiB3YXMgaW5kaXZpZHVhbGx5IHN1c3BlbmRlZCBhIGdsb2JhbCByZXN1bWUgd2lsbAogICAgICAgICAgICAgbm90IHJlc3VtZSB0aGF0IHN0YXRpb24KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBwdWNTVEFJZDogICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiB3aGljaCBpcyBiZWluZyByZXN1bWVkOyBOVUxMCiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlcyBpbnRvIGdsb2JhbCByZXN1bWUKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfUmVzdW1lRGF0YVR4CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9SZXN1bWVEYXRhVHgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIHRvIHNlZSB0aGUgdHlwZSBvZiByZXN1bWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcHVjU1RBSWQgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6R2VuZXJhbCByZXN1bWUgcmVxdWVzdGVkIikpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgfQogIGVsc2UKICB7CiAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggKnB1Y1NUQUlkICkpCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0gKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcFRMQ2ItPmF0bFNUQUNsaWVudHMgcG9pbnRlciBmb3IgU1RBIElkIDolZCBvbiAiCiAgICAgICAgICAgICJXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6U3RhdGlvbiAlZCB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfUmVzdW1lRGF0YVR4IiwgKnB1Y1NUQUlkKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICJXTEFOIFRMOlJlc3VtZSByZXF1ZXN0IGZvciBzdGF0aW9uOiAlZCIsICpwdWNTVEFJZCkpOwogICAgdm9zX2F0b21pY19zZXRfVTgoICZwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y1R4U3VzcGVuZGVkLCAwKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXN1bWluZyB0cmFuc21pc3Npb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgogICAgICAoIDAgPT0gcFRMQ2ItPnVjVHhTdXNwZW5kZWQgKSkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpSZXN1bWluZyB0cmFuc21pc3Npb24iKSk7CiAgICByZXR1cm4gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc3VtZURhdGFUeCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TdXNwZW5kQ0IKCiAgREVTQ1JJUFRJT04KICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzZXJpYWxpemluZyBTdXNwZW5kIHNpZ25hbCB0aHJvdWdoIFR4IHRocmVhZAoKICBERVBFTkRFTkNJRVMKICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgIHBVc2VyRGF0YTogICAgICB1c2VyIGRhdGEgc2VudCB3aXRoIHRoZSBjYWxsYmFjawoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU3VzcGVuZENCCigKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgV0xBTlRMX1N1c3BlbmRDQlR5cGUgIHBmblN1c3BlbmRDQiwKICB2X1UxNl90ICAgICAgICAgICAgICAgdXNSZXNlcnZlZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgICA9IE5VTEw7CiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQgPSAodl9VOF90KXVzUmVzZXJ2ZWQ7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gcGZuU3VzcGVuZENCICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vIENhbGwgYmFjayBwcm9jZXNzaW5nIHJlcXVlc3RlZCBXTEFOVExfU3VzcGVuZENCIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZENCIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIHBmblN1c3BlbmRDQihwdm9zR0N0eCwgTlVMTCwgVk9TX1NUQVRVU19TVUNDRVNTKTsKICB9CiAgZWxzZQogIHsKICAgIHBmblN1c3BlbmRDQihwdm9zR0N0eCwgJnVjU1RBSWQsIFZPU19TVEFUVVNfU1VDQ0VTUyk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfU3VzcGVuZENCKi8KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENMSUVOVCBJTkRFUEVOREVOVCBJTlRFUkZBQ0UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRUeFBrdENvdW50CgogIERFU0NSSVBUSU9OCiAgICBUTCB3aWxsIHByb3ZpZGUgdGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBwYWNrZXRzIGNvdW50ZWQgcGVyCiAgICBTVEEgcGVyIFRJRC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgogICAgdWNUaWQ6ICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHRzcGVjCgogICAgT1VUCiAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHR4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRUeFBrdENvdW50CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgIHVjVGlkLAogIHZfVTMyX3QqICAgICAgIHB1VHhQa3RDb3VudAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB1VHhQa3RDb3VudCApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgfHwgV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQvdGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCIsCiAgICAgICAgICAgIHVjU1RBSWQsIHVjVGlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgaWYgc3RhdGlvbiBleGlzdHMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRUeFBrdENvdW50IikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYgKCAwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0VHhQa3RDb3VudCAlZCIsCiAgICAgdWNTVEFJZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIGRhdGEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL1ZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgLy8gICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0ZWQgdHggcGFja2V0IGNvdW50IGZvciBTVEE6ICVkLCBUSUQ6ICVkIiwgCiAgICAgIC8vICAgICAgICAgdWNTVEFJZCwgdWNUaWQpOwoKICAqcHVUeFBrdENvdW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPmF1VHhDb3VudFt1Y1RpZF07CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfR2V0VHhQa3RDb3VudCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0UnhQa3RDb3VudAoKICBERVNDUklQVElPTgogICAgVEwgd2lsbCBwcm92aWRlIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBjb3VudGVkIHBlcgogICAgU1RBIHBlciBUSUQuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24KICAgIHVjVGlkOiAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSB0c3BlYwoKICAgT1VUCiAgICBwdVR4UGt0Q291bnQ6ICAgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJ4IHBhY2tldCBmb3IgdGhpcyBTVEEgYW5kIFRJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfRV9FWElTVFM6ICBTdGF0aW9uIHdhcyBub3QgcmVnaXN0ZXJlZAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRSeFBrdENvdW50CigKICB2X1BWT0lEX3QgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICB1Y1NUQUlkLAogIHZfVThfdCAgICAgICAgIHVjVGlkLAogIHZfVTMyX3QqICAgICAgIHB1UnhQa3RDb3VudAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdVJ4UGt0Q291bnQgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApIHx8IFdMQU5UTF9USURfSU5WQUxJRCggdWNUaWQpICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDpJbnZhbGlkIHN0YXRpb24gaWQgJWQvdGlkICVkIHJlcXVlc3RlZCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIsCiAgICAgICAgICAgICB1Y1NUQUlkLCB1Y1RpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBvbiBXTEFOVExfR2V0UnhQa3RDb3VudCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRVhJU1RTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJldHVybiBkYXRhCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0czKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgICAgICAgICAiV0xBTiBUTDpSZXF1ZXN0ZWQgcnggcGFja2V0IGNvdW50IGZvciBTVEE6ICVkLCBUSUQ6ICVkIiwKICAgICAgICAgICAgIHVjU1RBSWQsIHVjVGlkKSk7CgogICpwdVJ4UGt0Q291bnQgPSBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0dldFJ4UGt0Q291bnQgKi8KClZPU19TVEFUVVMKV0xBTlRMX1R4RkNGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4Cik7Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgVEwgSU5URVJOQUwgQVBJIERFRklOSVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9HZXRGcmFtZXMKCiAgREVTQ1JJUFRJT04KCiAgICBCQUwgY2FsbHMgdGhpcyBmdW5jdGlvbiBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgbG93ZXIgYnVzIGludGVyZmFjZS4KICAgIFdoZW4gdGhpcyByZXF1ZXN0IGlzIGJlaW5nIHJlY2VpdmVkIFRMIHdpbGwgcmV0cmlldmUgcGFja2V0cyBmcm9tIEhERAogICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBwcmlvcml0eSBydWxlcyBhbmQgdGhlIGNvdW50IHN1cHBsaWVkIGJ5IEJBTC4KCiAgREVQRU5ERU5DSUVTCgogICAgSEREIG11c3QgaGF2ZSByZWdpc3RlcmVkIHdpdGggVEwgYXQgbGVhc3Qgb25lIFNUQSBiZWZvcmUgdGhpcyBmdW5jdGlvbgogICAgY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVTaXplOiAgICAgICAgICBtYXhpbXVtIHNpemUgYWNjZXB0ZWQgYnkgdGhlIGxvd2VyIGxheWVyCiAgICB1Rmxvd01hc2sgICAgICAgVFggZmxvdyBjb250cm9sIG1hc2sgZm9yIFByaW1hLiBFYWNoIGJpdCBpcyBkZWZpbmVkIGFzIAogICAgICAgICAgICAgICAgICAgIFdEQV9UWEZsb3dFbnVtVHlwZQoKICAgIE9VVAogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHN1cHBsaWVkCiAgICAgICAgICAgICAgICAgICAgYnkgVEwsIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcGFja2V0IHN1cHBsaWVkLCBUTAogICAgICAgICAgICAgICAgICAgIHdpbGwgY2hhaW4gdGhlbSB0aHJvdWdoIHZPU1MgYnVmZmVycwoKICBSRVRVUk4gVkFMVUUKCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIDEgb3IgbW9yZTogbnVtYmVyIG9mIHJlcXVpcmVkIHJlc291cmNlcyBpZiB0aGVyZSBhcmUgc3RpbGwgZnJhbWVzIHRvIGZldGNoCiAgICAwIDogZXJyb3Igb3IgSEREIHF1ZXVlcyBhcmUgZHJhaW5lZAoKICBTSURFIEVGRkVDVFMKCiAgTk9URQogICAgCiAgICBGZWF0dXJpemVkIHVGbG93TWFzay4gSWYgd2Ugd2FudCB0byByZW1vdmUgZmVhdHVyaXphdGlvbiwgd2UgbmVlZCB0byBjaGFuZ2UKICAgIEJBTCBvbiBWb2xhbnMuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdl9VMzJfdApXTEFOVExfR2V0RnJhbWVzCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90ICAgICAqKnBwRnJhbWVEYXRhQnVmZiwKICB2X1UzMl90ICAgICAgICAgdVNpemUsCiAgdl9VOF90ICAgICAgICAgIHVGbG93TWFzaywKICB2X0JPT0xfdCogICAgICAgcGJVcmdlbnQKKQp7CiAgIHZvc19wa3RfdCoqICAgICAgICAgcHZvc0RhdGFCdWZmID0gKHZvc19wa3RfdCoqKXBwRnJhbWVEYXRhQnVmZjsKICAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAgdl9VMzJfdCAgICAgICAgICAgICB1UmVtYWluaW5nID0gdVNpemU7CiAgIHZvc19wa3RfdCogICAgICAgICAgdm9zUm9vdDsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmOwogICBXTEFOVExfU1RBRnVuY1R5cGUgIHBmblNUQUZzbTsKICAgdl9VMTZfdCAgICAgICAgICAgICB1c1BrdExlbjsKICAgdl9VMzJfdCAgICAgICAgICAgICB1UmVzTGVuOwogICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CiAgIHZfVThfdCAgICAgICAgICAgICAgdWNBQzsKICAgdm9zX3BrdF90KiAgICAgICAgICB2b3NEYXRhQnVmZjsKICAgdl9VMzJfdCAgICAgICAgICAgICB1VG90YWxQa3RMZW47CiAgIHZfVTMyX3QgICAgICAgICAgICAgaT0wOwogICB2X1UzMl90ICAgICAgICAgICAgIGo9MDsKICAgdl9VMzJfdCAgICAgICAgICAgICB1Y1Jlc3VsdCA9IDA7CiAgIFZPU19TVEFUVVMgICAgICAgICAgdm9zU3RhdHVzOwogICBXTEFOVExfU1RBRXZlbnRUeXBlICAgd1NUQUV2ZW50OwogICB0QnNzU3lzdGVtUm9sZSAgICAgICBzeXN0ZW1Sb2xlOwogICB0cEFuaVNpckdsb2JhbCBwTWFjOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfQ2hhbmdlU1RBU3RhdGUiKSk7CiAgICByZXR1cm4gdWNSZXN1bHQ7CiAgfQoKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfUEUsIHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcE1hYyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBJbnZhbGlkIHBNYWMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIHVjUmVzdWx0OwogIH0KCiAgdm9zRGF0YUJ1ZmYgPSBwVExDYi0+dm9zRHVtbXlCdWY7IC8qIEp1c3QgdG8gYXZvaWQgY2hlY2tpbmcgZm9yIE5VTEwgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGl0ZXJhdGlvbiAqLwoKICBwVExDYi0+dVJlc0NvdW50ID0gdVNpemU7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIHJvb3QgYXMgd2Ugd2lsbCB3YWxrIHRoaXMgY2hhaW4gYXMgd2UgZmlsbCBpdAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zUm9vdCA9IHZvc0RhdGFCdWZmOwogCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVGhlcmUgaXMgc3RpbGwgZGF0YSAtIHVudGlsIEZTTSBmdW5jdGlvbiBzYXlzIG90aGVyd2lzZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IEZBTFNFOwoKICB3aGlsZSAoKCBwVExDYi0+dGxDb25maWdJbmZvLnVNaW5GcmFtZXNQcm9jVGhyZXMgPCBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgKCAwIDwgdVJlbWFpbmluZyApKQogIHsKICAgIHN5c3RlbVJvbGUgPSB3ZGFHZXRHbG9iYWxTeXN0ZW1Sb2xlKHBNYWMpOwojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KLyogRklYTUU6IFRoZSBjb2RlIGhhcyBiZWVuIGRpc2FibGVkIHNpbmNlIGl0IGlzIGNyZWF0aW5nIGlzc3VlcyBpbiBwb3dlciBzYXZlICovCiAgICBpZiAoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpCiAgICB7CiAgICAgICBpZiAocFRMQ2ItPmRvbmVfb25jZSA9PSAwICYmIE5VTEwgPT0gcFRMQ2ItPnZvc1R4RkNCdWYpCiAgICAgICB7CiAgICAgICAgICBXTEFOVExfVHhGQ0ZyYW1lIChwdm9zR0N0eCk7CiAgICAgICAgICBwVExDYi0+ZG9uZV9vbmNlICsrOwogICAgICAgfQogICAgfSAKICAgIGlmICggTlVMTCAhPSBwVExDYi0+dm9zVHhGQ0J1ZiApCiAgICB7CiAgICAgICAvL3RoZXJlIGlzIGZsb3cgY29udHJvbCBwYWNrZXQgd2FpdGluZyB0byBiZSBzZW50CiAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCBwVExDYi0+dm9zVHhGQ0J1ZiwgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CiAgICAKICAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApICYmCiAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfRkMgKSApICkKICAgICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBGQyBmcmFtZSBmaXJzdCBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsIHBUTENiLT52b3NUeEZDQnVmLCAxIC8qdHJ1ZSovICk7CgogICAgICAgICAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT52b3NUeEZDQnVmLCAodl9VMzJfdClOVUxMKTsKCiAgICAgICAgICAvKkZDIGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICB1UmVtYWluaW5nICAgICAgICAtPSAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpzZW5kIGZjIG91dCBvZiBzb3VyY2UgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgICAgdWNSZXN1bHQgPSAoIHBUTENiLT51UmVzQ291bnQgPiB1UmVzTGVuICk/Vk9TX1RSVUU6Vk9TX0ZBTFNFOwogICAgICAgICAgYnJlYWs7IC8qIE91dCBvZiByZXNvdXJjZXMgb3IgcmVhY2hlZCBtYXggbGVuICovCiAgICAgICB9CiAgIH0KICAgZWxzZSAKI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KCiAgICBpZiAoKCBOVUxMICE9IHBUTENiLT50bE1nbXRGcm1DbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsTWdtdEZybUNsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNQa3RMZW4sIHVSZXNMZW4sIHVUb3RhbFBrdExlbik7CgogICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICB7CiAgICAgICAgICB1c1BrdExlbiA9IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU47CiAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICB9CgogICAgICBpZiAoICggcFRMQ2ItPnVSZXNDb3VudCA+IHVSZXNMZW4gKSAmJgogICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApICYmCiAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19NR01UICkgKSApCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgbWFuYWdlbWVudCBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKCiAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnRydWUqLyApOwoKICAgICAgICB2b3NfYXRvbWljX3NldF9VMzIoICh2X1UzMl90KikmcFRMQ2ItPnRsTWdtdEZybUNsaWVudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1BlbmRpbmdEYXRhQnVmZiwgKHZfVTMyX3QpTlVMTCk7CgogICAgICAgIC8qbWFuYWdlbWVudCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogICAgICAgIHBUTENiLT5iVXJnZW50ICAgICAgPSBUUlVFOwoKICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgcFRMQ2ItPnVSZXNDb3VudCAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gKCBwVExDYi0+dVJlc0NvdW50ID4gdVJlc0xlbiApP1ZPU19UUlVFOlZPU19GQUxTRTsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKCBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICkgJiYKICAgICAgICAgICAgICggV0RBX1RMSV9NSU5fUkVTX0JBUCA8PSBwVExDYi0+dVJlc0NvdW50ICkgJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICAgICAgICAgICkKICAgIHsKICAgICAgV0RBX1RMSV9QUk9DRVNTX0ZSQU1FX0xFTiggcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgIHsKICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIH0KCiAgICAgIGlmICggKCBwVExDYi0+dVJlc0NvdW50ID4gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2hhaW5pbmcgQlQtQU1QIGZyYW1lIG9uIEdldEZyYW1lIikpOwoKICAgICAgICB2b3NfcGt0X2NoYWluX3BhY2tldCggdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLyp0cnVlKi8gKTsKCiAgICAgICAgLypCQVAgZnJhbWVzIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgdm9zX2F0b21pY19zZXRfVTMyKCAodl9VMzJfdCopJnBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClOVUxMKTsKCiAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgIHVSZW1haW5pbmcgICAgICAgIC09ICAodXNQa3RMZW4gKyBXREFfRFhFX0hFQURFUl9TSVpFKTsKCiAgICAgICAgLypVcGRhdGUgcmVzb3VyY2UgY291bnQgKi8KICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHVjUmVzdWx0ID0gdVJlc0xlbiArIFdEQV9UTElfTUlOX1JFU19NRjsKICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgfQogICAgfQogICAgLyogbm90ZTogdGhpcyBmZWF0dXJlIGltcGxlbWVudGVkIG9ubHkgYWZ0ZXIgV0xBTl9JTkdFVFJBVEVEX1NPQyAqLwogICAgLyogc2VhcmNoICdFQVBPTF9ISV9QUklPUklUWScgd2lsbCBzaG93IEVBUE9MIEhJX1BSSU9SSVRZIGNoYW5nZSBpbiBUTCBhbmQgV0RJCiAgICAgICBieSBkZWZhdWx0LCBFQVBPTCB3aWxsIGJlIHRyZWF0ZWQgYXMgaGlnaGVyIHByaW9yaXR5LCB3aGljaCBtZWFucwogICAgICAgdXNlIG1nbXRfcG9vbCBhbmQgRFhFX1RYX0hJIHByb3JpdHkgY2hhbm5lbC4KICAgICAgIHRoaXMgaXMgaW50cm9kdWNlZCB0byBhZGRyZXNzIEVBUE9MIGZhaWx1cmUgdW5kZXIgaGlnaCBiYWNrZ3JvdW5kIHRyYWZmaWMKICAgICAgIHdpdGggbXVsdGktY2hhbm5lbCBjb25jdXJyZW50IG1vZGUuIEJ1dCB0aGlzIGNoYW5nZSB3b3JrcyBpbiBTQ0Mgb3Igc3RhbmRhbG9uZSwgdG9vLgogICAgICAgc2VlIENSIzM4NzAwOSBhbmQgV0NOU09TLTgKICAgICAqLwogICAgZWxzZSBpZiAoKCBXREFfVExJX01JTl9SRVNfTUYgPD0gcFRMQ2ItPnVSZXNDb3VudCApJiYKICAgICAgICAgICAgICggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX01HTVQgKSApCiAgICAgICAgICAgICkKICAgIHsKICAgICAgICB2b3NUZW1wQnVmID0gTlVMTDsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICBDaGVjayB0byBzZWUgaWYgdGhlcmUgd2FzIGFueSBFQVBPTCBwYWNrZXQgaXMgcGVuZGluZwogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGZvciAoIGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICAgICAgewogICAgICAgICAgIGlmICgoTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAgICAgKDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0tPnVjVHhTdXNwZW5kZWQpICYmCiAgICAgICAgICAgICAgIChXTEFOVExfU1RBX0NPTk5FQ1RFRCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+dGxTdGF0ZSkgJiYKICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgewogICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8qIFNlcnZlIEVBUE9MIGZyYW1lIHdpdGggSElfRkxPV19NQVNLICovCiAgICAgICAgdWNTVEFJZCA9IGk7CgogICAgICAgIGZvciAoaiA9IFdMQU5UTF9NQVhfQUMgOyBqID4gMDsgai0tKQogICAgICAgIHsKICAgICAgICAgIGlmICgwICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdWNBQ01hc2tbai0xXSkKICAgICAgICAgIHsKICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjQ3VycmVudEFDID0gai0xOwogICAgICAgICAgICBwVExDYi0+dUN1clNlcnZlZEFDID0gai0xOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICAgICAgICB3U1RBRXZlbnQgPSBXTEFOVExfVFhfRVZFTlQ7CgogICAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgICBwZm5TVEFUYmxbd1NUQUV2ZW50XTsKCiAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgICAgewogICAgICAgICAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZiwgVk9TX0ZBTFNFKTsKCiAgICAgICAgICBpZiAoKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgICAgICAoIE5VTEwgIT0gdm9zVGVtcEJ1ZiApKQogICAgICAgICAgewogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT5wZm5TVEFUeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmLCB2b3NTdGF0dXMgKTsKICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfS8qIHN0YXR1cyBzdWNjZXNzKi8KICAgICAgICB9CgogICAgICAgIGlmIChOVUxMICE9IHZvc1RlbXBCdWYpCiAgICAgICAgewogICAgICAgICAgICBXREFfVExJX1BST0NFU1NfRlJBTUVfTEVOKCB2b3NUZW1wQnVmLCB1c1BrdExlbiwgdVJlc0xlbiwgdVRvdGFsUGt0TGVuKTsKCiAgICAgICAgICAgIGlmICh1c1BrdExlbiA+IFdMQU5UTF9NQVhfQUxMT1dFRF9MRU4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVzUGt0TGVuID0gV0xBTlRMX01BWF9BTExPV0VEX0xFTjsKICAgICAgICAgICAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlc291cmNlcyBuZWVkZWQgYnkgZnJhbWU6ICVkIiwgdVJlc0xlbikpOwoKICAgICAgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfTUYgKSApICYmCiAgICAgICAgICAgICAgICggdVJlbWFpbmluZyA+IHVUb3RhbFBrdExlbiApCiAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgICAgIHZvc19wa3RfY2hhaW5fcGFja2V0KCB2b3NEYXRhQnVmZiwgdm9zVGVtcEJ1ZiwgMSAvKnRydWUqLyApOwoKICAgICAgICAgICAgICAvKkVBUE9MIGZyYW1lIGNhbm5vdCBiZSBkZWxheWVkKi8KICAgICAgICAgICAgICBwVExDYi0+YlVyZ2VudCAgICAgID0gVFJVRTsKCiAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9ICBOVUxMOwoKICAgICAgICAgICAgICAvKlVwZGF0ZSByZW1haW5pbmcgbGVuIGZyb20gU1NDICovCiAgICAgICAgICAgICAgdVJlbWFpbmluZyAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgICAgICAvKlVwZGF0ZSByZXNvdXJjZSBjb3VudCAqLwogICAgICAgICAgICAgIHBUTENiLT51UmVzQ291bnQgIC09IHVSZXNMZW47CgogICAgICAgICAgICAgIC8vZm93IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUluZ3Jlc3NfbGVuZ3RoICs9IHVSZXNMZW47CiAgICAgICAgICAgICAgcENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPSAocENsaWVudFNUQS0+dUJ1ZmZUaHJlc2hvbGRNYXggPj0gdVJlc0xlbikgPwogICAgICAgICAgICAgICAgKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4IC0gdVJlc0xlbikgOiAwOwogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRWFwb2xQa3RQZW5kaW5nID0gMDsKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpHZXRGcmFtZXMgU1RBOiAlZCBFQVBPTFBrdFBlbmRpbmcgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWNFYXBvbFBrdFBlbmRpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7ICAvLyBubyBFQVBPTCBmcmFtZXMgZXhpdCBHZXQgZnJhbWVzCiAgICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkdldEZyYW1lcyBTVEE6ICVkLCBubyBFQVBPTCBmcmFtZSwgY29udGludWUuIiwKICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgIH0KCiAgICBlbHNlIGlmICgoIFdEQV9UTElfTUlOX1JFU19EQVRBIDw9IHBUTENiLT51UmVzQ291bnQgKSAmJgogICAgICAgICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYKICAgICAgICAgICAgICgoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JLICkgKSB8fAogICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQkUgKSApIHx8CiAgICAgICAgICAgICAgKCB1Rmxvd01hc2sgJiAoIDEgPDwgV0RBX1RYRkxPV19BQ19WSSApICkgfHwKICAgICAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZPICkgKSkgKQogICAgewogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW55IHBhY2tldCBsZWZ0IGJlaGluZCBwcmV2aW91c2x5IGR1ZSB0bwogICAgICAgIHNpemUgY29uc3RyYWludHMKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHZvc1RlbXBCdWYgPSBOVUxMOwoKICAgICAgaWYgKCBOVUxMICE9IHBUTENiLT52b3NUZW1wQnVmICkgCiAgICAgIHsKICAgICAgICB2b3NUZW1wQnVmICAgICAgICAgID0gcFRMQ2ItPnZvc1RlbXBCdWY7CiAgICAgICAgcFRMQ2ItPnZvc1RlbXBCdWYgICA9IE5VTEw7CiAgICAgICAgdWNTVEFJZCAgICAgICAgICAgICA9IHBUTENiLT51Y0NhY2hlZFNUQUlkOyAKICAgICAgICB1Y0FDICAgICAgICAgICAgICAgID0gcFRMQ2ItPnVjQ2FjaGVkQUM7CgogICAgICAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+dWNOb01vcmVEYXRhID0gMDsKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDaGFpbmluZyBjYWNoZWQgZGF0YSBmcmFtZSBvbiBHZXRGcmFtZSIpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBXTEFOX1RMR2V0TmV4dFR4SWRzKCBwdm9zR0N0eCwgJnVjU1RBSWQpOwogICAgICAgIGlmICh1Y1NUQUlkID49IFdMQU5fTUFYX1NUQV9DT1VOVCkKICAgICAgICB7CiAgICAgICAgIC8qIFBhY2tldHMgc3RhcnQgY29taW5nIGluIGV2ZW4gYWZ0ZXIgaW5zbW9kIFdpdGhvdXQgKgogICAgICAgICAgICBzdGFydGluZyBIb3N0YXBkIG9yIEludGVyZmFjZSBiZWluZyB1cCAgICAgICAgICAgICoKICAgICAgICAgICAgRHVyaW5nIHdoaWNoIGNhc2VzIFNUQUlEIGlzIGludmFsZWQgYW5kIGhlbmNlIAogICAgICAgICAgICB0aGUgY2hlY2suIEhhbE1zZ19TY25hQ29tcGxldGUgVHJpZ2dlcnMgKi8KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiB1Y0N1cnJlbnRBQyBzaG91bGQgaGF2ZSBjb3JyZWN0IEFDIHRvIGJlIHNlcnZlZCBieSBjYWxsaW5nCiAgICAgICAgICAgV0xBTl9UTEdldE5leHRUeElkcyAqLwogICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6ICVzIGdldCBvbmUgZGF0YSBmcmFtZSwgc3RhdGlvbiBJRCAlZCAiLCBfX2Z1bmNfXywgdWNTVEFJZCkpOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENoZWNrIHRvIHNlZSB0aGF0IFNUQSBpcyB2YWxpZCBhbmQgdHggaXMgbm90IHN1c3BlbmRlZAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBpZiAoICggISBXTEFOVExfU1RBX0lEX0lOVkFMSUQoIHVjU1RBSWQgKSApICYmCiAgICAgICAgICAgKCAwID09IHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQgKSAmJgogICAgICAgICAgICggMCA9PSBwQ2xpZW50U1RBLT5mY1N0YVR4RGlzYWJsZWQpICkKICAgICAgICB7CiAgICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDogJXMgc3RhIGlkIHZhbGlkIGFuZCBub3Qgc3VzcGVuZGVkICIsX19mdW5jX18pKTsKICAgICAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9UWF9FVkVOVDsKCiAgICAgICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgICAgICB7CiAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjTm9Nb3JlRGF0YSA9IDA7CiAgICAgICAgICAgIHZvc1N0YXR1cyAgPSBwZm5TVEFGc20oIHB2b3NHQ3R4LCB1Y1NUQUlkLCAmdm9zVGVtcEJ1ZiwgVk9TX0ZBTFNFKTsKCiAgICAgICAgICAgIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSAmJgogICAgICAgICAgICAgICAgKCBOVUxMICE9IHZvc1RlbXBCdWYgKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzICk7CiAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgIH0vKiBzdGF0dXMgc3VjY2VzcyovCiAgICAgICAgICB9LypOVUxMIGZ1bmN0aW9uIHN0YXRlKi8KICAgICAgICB9LyogdmFsaWQgU1RBIGlkIGFuZCAhIHN1c3BlbmRlZCovCiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICBpZiAoICEgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKSAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vdCBmZXRjaGluZyBmcmFtZSBiZWNhdXNlIHN1c3BlbmRlZCBmb3Igc3RhIElEICVkIiwgCiAgICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfS8qIGRhdGEgKi8KCiAgICAgIGlmICggTlVMTCAhPSB2b3NUZW1wQnVmICkKICAgICAgewogICAgICAgIFdEQV9UTElfUFJPQ0VTU19GUkFNRV9MRU4oIHZvc1RlbXBCdWYsIHVzUGt0TGVuLCB1UmVzTGVuLCB1VG90YWxQa3RMZW4pOwoKICAgICAgICBpZiAodXNQa3RMZW4gPiBXTEFOVExfTUFYX0FMTE9XRURfTEVOKQogICAgICAgIHsKICAgICAgICAgICAgdXNQa3RMZW4gPSBXTEFOVExfTUFYX0FMTE9XRURfTEVOOwogICAgICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgICAgIH0KCiAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSZXNvdXJjZXMgbmVlZGVkIGJ5IGZyYW1lOiAlZCIsIHVSZXNMZW4pKTsKCiAgICAgICAgaWYgKCAoIHBUTENiLT51UmVzQ291bnQgPj0gKHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfQkFQICkgKSAmJgogICAgICAgICAgICAgKCB1UmVtYWluaW5nID4gdVRvdGFsUGt0TGVuICkgJiYKICAgICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IHVjQUMgKSApICkKICAgICAgICB7CiAgICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkNoYWluaW5nIGRhdGEgZnJhbWUgb24gR2V0RnJhbWUiKSk7CgogICAgICAgICAgdm9zX3BrdF9jaGFpbl9wYWNrZXQoIHZvc0RhdGFCdWZmLCB2b3NUZW1wQnVmLCAxIC8qdHJ1ZSovICk7CiAgICAgICAgICB2b3NUZW1wQnVmID0gIE5VTEw7CgogICAgICAgICAgLypVcGRhdGUgcmVtYWluaW5nIGxlbiBmcm9tIFNTQyAqLwogICAgICAgICAgdVJlbWFpbmluZyAgICAgICAgLT0gKHVzUGt0TGVuICsgV0RBX0RYRV9IRUFERVJfU0laRSk7CgogICAgICAgICAgIC8qVXBkYXRlIHJlc291cmNlIGNvdW50ICovCiAgICAgICAgICBwVExDYi0+dVJlc0NvdW50ICAtPSB1UmVzTGVuOwoKICAgICAgICAgIC8vZm93IGNvbnRyb2wgdXBkYXRlCiAgICAgICAgICBwQ2xpZW50U1RBLT51SW5ncmVzc19sZW5ndGggKz0gdVJlc0xlbjsKICAgICAgICAgIHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID0gKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4ID49IHVSZXNMZW4pID8KICAgICAgICAgICAgKHBDbGllbnRTVEEtPnVCdWZmVGhyZXNob2xkTWF4IC0gdVJlc0xlbikgOiAwOwoKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qIFN0b3JlIHRoaXMgZm9yIGxhdGVyIHR4IC0gYWxyZWFkeSBmZXRjaGVkIGZyb20gSEREICovCiAgICAgICAgICBwVExDYi0+dm9zVGVtcEJ1ZiA9IHZvc1RlbXBCdWY7CiAgICAgICAgICBwVExDYi0+dWNDYWNoZWRTVEFJZCA9IHVjU1RBSWQ7CiAgICAgICAgICBwVExDYi0+dWNDYWNoZWRBQyAgICA9IHVjQUM7CiAgICAgICAgICB1Y1Jlc3VsdCA9IHVSZXNMZW4gKyBXREFfVExJX01JTl9SRVNfQkFQOwogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIm1pbiAlZCByZXMgcmVxdWlyZWQgYnkgVEwuIiwgdWNSZXN1bHQgKSk7CiAgICAgICAgICBicmVhazsgLyogT3V0IG9mIHJlc291cmNlcyBvciByZWFjaGVkIG1heCBsZW4gKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKykKICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV0gJiYgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y0V4aXN0cykgJiYKICAgICAgICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW2ldLT51Y1BrdFBlbmRpbmcpKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgc3RhdGlvbiB0byBiZSBTZXJ2ZWQgKi8KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoaSA+PSBXTEFOX01BWF9TVEFfQ09VTlQpCiAgICAgICAgICAgewogICAgICAgICAgICAgIC8qIE5vIE1vcmUgdG8gU2VydmUgRXhpdCBHZXQgRnJhbWVzICovCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICAgLyogTW9yZSB0byBiZSBTZXJ2ZWQgKi8KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6UmV0dXJuaW5nIGZyb20gR2V0RnJhbWU6IHJlc291cmNlcyA9ICVkIHN1c3BlbmRlZCA9ICVkIiwKICAgICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dWNUeFN1c3BlbmRlZCkpOwogICAgICAvKiBUTCBpcyBzdGFydmluZyBldmVuIHdoZW4gRFhFIGlzIG5vdCBpbiBsb3cgcmVzb3VyY2UgY29uZGl0aW9uIAogICAgICAgICBSZXR1cm4gbWluIHJlc291cmNlIG51bWJlciByZXF1aXJlZCBhbmQgTGV0IERYRSBkZWNlaWRlIHdoYXQgdG8gZG8gKi8KICAgICAgaWYoKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkgJiYgCiAgICAgICAgICgoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX0JLICkgKSB8fCAKICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfQkUgKSApIHx8CiAgICAgICAgICAoIHVGbG93TWFzayAmICggMSA8PCBXREFfVFhGTE9XX0FDX1ZJICkgKSB8fCAKICAgICAgICAgICggdUZsb3dNYXNrICYgKCAxIDw8IFdEQV9UWEZMT1dfQUNfVk8gKSApKSkKICAgICAgewogICAgICAgICBUTExPRzEoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgIldMQU4gVEw6UmV0dXJuaW5nIGZyb20gR2V0RnJhbWU6IHJlc291cmNlcyA9ICVkIiwKICAgICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50KSk7CiAgICAgICAgIHVjUmVzdWx0ID0gV0RBX1RMSV9NSU5fUkVTX0RBVEE7CiAgICAgIH0KICAgICAgIGJyZWFrOyAvKm91dCBvZiBtaW4gZGF0YSByZXNvdXJjZXMqLwogICAgfQoKICAgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQrKzsKICAgIC8qIE1vdmUgZGF0YSBidWZmZXIgdXAgb25lIHBhY2tldCAqLwogICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMC8qZmFsc2UqLyApOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBQYWNrZXQgY2hhaW4gc3RhcnRzIGF0IHJvb3QgKyAxCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc19wa3Rfd2Fsa19wYWNrZXRfY2hhaW4oIHZvc1Jvb3QsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CgogICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKICBpZiAocGJVcmdlbnQpCiAgewogICAgICAqcGJVcmdlbnQgICAgID0gcFRMQ2ItPmJVcmdlbnQ7CiAgfQogIGVsc2UKICB7CiAgICAgIFZPU19BU1NFUlQoIHBiVXJnZW50ICk7CiAgfQogIHJldHVybiB1Y1Jlc3VsdDsKfS8qIFdMQU5UTF9HZXRGcmFtZXMgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9UeENvbXAKCiAgREVTQ1JJUFRJT04KICAgIEl0IGlzIGJlaW5nIGNhbGxlZCBieSBCQUwgdXBvbiBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIG9mIHRoZSBwYWNrZXQKICAgIG9yIHBhY2tldHMgIGJlaW5nIHNlbnQgb3ZlciB0aGUgYnVzLgoKICBERVBFTkRFTkNJRVMKICAgIFR4IGNvbXBsZXRlIGNhbm5vdCBiZSBjYWxsZWQgd2l0aG91dCBhIHByZXZpb3VzIHRyYW5zbWl0LgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBCQUwncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIGZvciB3aGljaAogICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgcmVwb3J0IGlzIGJlaW5nIG1hZGUsIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUKICAgICAgICAgICAgICAgICAgICBwYWNrZXQgdGhleSB3aWxsIGJlIGNoYWluZWQgdXNpbmcgdk9TUyBidWZmZXJzLgogICAgd1R4U3RhdHVzOiAgICAgIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbWl0dGVkIHBhY2tldCwgc2VlIGFib3ZlIGNoYXB0ZXIKICAgICAgICAgICAgICAgICAgICBvbiBIREQgaW50ZXJhY3Rpb24gZm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgcG9pbnRlciB0byBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGZhdWx0CiAgICBWT1NfU1RBVFVTX0VfRVhJU1RTOiAgU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhDb21wCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90ICAgICAgKnBGcmFtZURhdGFCdWZmLAogIFZPU19TVEFUVVMgICAgICB3VHhTdGF0dXMKKQp7CiAgdm9zX3BrdF90KiAgICAgICAgICAgdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KilwRnJhbWVEYXRhQnVmZjsKICBXTEFOVExfQ2JUeXBlKiAgICAgICBwVExDYiAgICAgPSBOVUxMOwogIFdMQU5UTF9UeENvbXBDQlR5cGUgIHBmblR4Q29tcCA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZvc19wa3RfdCogICAgICAgICAgIHZvc1RlbXBUeCA9IE5VTEw7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkV4dHJhbmVvdXMgTlVMTCBkYXRhIHBvaW50ZXIgb24gV0xBTlRMX1R4Q29tcCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9UeENvbXAiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgd2hpbGUgKCgwIDwgcFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCkgJiYKICAgICAgICAgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkgJiYKICAgICAgICAgKCBOVUxMICE9ICB2b3NEYXRhQnVmZikpCiAgewogICAgdm9zX3BrdF9nZXRfdXNlcl9kYXRhX3B0ciggIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnBmblR4Q29tcCk7CgogICAgLyppdCBzaG91bGQgbmV2ZXIgYmUgTlVMTCAtIGRlZmF1bHQgaGFuZGxlciBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpZiBub25lKi8KICAgIGlmICggTlVMTCA9PSBwZm5UeENvbXAgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpOVUxMIHBvaW50ZXIgdG8gVHggQ29tcGxldGUgb24gV0xBTlRMX1R4Q29tcCIpKTsKICAgICAgVk9TX0FTU0VSVCgwKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpDYWxsaW5nIFR4IGNvbXBsZXRlIGZvciBwa3QgJXAgaW4gZnVuY3Rpb24gJXAiLAogICAgICAgICAgICAgICB2b3NEYXRhQnVmZiwgcGZuVHhDb21wKSk7CgogICAgdm9zVGVtcFR4ID0gdm9zRGF0YUJ1ZmY7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovKTsKCiAgICBwZm5UeENvbXAoIHB2b3NHQ3R4LCB2b3NUZW1wVHgsIHdUeFN0YXR1cyApOwoKICAgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQtLTsKICB9CgogCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6IGN1cnJlbnQgVEwgdmFsdWVzIGFyZTogcmVzb3VyY2VzID0gJWQgIgogICAgICAgICAgICAicFRMQ2ItPnVzUGVuZGluZ1R4Q29tcGxldGVDb3VudCA9ICVkIiwKICAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCBwVExDYi0+dXNQZW5kaW5nVHhDb21wbGV0ZUNvdW50KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfVHhDb21wICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DYWNoZVNUQUZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBmb3IgY2FjaGluZyBpbmNvbWluZyBkYXRhIGZyYW1lcyB0aGF0IGRvIAogICAgbm90IGhhdmUgYSByZWdpc3RlcmVkIHN0YXRpb24geWV0LiAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEluIG9yZGVyIHRvIGJlbmVmaXQgZnJvbSB0aHNpIGNhY2hpbmcsIHRoZSBjb21wb25lbnRzIG11c3QgZW5zdXJlIHRoYXQKICAgIHRoZXkgd2lsbCBvbmx5IHJlZ2lzdGVyIHdpdGggVEwgYXQgdGhlIG1vbWVudCB3aGVuIHRoZXkgYXJlIGZ1bGx5IHNldHVwCiAgICBhbmQgcmVhZHkgdG8gcmVjZWl2ZSBpbmNvbWluZyBkYXRhIAogICAKICBQQVJBTUVURVJTCgogICAgSU4KICAgIAogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgdWNTVEFJZDogICAgICAgICAgICAgICAgc3RhdGlvbiBpZAogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CiAgICB1RFBVU2lnOiAgICAgICAgICAgICAgICBEUFUgc2lnbmF0dXJlIG9mIHRoZSBpbmNvbWluZyBwYWNrZXQKICAgIGJCY2FzdDogICAgICAgICAgICAgICAgIHRydWUgaWYgcGFja2V0IGhhZCB0aGUgTUMvQkMgYml0IHNldCAKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgb3IgU1RBIElkIGludmFsaWQgOyBhY2Nlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBjYXVzZSBhIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMKV0xBTlRMX0NhY2hlU1RBRnJhbWUKKAogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiLAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgdl9VMzJfdCAgICAgICAgICAgdURQVVNpZywKICB2X1U4X3QgICAgICAgICAgICBiQmNhc3QsCiAgdl9VOF90ICAgICAgICAgICAgdWNGcm1UeXBlCikKewogIHZfVThfdCAgICB1Y1VjYXN0U2lnOwogIHZfVThfdCAgICB1Y0JjYXN0U2lnOwogIHZfQk9PTF90ICBiT2xkU1RBUGt0OwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIFNhbml0eSBjaGVjayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIGlmICgoIE5VTEwgPT0gcFRMQ2IgKSB8fCAoIE5VTEwgPT0gdm9zVGVtcEJ1ZmYgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogSW52YWxpZCBpbnB1dCBwb2ludGVyIG9uIFdMQU5UTF9DYWNoZVNUQUZyYW1lIFRMICVwIgogICAgICAgICAgICAgICAiIFBhY2tldCAlcCIsIHBUTENiLCB2b3NUZW1wQnVmZiApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCggdWNTVEFJZCApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICJXTEFOIFRMOkludmFsaWQgc3RhdGlvbiBpZCByZXF1ZXN0ZWQgb24gV0xBTlRMX0NhY2hlU1RBRnJhbWUiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QXR0ZW1wdGluZyB0byBjYWNoZSBwa3QgZm9yIFNUQSAlZCwgQkQgRFBVIFNpZzogJWQgd2l0aCBzaWcgVUM6ICVkLCBCQzogJWQiLCAKICAgICAgICAgICAgIHVjU1RBSWQsIHVEUFVTaWcsCiAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZykpOwoKICBpZihXTEFOVExfSVNfQ1RSTF9GUkFNRSh1Y0ZybVR5cGUpKQogIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm8gbmVlZCB0byBjYWNoZSBDVFJMIGZyYW1lLiBEcm9wcGluZyIpKTsKICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENoZWNrIGlmIHRoZSBwYWNrZXQgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGNhY2hlIGJlbG9uZ3MgdG8gdGhlIG9sZAogICAgcmVnaXN0ZXJlZCBzdGF0aW9uIChpZiBhbnkpIG9yIHRoZSBuZXcgKHBvdGVudGlhbGx5KXVwY29taW5nIHN0YXRpb24KICAgIAogICAgLSBJZiB0aGUgU1RBIHdpdGggdGhpcyBJZCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCB3aXRoIFRMIC0gdGhlIHNpZ25hdHVyZQogICAgd2lsbCBiZSBpbnZhbGlkOwogICAgLSBJZiB0aGUgU1RBIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgVEwgd2lsbCBoYXZlIGNhY2hlZCB0aGUgZm9ybWVyCiAgICBzZXQgb2YgRFBVIHNpZ25hdHVyZXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIGJCY2FzdCApCiAgewogICAgdWNCY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgIGJPbGRTVEFQa3QgPSAoKCBXTEFOX1RMX0lOVkFMSURfQl9TSUcgIT0gCiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcgKSAmJgogICAgICAoIHVjQmNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApKTsKICB9CiAgZWxzZQogIHsKICAgIHVjVWNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICBiT2xkU1RBUGt0ID0gKCggV0xBTl9UTF9JTlZBTElEX1VfU0lHICE9IAogICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgKSAmJgogICAgICAgICggdWNVY2FzdFNpZyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnICkpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElmIHRoZSB2YWx1ZSBvZiB0aGUgRFBVIFNJRyBtYXRjaGVzIHRoZSBvbGQsIHRoaXMgcGFja2V0IHdpbGwgbm90CiAgICBiZSBjYWNoZWQgYXMgaXQgYmVsb25nZWQgdG8gdGhlIGZvcm1lciBhc3NvY2lhdGlvbgogICAgSW4gY2FzZSB0aGUgU0lHIGRvZXMgbm90IG1hdGNoIC0gdGhpcyBpcyBhIHBhY2tldCBmb3IgYSBwb3RlbnRpYWxseSBuZXcKICAgIGFzc29jaWF0ZWQgc3RhdGlvbiAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIGJPbGRTVEFQa3QgfHwgYkJjYXN0ICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBtYXRjaGVzIG9sZCBzaWcgZm9yIHNpZyBEUFU6ICVkIFVDOiAlZCwgIgogICAgICAgICAgICAgICAiQkM6ICVkIC0gZHJvcHBpbmciLCAKICAgICAgICAgICAgICAgdURQVVNpZywgCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcpKTsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogIH0KICBlbHNlCiAgewogICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lICkKICAgIHsKICAgICAgLyp0aGlzIGlzIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHdlIGFyZSBjYWNoaW5nICovCiAgICAgIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qdGhpcyBpcyBhIHN1YnNlcXVlbnQgZnJhbWUgdGhhdCB3ZSBhcmUgY2FjaGluZzogY2hhaW4gdG8gdGhlIGVuZCAqLwogICAgICB2b3NfcGt0X2NoYWluX3BhY2tldChwQ2xpZW50U1RBLT52b3NFbmRDYWNoZWRGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsIFZPU19UUlVFKTsKICAgIH0KICAgIHBDbGllbnRTVEEtPnZvc0VuZENhY2hlZEZyYW1lID0gdm9zVGVtcEJ1ZmY7CiAgfS8qZWxzZSBuZXcgcGFja2V0Ki8KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsgCn0vKldMQU5UTF9DYWNoZVNUQUZyYW1lKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgVEwgdG8gZmx1c2ggdGhlIHN0YXRpb24gY2FjaGUKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIAogIFBBUkFNRVRFUlMKCiAgICBJTgoKICAgIHZvc0RhdGFCdWZmOiAgIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNhY2hlZCBidWZmZXIKICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCiAgTk9URQogICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHJlLWluaXRpYWxpemUgdm9zRGF0YUJ1ZmYgdG8gTlVMTC4gSXQncyBjYWxsZXIncyAKICAgIHJlc3BvbnNpYmlsaXR5IHRvIGRvIHNvLCBpZiByZXF1aXJlZCwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsLgogICAgQmVjYXVzZSBvZiB0aGlzIHJlc3RyaWN0aW9uLCB3ZSBkZWNpZGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHRvIHN0YXRpYwogICAgc28gdGhhdCB1cHBlciBsYXllciBkb2Vzbid0IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyByZXN0cmljdGlvbi4gCiAgICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyBWT1NfU1RBVFVTCldMQU5UTF9GbHVzaENhY2hlZEZyYW1lcwooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmCikKewogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmV0dXJuIHRoZSBlbnRpcmUgY2hhaW4gdG8gdm9zIGlmIHRoZXJlIGFyZSBpbmRlZWQgY2FjaGUgZnJhbWVzIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCAhPSB2b3NEYXRhQnVmZiApCiAgewogICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7ICAKfS8qV0xBTlRMX0ZsdXNoQ2FjaGVkRnJhbWVzKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX0ZvcndhcmRTVEFGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGVpdGhlciBmb3J3YXJkaW5nIGNhY2hlZCBkYXRhIHRvIHRoZSBzdGF0aW9uIGFmdGVyCiAgICB0aGUgc3RhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkLCBvciBmbHVzaGluZyBjYWNoZWQgZGF0YSBpZiB0aGUgc3RhdGlvbiBoYXMgbm90IAogICAgYmVlbiByZWdpc3RlcmVkLiAKICAgICAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHBUTENiOiAgICAgICAgICAgICAgICAgIFRMIGNvbnRyb2wgYmxvY2sKICAgIHVjU1RBSWQ6ICAgICAgICAgICAgICAgIHN0YXRpb24gaWQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmUtaW5pdGlhbGl6ZSB2b3NEYXRhQnVmZiB0byBOVUxMLiBJdCdzIGNhbGxlcidzIAogICAgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28sIGlmIHJlcXVpcmVkLCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwuCiAgICBCZWNhdXNlIG9mIHRoaXMgcmVzdHJpY3Rpb24sIHdlIGRlY2lkZSB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdG8gc3RhdGljCiAgICBzbyB0aGF0IHVwcGVyIGxheWVyIGRvZXNuJ3QgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGlzIHJlc3RyaWN0aW9uLiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUwpXTEFOVExfRm9yd2FyZFNUQUZyYW1lcwooCiAgdm9pZCogICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZCwKICB2X1U4X3QgICAgICAgICAgICB1Y1VjYXN0U2lnLAogIHZfVThfdCAgICAgICAgICAgIHVjQmNhc3RTaWcKKQp7CiAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAogICAgIFNhbml0eSBjaGVjayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6IEludmFsaWQgaW5wdXQgcG9pbnRlciBvbiBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyBUTCAlcCIsCiAgICAgICAgIHBUTENiICkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIHJlcXVlc3RlZCBvbiBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL1dMQU5fVExfTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBDaGVjayBpZiBzdGF0aW9uIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBtZWFuIHdoaWxlCiAgICAgaWYgbm90IHJlZ2lzdGVyZWQsIGZsdXNoIGNhY2hlZCBmcmFtZXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIAogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmICggMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cyApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICJXTEFOIFRMOlN0YXRpb24gaGFzIGJlZW4gZGVsZXRlZCBmb3IgU1RBICVkIC0gZmx1c2hpbmcgY2FjaGUiLCB1Y1NUQUlkKSk7CiAgICBXTEFOVExfRmx1c2hDYWNoZWRGcmFtZXMocENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUpOwogICAgZ290byBkb25lOyAKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGb3J3YXJkaW5nIGNhY2hlIGZyYW1lcyByZWNlaXZlZCB3aGlsZSB0aGUgc3RhdGlvbiB3YXMgaW4gdGhlIHByb2Nlc3MgICAKICAgIG9mIGJlaW5nIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgU1cgY29tcG9uZW50cyAgIAoKICAgIEFjY2VzcyB0byB0aGUgY2FjaGUgbXVzdCBiZSBsb2NrZWQ7IHNpbWlsYXJseSB1cGRhdGluZyB0aGUgc2lnbmF0dXJlIGFuZCAgIAogICAgdGhlIGV4aXN0ZW5jZSBmbGFnIG11c3QgYmUgc3luY2hyb25pemVkIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkICAgCiAgICBkdXJpbmcgY2FjaGVkICAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV0xBTiBUTDpQcmVwYXJpbmcgdG8gZndkIHBhY2tldHMgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgbmV3IHNpZ25hdHVyZSB2YWx1ZXMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjVWNhc3RTaWcgID0gdWNVY2FzdFNpZzsKICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICA9IHVjQmNhc3RTaWc7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAiV0xBTiBUTDpGd2QtaW5nIHBhY2tldHMgZm9yIFNUQSAlZCBVQyAlZCBCQyAlZCIsCiAgICAgICB1Y1NUQUlkLCB1Y1VjYXN0U2lnLCB1Y0JjYXN0U2lnKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYW55IGNhY2hlZCBkYXRhIHRvIGZvcndhcmQgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAKICBpZiAoIE5VTEwgIT0gcENsaWVudFNUQS0+dm9zQmVnQ2FjaGVkRnJhbWUgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBGd2QtaW5nIENhY2hlZCBwYWNrZXRzIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCApKTsKCiAgICBXTEFOVExfUnhDYWNoZWRGcmFtZXMoIHBUTENiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lKTsKICB9CiAgZWxzZQogIHsKICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDogTk8gY2FjaGVkIHBhY2tldHMgZm9yIHN0YXRpb24gJWQiLCB1Y1NUQUlkICkpOwogIH0KCmRvbmU6CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKICAgQ2xlYXIgdGhlIHN0YXRpb24gY2FjaGUgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnZvc0JlZ0NhY2hlZEZyYW1lID0gTlVMTDsKICBwQ2xpZW50U1RBLT52b3NFbmRDYWNoZWRGcmFtZSA9IE5VTEw7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQWZ0ZXIgYWxsIHRoZSBpbml0IGlzIGNvbXBsZXRlIHdlIGNhbiBtYXJrIHRoZSBleGlzdGFuY2UgZmxhZyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPnVjUnhCbG9ja2VkID0gMDsKCiAgLy9XTEFOX1RMX1VOTE9DS19TVEFfQ0FDSEUocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0pOyAKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOyAKCn0vKldMQU5UTF9Gb3J3YXJkU1RBRnJhbWVzKi8KCgojaWYgZGVmaW5lZChGRUFUVVJFX1dMQU5fQ0NYKSB8fCBkZWZpbmVkKEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FEKQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Jc0lBUFBGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZGV0ZWN0aW5nIGluY29taW5nIENDWCBJQVBQIGZyYW1lcwoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfVFJVRTogICBJdCBpcyBhIElBUFAgZnJhbWUKICAgIFZPU19GQUxTRTogIEl0IGlzIE5PVCBJQVBQIGZyYW1lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc0lBUFBGcmFtZQooCiAgdl9QVk9JRF90ICAgICAgICAgcHZCREhlYWRlciwKICB2b3NfcGt0X3QqICAgICAgICB2b3NUZW1wQnVmZgopCnsKICB2X1UxNl90ICAgICAgICAgICAgIHVzTVBEVURPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09mZnNldDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU25hcEhkcltXTEFOVExfTExDX1NOQVBfU0laRV07CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1NuYXBIZHJTaXplID0gV0xBTlRMX0xMQ19TTkFQX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgT1VJIGZpZWxkIGlzIHByZXNlbnQuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBWT1NfRkFMU0UgPT0gV0RBX0lTX1JYX0xMQ19QUkVTRU5UKHB2QkRIZWFkZXIpICkKICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogIH0KICB1c01QRFVET2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfREFUQV9PRkZTRVQocHZCREhlYWRlcik7CiAgdWNPZmZzZXQgICAgICA9ICh2X1U4X3QpdXNNUERVRE9mZnNldCArIFdMQU5UTF9MTENfU05BUF9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y1NuYXBIZHIsICZ1c1NuYXBIZHJTaXplKTsKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykpIAogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IFNuYXAgSGRyIG9mIGRhdGEgIHBhY2tldCAtIgogICAgICAgICAgICAgICAgImRyb3BwaW5nIHBrdCIpKTsKICAgIHJldHVybiBWT1NfRkFMU0U7CiAgfQoKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiB0aGlzIGlzIElBUFAgZnJhbWUgYnkgbWF0Y2hpbmcgQWlyb25ldCBTbmFwIGhkci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvLyBDb21wYXJlIHJldHVybnMgMSBpZiB2YWx1ZXMgYXJlIHNhbWUgYW5kIDAKICAvLyBpZiBub3QgdGhlIHNhbWUuCiAgaWYgKCggV0xBTlRMX0xMQ19TTkFQX1NJWkUgIT0gdXNTbmFwSGRyU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y1NuYXBIZHIsICh2X1BWT0lEX3QpV0xBTlRMX0FJUk9ORVRfU05BUF9IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX1NOQVBfU0laRSApICkpCiAgewogICAgcmV0dXJuIFZPU19GQUxTRTsKICB9CgogIHJldHVybiBWT1NfVFJVRTsKCn0KI2VuZGlmIC8vRkVBVFVSRV9XTEFOX0NDWAoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCgogIERFU0NSSVBUSU9OCiAgICBJbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGluY29taW5nIEJULUFNUCBmcmFtZXMKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIEJvdGhlIHRoZSBCVC1BTVAgc3RhdGlvbiBhbmQgdGhlIEJBUCBDdHJsIHBhdGggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSAKICAgIHJlZ2lzdGVyZWQgd2l0aCBUTC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICAKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgdm9zVGVtcEJ1ZmY6ICAgICAgICAgICAgdGhlIGRhdGEgcGFja2V0CiAgICBwVExDYjogICAgICAgICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1NUQUlkOiAgICAgICAgICAgICAgICBzdGF0aW9uIGlkCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0JBUEZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyLAogIHZvc19wa3RfdCogICAgICAgIHZvc1RlbXBCdWZmLAogIFdMQU5UTF9DYlR5cGUqICAgIHBUTENiLAogIHZfVThfdCogICAgICAgICAgIHBGaXJzdERhdGFQa3RBcnJpdmVkLAogIHZfVThfdCAgICAgICAgICAgIHVjU1RBSWQKKQp7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c01QRFVET2Zmc2V0OwogIHZfVThfdCAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y09VSVtXTEFOVExfTExDX09VSV9TSVpFXTsKICB2X1NJWkVfdCAgICAgICAgICAgIHVzT1VJU2l6ZSA9IFdMQU5UTF9MTENfT1VJX1NJWkU7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c1R5cGU7CiAgdl9TSVpFX3QgICAgICAgICAgICB1c1R5cGVMZW4gPSBzaXplb2YodXNUeXBlKTsKICB2X1U4X3QgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVITGVuID0gMDsKICB2X1UxNl90ICAgICAgICAgICAgIHVzQWN0dWFsSExlbiA9IDA7CgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBPVUkgYW5kIHR5cGUgZnJvbSBMTEMgYW5kIHZhbGlkYXRlOyBpZiBub24tZGF0YSBzZW5kIHRvIEJBUAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggVk9TX0ZBTFNFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVChwdkJESGVhZGVyKSApCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAiV0xBTiBUTDpMTEMgaGVhZGVyIHJlbW92ZWQsIGNhbm5vdCBkZXRlcm1pbmUgQlQtQU1QIHR5cGUgLSIKICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7IAogIH0KCiAgdXNNUERVRE9mZnNldCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKHB2QkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKHB2QkRIZWFkZXIpOwogIHVjT2Zmc2V0ICAgICAgPSAodl9VOF90KXVzTVBEVURPZmZzZXQgKyBXTEFOVExfTExDX09VSV9PRkZTRVQ7CgogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwgdWNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCl1Y09VSSwgJnVzT1VJU2l6ZSk7CgojaWYgMAogIC8vIENvbXBhcmUgcmV0dXJucyAxIGlmIHZhbHVlcyBhcmUgc2FtZSBhbmQgMAogIC8vIGlmIG5vdCB0aGUgc2FtZS4KICBpZiAoKCBXTEFOVExfTExDX09VSV9TSVpFICE9IHVzT1VJU2l6ZSApIHx8CiAgICAgKCAwID09IHZvc19tZW1fY29tcGFyZSh1Y09VSSwgKHZfUFZPSURfdClXTEFOVExfQlRfQU1QX09VSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5UTF9MTENfT1VJX1NJWkUgKSApKQogIHsKICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgIkxMQyBoZWFkZXIgcG9pbnRzIHRvIGRpZmYgT1VJIGluIEJULUFNUCBzdGF0aW9uIC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQojZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBMTEMgT1VJIGFuZCBlbnN1cmUgdGhhdCB0aGlzIGlzIGluZGVlZCBhIEJULUFNUCBmcmFtZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQgKyBXTEFOVExfTExDX09VSV9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzVHlwZSwgJnVzVHlwZUxlbik7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMpIHx8CiAgICAgICggc2l6ZW9mKHVzVHlwZSkgIT0gdXNUeXBlTGVuICkpCiAgewogICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGV4dHJhY3QgdHlwZSBvbiBpbmNvbWluZyBCQVAgcGFja2V0IC0iCiAgICAgICAgICAgICAgICAiZHJvcHBpbmcgcGt0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICByZXR1cm4gVk9TX1RSVUU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgdGhpcyBpcyBCVC1BTVAgZGF0YSBvciBjdHJsIHBhY2tldChSU04sIExpbmtTdmlzaW9uLCBBY3Rpdml0eVIpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdXNUeXBlID0gdm9zX2JlMTZfdG9fY3B1KHVzVHlwZSk7CgogIGlmIChXTEFOVExfQkFQX0lTX05PTl9EQVRBX1BLVF9UWVBFKHVzVHlwZSkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6Tm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6ICVkLCA9PiBCQVAiLAogICAgICAgICAgICAgICB1c1R5cGUpKTsKCiAgICAvKkZsYXR0ZW4gcGFja2V0IGFzIEJBUCBleHBlY3RzIHRvIGJlIGFibGUgdG8gcGVlayovCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NfcGt0X2ZsYXR0ZW5fcnhfcGt0KCZ2b3NUZW1wQnVmZikpCiAgICB7CiAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBmbGF0dGVuIEJULUFNUCBwYWNrZXQgLSBkcm9wcGluZyIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQoKICAgIC8qIFNlbmQgcGFja2V0IHRvIEJBUCBjbGllbnQqLwogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gV0RBX0RTX1RyaW1SeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmICkgKQogICAgewogICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICByZXR1cm4gVk9TX1RSVUU7CiAgICB9CgogICAgaWYgKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShwdkJESGVhZGVyKSApCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiTm9uLWRhdGEgcGFja2V0IHJlY2VpdmVkIG92ZXIgQlQtQU1QIGxpbms6IFNlbmRpbmcgaXQgZm9yICIKICAgICAgICAgICJmcmFtZSBUcmFuc2xhdGlvbiIpKTsKCiAgICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgICAgewogICAgICAgIHVzQWN0dWFsSExlbiA9IHVzTVBEVURPZmZzZXQgLSB1Y01QRFVIT2Zmc2V0OwogICAgICB9CgogICAgICAvKiBzb2Z0d2FyZSBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgQlRBTVAgV0RTLiovCiAgICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIxMVRvODAyM0hlYWRlciggdm9zVGVtcEJ1ZmYsICZ2b3NTdGF0dXMsIHVzQWN0dWFsSExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYix1Y1NUQUlkLCBWT1NfRkFMU0UpOwogICAgICAKICAgIH0KICAgIGlmIChwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCkKICAgICAgICBwVExDYi0+dGxCQVBDbGllbnQucGZuVGxCQVBSeCggdm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTEFOVExfQkFQRnJhbWVFbnVtVHlwZSl1c1R5cGUgKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBWT1NfQVNTRVJUKDApOwogICAgfQoKICAgIHJldHVybiBWT1NfVFJVRTsKICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICJXTEFOIFRMOiBCQVAgREFUQSBwYWNrZXQgcmVjZWl2ZWQgb3ZlciBCVC1BTVAgbGluazogJWQsID0+IEJBUCIsCiAgICAgICAgICAgICAgIHVzVHlwZSkpOwogICAvKiEhIUZJWCBNRSEhKi8KICNpZiAwCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgRm9yIGRhdGEgcGFja2V0IGNvbGxlY3QgcGh5IHN0YXRzIFJTU0kgYW5kIExpbmsgUXVhbGl0eQogICAgIENhbGN1bGF0ZSB0aGUgUlNTSSBhdmVyYWdlIGFuZCBzYXZlIGl0LiBDb250aW51b3VzIGF2ZXJhZ2UgaXMgZG9uZS4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggKnBGaXJzdERhdGFQa3RBcnJpdmVkID09IDApCiAgICB7CiAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnJzc2lBdmcgPQogICAgICAgICBXTEFOSEFMX0dFVF9SU1NJX0FWRVJBR0UoIHB2QkRIZWFkZXIgKTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUxpbmtRdWFsaXR5QXZnID0gCiAgICAgICAgV0xBTkhBTF9SWF9CRF9HRVRfU05SKCBwdkJESGVhZGVyICk7CgogICAgICAvLyBSY3ZkIDFzdCBwa3QsIHN0YXJ0IGF2ZXJhZ2UgZnJvbSBuZXh0IHRpbWUKICAgICAgKnBGaXJzdERhdGFQa3RBcnJpdmVkID0gMTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0ucnNzaUF2ZyA9CiAgICAgICAgICAoV0xBTkhBTF9HRVRfUlNTSV9BVkVSQUdFKCBwdkJESGVhZGVyICkgKyAKICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5yc3NpQXZnKS8yOwogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51TGlua1F1YWxpdHlBdmcgPQogICAgICAgICAgKFdMQU5IQUxfUlhfQkRfR0VUX1NOUiggcHZCREhlYWRlciApICsgIAogICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMaW5rUXVhbGl0eUF2ZykvMjsKICAgIH0vKkVsc2UsIGZpcnN0IGRhdGEgcGFja2V0Ki8KICNlbmRpZgogIH0vKkJULUFNUCBkYXRhIHBhY2tldCovCgogIHJldHVybiBWT1NfRkFMU0U7IAp9LypXTEFOVExfUHJvY2Vzc0JBUEZyYW1lKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9Qcm9jZXNzRkNGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBpbmNvbWluZyBGbG93IENvbnRyb2wgZnJhbWVzLiBFbmFibGUKICAgIG9yIGRpc2FibGUgTFdNIG1vZGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgRlcgc2VuZHMgdXAgc3BlY2lhbCBmbG93IGNvbnRyb2wgZnJhbWUuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHggICAgICAgICAgICAgICAgcG9pbnRlciB0byB2b3MgZ2xvYmFsIGNvbnRleHQKICAgIHB2QkRIZWFkZXI6ICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIEJEIGhlYWRlcgogICAgcFRMQ2I6ICAgICAgICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICAgcHZCREhlYWRlciAgICAgICAgICAgICAgcG9pbnRlciB0byBCRCBoZWFkZXIuCgogICAgSU4vT1VUCiAgICBwRmlyc3REYXRhUGt0QXJyaXZlZDogICBzdGF0aWMgZnJvbSBjYWxsZXIgZnVuY3Rpb247IHVzZWQgZm9yIHJzc2kgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRhdGlvbgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgZnJhbWUgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCiAgICBUaGUgaW5ncmVzcyBhbmQgZWdyZXNzIG9mIGVhY2ggc3RhdGlvbiB3aWxsIGJlIHVwZGF0ZWQuIElmIG5lZWRlZCwgTFdNIG1vZGUgd2lsbAogICAgYmUgZW5hYmxlZCBvciBkaXNhYmxlZCBiYXNlZCBvbiB0aGUgZmxvdyBjb250cm9sIGFsZ29yaXRobS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfUHJvY2Vzc0ZDRnJhbWUKKAogIHZfUFZPSURfdCAgICAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgICAgIHB2b3NEYXRhQnVmZiwKICB2X1BWT0lEX3QgICAgICAgICBwdkJESGVhZGVyCikKewojaWYgMSAvL2VuYWJsZSBwcm9jZXNzaW5nIG9mIG9ubHkgZmNTdGFUeERpc2FibGVkIGJpdG1hcCBmb3Igbm93LiB0aGUgZWxzZSBwYXJ0IGlzIG9sZCBiZXR0ZXIgcW9zIGNvZGUuCiAgICAgIC8vIG5lZWQgdG8gcmV2aXNpdCB0aGUgb2xkIGNvZGUgZm9yIGZ1bGwgaW1wbGVtZW50YXRpb24uCiAgdl9VOF90ICAgICAgICAgICAgdWNTVEFJZDsKICB2X1UxNl90ICAgICAgICAgICB1Y1N0YVZhbGlkQml0bWFwOwogIHZfVTE2X3QgICAgICAgICAgIHVjU3RhVHhEaXNhYmxlZEJpdG1hcDsKICBXTEFOVExfQ2JUeXBlKiAgICBwVExDYiA9IE5VTEw7CiAgI2lmZGVmIFRMX0RFQlVHX0ZDCiAgdl9VMzJfdCAgICAgICAgICAgcnhUaW1lU3RhbXA7CiAgdl9VMzJfdCAgICAgICAgICAgY3VyVGljazsKICAjZW5kaWYKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiBXTEFOVExfU3VzcGVuZERhdGFUeCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHVjU3RhVmFsaWRCaXRtYXAgPSBXREFfR0VUX1JYX0ZDX1ZBTElEX1NUQV9NQVNLKHB2QkRIZWFkZXIpOwogIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA9IFdEQV9HRVRfUlhfRkNfU1RBX1RYX0RJU0FCTEVEX0JJVE1BUChwdkJESGVhZGVyKTsKI2lmZGVmIFRMX0RFQlVHX0ZDCiAgcnhUaW1lU3RhbXAgPSBXREFfR0VUX1JYX1RJTUVTVEFNUChwdkJESGVhZGVyKTsKICAvKiBoYXJkIGNvZGUgb2YgTVRVX0dMT0JBTF9USU1FUl9BRERSIHRvIGNhbGN1bGF0ZSB0aGUgdGltZSBiZXR3ZWVuIGdlbmVyYXRlZCBhbmQgcHJvY2Vzc2VkICovCiAgd3BhbFJlYWRSZWdpc3RlcigweDAzMDgxNDAwKzB4MUQ0LCAmY3VyVGljayk7CgogIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICIlbGQgKCVsZC0lbGQpOiBEaXNhYmxlZCAleCBWYWxpZCAleCIsIGN1clRpY2sgPiByeFRpbWVTdGFtcCA/IGN1clRpY2sgLSByeFRpbWVTdGFtcCA6IHJ4VGltZVN0YW1wIC0gKDB4RkZGRkZGRkYgLSBjdXJUaWNrKSwKICAgIGN1clRpY2ssIHJ4VGltZVN0YW1wLCAgdWNTdGFUeERpc2FibGVkQml0bWFwLCB1Y1N0YVZhbGlkQml0bWFwKSk7CiNlbmRpZgogIGZvcih1Y1NUQUlkID0gMDsgdWNTdGFWYWxpZEJpdG1hcCAhPSAwOyB1Y1N0YVZhbGlkQml0bWFwID4+PTEsIHVjU3RhVHhEaXNhYmxlZEJpdG1hcCA+Pj0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoICgwID09ICh1Y1N0YVZhbGlkQml0bWFwICYgMHgxKSkgfHwgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICYmICgwID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT51Y0V4aXN0cykpICkKICAgICAgICBjb250aW51ZTsKCiAgICBpZiAodWNTdGFUeERpc2FibGVkQml0bWFwICYgMHgxKQogICAgewogICAgICBXTEFOVExfU3VzcGVuZERhdGFUeChwdm9zR0N0eCwgJnVjU1RBSWQsIE5VTEwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBXTEFOVExfUmVzdW1lRGF0YVR4KHB2b3NHQ3R4LCAmdWNTVEFJZCk7CiAgICB9CiAgfQoKI2Vsc2UKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB0cEhhbEZjUnhCZCAgICAgICAgIHB2RmNSeEJkID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjQml0Q2hlY2sgPSAweDE7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1N0YVZhbGlkID0gMDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQgPSAwOwoKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgRkMgUmVzcG9uc2UiKTsKICBpZiAoIChOVUxMID09IHBUTENiKSB8fCAoTlVMTCA9PSBwdm9zRGF0YUJ1ZmYpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBvaW50ZXIgaW4gJXMiLCBfX2Z1bmNfXykpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHB2b3NEYXRhQnVmZiwgMCwgKHZfUFZPSURfdCkmcHZGY1J4QmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRIYWxGY1J4QmQpKTsKCiAgaWYgKCAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgfHwgKE5VTEwgPT0gcHZGY1J4QmQpICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDp3cm9uZyBGQyBSeCBwYWNrZXQiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIAogIC8vIG5lZWQgdG8gc3dhcCBieXRlcyBpbiB0aGUgRkMgY29udGVudHMuICAKICBXTEFOSEFMX1N3YXBGY1J4QmQoJnB2RmNSeEJkLT5mY1NUQVR4UUxlblswXSk7CgogIC8vbG9naWMgdG8gZW5hYmxlL2Rpc2FibGUgTFdNIG1vZGUgZm9yIGVhY2ggc3RhdGlvbgogIGZvciggdWNTdGFWYWxpZCA9ICh2X1U4X3QpcHZGY1J4QmQtPmZjU1RBVmFsaWRNYXNrOyB1Y1N0YVZhbGlkOyB1Y1N0YVZhbGlkID4+PSAxLCB1Y0JpdENoZWNrIDw8PSAxLCB1Y1NUQUlkICsrKQogIHsKICAgIGlmICggKDAgPT0gKHVjU3RhVmFsaWQgJiAweDEpKSB8fCAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cykgKQogICAgewogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoIHB2RmNSeEJkLT5mY1NUQVRocmVzaEluZE1hc2sgJiB1Y0JpdENoZWNrICkKICAgIHsKICAgICAgLy9MV00gZXZlbnQgaXMgcmVwb3J0ZWQgYnkgRlcuIEFibGUgdG8gZmV0Y2ggbW9yZSBwYWNrZXQKICAgICAgaWYoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTHdtTW9kZUVuYWJsZWQgKQogICAgICB7CiAgICAgICAgLy9Ob3cgbWVtb3J5IHVzYWdlIGlzIGJlbG93IExXTS4gU3RhdGlvbiBjYW4gc2VuZCBtb3JlIHBhY2tldHMuCiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21FdmVudFJlcG9ydGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZXIHJlcG9ydCBMV00gZXZlbnQgYnV0IHRoZSBzdGF0aW9uICVkIGlzIG5vdCBpbiBMV00gbW9kZSIsIHVjU1RBSWQpKTsKICAgICAgfQogICAgfQoKICAgIC8vY2FsY3VsYXRlIHVFZ3Jlc3NfbGVuZ3RoL3VJbmdyZXNzX2xlbmd0aCBvbmx5IGFmdGVyIHJlY2VpdmluZyBlbm91Z2ggcGFja2V0cwogICAgaWYgKFdMQU5UTF9MV01fSU5HUkVTU19TQU1QTEVfVEhSRVNIT0xEIDw9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCkKICAgIHsKICAgICAgLy9jaGVjayBtZW1vcnkgdXNhZ2UgaW5mbyB0byBzZWUgd2hldGhlciBMV00gbW9kZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIHN0YXRpb24KICAgICAgdl9VMzJfdCB1RWdyZXNzX2xlbmd0aCA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCArIAogICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLmJtdU1lbUNvbnN1bWVkIC0gcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwoKICAgICAgLy9pZiAoKGZsb2F0KXVFZ3Jlc3NfbGVuZ3RoLyhmbG9hdClwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51SW5ncmVzc19sZW5ndGggCiAgICAgIC8vICAgICAgPD0gV0xBTlRMX0xXTV9FR1JFU1NfSU5HUkVTU19USFJFU0hPTEQpCiAgICAgIGlmICggKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+IHVFZ3Jlc3NfbGVuZ3RoKSAmJgogICAgICAgICAgICgocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoIC0gdUVncmVzc19sZW5ndGggKSA+PSAKICAgICAgICAgICAgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVJbmdyZXNzX2xlbmd0aCA+PiAyKSkKICAgICAgICAgKQogICAgICB7ICAgCiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RW5hYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCApCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxlIExXTSBtb2RlIGZvciBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNMd21Nb2RlRW5hYmxlZCA9IEZBTFNFOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vcmVtZW1iZXIgbWVtb3J5IHVzYWdlIGluIEZXIHN0YXJ0aW5nIGZyb20gdGhpcyByb3VuZAogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS5ibXVNZW1Db25zdW1lZCA9IHB2RmNSeEJkLT5mY1NUQVR4UUxlblt1Y1NUQUlkXTsKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoID0gMDsKICAgIH0gLy8oV0xBTlRMX0xXTV9JTkdSRVNTX1NBTVBMRV9USFJFU0hPTEQgPD0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUluZ3Jlc3NfbGVuZ3RoKQoKICAgIGlmKCBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkICkKICAgIHsKICAgICAgLy9hbHdheXMgdXBkYXRlIGN1cnJlbnQgbWF4aW11bSBhbGxvd2VkIG1lbWVvcnkgdXNhZ2UKICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udUJ1ZmZUaHJlc2hvbGRNYXggPSAgV0xBTlRMX1NUQV9CTVVfVEhSRVNIT0xEX01BWCAtCiAgICAgICAgcHZGY1J4QmQtPmZjU1RBVHhRTGVuW3VjU1RBSWRdOwogICAgfQoKICB9CiNlbmRpZgoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfUnhGcmFtZXMKCiAgREVTQ1JJUFRJT04KICAgIENhbGxiYWNrIHJlZ2lzdGVyZWQgYnkgVEwgYW5kIGNhbGxlZCBieSBCQUwgd2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZAogICAgb3ZlciB0aGUgYnVzLiBVcG9uIHRoZSBjYWxsIG9mIHRoaXMgZnVuY3Rpb24gVEwgd2lsbCBtYWtlIHRoZSBuZWNlc3NhcnkKICAgIGRlY2lzaW9uIHdpdGggcmVnYXJkcyB0byB0aGUgZm9yd2FyZGluZyBvciBxdWV1aW5nIG9mIHRoaXMgcGFja2V0IGFuZAogICAgdGhlIGxheWVyIGl0IG5lZWRzIHRvIGJlIGRlbGl2ZXJlZCB0by4KCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcwogICAgZGVzdGluZWQgdG8gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIG9yIEJBTCdzIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnVmZmVyIHJlY2VpdmVkLAogICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUgcGFja2V0IHRoZXkgd2lsbCBiZSBjaGFpbmVkCiAgICAgICAgICAgICAgICAgICAgdXNpbmcgdk9TUyBidWZmZXJzLgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIElucHV0IHBhcmFtZXRlcnMgYXJlIGludmFsaWQKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUnhGcmFtZXMKKAogIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCAgICAgKnBGcmFtZURhdGFCdWZmCikKewogIHZvc19wa3RfdCogICAgICAgICAgdm9zRGF0YUJ1ZmYgPSAodm9zX3BrdF90KilwRnJhbWVEYXRhQnVmZjsKICBXTEFOVExfQ2JUeXBlKiAgICAgIHBUTENiID0gTlVMTDsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQ7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y0ZybVR5cGU7CiAgdl9QVk9JRF90ICAgICAgICAgICBwdkJESGVhZGVyID0gTlVMTDsKICBXTEFOVExfU1RBRXZlbnRUeXBlIHdTVEFFdmVudCAgPSBXTEFOVExfUlhfRVZFTlQ7CiAgdl9VOF90ICAgICAgICAgICAgICB1Y1RpZCAgICAgID0gMDsKICB2X0JPT0xfdCAgICAgICAgICAgIGJyb2FkY2FzdCAgPSBWT1NfRkFMU0U7CiAgdl9CT09MX3QgICAgICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsKICBzdGF0aWMgdl9VOF90ICAgICAgIGZpcnN0X2RhdGFfcGt0X2Fycml2ZWQ7CiAgdl9VMzJfdCAgICAgICAgICAgICB1RFBVU2lnOyAKICB2X1UxNl90ICAgICAgICAgICAgIHVzUGt0TGVuOwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFNfSU5URVJOQUwgCiAgdl9VOF90ICAgICAgICAgICAgICB1Y01QRFVITGVuID0gMCA7CiAgdl9VMTZfdCAgICAgICAgICAgICB1c0V0aGVyVHlwZSA9IDA7CiNlbmRpZgogIHZfQk9PTF90ICAgICAgICAgICAgYkZvcndhcmRJQVBQd2l0aExMQyA9IFZPU19GQUxTRTsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpUTCBSZWNlaXZlIEZyYW1lcyBjYWxsZWQiKSk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHZvc0RhdGFCdWZmICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX1J4RnJhbWVzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgUG9wb2xhdXRlIHRpbWVzdGFtcCBhcyB0aGUgdGltZSB3aGVuIHBhY2tldCBhcnJpdmVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgdm9zRGF0YUJ1ZmYtPnRpbWVzdGFtcCA9IHZvc190aW1lcl9nZXRfc3lzdGVtX3RpY2tzKCk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9DaGFuZ2VTVEFTdGF0ZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSB0aGUgaW5pdGlhbCBidWZmZXIgLSB0aGlzIGlzIHRoZSBmaXJzdCByZWNlaXZlZCBidWZmZXIKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwoKICB3aGlsZSAoIE5VTEwgIT0gdm9zVGVtcEJ1ZmYgKQogIHsKICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKICAgIHNlbGZCY2FzdExvb3BiYWNrID0gVk9TX0ZBTFNFOyAKCiAgICB2b3NfcGt0X3dhbGtfcGFja2V0X2NoYWluKCB2b3NEYXRhQnVmZiwgJnZvc0RhdGFCdWZmLCAxLyp0cnVlKi8gKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBQZWVrIGF0IEJEIGhlYWRlciAtIGRvIG5vdCByZW1vdmUKICAgICAgISEhIE9wdGltaXplIG1lOiBvbmx5IHBhcnQgb2YgaGVhZGVyIGlzIG5lZWRlZDsgbm90IGVudGlyZSBvbmUKICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdm9zU3RhdHVzID0gV0RBX0RTX1BlZWtSeFBhY2tldEluZm8oIHZvc1RlbXBCdWZmLCAodl9QVk9JRF90KSZwdkJESGVhZGVyLCAxLypTd2FwIEJEKi8gKTsKCiAgICBpZiAoIE5VTEwgPT0gcHZCREhlYWRlciApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBCRCBoZWFkZXIiKSk7CiAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENoZWNrIGlmIEZDIGZyYW1lIHJlcG9ydGVkIGZyb20gRlcKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZihXREFfSVNfUlhfRkMocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6cmVjZWl2ZSBvbmUgRkMgZnJhbWUiKSk7CgogICAgICBXTEFOVExfUHJvY2Vzc0ZDRnJhbWUocHZvc0dDdHgsIHZvc1RlbXBCdWZmLCBwdkJESGVhZGVyKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLyogQU1TRFUgSFcgYnVnIGZpeAogICAgICogQWZ0ZXIgMm5kIEFNU0RVIHN1YmZyYW1lIEhXIGNvdWxkIG5vdCBoYW5kbGUgQkQgY29ycmVjdGx5CiAgICAgKiBIQUwgd29ya2Fyb3VuZCBpcyBuZWVkZWQgKi8KICAgIGlmKFdEQV9HRVRfUlhfQVNGKHB2QkRIZWFkZXIpKQogICAgewogICAgICBXREFfRFNfUnhBbXNkdUJkRml4KHB2b3NHQ3R4LCBwdkJESGVhZGVyKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBFeHRyYWN0IGZyYW1lIGNvbnRyb2wgZmllbGQgZnJvbSA4MDIuMTEgaGVhZGVyIGlmIHByZXNlbnQgCiAgICAgIChmcmFtZSB0cmFuc2xhdGlvbiBub3QgZG9uZSkgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc1N0YXR1cyA9IFdEQV9EU19HZXRGcmFtZVR5cGVTdWJUeXBlKCBwdm9zR0N0eCwgdm9zVGVtcEJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICBwdkJESGVhZGVyLCAmdWNGcm1UeXBlICk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpDYW5ub3QgZXh0cmFjdCBGcmFtZSBDb250cm9sIEZpZWxkIikpOwogICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICBjb250aW51ZTsKICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgaWYgKCBXTEFOVExfSVNfREFUQV9GUkFNRSh1Y0ZybVR5cGUpKQogICAgewogICAgICAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4ocHZCREhlYWRlcik7CiAgICAgICBXTEFOVExfR2V0RXRoZXJUeXBlXzIocHZCREhlYWRlciwgdm9zVGVtcEJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSkgOwogICAgfQojZW5kaWYKICAgIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgodm9zVGVtcEJ1ZmYsICZ1c1BrdExlbik7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgbWFuYWdlbWVudCBhbmQgc2VuZCB0byBQRQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoIFdMQU5UTF9JU19NR01UX0ZSQU1FKHVjRnJtVHlwZSkgCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMU19JTlRFUk5BTAogICAgICAgIHx8IChXTEFOVExfSVNfVERMU19GUkFNRSh1c0V0aGVyVHlwZSkpIAojZW5kaWYKICAgICAgICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIHBhY2tldCB0byBtYW5hZ2VtZW50IGNsaWVudCIpKTsKICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdWNTVEFJZCA9ICh2X1U4X3QpV0RBX0dFVF9SWF9TVEFJRCggcHZCREhlYWRlciApOwogICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICBpZighV0xBTlRMX1NUQV9JRF9JTlZBTElEKHVjU1RBSWQpKQogICAgICB7CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgLyogUmVhZCBSU1NJIGFuZCB1cGRhdGUgKi8KICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfSFNIYW5kbGVSWEZyYW1lKHB2b3NHQ3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01HTVRfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9TX0ZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiNlbHNlCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRSU1NJKHB2b3NHQ3R4LCBwdkJESGVhZGVyLCB1Y1NUQUlkKTsKI2VuZGlmCiAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR1coVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFuZGxlIFJYIE1hbmFnZW1lbnQgRnJhbWUgZmFpbCB3aXRoaW4gSGFuZG9mZiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IG1vZHVsZSIpKTsKICAgICAgICAgIC8qIERvIE5vdCBEcm9wIHBhY2tldCBhdCBoZXJlCiAgICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICAgICAqICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAqICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAqICAgY29udGludWU7CiAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRTTlIocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiRmFpbGVkIHRvIFJlYWQgU05SIikpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBUTENiLT50bE1nbXRGcm1DbGllbnQucGZuVGxNZ210RnJtUngoIHB2b3NHQ3R4LCB2b3NUZW1wQnVmZik7IAogICAgfQogICAgZWxzZSAvKiBEYXRhIEZyYW1lICovCiAgICB7CiAgICAgIHVjU1RBSWQgPSAodl9VOF90KVdEQV9HRVRfUlhfU1RBSUQoIHB2QkRIZWFkZXIgKTsKICAgICAgdWNUaWQgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9USUQoIHB2QkRIZWFkZXIgKTsKCiAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6RGF0YSBwYWNrZXQgcmVjZWl2ZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpKTsKCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkIHdoZW4gbXVsdGlwZSBzdGEgc3VwcG9ydCBpcyBhZGRlZCAhISEKICAgICAgICBmb3Igbm93IGJjYXN0IGZyYW1lcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGxhc3QgcmVnaXN0ZXJlZCBTVEEKICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggV0RBX0lTX1JYX0JDQVNUKHB2QkRIZWFkZXIpKQogICAgICB7CiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpUTCByeCBCY2FzdCBmcmFtZSAtIHNlbmRpbmcgdG8gbGFzdCByZWdpc3RlcmVkIHN0YXRpb24iKSk7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX1RSVUU7CiAgICAgICAgCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBJZiBBZGRyMSBpcyBiL21jYXN0LCBidXQgQWRkcjMgaXMgb3VyIG93biBzZWxmIE1BQywgaXQgaXMgYSBiL21jYXN0CiAgICAgICAgICBwa3Qgd2Ugc2VudCAgbG9vcGluZyBiYWNrIHRvIHVzLiBUbyBiZSBkcm9wcGVkIGlmIHdlIGFyZSBub24gQlRBTVAgIAogICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gCiAgICAgICAgaWYoIFdMQU5IQUxfUlhfQkRfQUREUjNfU0VMRl9JRFggPT0gCiAgICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgICAgewogICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfVFJVRTsgCiAgICAgICAgfQogICAgICB9LyppZiBiY2FzdCovCgogICAgICBpZiAoIFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSApCiAgICAgIHsKICAgICAgICBUTExPR1coVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBJRCBpbnZhbGlkIC0gZHJvcHBpbmcgcGt0IikpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBObyBuZWVkIHRvIGxvY2sgY2FjaGUgYWNjZXNzIGJlY2F1c2UgY2FjaGUgbWFuaXB1bGF0aW9uIG9ubHkgaGFwcGVucwogICAgICAgIGluIHRoZSB0cmFuc3BvcnQgdGhyZWFkL3Rhc2sgY29udGV4dAogICAgICAgIC0gVGhlc2UgZnJhbWVzIGFyZSB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIHN0YXRpb24gdXBvbiByZWdpc3RyYXRpb24KICAgICAgICAgIHdoaWNoIGhhcHBlbnMgaW4gdGhlIG1haW4gdGhyZWFkIGNvbnRleHQKICAgICAgICAgIFRoZSBjYWNoaW5nIGhlcmUgY2FuIGhhcHBlbiBpbiBlaXRoZXIgVHggb3IgUnggdGhyZWFkIGRlcGVuZGluZwogICAgICAgICAgb24gdGhlIGN1cnJlbnQgU1NDIHNjaGVkdWxpbmcKICAgICAgICAtIGFsc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWVzIGluIHRoZSBjYWNoZSBhcmUgZndkLWVkIHRvCiAgICAgICAgICB0aGUgc3RhdGlvbiBiZWZvcmUgdGhlIG5ldyBpbmNvbWluZyBvbmVzIAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKICAgICAgaWYgKE5VTEwgPT0gcENsaWVudFNUQSkKICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpTVEEgbm90IGFsbG9jYXRlZCBtZW1vcnkuIERyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoKCBwQ2xpZW50U1RBLT51Y0V4aXN0cyApICYmCiAgICAgICAgICAgKFdMQU5fU1RBX1RETFMgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICAgICAgKHBDbGllbnRTVEEtPnVjVHhTdXNwZW5kZWQpKQogICAgICAgICAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1R4U3VzcGVuZGVkLCAwICk7CiAgICAgIGVsc2UgaWYgKCAhYnJvYWRjYXN0ICYmIChwQ2xpZW50U1RBLT51Y0V4aXN0cyA9PSAwICkgKQogICAgICB7CiAgICAgICAgICB0cFNpck1hY01nbXRIZHIgcE1hY0hlYWRlciA9IFdEQV9HRVRfUlhfTUFDX0hFQURFUiggcHZCREhlYWRlciApOwoKICAgICAgICAgIC8qIGZyb20gdGhlIGRpcmVjdCBwZWVyIHdoaWxlIGl0IGlzIG5vdCByZWdpc3RlcmVkIHRvIFRMIHlldCAqLwogICAgICAgICAgaWYgKCAocE1hY0hlYWRlci0+ZmMuZnJvbURTID09IDApICYmCiAgICAgICAgICAgICAgIChwTWFjSGVhZGVyLT5mYy50b0RTID09IDApICkKICAgICAgICAgIHsKICAgICAgICAgICAgICB2X1U4X3QgdWNBZGRyM1NUQUlkOwoKICAgICAgICAgICAgICB1Y0FkZHIzU1RBSWQgPSBXREFfR0VUX1JYX0FERFIzX0lEWChwdkJESGVhZGVyKTsKCiAgICAgICAgICAgICAgaWYgKCBXTEFOVExfU1RBX0lEX0lOVkFMSUQodWNBZGRyM1NUQUlkKSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOlNUQSBJRCAlZCBpbnZhbGlkIC0gZHJvcHBpbmcgcGt0IiwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICghKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNBZGRyM1NUQUlkXS0+dWNFeGlzdHMgJiYKICAgICAgICAgICAgICAgICAgKFdMQU5fU1RBX0lORlJBID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPndTVEFEZXNjLndTVEFUeXBlKSAmJgogICAgICAgICAgICAgICAgICAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGFkZHIzSWQgJWQgdGxTdGF0ZSAlZC4gVW5rb3duIFJlY2VpdmVyL1RyYW5zbWl0dGVyIERyb3BwaW5nIHBhY2tldCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLCB1Y0FkZHIzU1RBSWQsIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjQWRkcjNTVEFJZF0tPnRsU3RhdGUpKTsKICAgICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHN0YUlkICVkIGRvZXNuJ3QgZXhpc3QsIGJ1dCBtYXBwZWQgdG8gQVAgc3RhSWQgJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBZGRyM1NUQUlkKSk7CiAgICAgICAgICAgICAgICAgIHVjU1RBSWQgPSB1Y0FkZHIzU1RBSWQ7CiAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0FkZHIzU1RBSWRdOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQojZW5kaWYKCiAgICAgIGlmICgoKCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzICkgfHwKICAgICAgICAgICggKDAgIT0gcENsaWVudFNUQS0+dWNSeEJsb2NrZWQpCiAgICAgICAgICAgIC8vL0BAQDogeGc6IG5vIGNoZWNraW5nIGluIFNPRlRBUCBmb3Igbm93LCB3aWxsIHJldmlzaXQgbGF0ZXIKICAgICAgICAgICAgJiYgKFdMQU5fU1RBX1NPRlRBUCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgICAgICAgICkgfHwKICAgICAgICAgICggV0xBTlRMX1NUQV9ESVNDT05ORUNURUQgPT0gcENsaWVudFNUQS0+dGxTdGF0ZSkpICYmCiAgICAgICAgICAgIC8qRG9udCBidWZmZXIgQnJvYWRjYXN0L011bHRpY2FzdCBmcmFtZXMuIElmIEFQIHRyYW5zbWl0cyBidXJzdHMgb2YgQnJvYWRjYXN0L011bHRpY2FzdCBkYXRhIGZyYW1lcywgCiAgICAgICAgICAgICAqIGxpYnJhIGJ1ZmZlcnMgYWxsIEJyb2FkY2FzdC9NdWx0aWNhc3QgcGFja2V0cyBhZnRlciBhdXRoZW50aWNhdGlvbiB3aXRoIEFQLCAKICAgICAgICAgICAgICogU28gaXQgd2lsbCBsZWFkIHRvIGxvdyByZXNvdXJjZSBjb25kaXRpb24gaW4gUnggRGF0YSBQYXRoLiovCiAgICAgICAgICAoKFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSA9PSAwKSkpCiAgICAgIHsKICAgICAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKICAgICAgICAgIC8vU3RhdGlvbiBoYXMgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgd2l0aCBUTCAtIGNhY2hlIHRoZSBmcmFtZQogICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICIlczogc3RhSWQgJWQgZXhpc3QgJWQgdGxTdGF0ZSAlZCBjYWNoZSByeCBmcmFtZSIsIF9fZnVuY19fLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjRXhpc3RzLCBwQ2xpZW50U1RBLT50bFN0YXRlKSk7CiAgICAgICAgV0xBTlRMX0NhY2hlU1RBRnJhbWUoIHBUTENiLCB1Y1NUQUlkLCB2b3NUZW1wQnVmZiwgdURQVVNpZywgYnJvYWRjYXN0LCB1Y0ZybVR5cGUpOwogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYX1VQTE9BRAogICAgICBpZiAoKHBDbGllbnRTVEEtPndTVEFEZXNjLnVjSXNDY3hTdGEpfHwgYnJvYWRjYXN0KQogICAgICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsdGVyIHRoZSBJQVBQIGZyYW1lcyBmb3IgQ0NYIGNvbm5lY3Rpb247CiAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdAogICAgICAgICAgd2lsbCBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcmVndWxhciBkYXRhIHBhdGgKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKCBXTEFOVExfSXNJQVBQRnJhbWUocHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZikpCiAgICAgICAgewogICAgICAgICAgICBiRm9yd2FyZElBUFB3aXRoTExDID0gVk9TX1RSVUU7CiAgICAgICAgfQogICAgICB9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVFVSRV9XTEFOX0NDWCkgJiYgIWRlZmluZWQoRkVBVFVSRV9XTEFOX0NDWF9VUExPQUQpCiAgICAgIGlmICgocENsaWVudFNUQS0+d1NUQURlc2MudWNJc0NjeFN0YSl8fCBicm9hZGNhc3QpCiAgICAgIHsKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBGaWx0ZXIgdGhlIElBUFAgZnJhbWVzIGZvciBDQ1ggY29ubmVjdGlvbjsgCiAgICAgICAgICBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX0lzSUFQUEZyYW1lKHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zX3BrdF9mbGF0dGVuX3J4X3BrdCgmdm9zVGVtcEJ1ZmYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGZsYXR0ZW4gcGFja2V0IC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFJlY2VpdmVkIENDWCBJQVBQIEZyYW1lIikpOwoKICAgICAgICAgICAgICAgcFRMQ2ItPnRsTWdtdEZybUNsaWVudC5wZm5UbE1nbXRGcm1SeCggcHZvc0dDdHgsIHZvc1RlbXBCdWZmKTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiNlbmRpZiAgLyogZGVmaW5lZChGRUFUVVJFX1dMQU5fQ0NYKSAmJiAhZGVmaW5lZChGRUFUVVJFX1dMQU5fQ0NYX1VQTE9BRCkgKi8KCiAgICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgICAgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICAgIHdpbGwgYmUgcm91dGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgZGF0YSBwYXRoCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvc1RlbXBCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNTVEFJZCkpCiAgICAgICAgewogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfS8qaWYgQlQtQU1QIHN0YXRpb24qLwogICAgICBlbHNlIGlmKHNlbGZCY2FzdExvb3BiYWNrID09IFZPU19UUlVFKQogICAgICB7IAogICAgICAgIC8qIERyb3AgcGFja2V0ICovIAogICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7IAogICAgICAgIGNvbnRpbnVlOyAKICAgICAgfSAKICAgICAgCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRGF0YSBwYWNrZXQgcmVjZWl2ZWQsIHNlbmQgdG8gc3RhdGUgbWFjaGluZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3U1RBRXZlbnQgPSBXTEFOVExfUlhfRVZFTlQ7CgogICAgICBwZm5TVEFGc20gPSB0bFNUQUZzbVtwQ2xpZW50U1RBLT50bFN0YXRlXS4KICAgICAgICAgICAgICAgICAgICAgIHBmblNUQVRibFt3U1RBRXZlbnRdOwoKICAgICAgaWYgKCBOVUxMICE9IHBmblNUQUZzbSApCiAgICAgIHsKI2lmIGRlZmluZWQgV0xBTl9GRUFUVVJFX05FSUdIQk9SX1JPQU1JTkcKICAgICAgICAvKiBSZWFkIFJTU0kgYW5kIHVwZGF0ZSAqLwogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9IU0hhbmRsZVJYRnJhbWUocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfREFUQV9GUkFNRV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZik7CiAgICAgICAgYnJvYWRjYXN0ID0gVk9TX0ZBTFNFOwojZWxzZQogICAgICAgIHZvc1N0YXR1cyA9IFdMQU5UTF9SZWFkUlNTSShwdm9zR0N0eCwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZiAvKkZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcqLwogICAgICAgIGlmICghVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJIYW5kbGUgUlggRGF0YSBGcmFtZSBmYWlsIHdpdGhpbiBIYW5kb2ZmIHN1cHBvcnQgbW9kdWxlIikpOwogICAgICAgICAgLyogRG8gTm90IERyb3AgcGFja2V0IGF0IGhlcmUgCiAgICAgICAgICAgKiBSZXZpc2l0IHdoeSBITyBtb2R1bGUgcmV0dXJuIGZhaWwKICAgICAgICAgICAqIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICAgKiB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgICogY29udGludWU7CiAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1JlYWRTTlIocHZvc0dDdHgsIHB2QkRIZWFkZXIsIHVjU1RBSWQpOwoKICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgIHsKICAgICAgICAgIFRMTE9HVyhWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJGYWlsZWQgdG8gUmVhZCBTTlIiKSkpOwogICAgICAgIH0KCiAgICAgICAgcGZuU1RBRnNtKCBwdm9zR0N0eCwgdWNTVEFJZCwgJnZvc1RlbXBCdWZmLCBiRm9yd2FyZElBUFB3aXRoTExDKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgfS8qIGVsc2UgZGF0YSBmcmFtZSovCgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhGcmFtZXMgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9SeENhY2hlZEZyYW1lcwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IFRMIHRvIGZvcndhcmQgdGhlIGNhY2hlZCBmcmFtZXMgdG8gYSBwYXJ0aWN1bGFyCiAgICBzdGF0aW9uOyAKCiAgREVQRU5ERU5DSUVTCiAgICBUTCBtdXN0IGJlIGluaXRpYWlsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KICAgIElmIHRoZSBmcmFtZSBjYXJyaWVkIGlzIGEgZGF0YSBmcmFtZSB0aGVuIHRoZSBzdGF0aW9uIGZvciB3aGljaCBpdCBpcwogICAgZGVzdGluZWQgdG8gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggVEwuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcFRMQ2I6ICAgcG9pbnRlciB0byBUTCBoYW5kbGUgCiAgIAogICAgdWNTVEFJZDogICAgc3RhdGlvbiBmb3Igd2hpY2ggd2UgbmVlZCB0byBmb3J3YXJkIHRoZSBwYWNrZXRzCgogICAgdm9zRGF0YUJ1ZmY6ICAgaXQgd2lsbCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2FjaGVkIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQsIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUgcGFja2V0IHRoZXkgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgY2hhaW5lZCB1c2luZyB2T1NTIGJ1ZmZlcnMuCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcGFyYW1ldGVycyBhcmUgaW52YWxpZAogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9SeENhY2hlZEZyYW1lcwooCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZgopCnsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgV0xBTlRMX1NUQUZ1bmNUeXBlICBwZm5TVEFGc207CiAgdm9zX3BrdF90KiAgICAgICAgICB2b3NUZW1wQnVmZjsKICBWT1NfU1RBVFVTICAgICAgICAgIHZvc1N0YXR1czsKICB2X1BWT0lEX3QgICAgICAgICAgIHB2QkRIZWFkZXIgPSBOVUxMOwogIFdMQU5UTF9TVEFFdmVudFR5cGUgd1NUQUV2ZW50ICA9IFdMQU5UTF9SWF9FVkVOVDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjVGlkICAgICAgPSAwOwogIHZfQk9PTF90ICAgICAgICAgICAgYnJvYWRjYXN0ICA9IFZPU19GQUxTRTsKICB2X0JPT0xfdCAgICAgICAgICAgIGJTaWdNYXRjaCAgPSBWT1NfRkFMU0U7IAogIHZfQk9PTF90ICAgICAgICAgICAgc2VsZkJjYXN0TG9vcGJhY2sgPSBWT1NfRkFMU0U7CiAgc3RhdGljIHZfVThfdCAgICAgICBmaXJzdF9kYXRhX3BrdF9hcnJpdmVkOwogIHZfVTMyX3QgICAgICAgICAgICAgdURQVVNpZzsgCiAgdl9VOF90ICAgICAgICAgICAgICB1Y1VjYXN0U2lnOyAKICB2X1U4X3QgICAgICAgICAgICAgIHVjQmNhc3RTaWc7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6VEwgUmVjZWl2ZSBDYWNoZWQgRnJhbWVzIGNhbGxlZCIpKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUnhGcmFtZXMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhdmUgdGhlIGluaXRpYWwgYnVmZmVyIC0gdGhpcyBpcyB0aGUgZmlyc3QgcmVjZWl2ZWQgYnVmZmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKCiAgd2hpbGUgKCBOVUxMICE9IHZvc1RlbXBCdWZmICkKICB7CiAgICBicm9hZGNhc3QgPSBWT1NfRkFMU0U7CiAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19GQUxTRTsgCgogICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NEYXRhQnVmZiwgMS8qdHJ1ZSovICk7CgogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6U2VuZGluZyBuZXcgY2FjaGVkIHBhY2tldCB0byBzdGF0aW9uICVkIiwgdWNTVEFJZCkpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgUGVlayBhdCBCRCBoZWFkZXIgLSBkbyBub3QgcmVtb3ZlCiAgICAgICEhISBPcHRpbWl6ZSBtZTogb25seSBwYXJ0IG9mIGhlYWRlciBpcyBuZWVkZWQ7IG5vdCBlbnRpcmUgb25lCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NUZW1wQnVmZiwgKHZfUFZPSURfdCkmcHZCREhlYWRlciwgMCApOwoKICAgIGlmICggTlVMTCA9PSBwdkJESGVhZGVyICkKICAgICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOkNhbm5vdCBleHRyYWN0IEJEIGhlYWRlciIpKTsKICAgICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zVGVtcEJ1ZmYpOwogICAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICB1RFBVU2lnID0gV0RBX0dFVF9SWF9EUFVTSUcoIHB2QkRIZWFkZXIgKTsKCiAgICAvKiBBTVNEVSBIVyBidWcgZml4CiAgICAgKiBBZnRlciAybmQgQU1TRFUgc3ViZnJhbWUgSFcgY291bGQgbm90IGhhbmRsZSBCRCBjb3JyZWN0bHkKICAgICAqIEhBTCB3b3JrYXJvdW5kIGlzIG5lZWRlZCAqLwogICAgaWYoV0RBX0dFVF9SWF9BU0YocHZCREhlYWRlcikpCiAgICB7CiAgICAgIFdEQV9EU19SeEFtc2R1QmRGaXgodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIpOwogICAgfQoKICAgIHVjVGlkICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKCBwdkJESGVhZGVyICk7CgogICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpEYXRhIHBhY2tldCBjYWNoZWQgZm9yIFNUQSAlZCIsIHVjU1RBSWQpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIFRoaXMgc2hvdWxkIGJlIGNvcnJlY3RlZCB3aGVuIG11bHRpcGUgc3RhIHN1cHBvcnQgaXMgYWRkZWQgISEhCiAgICAgIGZvciBub3cgYmNhc3QgZnJhbWVzIHdpbGwgYmUgc2VudCB0byB0aGUgbGFzdCByZWdpc3RlcmVkIFNUQQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoIFdEQV9JU19SWF9CQ0FTVChwdkJESGVhZGVyKSkKICAgIHsKICAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6VEwgcnggQmNhc3QgZnJhbWUgIikpOwogICAgICBicm9hZGNhc3QgPSBWT1NfVFJVRTsKCiAgICAgIC8qIElmIEFkZHIxIGlzIGIvbWNhc3QsIGJ1dCBBZGRyMyBpcyBvdXIgb3duIHNlbGYgTUFDLCBpdCBpcyBhIGIvbWNhc3QgCiAgICAgICAqIHBrdCB3ZSBzZW50IGxvb3BpbmcgYmFjayB0byB1cy4gVG8gYmUgZHJvcHBlZCBpZiB3ZSBhcmUgbm9uIEJUQU1QICAKICAgICAgICovIAogICAgICBpZiggV0xBTkhBTF9SWF9CRF9BRERSM19TRUxGX0lEWCA9PSAKICAgICAgICAgICh2X1U4X3QpV0RBX0dFVF9SWF9BRERSM19JRFgoIHB2QkRIZWFkZXIgKSkgCiAgICAgIHsKICAgICAgICBzZWxmQmNhc3RMb29wYmFjayA9IFZPU19UUlVFOyAKICAgICAgfQogICAgfS8qaWYgYmNhc3QqLwoKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgdGhlIHBhY2tldCB0aGF0IHdlIGNhY2hlZCBtYXRjaGVzIHRoZSBEUFUgc2lnbmF0dXJlIG9mIHRoZQogICAgICBuZXdseSBhZGRlZCBzdGF0aW9uIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgoKICAgIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAoIGJyb2FkY2FzdCApCiAgICB7CiAgICAgIHVjQmNhc3RTaWcgPSAodl9VOF90KXVEUFVTaWc7CiAgICAgIGJTaWdNYXRjaCA9ICgoIFdMQU5fVExfSU5WQUxJRF9CX1NJRyAhPSAKICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnICkgJiYKICAgICAgICAoIHVjQmNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNCY2FzdFNpZyApKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgdWNVY2FzdFNpZyA9ICh2X1U4X3QpdURQVVNpZzsKICAgICAgYlNpZ01hdGNoID0gKCggV0xBTl9UTF9JTlZBTElEX1VfU0lHICE9IAogICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApICYmCiAgICAgICAgICAoIHVjVWNhc3RTaWcgPT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZyApKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgSWYgdGhlIHBhY2tldCBkb2Vzbid0IG1hdGNoIC0gZHJvcCBpdCAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKCAhYlNpZ01hdGNoICkKICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTUVELAogICAgICAgICJXTEFOIFRMOiBDYWNoZWQgcGFja2V0IGRvZXMgbm90IG1hdGNoIERQVSBTaWcgb2YgdGhlIG5ldyBTVEEgLSBkcm9wICIKICAgICAgICAiIERQVSBTaWcgJWQgIFVDICVkIEJDICVkIEIgJWQiLAogICAgICAgIHVEUFVTaWcsCiAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNVY2FzdFNpZywKICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0JjYXN0U2lnLAogICAgICAgIGJyb2FkY2FzdCkpOwoKICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NUZW1wQnVmZik7IAogICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOyAKICAgICAgY29udGludWU7IAoKICAgIH0vKmlmIHNpZ25hdHVyZSBtaXNtYXRjaCovCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgQ2hlY2sgaWYgQlQtQU1QIGZyYW1lOgogICAgICAtIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBuZWVkZWQgaW4gdGhpcyBjYXNlIHRvIHNlcGFyYXRlIEJULUFNUCBkYXRlCiAgICAgICAgZnJvbSBCVC1BTVAgQ3RybCBwYXRoIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggV0xBTl9TVEFfQlRfQU1QID09IHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlICkKICAgIHsKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIFByb2Nlc3MgdGhlIGN0cmwgQkFQIGZyYW1lOyBpZiBkYXRhIGl0IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCBpdCAKICAgICAgICB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIHRoZSByZWd1bGFyIGRhdGEgcGF0aAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGlmICggV0xBTlRMX1Byb2Nlc3NCQVBGcmFtZSggcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3NUZW1wQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdF9kYXRhX3BrdF9hcnJpdmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjU1RBSWQpKQogICAgICB7CiAgICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9LyppZiBCVC1BTVAgc3RhdGlvbiovCiAgICAgIGVsc2UgaWYoc2VsZkJjYXN0TG9vcGJhY2sgPT0gVk9TX1RSVUUpCiAgICAgIHsgCiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8gCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsgCiAgICAgICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsgCiAgICAgICAgY29udGludWU7IAogICAgICB9IAogICAgICAKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBEYXRhIHBhY2tldCByZWNlaXZlZCwgc2VuZCB0byBzdGF0ZSBtYWNoaW5lCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHdTVEFFdmVudCA9IFdMQU5UTF9SWF9FVkVOVDsKCiAgICAgIHBmblNUQUZzbSA9IHRsU1RBRnNtW3BDbGllbnRTVEEtPnRsU3RhdGVdLgogICAgICAgICAgICAgICAgICAgICAgcGZuU1RBVGJsW3dTVEFFdmVudF07CgogICAgICBpZiAoIE5VTEwgIT0gcGZuU1RBRnNtICkKICAgICAgewojaWYgZGVmaW5lZCBXTEFOX0ZFQVRVUkVfTkVJR0hCT1JfUk9BTUlORwogICAgICAgIC8qIFJlYWQgUlNTSSBhbmQgdXBkYXRlICovCiAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX0hTSGFuZGxlUlhGcmFtZSh2b3NfZ2V0X2dsb2JhbF9jb250ZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NT0RVTEVfSURfVEwscFRMQ2IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX0RBVEFfRlJBTUVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2QkRIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9zVGVtcEJ1ZmYpOwogICAgICAgIGJyb2FkY2FzdCA9IFZPU19GQUxTRTsKI2Vsc2UKICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfUmVhZFJTU0kodm9zX2dldF9nbG9iYWxfY29udGV4dChWT1NfTU9EVUxFX0lEX1RMLHBUTENiKSwgcHZCREhlYWRlciwgdWNTVEFJZCk7CiNlbmRpZiAvKkZFQVRVUkVfV0xBTl9HRU42X1JPQU1JTkcqLwogICAgICAgIGlmKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIkhhbmRsZSBSWCBEYXRhIEZyYW1lIGZhaWwgd2l0aGluIEhhbmRvZmYgc3VwcG9ydCBtb2R1bGUiKSk7CiAgICAgICAgICAvKiBEbyBOb3QgRHJvcCBwYWNrZXQgYXQgaGVyZSAKICAgICAgICAgICAqIFJldmlzaXQgd2h5IEhPIG1vZHVsZSByZXR1cm4gZmFpbAogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICAgIHZvc1RlbXBCdWZmID0gdm9zRGF0YUJ1ZmY7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBwZm5TVEFGc20oIHZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9UTCxwVExDYiksIHVjU1RBSWQsIAogICAgICAgICAgICAgICAgICZ2b3NUZW1wQnVmZiwgVk9TX0ZBTFNFKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOk5VTEwgc3RhdGUgZnVuY3Rpb24sIFNUQTolZCwgU3RhdGU6ICVkLSBkcm9wcGluZyBwYWNrZXQiLAogICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dGxTdGF0ZSkpOwogICAgICAgIC8qIERyb3AgcGFja2V0ICovCiAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc1RlbXBCdWZmKTsKICAgICAgICB2b3NUZW1wQnVmZiA9IHZvc0RhdGFCdWZmOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgdm9zVGVtcEJ1ZmYgPSB2b3NEYXRhQnVmZjsKICB9Lyp3aGlsZSBjaGFpbiovCgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfUnhDYWNoZWRGcmFtZXMgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfUmVzb3VyY2VDQgoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBUTCB3aGVuIGl0IGhhcyBwYWNrZXRzIGF2YWlsYWJsZSBmb3IgdHJhbnNtaXNzaW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBCQUwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgQkFMJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfUmVzb3VyY2VDQgooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4LAogIHZfVTMyX3QgICAgICAgICB1Q291bnQKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBUTENiLT51UmVzQ291bnQgPSB1Q291bnQ7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXN1bWUgVHggaWYgZW5vdWdoIHJlcyBhbmQgbm90IHN1c3BlbmRlZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX01GICkgJiYKICAgICAgKCAwID09IHBUTENiLT51Y1R4U3VzcGVuZGVkICkpCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6SXNzdWluZyBYbWl0IHN0YXJ0IHJlcXVlc3QgdG8gQkFMIGZvciBhdmFpbCByZXMgQVNZTkMiKSk7CiAgICByZXR1cm4gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1Jlc291cmNlQ0IgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfSXNUeFhtaXRQZW5kaW5nCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgdGhlIFdEQSB3aGVuIGl0IHdhbnRzIHRvIGtub3cgd2hldGhlciBXREFfRFNfVFhfU1RBUlRfWE1JVCBtc2cKICAgIGlzIHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBXREEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgb3IgV0RBJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIDA6ICAgTm8gV0RBX0RTX1RYX1NUQVJUX1hNSVQgbXNnIHBlbmRpbmcgCiAgICAxOiAgIE1zZyBXREFfRFNfVFhfU1RBUlRfWE1JVCBhbHJlYWR5IHBlbmRpbmcgaW4gVEwgbXNnIHF1ZXVlIAoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwp2X0JPT0xfdApXTEFOVExfSXNUeFhtaXRQZW5kaW5nCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CgogICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IGluIFdMQU5UTF9Jc1R4WG1pdFBlbmRpbmcgIikpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgcmV0dXJuIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmc7Cgp9LypXTEFOVExfSXNUeFhtaXRQZW5kaW5nICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICBXTEFOVExfU2V0VHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBpbmRpY2F0ZSB0aGF0IFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfU2V0VHhYbWl0UGVuZGluZwooCiAgdl9QVk9JRF90ICAgICAgIHB2b3NHQ3R4CikKewoKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBpbiBXTEFOVExfU2V0VHhYbWl0UGVuZGluZyIpKTsKICAgIHJldHVybjsKICB9CgogIHBUTENiLT5pc1R4VHJhbm1pdE1zZ1BlbmRpbmcgPSAxOwogIHJldHVybjsKCn0vKldMQU5UTF9TZXRUeFhtaXRQZW5kaW5nICAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IHRoZSBXREEgd2hlbiBpdCB3YW50cyB0byBpbmRpY2F0ZSB0aGF0IG5vIFdEQV9EU19UWF9TVEFSVF9YTUlUIG1zZwogICAgaXMgcGVuZGluZyBpbiBUTCBtc2cgcXVldWUgCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIFdEQSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgICAgIE5vbmUKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZfVk9JRF90CldMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eAopCnsKCiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggaW4gV0xBTlRMX0NsZWFyVHhYbWl0UGVuZGluZyAiKSk7CiAgICByZXR1cm47CiAgfQoKICBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nID0gMDsKICByZXR1cm47Cn0vKldMQU5UTF9DbGVhclR4WG1pdFBlbmRpbmcgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9UeFRocmVhZERlYnVnSGFuZGxlcgoKICBERVNDUklQVElPTgogICAgUHJpbnRpbmcgVEwgU25hcHNob3QgZHVtcCwgcHJvY2Vzc2VkIHVuZGVyIFR4VGhyZWFkIGNvbnRleHQsIGN1cnJlbnRseQogICAgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBnbG9iYWwgVGxDYiBzdHJ1dHVyZS4gRHVtcHMgaW5mb3JtYXRpb24gcmVsYXRlZAogICAgdG8gcGVyIGFjdGl2ZSBTVEEgY29ubmVjdGlvbiBjdXJyZW50bHkgaW4gdXNlIGJ5IFRMLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGdldHMgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBvciBXREEncyBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAoKICBSRVRVUk4gVkFMVUUgICAgICBOb25lCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgp2X1ZPSURfdApXTEFOVExfVHhUaHJlYWREZWJ1Z0hhbmRsZXIKKAogdl9QVk9JRF90ICpwVm9zQ29udGV4dAopCnsKICAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIGludCBpID0gMDsKICAgdFdEQV9DYkNvbnRleHQgKnBXREEgPSBOVUxMOwoKICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICJXTEFOIFRMOiAlcyBFbnRlciAiLCBfX2Z1bmNfXykpOwoKICAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHBWb3NDb250ZXh0KTsKICAgcFdEQSA9ICh0V0RBX0NiQ29udGV4dCAqKXZvc19nZXRfZ2xvYmFsX2NvbnRleHQoVk9TX01PRFVMRV9JRF9XREEsIHBWb3NDb250ZXh0KTsKCiAgIGlmICggTlVMTCA9PSBwVm9zQ29udGV4dCB8fCBOVUxMID09IHBUTENiICkKICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIFZvUyBDb250ZXh0IG9yIFRMIENvbnRleHQgYXJlIE5VTEwiKSk7CiAgICAgICAgcmV0dXJuOwogICB9CgogICBpZiAoTlVMTCAhPSBwV0RBKQogICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldEQSB1VHhGbG93TWFzazogJWQiLCBwV0RBLT51VHhGbG93TWFzaykpOwogICB9CiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKlRMIERVTVAgSU5GT1JNQVRJT04qKioqKioqKioqKioqKiIpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgInVEZWxheWVkVHJpZ2dlckZybUludDolZFx0dU1pbkZyYW1lc1Byb2NUaHJlczolZCIsCiAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludCwKICAgICAgICAgIHBUTENiLT50bENvbmZpZ0luZm8udU1pbkZyYW1lc1Byb2NUaHJlcykpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiTWFuYWdlbWVudCBGcmFtZSBDbGllbnQgZXhpc3RzOiAlZCIsCiAgICAgICAgICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzKSk7CiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgInVzUGVuZGluZ1R4Q29tcGxldGVDb3VudDogJWRcdHVjVHhTdXNwZW5kZWQ6ICVkIiwKICAgICAgICAgIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQsCiAgICAgICAgICBwVExDYi0+dWNUeFN1c3BlbmRlZCkpOwoKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAidVJlc0NvdW50OiAlZCIsIHBUTENiLT51UmVzQ291bnQpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgInVjUmVnaXN0ZXJlZFN0YUlkOiAlZFx0dWNDdXJyZW50U1RBOiAlZCIsCiAgICAgICAgICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQsIHBUTENiLT51Y0N1cnJlbnRTVEEpKTsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIlVyZ2VudEZyYW1lUHJvY2Vzc2luZzogJXNcdHVGcmFtZXNQcm9jVGhyZXM6ICVkIiwKICAgICAgICAgIChwVExDYi0+YlVyZ2VudD8iVHJ1ZSI6IkZhbHNlIiksIHBUTENiLT51RnJhbWVzUHJvY1RocmVzKSk7CgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJpc1R4VHJhbm1pdE1zZ1BlbmRpbmc6ICVkXHQgaXNCTVBTOiAlcyIsCiAgICAgICAgICBwVExDYi0+aXNUeFRyYW5taXRNc2dQZW5kaW5nLCBwVExDYi0+aXNCTVBTPyJUcnVlIjoiRmFsc2UiKSk7CgojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiVERMUyBQZWVyIENvdW50OiAlZCIsIHBUTENiLT51Y1RkbHNQZWVyQ291bnQpKTsKI2VuZGlmCgogICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICIrKysrKysrKysrKysrKysrKysrK1JlZ2lzdGVyZCBDbGllbnQgSW5mb3JtYXRpb24rKysrKysrKysrIikpOwoKICAgZm9yICggaSA9MDsgaTxXTEFOX01BWF9TVEFfQ09VTlQ7IGkrKyApCiAgIHsKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbaV07CiAgICAgICAgaWYoIE5VTEwgPT0gcENsaWVudFNUQSB8fCAwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyNTVEEgSW5kZXg6ICVkICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiLGkpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU5fU1RBRGVzY1R5cGU6IikpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJTVEFJZDogJWRcdCBTVEEgTUFDIEFkZHJlc3M6ICVwTSIsIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU1RBSWQsCiAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MuYnl0ZXMpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiU1RBIFR5cGU6ICVkXHRQcm90ZWN0ZWRGcmFtZTogJWQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLndTVEFUeXBlLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Byb3RlY3RlZEZyYW1lKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJRb1M6ICVkXHRSeEZyYW1lVHJhbnM6ICVkXHRUeEZyYW1lVHJhbnM6ICVkIiwKICAgICAgICAgICAgICAgcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24sCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbikpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJ1Y1VjYXN0U2lnOiAlZFx0dWNCY2FzdFNpZzogJWQiLCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1VjYXN0U2lnLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQmNhc3RTaWcpKTsKCiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkNsaWVudEluZGV4OiAlZFx0IEV4aXN0czogJWQiLCBpLCBwQ2xpZW50U1RBLT51Y0V4aXN0cykpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJUTCBTdGF0ZTogJWRcdCBUTCBQcmlvcml0eTogJWQiLCBwQ2xpZW50U1RBLT50bFN0YXRlLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRsUHJpKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgInVjVHhTdXNwZW5kZWQ6ICVkXHR1Y1BrdFBlbmRpbmc6ICVkIiwgcENsaWVudFNUQS0+dWNUeFN1c3BlbmRlZCwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcpKTsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAidWNFQVBPTFBrdFBlbmRpbmc6ICVkXHR1Y05vTW9yZURhdGE6ICVkIiwKICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51Y0VhcG9sUGt0UGVuZGluZywgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJ1Y1J4QmxvY2tlZDogJWRcdCBmY1N0YVR4RGlzYWJsZWQ6ICVkIiwgcENsaWVudFNUQS0+dWNSeEJsb2NrZWQsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPmZjU3RhVHhEaXNhYmxlZCkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAidWNDdXJyZW50QUM6ICVkXHR1Y1NlcnZpY2VkQUM6ICVkIiwgcENsaWVudFNUQS0+dWNDdXJyZW50QUMsCiAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnVjU2VydmljZWRBQykpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJUSUQ6ICVkXHRhdXRUeENvdW50WzBdOiAlZFx0YXVSeENvdW50WzBdOiAlZCIsMCwgcENsaWVudFNUQS0+YXVUeENvdW50WzBdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1UnhDb3VudFswXSkpOwogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJhdWNBY01hc2tbMF06ICVkXHRhdWNBY01hc2tbMV06ICVkXHRhdWNBY01hc2tbMl06ICVkXHRhdWNBY01hc2tbM106ICVkXHQiLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1swXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzFdLAogICAgICAgICAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1syXSwgcENsaWVudFNUQS0+YXVjQUNNYXNrWzNdKSk7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJ1Y0N1cnJlbnRXZWlnaHQ6ICVkIiwgcENsaWVudFNUQS0+dWNDdXJyZW50V2VpZ2h0KSk7CgogICAgICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIlRyYWZmaWNTdGF0aXN0aWNzIGZvciBTT0ZUQVAgU3RhdGlvbjoiKSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiUlVGPSVkXHRSTUY9JWRcdFJCRj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4TUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4QkNGY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiUlVCPSVkXHRSTUI9JWRcdFJCQj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4VUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4TUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnJ4QkNCY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiVFVGPSVkXHRUTUY9JWRcdFRCRj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4TUNGY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4QkNGY250KSk7CiAgICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiVFVCPSVkXHRUTUI9JWRcdFRCQj0lZCIsIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4VUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4TUNCY250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzLnR4QkNCY250KSk7CiAgICAgICAgfQogICAgfQogICByZXR1cm47Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgIFdMQU5UTF9UTERlYnVnTWVzc2FnZQoKICBERVNDUklQVElPTgogICAgUG9zdCBhIFRMIFNuYXBzaG90IHJlcXVlc3QsIHBvc3RzIG1lc3NhZ2UgaW4gVHhUaHJlYWQuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZ2V0cyBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgZGlzcGxheVNuYXBzaG90IEJvb2xlYW4gc2hvd2luZyB3aGV0aGVyIHRvIGR1bXAgdGhlIHNuYXBzaG90IG9yIG5vdC4KCiAgUkVUVVJOIFZBTFVFICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdl9WT0lEX3QKV0xBTlRMX1RMRGVidWdNZXNzYWdlCigKIHZfQk9PTF90ICAgZGlzcGxheVNuYXBzaG90CikKewogICB2b3NfbXNnX3Qgdm9zTXNnOwogICBWT1NfU1RBVFVTIHN0YXR1czsKCiAgIGlmKGRpc3BsYXlTbmFwc2hvdCkKICAgewogICAgICAgIHZvc01zZy5yZXNlcnZlZCA9IDA7CiAgICAgICAgdm9zTXNnLmJvZHlwdHIgID0gTlVMTDsKICAgICAgICB2b3NNc2cudHlwZSAgICAgPSBXTEFOVExfVFhfU05BUFNIT1Q7CgogICAgICAgIHN0YXR1cyA9IHZvc190eF9tcV9zZXJpYWxpemUoIFZPU19NT0RVTEVfSURfVEwsICZ2b3NNc2cpOwogICAgICAgIGlmKHN0YXR1cyAhPSBWT1NfU1RBVFVTX1NVQ0NFU1MpCiAgICAgICAgewogICAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIlRYIE1zZyBQb3N0aW5nIEZhaWxlZCB3aXRoIHN0YXR1czogJWQiLHN0YXR1cykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICB9CiAgIHJldHVybjsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMIFNUQVRFIE1BQ0hJTkUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVR4Q29ubgoKICBERVNDUklQVElPTgogICAgVHJhbnNtaXQgaW4gY29ubmVjdGVkIHN0YXRlIC0gb25seSBFQVBPTCBhbmQgV0FJIHBhY2tldHMgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgIE90aGVyIHJldHVybiB2YWx1ZXMgYXJlIHBvc3NpYmxlIGNvbWluZyBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgogICBQbGVhc2UgY2hlY2sgQVBJIGZvciBhZGRpdGlvbmFsIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4Q29ubgooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICB2X1UxNl90ICAgICAgICAgICAgICB1c1BrdExlbjsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgdm9zU3RhdHVzOwogICB2X01BQ0FERFJfdCAgICAgICAgICB2RGVzdE1hY0FkZHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgcFRMQ2IgICAgICAgPSBOVUxMOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSogcENsaWVudFNUQSA9IE5VTEw7CiAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgIHRsTWV0YUluZm87CiAgIHZfVThfdCAgICAgICAgICAgICAgIHVjVHlwZVN1YnR5cGUgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y1RpZDsKICAgdl9VOF90ICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgaTsgCiAgIHZfVTMyX3QgICAgICAgICAgICAgIHR4RmxhZyA9IEhBTF9UWF9OT19FTkNSWVBUSU9OX01BU0s7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVR4Q29ubiIpOwogICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAvL0xUSTpwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS4KICAvL0xUSTogICBhdWNBQ01hc2tbcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNDdXJyZW50QUNdID0gMDsgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGZXRjaCBwYWNrZXQgZnJvbSBIREQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTCiAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICghdm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKSAmJgogICAgICAhcFRMQ2ItPnVjVGRsc1BlZXJDb3VudCkKICB7CiNlbHNlCiAgaWYgKChXTEFOX1NUQV9TT0ZUQVAgIT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpICYmCiAgICAgICghdm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiNlbmRpZgogICAgICB1Y0FDID0gcENsaWVudFNUQS0+dWNDdXJyZW50QUM7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBEaXNhYmxlIEFDIHRlbXBvcmFyeSAtIGlmIHN1Y2Nlc3NmdWxsIHJldHJpZXZlIHJlLWVuYWJsZQogICAgICBUaGUgb3JkZXIgaXMganVzdGlmaWVkIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmxlIHNjZW5hcmlvCiAgICAgICAtIFRMIHRyeWVzIHRvIGZldGNoIHBhY2tldCBmb3IgQUMgYW5kIGl0IHJldHVybnMgTlVMTAogICAgICAgLSBUTCBhbmFseXplcyB0aGUgZGF0YSBpdCBoYXMgcmVjZWl2ZWQgdG8gc2VlIGlmIHRoZXJlIGFyZQogICAgICAgYW55IG1vcmUgcGt0cyBhdmFpbGFibGUgZm9yIEFDIC0+IGlmIG5vdCBUTCB3aWxsIGRpc2FibGUgQUMKICAgICAgIC0gaG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoaWxlIGFuYWx5emluZyByZXN1bHRzIFRMIGdvdAogICAgICAgcHJlZW1wdGVkIGJ5IGEgcGVuZGluZyBpbmRpY2F0aW9uIHdoZXJlIHRoZSBtYXNrIHdhcyBhZ2FpbiBzZXQKICAgICAgIFRMIHdpbGwgbm90IGNoZWNrIGFnYWluIGFuZCBhcyBhIHJlc3VsdCB3aGVuIGl0IHJlc3VtZXMKICAgICAgIGV4ZWN1dGlvbiBpdCB3aWxsIGRpc2FibGUgQUMKICAgICAgIFRvIHByZXZlbnQgdGhpcyB0aGUgQUMgd2lsbCBiZSBkaXNhYmxlZCBoZXJlIGFuZCBpZiByZXRyaWV2ZQogICAgICAgaXMgc3VjY2Vzc2Z1bGwgaXQgd2lsbCBiZSByZS1lbmFibGVkCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAgIC8vc29mdGFwIGNhc2UKICAgICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICAgIHBDbGllbnRTVEEtPmF1Y0FDTWFza1t1Y0FDXSA9IDA7CiAgfQoKICAgIC8qWW91IG1ha2UgYW4gaW5pdGlhbCBhc3N1bXB0aW9uIHRoYXQgSEREIGhhcyBubyBtb3JlIGRhdGEgYW5kIGlmIHRoZQogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIC8vTFRJOiB2b3NfYXRvbWljX3NldF9VOCggJnBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZywgMCk7CiAgLy9MVEk6IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjTm9Nb3JlRGF0YSA9IDE7CiAgdm9zX2F0b21pY19zZXRfVTgoICZwQ2xpZW50U1RBLT51Y1BrdFBlbmRpbmcsIDApOwogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwQ2xpZW50U1RBLCB1Y0FDTWFzaywgaSk7CiAgICAvKllvdSBtYWtlIGFuIGluaXRpYWwgYXNzdW1wdGlvbiB0aGF0IEhERCBoYXMgbm8gbW9yZSBkYXRhIGFuZCBpZiB0aGUKICAgICAgICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgICAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQKICAgICAgICAgICBmb3IgcGFja2V0cyBhbmQgc2V0dGluZyB0aGUgZmxhZ3MgdG8gZmFsc2UqLwogIGlmICggMCA9PSB1Y0FDTWFzayApCiAgewogICAgICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogIH0KICBlbHNlCiAgewogICAgICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgfQoKCiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gZmV0Y2hpbmcgcGFja2V0IGZyb20gSEREIGZvciBBQzogJWQgQUMgTWFzazogJWQgUGt0IFBlbmRpbmc6ICVkIiwgCiAgICAgICAgICAgICB1Y0FDLCB1Y0FDTWFzaywgcENsaWVudFNUQS0+dWNQa3RQZW5kaW5nKTsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHR4IHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovL0xUSQojaWYgMCAKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLndTVEFEZXNjLndTVEFUeXBlICYmIAogICAgICghdm9zX2NvbmN1cnJlbnRfc2Vzc2lvbnNfcnVubmluZygpKSkKICB7CiAgICAvLyBkb24ndCBzZXQgMC4gCiAgICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAwKTsKICAgIHZvc1N0YXR1cyA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQUZldGNoUGt0KCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNDdXJyZW50QUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CiAgfQogIGVsc2UKICB7CiAgICAvL3NvZnRhcCBjYXNlCiAgICBXTEFOVExfQUNFbnVtVHlwZSB1Y0FDID0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQzsKICAgIHZvc1N0YXR1cyA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnBmblNUQUZldGNoUGt0KCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b3NEYXRhQnVmZiwgJnRsTWV0YUluZm8gKTsKICB9CiNlbmRpZgoKICB2b3NTdGF0dXMgPSBwQ2xpZW50U1RBLT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9zRGF0YUJ1ZmYsICZ0bE1ldGFJbmZvICk7CgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAoIE5VTEwgPT0gdm9zRGF0YUJ1ZmYgKSkKICB7CiAgICBUTExPRzEoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm8gbW9yZSBkYXRhIGF0IEhERCBzdGF0dXMgJWQiLCB2b3NTdGF0dXMpKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlc2V0IEFDIGZvciB0aGUgc2VydmljZWQgc3RhdGlvbiB0byB0aGUgaGlnaGVzdCBwcmlvcml0eSBBQwogICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgRXZlbiBpZiB0aGlzIEFDIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHN0YXRpb24sIGNvcnJlY3Rpb24gd2lsbCBiZQogICAgbWFkZSBpbiB0aGUgbWFpbiBUTCBsb29wCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CiAgICBwQ2xpZW50U1RBLT51Y0N1cnJlbnRXZWlnaHQgPSAwOwoKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgIldMQU4gVEw6IFdMQU5UTF9TVEFUeENvbm4gbm8gbW9yZSBwYWNrZXRzIGluIEhERCBmb3IgQUM6ICVkIEFDIE1hc2s6ICVkIiwgCiAgICAgICAgICAgICAgIHVjQUMsIHVjQUNNYXNrKTsKCiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLypUaGVyZSBhcmUgc3RpbGwgcGFja2V0cyBpbiBIREQgLSBzZXQgYmFjayB0aGUgcGVuZGluZyBwYWNrZXRzIGFuZCAKICAgdGhlIG5vIG1vcmUgZGF0YSBhc3N1bXB0aW9uKi8KICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMSk7CiAgcENsaWVudFNUQS0+dWNOb01vcmVEYXRhID0gMDsKICBwQ2xpZW50U1RBLT5hdWNBQ01hc2tbdWNBQ10gPSAxOwoKI2lmZGVmIFdMQU5fUEVSRiAKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOwoKI2VuZGlmIC8qV0xBTl9QRVJGKi8KCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIElmIHRoZSBwYWNrZXQgaXMgbmVpdGhlciBhbiBFYXBvbCBwYWNrZXQgbm9yIGEgV0FJIHBhY2tldCB0aGVuIGRyb3AgaXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgaWYgKCAwID09IHRsTWV0YUluZm8udWNJc0VhcG9sICYmIDAgPT0gdGxNZXRhSW5mby51Y0lzV2FpICkKICAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAgIldMQU4gVEw6T25seSBFQVBPTCBvciBXQUkgcGFja2V0cyBhbGxvd2VkIGJlZm9yZSBhdXRoZW50aWNhdGlvbiIpKTsKCiAgICAgLyogRmFpbCB0eCBmb3IgcGFja2V0ICovCiAgICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRV9CQURNU0cpOwogICAgIHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KI2Vsc2UKICAgaWYgKCAwID09IHRsTWV0YUluZm8udWNJc0VhcG9sICkKICB7CiAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG5vbiBFQVBPTCBwYWNrZXQgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIikpOwoKICAgIC8qIEZhaWwgdHggZm9yIHBhY2tldCAqLwogICAgcENsaWVudFNUQS0+cGZuU1RBVHhDb21wKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRV9CQURNU0cpOwogICAgdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBDaGVjayBUSUQKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1RpZCAgICAgPSB0bE1ldGFJbmZvLnVjVElEOwoKICAvKk1ha2Ugc3VyZSBUSUQgaXMgdmFsaWQqLwogIGlmICggV0xBTlRMX1RJRF9JTlZBTElEKHVjVGlkKSkgCiAgewogICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVElEIHNlbnQgaW4gbWV0YSBpbmZvICVkIC0gZGVmYXVsdGluZyB0byAwIChCRSkiLCAKICAgICAgICAgICAgIHVjVGlkKSk7CiAgICAgdWNUaWQgPSAwOyAKICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRhY2hpbmcgQkQgaGVhZGVyIHRvIHBrdCBvbiBXTEFOVExfU1RBVHhDb25uIikpOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCBvciBpZiAKICAgIGZyYW1lIGlzIGEgV0FJIGZyYW1lLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggKCAxID09IHRsTWV0YUluZm8udWNJc1dhaSApIHx8CiAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwgKSApCiNlbHNlCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFRyYW5zbGF0ZSA4MDIuMyBmcmFtZSB0byA4MDIuMTEgaWYgRnJhbWUgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApICYmCiAgICAgICggMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24pICkKI2VuZGlmIC8vI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgewogICAgdm9zU3RhdHVzID0gIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciggdm9zRGF0YUJ1ZmYsICZ2b3NTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVExDYiwgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGxNZXRhSW5mbywgJnVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYUhlYWRTcGFjZSk7CiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpFcnJvciB3aGVuIHRyYW5zbGF0aW5nIGhlYWRlciBXTEFOVExfU1RBVHhDb25uIikpOwoKICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KCiAgICB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCA9IDE7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENhbGwgSEFMIHRvIGZpbGwgQkQgaGVhZGVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1RZUEUgPDwgNCk7CgogIGlmICggcENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkICkKICB7CiAgICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9RT1NfU1VCVFlQRSk7CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgLyogVEwgU3RhdGUgZG9lcyBub3QgdHJhbnNpdGlvbiB0byBBVVRIRU5USUNBVEVEIHRpbGwgR1RLIGlzIGluc3RhbGxlZCwgU28gaW4KICAgKiBjYXNlIG9mIFdQQSB3aGVyZSBHVEsgaGFuZHNoYWtlIGlzIGRvbmUgYWZ0ZXIgdGhlIDQgd2F5IGhhbmRzaGFrZSwgdGhlCiAgICogdW5pY2FzdCAyLzIgRUFQT0wgcGFja2V0IGZyb20gdGhlIFNUQS0+QVAgaGFzIHRvIGJlIGVuY3J5cHRlZCBldmVuIGJlZm9yZQogICAqIHRoZSBUTCBpcyBpbiBhdXRoZW50aWNhdGVkIHN0YXRlLiBTaW5jZSB0aGUgUFRLIGhhcyBiZWVuIGluc3RhbGxlZAogICAqIGFscmVhZHkgKGFmdGVyIHRoZSA0IHdheSBoYW5kc2hha2UpIHdlIG1ha2Ugc3VyZSB0aGF0IGFsbCB0cmFmZmljCiAgICogaXMgZW5jcnlwdGVkIGhlbmNlZm9ydGguKE5vdGU6IFRMIGlzIHN0aWxsIG5vdCBpbiBBVVRIRU5USUNBVEVEIHN0YXRlIHNvCiAgICogd2Ugd2lsbCBvbmx5IGFsbG93IEVBUE9MIGRhdGEgb3IgV0FJIGluIGNhc2Ugb2YgV0FQSSkKICAgKi8KICBpZiAodGxNZXRhSW5mby51Y0lzRWFwb2wgJiYgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkKQogIHsKICAgIHR4RmxhZyA9IDA7CiAgfQojZWxzZQogIGlmIChwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQpCiAgewogICAgdHhGbGFnID0gMDsKICB9CiNlbmRpZgoKICB2b3NTdGF0dXMgPSAoVk9TX1NUQVRVUylXREFfRFNfQnVpbGRUeFBhY2tldEluZm8oIHB2b3NHQ3R4LCB2b3NEYXRhQnVmZiAsICZ2RGVzdE1hY0FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQsIHVjV0RTRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1Y1R5cGVTdWJ0eXBlLCAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVjVGlkLCB0eEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51c1RpbWVTdGFtcCwgdGxNZXRhSW5mby51Y0lzRWFwb2wgfHwgdGxNZXRhSW5mby51Y0lzV2FpLCB0bE1ldGFJbmZvLnVjVVAgKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZmlsbCBCRCAlZCIsIHZvc1N0YXR1cykpOwogICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVXBkYXRlIHR4IGNvdW50ZXIgZm9yIEJBIHNlc3Npb24gcXVlcnkgZm9yIHR4IHNpZGUKICAgICExIC0gc2hvdWxkIHRoaXMgYmUgZG9uZSBmb3IgRUFQT0wgZnJhbWVzPwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBDbGllbnRTVEEtPmF1VHhDb3VudFt1Y1RpZF0rKzsKCiAgdm9zX3BrdF9zZXRfdXNlcl9kYXRhX3B0ciggdm9zRGF0YUJ1ZmYsIFZPU19QS1RfVVNFUl9EQVRBX0lEX1RMLAogICAgICAgICAgICAgICAodl9QVk9JRF90KXBDbGllbnRTVEEtPnBmblNUQVR4Q29tcCApOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2F2ZSBkYXRhIHRvIGlucHV0IHBvaW50ZXIgZm9yIFRMIGNvcmUKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKICAvKnNlY3VyaXR5IGZyYW1lcyBjYW5ub3QgYmUgZGVsYXllZCovCiAgcFRMQ2ItPmJVcmdlbnQgICAgICA9IFRSVUU7CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4Q29ubiAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBVHhBdXRoCgogIERFU0NSSVBUSU9OCiAgICBUcmFuc21pdCBpbiBhdXRoZW50aWNhdGVkIHN0YXRlIC0gYWxsIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgIE90aGVyIHJldHVybiB2YWx1ZXMgYXJlIHBvc3NpYmxlIGNvbWluZyBmcm9tIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgogICBQbGVhc2UgY2hlY2sgQVBJIGZvciBhZGRpdGlvbmFsIGluZm8uCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1NUQVR4QXV0aAooCiAgdl9QVk9JRF90ICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgIHVjU1RBSWQsCiAgdm9zX3BrdF90KiogICBwdm9zRGF0YUJ1ZmYsCiAgdl9CT09MX3QgICAgICBiRm9yd2FyZElBUFB3aXRoTExDCikKewogICB2X1UxNl90ICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIFZPU19TVEFUVVMgICAgICAgICAgICB2b3NTdGF0dXM7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICB2RGVzdE1hY0FkZHI7CiAgIHZvc19wa3RfdCogICAgICAgICAgICB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9NZXRhSW5mb1R5cGUgICB0bE1ldGFJbmZvOwogICB2X1U4X3QgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSA9IDA7CiAgIFdMQU5UTF9BQ0VudW1UeXBlICAgICB1Y0FDOwogICBXTEFOVExfQUNFbnVtVHlwZSAgICAgdWNOZXh0QUM7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1RpZDsKICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU3dGcm1YdGwgPSAwOwogICB2X1U4X3QgICAgICAgICAgICAgICAgZXh0cmFIZWFkU3BhY2UgPSAwOwogICBXTEFOVExfU1RBQ2xpZW50VHlwZSAqcFN0YUNsaWVudCA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y1dEU0VuYWJsZWQgPSAwOwogICB2X1UzMl90ICAgICAgICAgICAgICAgdWNUeEZsYWcgICA9IDA7CiAgIHZfVThfdCAgICAgICAgICAgICAgICB1Y0FDTWFzaywgaTsgCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgKCBOVUxMID09IHB2b3NEYXRhQnVmZiApKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9TVEFUeEF1dGggVEwgJXAgREIgJXAiLAogICAgICAgICAgICAgcFRMQ2IsIHB2b3NEYXRhQnVmZikpOwogICAgaWYgKE5VTEwgIT0gcHZvc0RhdGFCdWZmKQogICAgewogICAgICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgfQogICAgaWYoTlVMTCAhPSBwVExDYikKICAgIHsKICAgICAgICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjTm9Nb3JlRGF0YSA9IDE7CiAgICB9CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBwU3RhQ2xpZW50ID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwU3RhQ2xpZW50ICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICB2b3NfbWVtX3plcm8oJnRsTWV0YUluZm8sIHNpemVvZih0bE1ldGFJbmZvKSk7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZldGNoIHBhY2tldCBmcm9tIEhERAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgRkVBVFVSRV9XTEFOX1RETFMKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpICYmCiAgICAgICFwVExDYi0+dWNUZGxzUGVlckNvdW50KQogIHsKI2Vsc2UKICBpZiAoKFdMQU5fU1RBX1NPRlRBUCAhPSBwU3RhQ2xpZW50LT53U1RBRGVzYy53U1RBVHlwZSkgJiYKICAgICAgKCF2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpKQogIHsKI2VuZGlmCiAgdWNBQyA9IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGlzYWJsZSBBQyB0ZW1wb3JhcnkgLSBpZiBzdWNjZXNzZnVsbCByZXRyaWV2ZSByZS1lbmFibGUKICAgICAgVGhlIG9yZGVyIGlzIGp1c3RpZmllZCBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBzY2VuYXJpbwogICAgICAgLSBUTCB0cnllcyB0byBmZXRjaCBwYWNrZXQgZm9yIEFDIGFuZCBpdCByZXR1cm5zIE5VTEwKICAgICAgIC0gVEwgYW5hbHl6ZXMgdGhlIGRhdGEgaXQgaGFzIHJlY2VpdmVkIHRvIHNlZSBpZiB0aGVyZSBhcmUKICAgICAgIGFueSBtb3JlIHBrdHMgYXZhaWxhYmxlIGZvciBBQyAtPiBpZiBub3QgVEwgd2lsbCBkaXNhYmxlIEFDCiAgICAgICAtIGhvd2V2ZXIgaXQgaXMgcG9zc2libGUgdGhhdCB3aGlsZSBhbmFseXppbmcgcmVzdWx0cyBUTCBnb3QKICAgICAgIHByZWVtcHRlZCBieSBhIHBlbmRpbmcgaW5kaWNhdGlvbiB3aGVyZSB0aGUgbWFzayB3YXMgYWdhaW4gc2V0CiAgICAgICBUTCB3aWxsIG5vdCBjaGVjayBhZ2FpbiBhbmQgYXMgYSByZXN1bHQgd2hlbiBpdCByZXN1bWVzCiAgICAgICBleGVjdXRpb24gaXQgd2lsbCBkaXNhYmxlIEFDCiAgICAgICBUbyBwcmV2ZW50IHRoaXMgdGhlIEFDIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSBhbmQgaWYgcmV0cmlldmUKICAgICAgIGlzIHN1Y2Nlc3NmdWxsIGl0IHdpbGwgYmUgcmUtZW5hYmxlZAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBTdGFDbGllbnQtPmF1Y0FDTWFza1twU3RhQ2xpZW50LT51Y0N1cnJlbnRBQ10gPSAwOyAKCiAgLy8gZG9uJ3QgcmVzZXQgaXQsIGFzIG90aGVyIEFDIHF1ZXVlcyBpbiBIREQgbWF5IGhhdmUgcGFja2V0cwogIC8vdm9zX2F0b21pY19zZXRfVTgoICZwU3RhQ2xpZW50LT51Y1BrdFBlbmRpbmcsIDApOwogIH0KICBlbHNlCiAgewogICAgLy9zb2Z0YXAgY2FzZQogICAgdWNBQyA9IHBUTENiLT51Q3VyU2VydmVkQUM7CiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbdWNBQ10gPSAwOyAKCiAgICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICB9CgogIFdMQU5fVExfQUNfQVJSQVlfMl9NQVNLKCBwU3RhQ2xpZW50LCB1Y0FDTWFzaywgaSk7IAogICAgLypZb3UgbWFrZSBhbiBpbml0aWFsIGFzc3VtcHRpb24gdGhhdCBIREQgaGFzIG5vIG1vcmUgZGF0YSBhbmQgaWYgdGhlIAogICAgICBhc3N1bXB0aW9uIHdhcyB3cm9uZyB5b3UgcmVzZXQgdGhlIGZsYWdzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlCiAgICAgVGhpcyB3aWxsIHByZXZlbnQgZnJvbSBleHBvc2luZyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2hlY2tpbmcgd2l0aCBIREQgCiAgICAgZm9yIHBhY2tldHMgYW5kIHNldHRpbmcgdGhlIGZsYWdzIHRvIGZhbHNlKi8KICBpZiAoIDAgPT0gdWNBQ01hc2sgKQogIHsKICAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAwKTsKICAgIHBTdGFDbGllbnQtPnVjTm9Nb3JlRGF0YSA9IDE7CiAgfQoKICB2b3NTdGF0dXMgPSBwU3RhQ2xpZW50LT5wZm5TVEFGZXRjaFBrdCggcHZvc0dDdHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y0FDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvc0RhdGFCdWZmLCAmdGxNZXRhSW5mbyApOwoKCiAgaWYgKCggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApIHx8ICggTlVMTCA9PSB2b3NEYXRhQnVmZiApKQogIHsKCiAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmZXRjaCBwa3QgZnJvbSBIREQgJWQiLAogICAgICAgICAgICAgICAgICAgdm9zU3RhdHVzKTsKICAgICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBSZXNldCBBQyBmb3IgdGhlIHNlcnZpY2VkIHN0YXRpb24gdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgQUMKICAgICAgLT4gZHVlIHRvIG5vIG1vcmUgZGF0YSBhdCB0aGUgc3RhdGlvbgogICAgICBFdmVuIGlmIHRoaXMgQUMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc3RhdGlvbiwgY29ycmVjdGlvbiB3aWxsIGJlCiAgICAgIG1hZGUgaW4gdGhlIG1haW4gVEwgbG9vcAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50QUMgICAgID0gV0xBTlRMX0FDX1ZPOwogICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKCiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgV0xBTlRMX1N0YXRIYW5kbGVUWEZyYW1lKHB2b3NHQ3R4LCB1Y1NUQUlkLCB2b3NEYXRhQnVmZiwgTlVMTCwgJnRsTWV0YUluZm8pOwoKICAvKlRoZXJlIGFyZSBzdGlsbCBwYWNrZXRzIGluIEhERCAtIHNldCBiYWNrIHRoZSBwZW5kaW5nIHBhY2tldHMgYW5kIAogICB0aGUgbm8gbW9yZSBkYXRhIGFzc3VtcHRpb24qLwogIHZvc19hdG9taWNfc2V0X1U4KCAmcFN0YUNsaWVudC0+dWNQa3RQZW5kaW5nLCAxKTsKICBwU3RhQ2xpZW50LT51Y05vTW9yZURhdGEgPSAwOwoKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICAvLyBkb24ndCBuZWVkIHRvIHNldCBpdCwgYXMgd2UgZG9uJ3QgcmVzZXQgaXQgaW4gdGhpcyBmdW5jdGlvbi4KICAvL3Zvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0udWNQa3RQZW5kaW5nLCAxKTsKICB9CgojaWZkZWYgV0xBTl9QRVJGIAogICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KTApOwojZW5kaWYgLypXTEFOX1BFUkYqLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBUSUQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHVjVGlkICAgICA9IHRsTWV0YUluZm8udWNUSUQ7CgogIC8qTWFrZSBzdXJlIFRJRCBpcyB2YWxpZCovCiAgaWYgKCBXTEFOVExfVElEX0lOVkFMSUQodWNUaWQpKSAKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUSUQgc2VudCBpbiBtZXRhIGluZm8gJWQgLSBkZWZhdWx0aW5nIHRvIDAgKEJFKSIsIAogICAgICAgICAgICAgdWNUaWQpKTsKICAgICB1Y1RpZCA9IDA7IAogIH0KCiAgLypTYXZlIGZvciBVQVBTRCB0aW1lciBjb25zaWRlcmF0aW9uKi8KICBwU3RhQ2xpZW50LT51Y1NlcnZpY2VkQUMgPSB1Y0FDOyAKCiAgaWYgKCB1Y0FDID09IHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICkgCiAgewogICAgcFN0YUNsaWVudC0+YXVjQUNNYXNrW3BTdGFDbGllbnQtPnVjQ3VycmVudEFDXSA9IDE7CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQtLTsKICB9CiAgZWxzZQogIHsKICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IHVjQUM7CiAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjQUNdIC0gMTsKCiAgICBwU3RhQ2xpZW50LT5hdWNBQ01hc2tbcFN0YUNsaWVudC0+dWNDdXJyZW50QUNdID0gMTsKCiAgfQoKICBpZiAoV0xBTl9TVEFfU09GVEFQICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLndTVEFUeXBlKQogIHsKICBpZiAoIDAgPT0gcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ICkgCiAgewogICAgV0xBTlRMX0FDRW51bVR5cGUgdGVtcEFDID0gdWNBQzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIENob29zZSBuZXh0IEFDIC0gISEhIG9wdGltaXplIG1lCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB3aGlsZSAoIDAgIT0gdWNBQ01hc2sgKSAKICAgIHsKICAgICAgdWNOZXh0QUMgPSAoV0xBTlRMX0FDRW51bVR5cGUpKCggdGVtcEFDIC0gMSApICYgV0xBTlRMX01BU0tfQUMpOyAKICAgICAgaWYgKCAwICE9IHBTdGFDbGllbnQtPmF1Y0FDTWFza1t1Y05leHRBQ10gKQogICAgICB7CiAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICAgICA9IHVjTmV4dEFDOwogICAgICAgICBwU3RhQ2xpZW50LT51Y0N1cnJlbnRXZWlnaHQgPSBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjTmV4dEFDXTsKCiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IENoYW5naW5nIHNlcnZpY2VkIEFDIHRvOiAlZCB3aXRoIFdlaWdodDogJWQiLAogICAgICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPnVjQ3VycmVudEFDICwgCiAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0KSk7CiAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRlbXBBQyA9IHVjTmV4dEFDOwogICAgfQogIH0KICB9CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpBdHRhY2hpbmcgQkQgaGVhZGVyIHRvIHBrdCBvbiBXTEFOVExfU1RBVHhBdXRoIikpOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVHJhbnNsYXRlIDgwMi4zIGZyYW1lIHRvIDgwMi4xMQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCA9PSB0bE1ldGFJbmZvLnVjRGlzYWJsZUZybVh0bCApCiAgewogICAgIC8qIE5lZWRzIGZyYW1lIHRyYW5zbGF0aW9uICovCiAgICAgLy8gaWYgdGhlIGNsaWVudCBoYXMgbm90IGVuYWJsZWQgU1ctb25seSBmcmFtZSB0cmFuc2xhdGlvbgogICAgIC8vIGFuZCBpZiB0aGUgZnJhbWUgaXMgYSB1bmljYXN0IGZyYW1lCiAgICAgLy8gICAoSFcgZnJhbWUgdHJhbnNsYXRpb24gZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBicm9hZGNhc3QgZG9tYWlucwogICAgIC8vICAgIHNvIHdlIHVzZSBTVyBmcmFtZSB0cmFuc2xhdGlvbiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZXMpCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgIC8vIGFuZCBpZiB0aGUgZnJhbWUgaXMgbm90IGEgV0FQSSBmcmFtZQojZW5kaWYKICAgICAvLyB0aGVuIHVzZSBIV19iYXNlZCBmcmFtZSB0cmFuc2xhdGlvbgoKICAgICBpZiAoICggMCA9PSBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVUWFhsYXRpb24gKSAmJgogICAgICAgICAgKCAwID09IHRsTWV0YUluZm8udWNCY2FzdCApICYmCiAgICAgICAgICAoIDAgPT0gdGxNZXRhSW5mby51Y01jYXN0ICkKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgICAgICAgICAmJiAoIHRsTWV0YUluZm8udWNJc1dhaSAhPSAxICkKI2VuZGlmCiAgICAgICAgKQogICAgIHsKI2lmZGVmIFdMQU5fUEVSRiAKICAgICAgICB2X1UzMl90IHVGYXN0RndkT0sgPSAwOwoKICAgICAgICAvKiBIVyBiYXNlZCB0cmFuc2xhdGlvbi4gU2VlIGlmIHRoZSBmcmFtZSBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZCAqLwogICAgICAgIFdEQV9UTElfRmFzdEh3RndkRGF0YUZyYW1lKCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYgLCAmdm9zU3RhdHVzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdUZhc3RGd2RPSywgJnRsTWV0YUluZm8sICZwU3RhQ2xpZW50LT53U1RBRGVzYyk7CgogICAgICAgIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKICAgICAgICB7CiAgICAgICAgICAgIGlmKHVGYXN0RndkT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFBhY2tldCBjb3VsZCBiZSBmYXN0IGZvcndhcmRlZCBub3cgKi8KICAgICAgICAgICAgICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOwoKICAgICAgICAgICAgICAgICpwdm9zRGF0YUJ1ZmYgPSB2b3NEYXRhQnVmZjsKCiAgICAgICAgICAgICAgICAvKiBUT0RPOiBEbyB3ZSByZWFsbHkgbmVlZCB0byB1cGRhdGUgV0xBTlRMX0hTSGFuZGxlVFhGcmFtZSgpIAogICAgICAgICAgICAgICAgICAgc3RhdHMgZm9yIGV2ZXJ5IHBrdD8gKi8KICAgICAgICAgICAgICAgIHBTdGFDbGllbnQtPmF1VHhDb3VudFt0bE1ldGFJbmZvLnVjVElEXSsrOwogICAgICAgICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIGNhbid0IGJlIGZhc3QgZm9yd2FyZGVkLCBmYWxsIHRocm91Z2ggbm9ybWFsIChzbG93KSBwYXRoLiAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewoKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOkZhaWxlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGZhc3RGd2QgQkQgJWQiLCB2b3NTdGF0dXMpKTsKICAgICAgICAgICAgKnB2b3NEYXRhQnVmZiA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQojZW5kaWYgLypXTEFOX1BFUkYqLwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIC8qIFNXIGJhc2VkIHRyYW5zbGF0aW9uICovCgojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgICAgIGdVY0lzV2FpID0gdGxNZXRhSW5mby51Y0lzV2FpLAojZW5kaWYKCiAgICAgICB2b3NTdGF0dXMgPSAgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUTENiLCAmdWNTVEFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bE1ldGFJbmZvLCAmdWNXRFNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhSGVhZFNwYWNlKTsKICAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RXJyb3Igd2hlbiB0cmFuc2xhdGluZyBoZWFkZXIgV0xBTlRMX1NUQVR4QXV0aCIpKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICB9CgogICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICJXTEFOIFRMIHNvZnR3YXJlIHRyYW5zbGF0aW9uIHN1Y2Nlc3MiKSk7CiAgICAgICB1Y1N3RnJtWHRsID0gMTsKICAgICAgIHRsTWV0YUluZm8udWNEaXNhYmxlRnJtWHRsID0gMTsKICAgIH0KICB9CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgLypJbiBjYXNlIG9mIFRETFMsIGlmIHRoZSBwYWNrZXQgaXMgZGVzdGluZWQgdG8gVERMUyBTVEEgdWNTVEFJZCBtYXkKICAgICAgY2hhbmdlLiBzbyB1cGRhdGUgdGhlIHBTdGFDbGllbnQgYWNjb3JkaW5nbHkgKi8KICAgIHBTdGFDbGllbnQgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgICBpZiAoIE5VTEwgPT0gcFN0YUNsaWVudCApCiAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJwU3RhQ2xpZW50IGlzIE5VTEwgJXMiLCBfX2Z1bmNfXykpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KI2VuZGlmCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDYWxsIEhBTCB0byBmaWxsIEJEIGhlYWRlcgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y1R5cGVTdWJ0eXBlIHw9IChXTEFOVExfODAyMTFfREFUQV9UWVBFIDw8IDQpOwoKICBpZiAoIHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApIAogIHsKICAgIHVjVHlwZVN1YnR5cGUgfD0gKFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFKTsKICB9CgogIHVjVHhGbGFnICA9ICgwICE9IHBTdGFDbGllbnQtPndVQVBTREluZm9bdWNBQ10udWNTZXQpPwogICAgICAgICAgICAgIEhBTF9UUklHR0VSX0VOQUJMRURfQUNfTUFTSzowOwoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwU3RhQ2xpZW50LT53U1RBRGVzYy51Y0lzV2FwaVN0YSA9PSAxICkKICB7CiNpZmRlZiBMSUJSQV9XQVBJX1NVUFBPUlQKICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfV0FQSV9TVEFfTUFTSzsKI2VuZGlmIC8vTElCUkFfV0FQSV9TVVBQT1JUCiAgICBpZiAoIHRsTWV0YUluZm8udWNJc1dhaSA9PSAxICkgCiAgICB7CiAgICAgIHVjVHhGbGFnID0gdWNUeEZsYWcgfCBIQUxfVFhfTk9fRU5DUllQVElPTl9NQVNLOwogICAgfQogIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICggcFN0YUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfVERMUyApCiAgewogICAgdWNUeEZsYWcgPSB1Y1R4RmxhZyB8IEhBTF9URExTX1BFRVJfU1RBX01BU0s7CiAgfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX1RETFMgKi8KCiAgdm9zU3RhdHVzID0gKFZPU19TVEFUVVMpV0RBX0RTX0J1aWxkVHhQYWNrZXRJbmZvKCBwdm9zR0N0eCwgCiAgICAgICAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmICwgJnZEZXN0TWFjQWRkciwKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0Rpc2FibGVGcm1YdGwsICZ1c1BrdExlbiwKICAgICAgICAgICAgICAgICAgICAgcFN0YUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkLCB1Y1dEU0VuYWJsZWQsIAogICAgICAgICAgICAgICAgICAgICBleHRyYUhlYWRTcGFjZSwKICAgICAgICAgICAgICAgICAgICAgdWNUeXBlU3VidHlwZSwgJnBTdGFDbGllbnQtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgdWNUaWQsIHVjVHhGbGFnLCB0bE1ldGFJbmZvLnVzVGltZVN0YW1wLCAKICAgICAgICAgICAgICAgICAgICAgdGxNZXRhSW5mby51Y0lzRWFwb2wsIHRsTWV0YUluZm8udWNVUCApOwoKICBpZighVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIkZpbGwgVFggQkQgRXJyb3Igc3RhdHVzICVkIiwgdm9zU3RhdHVzKSk7CgogICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIC8qIFRYIFN0YXRpc3RpY3MgKi8KICBpZiAoISh0bE1ldGFJbmZvLnVjQmNhc3QgfHwgdGxNZXRhSW5mby51Y01jYXN0KSkKICB7CiAgICAvKiBUaGlzIGlzIFRYIFVDIGZyYW1lICovCiAgICBwU3RhQ2xpZW50LT50cmFmZmljU3RhdGlzdGljcy50eFVDRmNudCsrOwogICAgcFN0YUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MudHhVQ0JjbnQgKz0gdXNQa3RMZW47CiAgfQoKI2lmbmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFVwZGF0ZSB0eCBjb3VudGVyIGZvciBCQSBzZXNzaW9uIHF1ZXJ5IGZvciB0eCBzaWRlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFN0YUNsaWVudC0+YXVUeENvdW50W3VjVGlkXSsrOwojZWxzZQogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5hdVR4Q291bnRbdWNUaWRdKys7CiNlbmRpZgoKICAvKiBUaGlzIGNvZGUgaXMgdG8gc2VuZCB0cmFmZmljIHdpdGggbG93ZXIgcHJpb3JpdHkgQUMgd2hlbiB3ZSBkb2VzIG5vdCAKICAgICBnZXQgYWRtaXR0ZWQgdG8gc2VuZCBpdC4gVG9kYXkgSEFMIGRvZXMgbm90IGRvd25ncmFkZSBBQyBzbyB0aGlzIGNvZGUgCiAgICAgZG9lcyBub3QgZ2V0IGV4ZWN1dGVkLihJbiBvdGhlciB3b3JkcywgSEFMIGRvZXNuknQgY2hhbmdlIHRpZC4gVGhlIGlmIAogICAgIHN0YXRlbWVudCBpcyBhbHdheXMgZmFsc2UuKQogICAgIE5PVEU6IEluIHRoZSBjYXNlIG9mIExBIGRvd25ncmFkZSBvY2N1cnMgaW4gSEREICh0aGF0IHdhcyB0aGUgY2hhbmdlIAogICAgIFBoYW5pIG1hZGUgZHVyaW5nIFdNTS1BQyBwbHVnZmVzdCkuIElmIFdNICYgQk1QIGFsc28gdG9vayB0aGlzIGFwcHJvYWNoLCAKICAgICB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbmVlZCBmb3IgYW55IEFDIGRvd25ncmFkZSBsb2dpYyBpbiBUTC9XREkuICAgKi8KI2lmIDAKICBpZiAoKCB1Y1RpZCAhPSB0bE1ldGFJbmZvLnVjVElEICkgJiYKICAgICAgKCAwICE9IHBTdGFDbGllbnQtPndTVEFEZXNjLnVjUW9zRW5hYmxlZCApICYmIAogICAgICAoIDAgIT0gdWNTd0ZybVh0bCApKQogIHsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIEZJWCBtZTogT25jZSBkb3duZ3JhZGluZyBpcyBjbGVhciBwdXQgaW4gdGhlIHByb3BlciBjaGFuZ2UKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1Y1FDT2Zmc2V0ID0gV0xBTkhBTF9UWF9CRF9IRUFERVJfU0laRSArIFdMQU5UTF84MDJfMTFfSEVBREVSX0xFTjsKCiAgICAvLyEhIUZpeCB0aGlzIHJlcGxhY2UgcGVlayB3aXRoIGV4dHJhY3QgCiAgICB2b3NfcGt0X3BlZWtfZGF0YSggdm9zRGF0YUJ1ZmYsIHVjUUNPZmZzZXQsKHZfUFZPSURfdCkmcHVjUW9zQ3RybCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnB1Y1Fvc0N0cmwpKTsKICAgICpwdWNRb3NDdHJsID0gdWNUaWQ7IC8vPyBwcm9wZXIgYnl0ZSBvcmRlcgogIH0KI2VuZGlmCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmaWxsIEJEICVkIiwgdm9zU3RhdHVzKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXBTdGFDbGllbnQtPnBmblNUQVR4Q29tcCApOwoKICAqcHZvc0RhdGFCdWZmID0gdm9zRGF0YUJ1ZmY7CgogIC8qQkUgJiBCSyBjYW4gYmUgZGVsYXllZCwgVk8gYW5kIFZJIG5vdCBmcmFtZXMgY2Fubm90IGJlIGRlbGF5ZWQqLwogIGlmICggcFN0YUNsaWVudC0+dWNTZXJ2aWNlZEFDID4gV0xBTlRMX0FDX0JFICkgCiAgewogICAgcFRMQ2ItPmJVcmdlbnQ9IFRSVUU7CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVR4QXV0aCAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFUeERpc2MKCiAgREVTQ1JJUFRJT04KICAgIFRyYW5zbWl0IGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHR4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBVHhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICAgICAgICBwVExDYiAgICAgICA9IE5VTEw7CiAgIFdMQU5UTF9TVEFDbGllbnRUeXBlKiBwQ2xpZW50U1RBID0gTlVMTDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9TVEFUeEF1dGgiKSk7CiAgICAqcHZvc0RhdGFCdWZmID0gTlVMTDsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXJyb3IKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgIldMQU4gVEw6UGFja2V0IHNob3VsZCBub3QgYmUgdHJhbnNtaXR0ZWQgaW4gc3RhdGUgZGlzY29ubmVjdGVkIGlnbm9yaW5nIgogICAgICAgICAgICAiIHJlcXVlc3QiKSk7CgogICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwogICBwQ2xpZW50U1RBLT51Y05vTW9yZURhdGEgPSAxOwogICAKICAgLy9TaG91bGQgbm90IGJlIGFueXRoaW5nIHBlbmRpbmcgaW4gZGlzY29ubmVjdCBzdGF0ZQogICB2b3NfYXRvbWljX3NldF9VOCggJnBDbGllbnRTVEEtPnVjUGt0UGVuZGluZywgMCk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfU1RBVHhEaXNjICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1NUQVJ4Q29ubgoKICBERVNDUklQVElPTgogICAgUmVjZWl2ZSBpbiBjb25uZWN0ZWQgc3RhdGUgLSBvbmx5IEVBUE9MCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgdHgvcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeENvbm4KKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNFdGhlclR5cGUgPSAwOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNQa3RMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVIT2Zmc2V0OwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzTVBEVUxlbjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW47CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c0FjdHVhbEhMZW4gPSAwOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmOwogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgYXVjQkRIZWFkZXI7CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y1RpZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9ICpwdm9zRGF0YUJ1ZmYgKSkpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeENvbm4iKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0NoYW5nZVNUQVN0YXRlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgQkQgaGVhZGVyIGFuZCBjaGVjayBpZiB2YWxpZAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiwgKHZfUFZPSURfdCkmYXVjQkRIZWFkZXIsIDAvKlN3YXAgQkQqLyApOwoKICBpZiAoIE5VTEwgPT0gYXVjQkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6Q2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgVk9TX0FTU0VSVCggMCApOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgoKICB1Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXREFfR0VUX1JYX01QRFVfSEVBREVSX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVRE9mZnNldCA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9EQVRBX09GRlNFVChhdWNCREhlYWRlcik7CiAgdXNNUERVTGVuICAgICA9ICh2X1UxNl90KVdEQV9HRVRfUlhfTVBEVV9MRU4oYXVjQkRIZWFkZXIpOwogIHVjTVBEVUhMZW4gICAgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfTEVOKGF1Y0JESGVhZGVyKTsKICB1Y1RpZCAgICAgICAgID0gKHZfVThfdClXREFfR0VUX1JYX1RJRChhdWNCREhlYWRlcik7CgogIHZvc19wa3RfZ2V0X3BhY2tldF9sZW5ndGgoIHZvc0RhdGFCdWZmLCAmdXNQa3RMZW4pOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIHByb2Nlc3NpbmcgZGF0YTogSE8gJWQgRE8gJWQgTGVuICVkIEhMZW4gJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuKSk7CgogICAgLypJdCB3aWxsIGN1dCBvdXQgdGhlIDgwMi4xMSBoZWFkZXIgaWYgbm90IHVzZWQqLwogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpCRCBoZWFkZXIgY29ycnVwdGVkIC0gZHJvcHBpbmcgcGFja2V0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KCiAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlcix2b3NEYXRhQnVmZix1Y01QRFVITGVuLCZ1c0V0aGVyVHlwZSk7CiAgCiAgaWYoIFZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpICkKICB7CiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogICAgLyogSWYgZnJhbWUgaXMgbmVpdGhlciBhbiBFQVBPTCBmcmFtZSBub3IgYSBXQUkgZnJhbWUgdGhlbiB3ZSBkcm9wIHRoZSBmcmFtZSovCiAgICAvKiBUT0RPOiBEbyB3ZSBuZWVkIGEgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiBXQVBJIG1vZGU/IElmIG5vdCBpcyBpdCBwb3NzaWJsZSAqLwogICAgLyogdGhhdCB3ZSBnZXQgYW4gRUFQT0wgcGFja2V0IGluIFdBUEkgbW9kZSBvciB2aWNlIHZlcnNhPyAqLwogICAgaWYgKCBXTEFOVExfTExDXzgwMjFYX1RZUEUgICE9IHVzRXRoZXJUeXBlICYmIFdMQU5UTF9MTENfV0FJX1RZUEUgICE9IHVzRXRoZXJUeXBlICkKICAgIHsKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfV0FSTiwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSBub3QgRUFQT0wgb3IgV0FJIEV0aGVyVHlwZSAlZCAtIGRyb3BwaW5nIiwgdXNFdGhlclR5cGUgKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIH0KI2Vsc2UKICAgIGlmICggV0xBTlRMX0xMQ184MDIxWF9UWVBFICAhPSB1c0V0aGVyVHlwZSApCiAgICB7CiAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOlJYIEZyYW1lIG5vdCBFQVBPTCBFdGhlclR5cGUgJWQgLSBkcm9wcGluZyIsIHVzRXRoZXJUeXBlKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgIH0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9XQVBJICovCiAgICBlbHNlIC8qIEZyYW1lIGlzIGFuIEVBUE9MIGZyYW1lIG9yIGEgV0FJIGZyYW1lKi8gIAogICAgewoKICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICAgICAiV0xBTiBUTDpSWCBGcmFtZSAgRUFQT0wgRXRoZXJUeXBlICVkIC0gcHJvY2Vzc2luZyIsIHVzRXRoZXJUeXBlKTsKCiAgICAgIGlmICgoIDAgPT0gV0RBX0dFVF9SWF9GVF9ET05FKGF1Y0JESGVhZGVyKSApICYmCiAgICAgICAgICggMCAhPSBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24pKQogICAgICB7CiAgICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgICAgewogICAgICAgICB1c0FjdHVhbEhMZW4gPSB1c01QRFVET2Zmc2V0IC0gdWNNUERVSE9mZnNldDsKICAgICAgfQoKICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKCB2b3NEYXRhQnVmZiwgJnZvc1N0YXR1cywgdXNBY3R1YWxITGVuLCAKICAgICAgICAgICAgICAgICAgICAgIHVjTVBEVUhMZW4sIHBUTENiLCB1Y1NUQUlkLCBiRm9yd2FyZElBUFB3aXRoTExDKTsKCiAgICAgICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkgCiAgICAgICAgewogICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBJbmNyZW1lbnQgcmVjZWl2ZSBjb3VudGVyCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBpZiAoICFXTEFOVExfVElEX0lOVkFMSUQoIHVjVGlkKSApIAogICAgICB7CiAgICAgICAgcENsaWVudFNUQS0+YXVSeENvdW50W3VjVGlkXSsrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgICAgIHVjVGlkLCB1Y1NUQUlkLCBfX2Z1bmNfXykpOwogICAgICB9CgogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiV0xBTiBUTDpTZW5kaW5nIEVBUG9MIGZyYW1lIHRvIHN0YXRpb24gJWQgQUMgJWQiLCB1Y1NUQUlkLCB1Y1RpZCkpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICEhIUFzc3VtaW5nIFRJRCA9IFVQIG1hcHBpbmcgCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICB3UnhNZXRhSW5mby51Y1VQID0gdWNUaWQ7CgogICAgICBUTExPRzQoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICJXTEFOIFRMICVzOlNlbmRpbmcgZGF0YSBjaGFpbiB0byBzdGF0aW9uIiwgX19mdW5jX18pKTsKICAgICAgaWYgKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogICAgICB7CiAgICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IFdMQU5fUlhfU0FQX1NFTEZfU1RBX0lEOwogICAgICAgIHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfS8qRUFQT0wgZnJhbWUgb3IgV0FJIGZyYW1lKi8KICB9Lyp2b3Mgc3RhdHVzIHN1Y2Nlc3MqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4Q29ubiAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9Gd2RQa3RUb0hERAoKICBERVNDUklQVElPTgogICAgRGV0ZXJtaW5lIHRoZSBEZXN0YXRpb24gU3RhdGlvbiBJRCBhbmQgcm91dGUgdGhlIEZyYW1lIHRvIFVwcGVyIExheWVyCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKVk9TX1NUQVRVUwpXTEFOVExfRndkUGt0VG9IREQKKAogIHZfUFZPSURfdCAgICAgICBwdm9zR0N0eCwKICB2b3NfcGt0X3QqICAgICBwdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQKKQp7CiAgIHZfTUFDQUREUl90ICAgICAgICAgICAgICBEZXN0TWFjQWRkcmVzczsKICAgdl9NQUNBRERSX3QgICAgICAgICAgICAgICpwRGVzdE1hY0FkZHJlc3MgPSAmRGVzdE1hY0FkZHJlc3M7CiAgIHZfU0laRV90ICAgICAgICAgICAgICAgICB1c01hY0FkZFNpemUgPSBWT1NfTUFDX0FERFJfU0laRTsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2b3NfcGt0X3QqICAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYgOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgU1RBTWV0YUluZm87CiAgIHZvc19wa3RfdCogICAgICAgICAgICAgICB2b3NOZXh0RGF0YUJ1ZmYgOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNEZXNTVEFJZDsKICAgV0xBTlRMX1J4TWV0YUluZm9UeXBlICAgIHdSeE1ldGFJbmZvOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCggTlVMTCA9PSBwdm9zRGF0YUJ1ZmYgKSB8fCAoIE5VTEwgPT0gKCB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZiApKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfRndkUGt0VG9IZGQiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0Z3ZFBrdFRvSGRkIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIGlmKFdMQU5UTF9TVEFfSURfSU5WQUxJRCh1Y1NUQUlkKSkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsInVjU1RBSWQgJWQgaXMgbm90IHZhbGlkIiwKICAgICAgICAgICAgICAgICB1Y1NUQUlkKSk7CiAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogICAvKiBUaGlzIHRoZSBjaGFuZ2UgcmVxdWlyZWQgZm9yIFNvZnRBcCB0byBoYW5kbGUgUmVvcmRlcmVkIEJ1ZmZlci4gU2luY2UgYSBTVEEKICAgICAgbWF5IGhhdmUgcGFja2V0cyBkZXN0aW5lZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMgd2UgaGF2ZSB0byBwcm9jZXNzIGVhY2ggcGFja2V0CiAgICAgIGF0IGEgdGltZSBhbmQgZGV0ZXJtaW5lIGl0cyBEZXN0aW5hdGlvbi4gU28gdGhlIFZvc2NoYWluIHByb3ZpZGVkIGJ5IFJlb3JkZXIgY29kZQogICAgICBpcyB1bmNoYWluIGFuZCBmb3J3YXJkZWQgdG8gVXBwZXIgTGF5ZXIgYWZ0ZXIgRGV0ZXJtaW5pbmcgdGhlIERlc3RpbmF0aW9uICovCgogICB2b3NEYXRhQnVmZiA9IHB2b3NEYXRhQnVmZjsKICAgd2hpbGUgKHZvc0RhdGFCdWZmICE9IE5VTEwpCiAgIHsKICAgICAgdm9zX3BrdF93YWxrX3BhY2tldF9jaGFpbiggdm9zRGF0YUJ1ZmYsICZ2b3NOZXh0RGF0YUJ1ZmYsIDEvKnRydWUqLyApOwogICAgICB2b3NfcGt0X2dldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfVEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QgKikmU1RBTWV0YUluZm8gKTsKICAgICAgd1J4TWV0YUluZm8udWNVUCA9ICh2X1U4X3QpKFNUQU1ldGFJbmZvICYgV0xBTlRMX0FDX01BU0spOwogICAgICB1Y0Rlc1NUQUlkID0gKHZfVThfdCkoKFNUQU1ldGFJbmZvKSA+PiBXTEFOVExfU1RBSURfT0ZGU0VUKTsgCiAgICAgICAKICAgICAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCAwLCAodl9WT0lEX3QgKilwRGVzdE1hY0FkZHJlc3MsICZ1c01hY0FkZFNpemUpOwogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiByZWN2IGNvcnJ1cHRlZCBkYXRhIHBhY2tldCIpKTsKICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgICAgfQoKICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlvbiBtYWMgIk1BQ19BRERSRVNTX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgTUFDX0FERFJfQVJSQVkocERlc3RNYWNBZGRyZXNzLT5ieXRlcykpKTsKCiAgICAgIGlmICh2b3NfaXNfbWFjYWRkcl9icm9hZGNhc3QoIHBEZXN0TWFjQWRkcmVzcyApIHx8IHZvc19pc19tYWNhZGRyX2dyb3VwKHBEZXN0TWFjQWRkcmVzcykpCiAgICAgIHsKICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIG1jL2JjIHN0YXRpb24KICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX0JDTUNfU1RBX0lEOwogICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgIiVzOiBCQy9NQyBwYWNrZXQsIGlkICVkIiwgX19mdW5jX18sIFdMQU5fUlhfQkNNQ19TVEFfSUQpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgaWYgKHZvc19pc19tYWNhZGRyX2VxdWFsKHBEZXN0TWFjQWRkcmVzcywgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTZWxmTUFDQWRkcmVzcykpCiAgICAgICAgIHsKICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gaXMgQVAgaXRzZWxmCiAgICAgICAgICAgIHVjRGVzU1RBSWQgPSBXTEFOX1JYX1NBUF9TRUxGX1NUQV9JRDsKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgICAgICIlczogcGFja2V0IHRvIEFQIGl0c2VsZiwgaWQgJWQiLCBfX2Z1bmNfXywgV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICgoIFdMQU5fTUFYX1NUQV9DT1VOVCA8PSB1Y0Rlc1NUQUlkICkgfHwgKE5VTEwgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNEZXNTVEFJZF0tPnVjRXhpc3RzID09IDApKQogICAgICAgICB7CiAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHN0YXRpb24gaXMgc29tZXRoaW5nIGVsc2UKICAgICAgICAgICAgVExMT0c0KFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9IRERfU09GVEFQLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19MT1csCiAgICAgICAgICAgICAgICAgIiVzOiBnZXQgYW4gc3RhdGlvbiBpbmRleCBsYXJnZXIgdGhhbiBXTEFOX01BWF9TVEFfQ09VTlQgJWQiLCBfX2Z1bmNfXywgdWNEZXNTVEFJZCkpOwogICAgICAgICAgICB1Y0Rlc1NUQUlkID0gV0xBTl9SWF9TQVBfU0VMRl9TVEFfSUQ7CiAgICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAvL2xvb3BiYWNrIHVuaWNhc3Qgc3RhdGlvbiBjb21lcyBoZXJlCiAgICAgIH0KCiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSAodl9VOF90KShTVEFNZXRhSW5mbyAmIFdMQU5UTF9BQ19NQVNLKTsKICAgICAgd1J4TWV0YUluZm8udWNEZXNTVEFJZCA9IHVjRGVzU1RBSWQ7CiAgICAgCiAgICAgIHZvc1N0YXR1cyA9IHBDbGllbnRTVEEtPnBmblNUQVJ4KCBwdm9zR0N0eCwgdm9zRGF0YUJ1ZmYsIHVjRGVzU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndSeE1ldGFJbmZvICk7CiAgICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICAgIHsKICAgICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBmYWlsZWQgdG8gc2VuZCBwa3QgdG8gSEREIikpOwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKCiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgICB9CiAgICAgIHZvc0RhdGFCdWZmID0gdm9zTmV4dERhdGFCdWZmOwogICB9CiAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhBdXRoCgogIERFU0NSSVBUSU9OCiAgICBSZWNlaXZlIGluIGF1dGhlbnRpY2F0ZWQgc3RhdGUgLSBhbGwgZGF0YSBhbGxvd2VkCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbiBiZWluZyBwcm9jZXNzZWQKICAgdm9zRGF0YUJ1ZmY6ICAgcG9pbnRlciB0byB0aGUgcnggdm9zIGJ1ZmZlcgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeEF1dGgKKAogIHZfUFZPSURfdCAgICAgcHZvc0dDdHgsCiAgdl9VOF90ICAgICAgICB1Y1NUQUlkLAogIHZvc19wa3RfdCoqICAgcHZvc0RhdGFCdWZmLAogIHZfQk9PTF90ICAgICAgYkZvcndhcmRJQVBQd2l0aExMQwopCnsKICAgV0xBTlRMX0NiVHlwZSogICAgICAgICAgIHBUTENiID0gTlVMTDsKICAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICAgIHBDbGllbnRTVEEgPSBOVUxMOwogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNBc2Y7IC8qIEFNU0RVIHN1YiBmcmFtZSAqLwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNNUERVRE9mZnNldDsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjTVBEVUhPZmZzZXQ7CiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c01QRFVMZW47CiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuOwogICB2X1UxNl90ICAgICAgICAgICAgICAgICAgdXNBY3R1YWxITGVuID0gMDsgICAKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjVGlkOwojaWZkZWYgRkVBVFVSRV9XTEFOX1dBUEkKICAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gMDsKI2VuZGlmCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1c1BrdExlbjsKICAgdm9zX3BrdF90KiAgICAgICAgICAgICAgIHZvc0RhdGFCdWZmIDsKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgIGF1Y0JESGVhZGVyOwogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzOwogICBXTEFOVExfUnhNZXRhSW5mb1R5cGUgICAgd1J4TWV0YUluZm87CiAgIHN0YXRpYyB2X1U4X3QgICAgICAgICAgICB1Y1BNUERVSExlbjsKICAgdl9VMzJfdCogICAgICAgICAgICAgICAgICBTVEFNZXRhSW5mb1B0cjsKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgIHVjRXNmPTA7IC8qIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIGZsYWcgKi8KICAgdl9VNjRfdCAgICAgICAgICAgICAgICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyPTA7IC8qY3VycmVudCByZXBsYXkgY291bnRlciovCiAgIHZfVTY0X3QgICAgICAgICAgICAgICAgICB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXI9MDsgLypwcmV2aW91cyByZXBsYXkgY291bnRlciovCiAgIHZfVTE2X3QgICAgICAgICAgICAgICAgICB1Y1VuaWNhc3RCcm9hZGNhc3RUeXBlPTA7IC8qSXQgZGVub3RlcyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lIGlzIFVDIG9yIEJDKi8KICAgc3RydWN0IF9CQVJGcm1TdHJ1Y3QgICAgICpwQmFyRnJhbWUgPSBOVUxMOwoKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICgoIE5VTEwgPT0gcHZvc0RhdGFCdWZmICkgfHwgKCBOVUxMID09ICggdm9zRGF0YUJ1ZmYgPSAqcHZvc0RhdGFCdWZmICkpKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeEF1dGgiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX1NUQVJ4QXV0aCIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBXREFfRFNfUGVla1J4UGFja2V0SW5mbyggdm9zRGF0YUJ1ZmYsICh2X1BWT0lEX3QpJmF1Y0JESGVhZGVyLCAwICk7CgogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVET2Zmc2V0ID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0RBVEFfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKICB1c01QRFVMZW4gICAgID0gKHZfVTE2X3QpV0RBX0dFVF9SWF9NUERVX0xFTihhdWNCREhlYWRlcik7CiAgdWNNUERVSExlbiAgICA9ICh2X1U4X3QpV0RBX0dFVF9SWF9NUERVX0hFQURFUl9MRU4oYXVjQkRIZWFkZXIpOwogIHVjVGlkICAgICAgICAgPSAodl9VOF90KVdEQV9HRVRfUlhfVElEKGF1Y0JESGVhZGVyKTsKCiAgLyogRml4IGZvciBhIGhhcmR3YXJlIGJ1Zy4gCiAgICogSC9XIGRvZXMgbm90IHVwZGF0ZSB0aGUgdGlkIGZpZWxkIGluIEJEIGhlYWRlciBmb3IgQkFSIGZyYW1lcy4KICAgKiBGaXggaXMgdG8gcmVhZCB0aGUgdGlkIGZpZWxkIGZyb20gTUFDIGhlYWRlciBvZiBCQVIgZnJhbWUgKi8KICBpZiggKFdEQV9HRVRfUlhfVFlQRShhdWNCREhlYWRlcikgPT0gU0lSX01BQ19DVFJMX0ZSQU1FKSAmJgogICAgICAoV0RBX0dFVF9SWF9TVUJUWVBFKGF1Y0JESGVhZGVyKSA9PSBTSVJfTUFDX0NUUkxfQkFSKSkKICB7CiAgICAgIHBCYXJGcmFtZSA9IChzdHJ1Y3QgX0JBUkZybVN0cnVjdCAqKShXREFfR0VUX1JYX01BQ19IRUFERVIoYXVjQkRIZWFkZXIpKTsKICAgICAgdWNUaWQgPSBwQmFyRnJhbWUtPmJhckNvbnRyb2wubnVtVElEOwogIH0KCiAgLypIb3N0IGJhc2VkIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgZm9yIHVuaWNhc3QgZGF0YSBmcmFtZXMqLwogIHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUgID0gKHZfVTE2X3QpV0RBX0lTX1JYX0JDQVNUKGF1Y0JESGVhZGVyKTsKICBpZigwICE9IHVjTVBEVUhMZW4pCiAgewogICAgdWNQTVBEVUhMZW4gPSB1Y01QRFVITGVuOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOkJEIGhlYWRlciBwcm9jZXNzaW5nIGRhdGE6IEhPICVkIERPICVkIExlbiAlZCBITGVuICVkIgogICAgICAgICAgICAgIiBUaWQgJWQgQkQgJWQiLAogICAgICAgICAgICAgdWNNUERVSE9mZnNldCwgdXNNUERVRE9mZnNldCwgdXNNUERVTGVuLCB1Y01QRFVITGVuLCB1Y1RpZCwKICAgICAgICAgICAgIFdMQU5IQUxfUlhfQkRfSEVBREVSX1NJWkUpKTsKCiAgdm9zX3BrdF9nZXRfcGFja2V0X2xlbmd0aCggdm9zRGF0YUJ1ZmYsICZ1c1BrdExlbik7CgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19UcmltUnhQYWNrZXRJbmZvKCB2b3NEYXRhQnVmZiApICkKICB7CiAgICBpZigoV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpICYmICFXREFfR0VUX1JYX0VTRihhdWNCREhlYWRlcikpKQogIHsKICAgIC8qIEFNU0RVIGNhc2UsIHVjTVBEVUhPZmZzZXQgPSAwCiAgICAgKiBpdCBzaG91bGQgYmUgaGFuY2RsZWQgc2VwZXJhdGx5ICovCiAgICBpZigoIHVzTVBEVURPZmZzZXQgPiAgdWNNUERVSE9mZnNldCApICYmCiAgICAgICAoIHVzTVBEVUxlbiAgICAgPj0gdWNNUERVSExlbiApICYmICggdXNQa3RMZW4gPj0gdXNNUERVTGVuICkgJiYKICAgICAgICggIVdMQU5UTF9USURfSU5WQUxJRCh1Y1RpZCkgKSkKICAgIHsKICAgICAgICB1Y01QRFVIT2Zmc2V0ID0gdXNNUERVRE9mZnNldCAtIFdMQU5UTF9NUERVX0hFQURFUl9MRU47IAogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgIldMQU4gVEw6QkQgaGVhZGVyIGNvcnJ1cHRlZCAtIGRyb3BwaW5nIHBhY2tldCIpKTsKICAgIC8qIERyb3AgcGFja2V0ICovCiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICB9CiAgfQoKI2lmZGVmIEZFQVRVUkVfV0xBTl9XQVBJCiAgaWYgKCBwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzV2FwaVN0YSApCiAgewogICAgdm9zU3RhdHVzID0gV0xBTlRMX0dldEV0aGVyVHlwZShhdWNCREhlYWRlciwgdm9zRGF0YUJ1ZmYsIHVjTVBEVUhMZW4sICZ1c0V0aGVyVHlwZSk7CiAgICBpZiggVk9TX0lTX1NUQVRVU19TVUNDRVNTKHZvc1N0YXR1cykgKQogICAgewogICAgICBpZiAoIFdMQU5UTF9MTENfV0FJX1RZUEUgID09IHVzRXRoZXJUeXBlICkKICAgICAgeyAgICAgICAgCiAgICAgICAgaWYgKCAhKCBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikpICkKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOldBSSBmcmFtZSB3YXMgcmVjZWl2ZWQgZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgLypUZW1wb3JhcnkgZml4IGFkZGVkIHRvIGZpeCB3YXBpIHJla2V5IGlzc3VlKi8KICAgICAgICAgIC8vdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgIC8vcmV0dXJuIHZvc1N0YXR1czsgLy9yZXR1cm5pbmcgc3VjY2VzcwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBpZiAoICBXTEFOSEFMX1JYX0lTX1VOUFJPVEVDVEVEX1dQSV9GUkFNRShhdWNCREhlYWRlcikgKSAKICAgICAgICB7CiAgICAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICJXTEFOIFRMOk5vbi1XQUkgZnJhbWUgd2FzIHJlY2VpdmVkIHVuZW5jcnlwdGVkIC0gZHJvcHBpbmciKSk7CiAgICAgICAgICAvKiBEcm9wIHBhY2tldCAqLwogICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsgCiAgICAgICAgICByZXR1cm4gdm9zU3RhdHVzOyAvL3JldHVybmluZyBzdWNjZXNzCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIC8vY291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIC0gdGhpcyBzaG91bGQgbm90IGhhcHBlbgogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6Q291bGQgbm90IGV4dHJhY3QgRXRoZXJUeXBlIikpOwogICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgIHJldHVybiB2b3NTdGF0dXM7IC8vcmV0dXJuaW5nIGZhaWx1cmUKICAgIH0KICB9CiNlbmRpZiAvKiBGRUFUVVJFX1dMQU5fV0FQSSAqLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEluY3JlbWVudCByZWNlaXZlIGNvdW50ZXIKICAgICEhIG5vdCBzdXJlIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgdG8gaW5jcmVhc2UgdGhpcyAtIHBrdCBtaWdodCBiZQogICAgZHJvcHBlZCBiZWxvdyBvciBkZWxheWVkIGluIFRMJ3MgcXVldWVzCiAgICAtIHdpbGwgbGVhdmUgaXQgaGVyZSBmb3Igbm93CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAhV0xBTlRMX1RJRF9JTlZBTElEKCB1Y1RpZCkgKSAKICB7CiAgICBwQ2xpZW50U1RBLT5hdVJ4Q291bnRbdWNUaWRdKys7CiAgfQogIGVsc2UKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCB0aWQgICVkIChTdGF0aW9uIElEICVkKSBvbiAlcyIsCiAgICAgICAgICAgdWNUaWQsIHVjU1RBSWQsIF9fZnVuY19fKSk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgQU1TRFUgYW5kIHNlbmQgZm9yIHByb2Nlc3NpbmcgaWYgc28KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y0FzZiA9ICh2X1U4X3QpV0RBX0dFVF9SWF9BU0YoYXVjQkRIZWFkZXIpOwoKICBpZiAoIDAgIT0gdWNBc2YgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlBhY2tldCBpcyBBTVNEVSBzdWIgZnJhbWUgLSBzZW5kaW5nIGZvciBjb21wbGV0aW9uIikpOwogICAgdm9zU3RhdHVzID0gV0xBTlRMX0FNU0RVUHJvY2VzcyggcHZvc0dDdHgsICZ2b3NEYXRhQnVmZiwgYXVjQkRIZWFkZXIsIHVjU1RBSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCB1c01QRFVMZW4gKTsKICAgIGlmKE5VTEwgPT0gdm9zRGF0YUJ1ZmYpCiAgICB7CiAgICAgICAvL1BhY2tldCBpcyBhbHJlYWR5IGZyZWVkCiAgICAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogICAgfQogIH0KICAvKiBBZnRlciBBTVNEVSBoZWFkZXIgaGFuZGxlZAogICAqIEFNU0RVIGZyYW1lIGp1c3Qgc2FtZSB3aXRoIG5vcm1hbCBmcmFtZXMgKi8KICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBUcmFuc2xhdGluZyBoZWFkZXIgaWYgbmVjZXNhcnkKICAgICAgICEhIEZpeCBtZTogcm12IGNvbW1lbnRzIGJlbG93CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCAwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikgKSAmJgogICAgICAoIDAgIT0gcENsaWVudFNUQS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSAmJgogICAgICAoIFdMQU5UTF9JU19EQVRBX0ZSQU1FKFdEQV9HRVRfUlhfVFlQRV9TVUJUWVBFKGF1Y0JESGVhZGVyKSkgKSkKICB7CiAgICBpZigwID09IHVjTVBEVUhMZW4pCiAgICB7CiAgICAgIHVjTVBEVUhMZW4gPSB1Y1BNUERVSExlbjsKICAgIH0KICAgIGlmICh1c01QRFVET2Zmc2V0ID4gdWNNUERVSE9mZnNldCkKICAgIHsKICAgICAgdXNBY3R1YWxITGVuID0gdXNNUERVRE9mZnNldCAtIHVjTVBEVUhPZmZzZXQ7CiAgICB9CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIoIHZvc0RhdGFCdWZmLCAmdm9zU3RhdHVzLCB1c0FjdHVhbEhMZW4sIAogICAgICAgICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLCBwVExDYiwgdWNTVEFJZCwgYkZvcndhcmRJQVBQd2l0aExMQyk7CgogICAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gdHJhbnNsYXRlIGZyb20gODAyLjExIHRvIDgwMi4zIC0gZHJvcHBpbmciKSk7CiAgICAgICAgLyogRHJvcCBwYWNrZXQgKi8KICAgICAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQodm9zRGF0YUJ1ZmYpOwogICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICAgIH0KICAgIH0KICAgIC8qIFNvZnRhcCByZXF1aXJlcyBhZGRpdGlvbmFsIEluZm8gc3VjaCBhcyBEZXN0aW5hdGlvbiBTVEFJRCBhbmQgQWNjZXNzCiAgICAgICBDYXRlZ29yeS4gVm9zY2hhaW4gb3IgQnVmZmVyIHJldHVybmVkIGJ5IEJBIHdvdWxkIGJlIHVuY2hhaW4gYW5kIHRoaXMKICAgICAgIE1ldGEgRGF0YSB3b3VsZCBoZWxwIGluIHJvdXRpbmcgdGhlIHBhY2tldHMgdG8gYXBwcm9wcmlhdGUgRGVzdGluYXRpb24gKi8KICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgICBTVEFNZXRhSW5mb1B0ciA9ICh2X1UzMl90ICopKHVpbnRwdHJfdCkodWNUaWQgfCAoV0RBX0dFVF9SWF9BRERSM19JRFgoYXVjQkRIZWFkZXIpIDw8IFdMQU5UTF9TVEFJRF9PRkZTRVQpKTsKICAgICAgIHZvc19wa3Rfc2V0X3VzZXJfZGF0YV9wdHIoIHZvc0RhdGFCdWZmLCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdClTVEFNZXRhSW5mb1B0cik7CiAgICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayB0byBzZWUgaWYgcmUtb3JkZXJpbmcgc2Vzc2lvbiBpcyBpbiBwbGFjZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggMCAhPSBwQ2xpZW50U1RBLT5hdGxCQVJlb3JkZXJJbmZvW3VjVGlkXS51Y0V4aXN0cyApCiAgewogICAgV0xBTlRMX01TRFVSZW9yZGVyKCBwVExDYiwgJnZvc0RhdGFCdWZmLCBhdWNCREhlYWRlciwgdWNTVEFJZCwgdWNUaWQgKTsKICB9CgppZigwID09IHVjVW5pY2FzdEJyb2FkY2FzdFR5cGUKI2lmZGVmIEZFQVRVUkVfT05fQ0hJUF9SRU9SREVSSU5HCiAgICYmIChXTEFOSEFMX0lzT25DaGlwUmVvcmRlcmluZ0VuYWJsZWRGb3JUSUQocHZvc0dDdHgsIHVjU1RBSWQsIHVjVGlkKSAhPSBUUlVFKQojZW5kaWYKKQp7CiAgLyogcmVwbGF5IGNoZWNrIGNvZGUgOiBjaGVjayB3aGV0aGVyIHJlcGxheSBjaGVjayBpcyBuZWVkZWQgb3Igbm90ICovCiAgaWYoVk9TX1RSVUUgPT0gcENsaWVudFNUQS0+dWNJc1JlcGxheUNoZWNrVmFsaWQpCiAgewogICAgICAvKiByZXBsYXkgY2hlY2sgaXMgbmVlZGVkIGZvciB0aGUgc3RhdGlvbiAqLwoKICAgICAgLyogY2hlY2sgd2hldGhlciBmcmFtZSBpcyBBTVNEVSBmcmFtZSAqLwogICAgICBpZiAoIDAgIT0gdWNBc2YgKQogICAgICB7CiAgICAgICAgICAvKiBTaW5jZSB2aXJnbyBjYW4ndCBzZW5kIEFNU0RVIGZyYW1lcyB0aGlzIGxlZyBvZiB0aGUgY29kZSAKICAgICAgICAgICAgIHdhcyBub3QgdGVzdGVkIHByb3Blcmx5LCBpdCBuZWVkcyB0byBiZSB0ZXN0ZWQgcHJvcGVybHkqLwogICAgICAgICAgLyogRnJhbWUgaXMgQU1TRFUgZnJhbWUuIEFzIHBlciA4MDIuMTFuIG9ubHkgZmlyc3QKICAgICAgICAgICAgIHN1YmZyYW1lIHdpbGwgaGF2ZSByZXBsYXkgY291bnRlciAqLwogICAgICAgICAgdWNFc2YgPSAgV0RBX0dFVF9SWF9FU0YoIGF1Y0JESGVhZGVyICk7CiAgICAgICAgICBpZiggMCAhPSB1Y0VzZiApCiAgICAgICAgICB7CiAgICAgICAgICAgICAgdl9CT09MX3Qgc3RhdHVzOwogICAgICAgICAgICAgIC8qIEdldHRpbmcgNDgtYml0IHJlcGxheSBjb3VudGVyIGZyb20gdGhlIFJYIEJEICovCiAgICAgICAgICAgICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSBXREFfRFNfR2V0UmVwbGF5Q291bnRlcihhdWNCREhlYWRlcik7CiAKICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvKiBHZXR0aW5nIDQ4LWJpdCBwcmV2aW91cyByZXBsYXkgY291bnRlciBmcm9tIFRMIGNvbnRyb2wgIGJsb2NrICovCiAgICAgICAgICAgICAgdWxscHJldmlvdXNSZXBsYXlDb3VudGVyID0gcENsaWVudFNUQS0+dWxsUmVwbGF5Q291bnRlclt1Y1RpZF07CgogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBBTVNEVSBwcmV2aW91c1JlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgIC8qIEl0IGlzIGZpcnN0IHN1YmZyYW1lIG9mIEFNU0RVIHRodXMgaXQKICAgICAgICAgICAgICAgICBjb25hdGFpbnMgcmVwbGF5IGNvdW50ZXIgcGVyZm9ybSB0aGUKICAgICAgICAgICAgICAgICByZXBsYXkgY2hlY2sgZm9yIHRoaXMgZmlyc3Qgc3ViZnJhbWUqLwogICAgICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAiV0xBTiBUTDogQU1TRFUgdG90YWwgZHJvcHBlZCByZXBsYXkgcGFja2V0cyBvbiBTVEEgSUQgJVggaXMgWzB4JVhdIiwKICAgICAgICAgICAgICAgICAgdWNTVEFJZCwgIHBDbGllbnRTVEEtPnVsVG90YWxSZXBsYXlQYWNrZXRzRGV0ZWN0ZWQpOwoKICAgICAgICAgICAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCiAgICAgICAgICAgICAgICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgIHZfQk9PTF90IHN0YXR1czsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgICAgICAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IFdEQV9EU19HZXRSZXBsYXlDb3VudGVyKGF1Y0JESGVhZGVyKTsKCiAgICAgICAgICAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GTywKICAgICAgICAgICAgICJXTEFOIFRMOiBOb24tQU1TRFUgY3VycmVudFJlcGxheUNvdW50ZXIgWzB4JWxsWF0iLHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogR2V0dGluZyA0OC1iaXQgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgZnJvbSBUTCBjb250cm9sICBibG9jayAqLwogICAgICAgICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA9IHBDbGllbnRTVEEtPnVsbFJlcGxheUNvdW50ZXJbdWNUaWRdOwoKICAgICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIHByZXZpb3VzUmVwbGF5Q291bnRlciBbMHglbGxYXSIsdWxscHJldmlvdXNSZXBsYXlDb3VudGVyKTsKCiAgICAgICAgICAgLyogSXQgaXMgbm90IEFNU0RVIGZyYW1lIHNvIHBlcmZvcm0gCiAgICAgICAgICAgICAgcmVhcGx5IGNoZWNrIGZvciBlYWNoIHBhY2tldCwgYXMKICAgICAgICAgICAgICBlYWNoIHBhY2tldCBjb250YWlucyB2YWxpZCByZXBsYXkgY291bnRlciovIAogICAgICAgICAgIHN0YXR1cyA9ICBXTEFOVExfSXNSZXBsYXlQYWNrZXQoIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyLCB1bGxwcmV2aW91c1JlcGxheUNvdW50ZXIpOwogICAgICAgICAgIGlmKFZPU19GQUxTRSA9PSBzdGF0dXMpCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogTm90IGEgcmVwbGF5IHBha2V0LCB1cGRhdGUgcHJldmlvdXMgcmVwbGF5IGNvdW50ZXIgaW4gVEwgQ0IgKi8gICAgCiAgICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bGxSZXBsYXlDb3VudGVyW3VjVGlkXSA9IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDogTm9uLUFNU0RVIERyb3AgdGhlIHJlcGxheSBwYWNrZXQgd2l0aCBQTiA6IFsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CgogICAgICAgICAgICAgICBwQ2xpZW50U1RBLT51bFRvdGFsUmVwbGF5UGFja2V0c0RldGVjdGVkKys7CiAgICAgICAgICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6IE5vbi1BTVNEVSB0b3RhbCBkcm9wcGVkIHJlcGxheSBwYWNrZXRzIG9uIFNUQSBJRCAlWCBpcyBbMHglWF0iLAogICAgICAgICAgICAgICAgdWNTVEFJZCwgcENsaWVudFNUQS0+dWxUb3RhbFJlcGxheVBhY2tldHNEZXRlY3RlZCk7CgogICAgICAgICAgICAgICAvKiBSZXBhbHkgcGFja2V0LCBkcm9wIHRoZSBwYWNrZXQgKi8KICAgICAgICAgICAgICAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KHZvc0RhdGFCdWZmKTsKICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgICAgICB9CiAgICAgIH0KICB9Cn0KLypJdCBpcyBhIGJyb2FkYXN0IHBhY2tldCBEUFUgaGFzIGFscmVhZHkgZG9uZSByZXBsYXkgY2hlY2sgZm9yIAogIGJyb2FkY2FzdCBwYWNrZXRzIG5vIG5lZWQgdG8gZG8gcmVwbGF5IGNoZWNrIG9mIHRoZXNlIHBhY2tldHMqLwoKICBpZiAoIE5VTEwgIT0gdm9zRGF0YUJ1ZmYgKQogIHsKICAgIGlmKCBXTEFOX1NUQV9TT0ZUQVAgPT0gcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUpCiAgICB7CiAgICAgIFdMQU5UTF9Gd2RQa3RUb0hERCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHdSeE1ldGFJbmZvLnVjVVAgPSB1Y1RpZDsKICAgICAgd1J4TWV0YUluZm8ucnNzaUF2ZyA9IHBDbGllbnRTVEEtPnJzc2lBdmc7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgICBpZiAoV0xBTl9TVEFfVERMUyA9PSBwQ2xpZW50U1RBLT53U1RBRGVzYy53U1RBVHlwZSkKICAgICAgewogICAgICAgICAgd1J4TWV0YUluZm8uaXNTdGFUZGxzID0gVFJVRTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIHdSeE1ldGFJbmZvLmlzU3RhVGRscyA9IEZBTFNFOwogICAgICB9CiNlbmRpZgogICAgICBwQ2xpZW50U1RBLT5wZm5TVEFSeCggcHZvc0dDdHgsIHZvc0RhdGFCdWZmLCB1Y1NUQUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3UnhNZXRhSW5mbyApOwogICAgfQogIH0vKiBpZiBub3QgTlVMTCAqLwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4QXV0aCAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfU1RBUnhEaXNjCgogIERFU0NSSVBUSU9OCiAgICBSZWNlaXZlIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZSAtIG5vIGRhdGEgYWxsb3dlZAoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBTVEEgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggVEwgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgSU4KICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgdWNTVEFJZDogICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIHN0YXRpb24gYmVpbmcgcHJvY2Vzc2VkCiAgIHZvc0RhdGFCdWZmOiAgIHBvaW50ZXIgdG8gdGhlIHJ4IHZvcyBidWZmZXIKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfU1RBUnhEaXNjCigKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QqKiAgIHB2b3NEYXRhQnVmZiwKICB2X0JPT0xfdCAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoKCBOVUxMID09IHB2b3NEYXRhQnVmZiApIHx8ICggTlVMTCA9PSAgKnB2b3NEYXRhQnVmZiApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9TVEFSeERpc2MiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVycm9yIC0gZHJvcCBwYWNrZXQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAiV0xBTiBUTDpQYWNrZXQgc2hvdWxkIG5vdCBiZSByZWNlaXZlZCBpbiBzdGF0ZSBkaXNjb25uZWN0ZWQiCiAgICAgICAgICAgICAiIC0gZHJvcHBpbmciKSk7CiAgdm9zX3BrdF9yZXR1cm5fcGFja2V0KCpwdm9zRGF0YUJ1ZmYpOwogICpwdm9zRGF0YUJ1ZmYgPSBOVUxMOwoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX1NUQVJ4RGlzYyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBQcm9jZXNzaW5nIG1haW4gbG9vcHMgZm9yIE1BSU4gYW5kIFRYIHRocmVhZHMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX01jUHJvY2Vzc01zZwoKICBERVNDUklQVElPTgogICAgQ2FsbGVkIGJ5IFZPU1Mgd2hlbiBhIG1lc3NhZ2Ugd2FzIHNlcmlhbGl6ZWQgZm9yIFRMIHRocm91Z2ggdGhlCiAgICBtYWluIHRocmVhZC90YXNrLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICBtZXNzYWdlOiAgICAgICAgdHlwZSBhbmQgY29udGVudCBvZiB0aGUgbWVzc2FnZQoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9GQVVMVDogICBwb2ludGVyIHRvIFRMIGNiIGlzIE5VTEwgOyBhY2Nlc3Mgd291bGQgY2F1c2UgYQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgZmF1bHQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWNQcm9jZXNzTXNnCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4LAogIHZvc19tc2dfdCogICAgICAgbWVzc2FnZQopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdEFkZEJBSW5kKiAgICAgIHB0QWRkQmFJbmQgPSBOVUxMOwogICB0RGVsQkFJbmQqICAgICAgcHREZWxCYUluZCA9IE5VTEw7CiAgIHRBZGRCQVJzcCogICAgICBwdEFkZEJhUnNwID0gTlVMTDsKICAgdm9zX21zZ190ICAgICAgIHZvc01lc3NhZ2U7CiAgIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXM7CiAgIHRwRmx1c2hBQ1JzcCBGbHVzaEFDUnNwUHRyOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc01haW5NZXNzYWdlIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfVExfRkxVU0hfQUNfUlNQOgogICAgLy8gRXh0cmFjdCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIGJvZHkKICAgIEZsdXNoQUNSc3BQdHIgPSAodHBGbHVzaEFDUnNwKShtZXNzYWdlLT5ib2R5cHRyKTsKICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbCBiYWNrIGZ1bmN0aW9uIGlzIG5vdCBudWxsLgogICAgaWYgKCBOVUxMID09IHBUTENiLT50bEJBUENsaWVudC5wZm5GbHVzaE9wQ29tcGxldGVDYiApCiAgICB7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBwZm5GbHVzaE9wQ29tcGxldGVDYiIpKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0KCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICJSZWNlaXZlZCBtZXNzYWdlOiAgRmx1c2ggY29tcGxldGUgcmVjZWl2ZWQgYnkgVEwiKSk7CgogICAgLy8gU2luY2Ugd2UgaGF2ZSB0aGUgcmVzcG9uc2UgYmFjayBmcm9tIEhBTCwganVzdCBjYWxsIHRoZSBCQVAgY2xpZW50CiAgICAvLyByZWdpc3RlcmVkIGNhbGwgYmFjayBmcm9tIFRMLiBUaGVyZSBpcyBvbmx5IDEgcG9zc2libGUKICAgIC8vIEJBUCBjbGllbnQuIFNvIGRpcmVjdGx5IHJlZmVyZW5jZSB0bEJBUENsaWVudAogICAgcFRMQ2ItPnRsQkFQQ2xpZW50LnBmbkZsdXNoT3BDb21wbGV0ZUNiKCBwdm9zR0N0eCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNTVEFJZCwKICAgICAgICAgICAgRmx1c2hBQ1JzcFB0ci0+dWNUaWQsIEZsdXNoQUNSc3BQdHItPnN0YXR1cyApOwoKICAgIC8vIEZyZWUgdGhlIFBBTCBtZW1vcnksIHdlIGFyZSBkb25lIHdpdGggaXQuCiAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgIkZsdXNoIGNvbXBsZXRlIHJlY2VpdmVkIGJ5IFRMOiBGcmVlaW5nICVwIiwgRmx1c2hBQ1JzcFB0cikpOwogICAgdm9zX21lbV9mcmVlKCh2X1ZPSURfdCAqKUZsdXNoQUNSc3BQdHIpOwogICAgYnJlYWs7CgogIGNhc2UgV0RBX0hERF9BRERCQV9SRVE6CiAgIHB0QWRkQmFJbmQgPSAodEFkZEJBSW5kKikobWVzc2FnZS0+Ym9keXB0cik7CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfQmFTZXNzaW9uQWRkKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhU2Vzc2lvbklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNUQUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLmJhVElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9VMzJfdClwdEFkZEJhSW5kLT5iYVNlc3Npb24uYmFCdWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEFkZEJhSW5kLT5iYVNlc3Npb24ud2luU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRBZGRCYUluZC0+YmFTZXNzaW9uLlNTTik7CiAgICBwdEFkZEJhUnNwID0gdm9zX21lbV9tYWxsb2Moc2l6ZW9mKCpwdEFkZEJhUnNwKSk7CgogICAgaWYgKCBOVUxMID09IHB0QWRkQmFSc3AgKQogICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogZmF0YWwgZmFpbHVyZSwgY2Fubm90IGFsbG9jYXRlIEJBIFJzcCBzdHJ1Y3R1cmUiKSk7CiAgICAgIFZPU19BU1NFUlQoMCk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfTk9NRU07CiAgICB9CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgPT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIHN1Y2Nlc3MgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKICAgICAgLypTZW5kIHN1Y2Nlc3MqLwogICAgICBwdEFkZEJhUnNwLT5tZXNnVHlwZSAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgICB2b3NNZXNzYWdlLnR5cGUgICAgICAgICA9IFdEQV9IRERfQUREQkFfUlNQOwogICAgfQogICAgZWxzZQogICAgewogICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kaW5nIGZhaWx1cmUgaW5kaWNhdGlvbiB0byBIQUwgZm9yIEFERCBCQSIpKTsKCiAgICAgIC8qU2VuZCBmYWlsdXJlKi8KICAgICAgcHRBZGRCYVJzcC0+bWVzZ1R5cGUgICAgPSBXREFfQkFfRkFJTF9JTkQ7CiAgICAgIHZvc01lc3NhZ2UudHlwZSAgICAgICAgID0gV0RBX0JBX0ZBSUxfSU5EOwogICAgfQoKICAgIHB0QWRkQmFSc3AtPm1lc2dMZW4gICAgID0gc2l6ZW9mKHRBZGRCQVJzcCk7CiAgICBwdEFkZEJhUnNwLT5iYVNlc3Npb25JRCA9IHB0QWRkQmFJbmQtPmJhU2Vzc2lvbi5iYVNlc3Npb25JRDsKICAgICAgLyogVGhpcyBpcyBkZWZhdWx0LCByZXBseSB3aW4gc2l6ZSBoYXMgdG8gYmUgaGFuZGxlZCBCQSBtb2R1bGUsIEZJWCBUSElTICovCiAgICAgIHB0QWRkQmFSc3AtPnJlcGx5V2luU2l6ZSA9IFdMQU5UTF9NQVhfV0lOU0laRTsKICAgIHZvc01lc3NhZ2UuYm9keXB0ciA9IHB0QWRkQmFSc3A7CgogICAgdm9zX21xX3Bvc3RfbWVzc2FnZSggVk9TX01RX0lEX1dEQSwgJnZvc01lc3NhZ2UgKTsKICAgIFdMQU5UTF9NY0ZyZWVNc2cgKHB2b3NHQ3R4LCBtZXNzYWdlKTsKICBicmVhazsKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICBwdERlbEJhSW5kID0gKHREZWxCQUluZCopKG1lc3NhZ2UtPmJvZHlwdHIpOwogICAgdm9zU3RhdHVzICA9IFdMQU5UTF9CYVNlc3Npb25EZWwocHZvc0dDdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIGRlbCBCQSBzZXNzaW9uIFNUQTolZCBUSUQ6JWQgU3RhdHVzIDolZCIsCiAgICAgICAgICAgICAgIHB0RGVsQmFJbmQtPnN0YUlkeCwKICAgICAgICAgICAgICAgcHREZWxCYUluZC0+YmFUSUQsCiAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgfQogICAgV0xBTlRMX01jRnJlZU1zZyAocHZvc0dDdHgsIG1lc3NhZ2UpOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qbm8gcHJvY2Vzc2luZyBmb3Igbm93Ki8KICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9Qcm9jZXNzTWFpbk1lc3NhZ2UgKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfTWNGcmVlTXNnCgogIERFU0NSSVBUSU9OCiAgICBDYWxsZWQgYnkgVk9TUyB0byBmcmVlIGEgZ2l2ZW4gVEwgbWVzc2FnZSBvbiB0aGUgTWFpbiB0aHJlYWQgd2hlbiB0aGVyZQogICAgYXJlIG1lc3NhZ2VzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBpcyBiZWVuIHJlc2V0LgogICAgRm9yIG5vdywgVEwgZG9lcyBub3QgYWxsb2NhdGUgYW55IGJvZHkgc28gdGhpcyBmdW5jdGlvbiBzaG91dCB0cmFuc2xhdGUKICAgIGludG8gYSBOT09QCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9NY0ZyZWVNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfTWNGcmVlTXNnIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9NY0ZyZWVNc2ciKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDpSZWNlaXZlZCBtZXNzYWdlOiAlZCB0aHJvdWdoIG1haW4gZnJlZSIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXREFfSEREX0FEREJBX1JFUToKICBjYXNlIFdEQV9ERUxFVEVCQV9JTkQ6CiAgICAvKnZvcyBmcmVlIGJvZHkgcG9pbnRlciovCiAgICB2b3NfbWVtX2ZyZWUobWVzc2FnZS0+Ym9keXB0cik7CiAgICBtZXNzYWdlLT5ib2R5cHRyID0gTlVMTDsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKm5vIHByb2Nlc3NpbmcgZm9yIG5vdyovCiAgICBicmVhazsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKldMQU5UTF9NY0ZyZWVNc2cqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9UeFByb2Nlc3NNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHdoZW4gYSBtZXNzYWdlIHdhcyBzZXJpYWxpemVkIGZvciBUTCB0aHJvdWdoIHRoZQogICAgdHggdGhyZWFkL3Rhc2suCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIG1lc3NhZ2U6ICAgICAgICB0eXBlIGFuZCBjb250ZW50IG9mIHRoZSBtZXNzYWdlCgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UeFByb2Nlc3NNc2cKKAogIHZfUFZPSURfdCAgICAgICAgcHZvc0dDdHgsCiAgdm9zX21zZ190KiAgICAgICBtZXNzYWdlCikKewogICBWT1NfU1RBVFVTICAgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1UzMl90ICAgICAgICAgdURhdGE7CiAgIHZfVThfdCAgICAgICAgICB1Y1NUQUlkOyAKICAgdl9VOF90ICAgICAgICAgIHVjVWNhc3RTaWc7CiAgIHZfVThfdCAgICAgICAgICB1Y0JjYXN0U2lnOwogICB2b2lkICgqY2FsbGJhY2tSb3V0aW5lKSAodm9pZCAqY2FsbGJhY2tDb250ZXh0KTsKICAgdm9pZCAqY2FsbGJhY2tDb250ZXh0OwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IG1lc3NhZ2UgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUHJvY2VzcyBtZXNzYWdlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOlJlY2VpdmVkIG1lc3NhZ2U6ICVkIHRocm91Z2ggdHggZmxvdyIsIG1lc3NhZ2UtPnR5cGUpKTsKCiAgc3dpdGNoKCBtZXNzYWdlLT50eXBlICkKICB7CiAgY2FzZSBXTEFOVExfVFhfU0lHX1NVU1BFTkQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfU3VzcGVuZENCKCBwdm9zR0N0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9TdXNwZW5kQ0JUeXBlKW1lc3NhZ2UtPmJvZHlwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPnJlc2VydmVkKTsKICAgIGJyZWFrOwogIGNhc2UgV0xBTlRMX1RYX1JFU19ORUVERUQ6CiAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0VHhSZXNvdXJjZXNDQiggcHZvc0dDdHggKTsKICAgICBicmVhazsKICAKICBjYXNlIFdMQU5UTF9UWF9GV0RfQ0FDSEVEOgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBUaGUgZGF0YSBzZW50IHdpdGggdGhlIG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOiAKICAgICAgIHwgMDAgfCB1Y0JjYXN0U2lnbmF0dXJlIHwgdWNVY2FzdFNpZ25hdHVyZSB8IHVjU1RBSUQgfAogICAgICAgZWFjaCBmaWVsZCBhYm92ZSBpcyBvbmUgYnl0ZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHVEYXRhICAgICAgID0gbWVzc2FnZS0+Ym9keXZhbDsKICAgIHVjU1RBSWQgICAgID0gKCB1RGF0YSAmIDB4MDAwMDAwRkYpOyAKICAgIHVjVWNhc3RTaWcgID0gKCB1RGF0YSAmIDB4MDAwMEZGMDApPj44OyAKICAgIHVjQmNhc3RTaWcgID0gKHZfVThfdCkoKCB1RGF0YSAmIDB4MDBGRjAwMDApPj4xNik7IAogICAgdm9zU3RhdHVzICAgPSBXTEFOVExfRm9yd2FyZFNUQUZyYW1lcyggcHZvc0dDdHgsIHVjU1RBSWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNVY2FzdFNpZywgdWNCY2FzdFNpZyk7CiAgICBicmVhazsKICBjYXNlIFdEQV9EU19UWF9TVEFSVF9YTUlUOgogICAgICBXTEFOVExfQ2xlYXJUeFhtaXRQZW5kaW5nKHB2b3NHQ3R4KTsKICAgICAgdm9zU3RhdHVzID0gV0RBX0RTX1R4RnJhbWVzKCBwdm9zR0N0eCApOwogICAgICBicmVhazsKCiAgY2FzZSBXREFfRFNfRklOSVNIX1VMQToKICAgIGNhbGxiYWNrQ29udGV4dCA9IG1lc3NhZ2UtPmJvZHlwdHI7CiAgICBjYWxsYmFja1JvdXRpbmUgPSBtZXNzYWdlLT5jYWxsYmFjazsKICAgIGlmICggTlVMTCAhPSBjYWxsYmFja1JvdXRpbmUgKQogICAgewogICAgICBjYWxsYmFja1JvdXRpbmUoY2FsbGJhY2tDb250ZXh0KTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIFdMQU5UTF9UWF9TTkFQU0hPVDoKICAgIC8qRHVtcGluZyBUTCBTdGF0ZSBhbmQgdGhlbiBjb250aW51aW5nIHRvIHByaW50CiAgICAgIHRoZSBEWEUgRHVtcCovCiAgICBXTEFOVExfVHhUaHJlYWREZWJ1Z0hhbmRsZXIocHZvc0dDdHgpOwogICAgV0RBX1RyYW5zcG9ydENoYW5uZWxEZWJ1ZyhOVUxMLCBWT1NfVFJVRSwgVk9TX0ZBTFNFKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgLypubyBwcm9jZXNzaW5nIGZvciBub3cqLwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gdm9zU3RhdHVzOwp9LyogV0xBTlRMX1R4UHJvY2Vzc01zZyAqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9NY0ZyZWVNc2cKCiAgREVTQ1JJUFRJT04KICAgIENhbGxlZCBieSBWT1NTIHRvIGZyZWUgYSBnaXZlbiBUTCBtZXNzYWdlIG9uIHRoZSBNYWluIHRocmVhZCB3aGVuIHRoZXJlCiAgICBhcmUgbWVzc2FnZXMgcGVuZGluZyBpbiB0aGUgcXVldWUgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGlzIGJlZW4gcmVzZXQuCiAgICBGb3Igbm93LCBUTCBkb2VzIG5vdCBhbGxvY2F0ZSBhbnkgYm9keSBzbyB0aGlzIGZ1bmN0aW9uIHNob3V0IHRyYW5zbGF0ZQogICAgaW50byBhIE5PT1AKCiAgREVQRU5ERU5DSUVTCiAgICBUaGUgVEwgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICAgSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MKICAgICAgICAgICAgICAgICAgICBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdHMgY29udGV4dAogICAgbWVzc2FnZTogICAgICAgIHR5cGUgYW5kIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UKCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICAgRXZlcnl0aGluZyBpcyBnb29kIDopCgogIFNJREUgRUZGRUNUUwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX1R4RnJlZU1zZwooCiAgdl9QVk9JRF90ICAgICAgICBwdm9zR0N0eCwKICB2b3NfbXNnX3QqICAgICAgIG1lc3NhZ2UKKQp7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qTm90aGluZyB0byBkbyBmb3Igbm93ISEhKi8KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LypXTEFOVExfVHhGcmVlTXNnKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgRlVOQ1RJT04gICAgV0xBTlRMX1R4RkNGcmFtZQoKICBERVNDUklQVElPTgogICAgSW50ZXJuYWwgdXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIEZDIGZyYW1lLiBFbmFibGUKICAgIG9yIGRpc2FibGUgTFdNIG1vZGUgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uLgoKICBERVBFTkRFTkNJRVMKICAgIFRMIG11c3QgYmUgaW5pdGlhaWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkLgogICAgRlcgc2VuZHMgdXAgc3BlY2lhbCBmbG93IGNvbnRyb2wgZnJhbWUuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICAgSW5wdXQgcG9pbnRlcnMgYXJlIE5VTEwuCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICAgU29tZXRoaW5nIGlzIHdyb25nLgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZC4KCiAgU0lERSBFRkZFQ1RTCiAgICBOZXdseSBmb3JtZWQgRkMgZnJhbWUgaXMgZ2VuZXJhdGVkIGFuZCB3YWl0cyB0byBiZSB0cmFuc21pdHRlZC4gUHJldmlvdXNseSB1bnNlbnQgZnJhbWUgd2lsbAogICAgYmUgcmVsZWFzZWQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhGQ0ZyYW1lCigKICB2X1BWT0lEX3QgICAgICAgcHZvc0dDdHgKKQp7CiNpZiAwCiAgV0xBTlRMX0NiVHlwZSogICAgICBwVExDYiA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXM7CiAgdHBIYWxGY1R4QmQgICAgICAgICBwdkZjVHhCZCA9IE5VTEw7CiAgdm9zX3BrdF90ICogICAgICAgICBwUGFja2V0ID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgICAgIHVjU1RBSWQgPSAwOwogIHZfVThfdCAgICAgICAgICAgICAgdWNCaXRDaGVjayA9IDE7CgogIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBTZW5kIEZDIGZyYW1lICVzIiwgX19mdW5jX18pOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwdm9zR0N0eCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciAlcyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgaWYgKE5VTEwgPT0gcFRMQ2IpCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOkludmFsaWQgcG9pbnRlciBpbiAlcyBcbiIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KICAKICAvL0dldCBvbmUgdm9zcyBwYWNrZXQKICB2b3NTdGF0dXMgPSB2b3NfcGt0X2dldF9wYWNrZXQoICZwUGFja2V0LCBWT1NfUEtUX1RZUEVfVFhfODAyXzExX01HTVQsIHNpemVvZih0SGFsRmNUeEJkKSwgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19GQUxTRSwgTlVMTCwgTlVMTCApOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICB2b3NTdGF0dXMgPSB2b3NfcGt0X3Jlc2VydmVfaGVhZCggcFBhY2tldCwgKHZvaWQgKikmcHZGY1R4QmQsIHNpemVvZih0SGFsRmNUeEJkKSk7CgogIGlmKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIiVzOiBmYWlsZWQgdG8gcmVzZXJ2ZSBGQyBUWCBCRCAlZFxuIixfX2Z1bmNfXywgc2l6ZW9mKHRIYWxGY1R4QmQpKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvL0dlbmVyYXRlIG1vc3QgcmVjZW50IHRsRkNJbmZvLiBNb3N0IGZpZWxkcyBhcmUgY29ycmVjdC4KICBwVExDYi0+dGxGQ0luZm8uZmNTVEFUaHJlc2hFbmFibGVkTWFzayA9IDA7CiAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVHhNb3JlRGF0YU1hc2sgPSAwOwogIGZvciggdWNTVEFJZCA9IDAsIHVjQml0Q2hlY2sgPSAxIDsgdWNTVEFJZCA8IFdMQU5fTUFYX1NUQV9DT1VOVDsgdWNCaXRDaGVjayA8PD0gMSwgdWNTVEFJZCArKykKICB7CiAgICBpZiAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0V4aXN0cykKICAgIHsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVjUGt0UGVuZGluZykKICAgIHsKICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVHhNb3JlRGF0YU1hc2sgfD0gdWNCaXRDaGVjazsKICAgIH0KCiAgICBpZiAoIChwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bU1vZGVFbmFibGVkKSAmJgogICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0uYm11TWVtQ29uc3VtZWQgPiBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51THdtVGhyZXNob2xkKSkKICAgIHsKICAgICAgcFRMQ2ItPnRsRkNJbmZvLmZjU1RBVGhyZXNoRW5hYmxlZE1hc2sgfD0gdWNCaXRDaGVjazsKCiAgICAgIHBUTENiLT50bEZDSW5mby5mY1NUQVRocmVzaFt1Y1NUQUlkXSA9ICh0QU5JX1U4KXBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLnVMd21UaHJlc2hvbGQ7CgogICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS51Y0x3bUV2ZW50UmVwb3J0ZWQgPSBGQUxTRTsKICAgIH0KCiAgfQogIAogIC8vcmVxdWVzdCBpbW1lZGlhdGUgZmVlZGJhY2sKICBwVExDYi0+dGxGQ0luZm8uZmNDb25maWcgfD0gMHg0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgLy9maWxsIGluIEJEIHRvIHNlbnQKICB2b3NTdGF0dXMgPSBXTEFOSEFMX0ZpbGxGY1R4QmQocHZvc0dDdHgsICZwVExDYi0+dGxGQ0luZm8sICh2b2lkICopcHZGY1R4QmQpOwoKICBpZiggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICIlczogRmlsbCBGQyBUWCBCRCB1bnN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQoIHBQYWNrZXQgKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoTlVMTCAhPSBwVExDYi0+dm9zVHhGQ0J1ZikKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICIlczogUHJldmlvdXMgRkMgVFggQkQgbm90IHNlbnRcbiIsIF9fZnVuY19fKSk7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnZvc1R4RkNCdWYpOwogIH0KCiAgcFRMQ2ItPnZvc1R4RkNCdWYgPSBwUGFja2V0OwoKICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCBwUGFja2V0LCBWT1NfUEtUX1VTRVJfREFUQV9JRF9UTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpV0xBTlRMX1R4Q29tcERlZmF1bHRDYik7CiAgdm9zU3RhdHVzID0gV0RBX0RTX1N0YXJ0WG1pdChwdm9zR0N0eCk7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOiBzZW5kIEZDIGZyYW1lIGxlYXZlICVzIiwgX19mdW5jX18pKTsKI2VuZGlmCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfR2V0VHhSZXNvdXJjZXNDQgoKICBERVNDUklQVElPTgogICAgUHJvY2Vzc2luZyBmdW5jdGlvbiBmb3IgUmVzb3VyY2UgbmVlZGVkIHNpZ25hbC4gQSByZXF1ZXN0IHdpbGwgYmUgaXNzdWVkCiAgICB0byBCQUwgdG8gZ2V0IG1vcmUgdHggcmVzb3VyY2VzLgoKICBERVBFTkRFTkNJRVMKICAgIFRoZSBUTCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CgoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19FX0ZBVUxUOiAgIHBvaW50ZXIgdG8gVEwgY2IgaXMgTlVMTCA7IGFjY2VzcyB3b3VsZCBjYXVzZSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBPdGhlciB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGFzIGEgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgcGxlYXNlIGNoZWNrCiAgY29ycmVzcG9uZGluZyBBUEkgZm9yIG1vcmUgaW5mby4KICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRUeFJlc291cmNlc0NCCigKICB2X1BWT0lEX3QgICAgICAgIHB2b3NHQ3R4CikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYiAgICAgID0gTlVMTDsKICB2X1UzMl90ICAgICAgICAgdVJlc0NvdW50ICA9IFdEQV9UTElfTUlOX1JFU19EQVRBOwogIFZPU19TVEFUVVMgICAgICB2b3NTdGF0dXMgID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIHZfVThfdCAgICAgICAgICB1Y01nbXQgICAgID0gMDsKICB2X1U4X3QgICAgICAgICAgdWNCQVAgICAgICA9IDA7CiAgdl9VOF90ICAgICAgICAgIHVjRGF0YSAgICAgPSAwOwojaWZkZWYgV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4KICB0QnNzU3lzdGVtUm9sZSBzeXN0ZW1Sb2xlOwogIHRwQW5pU2lyR2xvYmFsIHBNYWM7CiNlbmRpZgogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCBvbiIKICAgICAgICAgICAgICAgIiBXTEFOVExfUHJvY2Vzc1R4TWVzc2FnZSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgR2V0IHR4IHJlc291cmNlcyBmcm9tIEJBTAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IFdEQV9EU19HZXRUeFJlc291cmNlcyggcHZvc0dDdHgsICZ1UmVzQ291bnQgKTsKCiAgaWYgKCAoVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cykgJiYgKFZPU19TVEFUVVNfRV9SRVNPVVJDRVMgIT0gdm9zU3RhdHVzKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOlRMIGZhaWxlZCB0byBnZXQgcmVzb3VyY2VzIGZyb20gQkFMLCBFcnI6ICVkIiwKICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CiAgICByZXR1cm4gdm9zU3RhdHVzOwogIH0KCiAgLyogQ3VycmVudGx5IG9ubHkgTGludXggQkFMIHJldHVybnMgdGhlIEVfUkVTT1VSQ0VTIGVycm9yIGNvZGUgd2hlbiBpdCBpcyBydW5uaW5nIAogICAgIG91dCBvZiBCRC9QRFVzLiBUbyBtYWtlIHVzZSBvZiB0aGlzIGludGVycnVwdCBmb3IgdGhyb3VnaHB1dCBlbmhhbmNlbWVudCwgc2ltaWxhcgogICAgIGNoYW5nZXMgc2hvdWxkIGJlIGRvbmUgaW4gQkFMIGNvZGUgb2YgQU1TUyBhbmQgV00gKi8KICBpZiAoVk9TX1NUQVRVU19FX1JFU09VUkNFUyA9PSB2b3NTdGF0dXMpCiAgewojaWZkZWYgVk9MQU5TX1BFUkYKICAgICBXTEFOSEFMX0VuYWJsZUlkbGVCZFBkdUludGVycnVwdChwdm9zR0N0eCwgKHRBTklfVTgpYmRQZHVJbnRlcnJ1cHRHZXRUaHJlc2hvbGQpOwogICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6IEVuYWJsaW5nIElkbGUgQkQvUERVIGludGVycnVwdCwgQ3VycmVudCByZXNvdXJjZXMgPSAlZCIsIHVSZXNDb3VudCk7CiNlbHNlCiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiNlbmRpZgogIH0KCiAgcFRMQ2ItPnVSZXNDb3VudCA9IHVSZXNDb3VudDsKICAKCiNpZmRlZiBXTEFOX1NPRlRBUF9GTE9XQ1RSTF9FTgogIC8qIEZJWE1FOiBkaXNhYmxlZCBzaW5jZSBjcmVhdGluZyBpc3N1ZXMgaW4gcG93ZXItc2F2ZSwgbmVlZHMgdG8gYmUgYWRkcmVzc2VkICovIAogIHBUTENiLT5zZW5kRkNGcmFtZSArKzsKICBwTWFjID0gdm9zX2dldF9jb250ZXh0KFZPU19NT0RVTEVfSURfV0RBLCBwdm9zR0N0eCk7CiAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CiAgaWYgKGVTWVNURU1fQVBfUk9MRSA9PSBzeXN0ZW1Sb2xlKQogIHsKICAgICBpZiAocFRMQ2ItPnNlbmRGQ0ZyYW1lICUgMTYgPT0gMCkKICAgICB7CiAgICAgICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiVHJhbnNtaXQgRkMiKSk7CiAgICAgICAgIFdMQU5UTF9UeEZDRnJhbWUgKHB2b3NHQ3R4KTsKICAgICB9IAogIH0KI2VuZGlmIC8vV0xBTl9TT0ZUQVBfRkxPV0NUUkxfRU4gCgogIHVjRGF0YSA9ICggcFRMQ2ItPnVSZXNDb3VudCA+PSAgV0RBX1RMSV9NSU5fUkVTX0RBVEEgKTsKICB1Y0JBUCAgPSAoIHBUTENiLT51UmVzQ291bnQgPj0gIFdEQV9UTElfTUlOX1JFU19CQVAgKSAmJgogICAgICAgICAgICggTlVMTCAhPSBwVExDYi0+dGxCQVBDbGllbnQudm9zUGVuZGluZ0RhdGFCdWZmICk7CiAgdWNNZ210ID0gKCBwVExDYi0+dVJlc0NvdW50ID49ICBXREFfVExJX01JTl9SRVNfTUYgKSAmJgogICAgICAgICAgICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApOwoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6IEV2YWwgUmVzdW1lIHR4IFJlczogJWQgREFUQTogJWQgQkFQOiAlZCBNR01UOiAlZCIsCiAgICAgICAgICAgICBwVExDYi0+dVJlc0NvdW50LCB1Y0RhdGEsIHVjQkFQLCB1Y01nbXQpKTsKCiAgaWYgKCggMCA9PSBwVExDYi0+dWNUeFN1c3BlbmRlZCApICYmCiAgICAgICgoIDAgIT0gdWNEYXRhICkgfHwgKCAwICE9IHVjTWdtdCApIHx8ICggMCAhPSB1Y0JBUCApICkgKQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAgIklzc3VpbmcgWG1pdCBzdGFydCByZXF1ZXN0IHRvIEJBTCBmb3IgYXZhaWwgcmVzIFNZTkMiKSk7CiAgICB2b3NTdGF0dXMgPVdEQV9EU19TdGFydFhtaXQocHZvc0dDdHgpOwogIH0KICByZXR1cm4gdm9zU3RhdHVzOwp9LypXTEFOVExfR2V0VHhSZXNvdXJjZXNDQiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFV0aWxpdHkgZnVuY3Rpb25zCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlcgoKICBERVNDUklQVElPTgogICAgSW5saW5lIGZ1bmN0aW9uIGZvciB0cmFuc2xhdGluZyBhbmQgODAyLjExIGhlYWRlciBpbnRvIGFuIDgwMi4zIGhlYWRlci4KCiAgREVQRU5ERU5DSUVTCgoKICBQQVJBTUVURVJTCgogICBJTgogICAgcFRMQ2I6ICAgICAgICAgICAgVEwgY29udHJvbCBibG9jawogICBJTi9PVVQgCiAgICB1Y1N0YUlkOiAgICAgICAgICBzdGF0aW9uIElELiBJbmNhc2Ugb2YgVERMUywgdGhpcyByZXR1cm5zIGFjdHVhbCBURExTCiAgICAgICAgICAgICAgICAgICAgICBzdGF0aW9uIElEIHVzZWQKCiAgIElOL09VVAogICAgdm9zRGF0YUJ1ZmY6ICAgICAgdm9zIGRhdGEgYnVmZmVyLCB3aWxsIGNvbnRhaW4gdGhlIG5ldyBoZWFkZXIgb24gb3V0cHV0CgogICBPVVQKICAgIHB2b3NTdGF0dXM6ICAgICAgIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uCgogIFJFVFVSTiBWQUxVRQoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICAgIE90aGVyIGVycm9yIGNvZGVzIG1pZ2h0IGJlIHJldHVybmVkIGZyb20gdGhlIHZvcyBhcGkgdXNlZCBpbiB0aGUgZnVuY3Rpb24KICAgIHBsZWFzZSBjaGVjayB0aG9zZSByZXR1cm4gdmFsdWVzLgoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlcgooCiAgdm9zX3BrdF90KiAgICAgIHZvc0RhdGFCdWZmLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIFdMQU5UTF9DYlR5cGUqICBwVExDYiwKICB2X1U4X3QgICAgICAgICAgKnB1Y1N0YUlkLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUgKnRsTWV0YUluZm8sCiAgdl9VOF90ICAgICAgICAgICp1Y1dEU0VuYWJsZWQsCiAgdl9VOF90ICAgICAgICAgICpleHRyYUhlYWRTcGFjZQopCnsKICBXTEFOVExfODAyM0hlYWRlclR5cGUgIHc4MDIzSGVhZGVyOwogIFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKnB3ODAyMTFIZWFkZXI7IC8vIEFsbG9jYXRlIGFuIGFsaWduZWQgQkQgYW5kIHRoZW4gZmlsbCBpdC4gCiAgVk9TX1NUQVRVUyAgICAgICAgICAgICB2b3NTdGF0dXM7CiAgdl9VOF90ICAgICAgICAgICAgICAgICBNYW5kYXRvcnl1Y0hlYWRlclNpemUgPSBXTEFOODAyMTFfTUFOREFUT1JZX0hFQURFUl9TSVpFOwogIHZfVThfdCAgICAgICAgICAgICAgICAgdWNIZWFkZXJTaXplID0gMDsKICB2X1ZPSURfdCAgICAgICAgICAgICAgICpwcHZCREhlYWRlciA9IE5VTEw7CiAgV0xBTlRMX1NUQUNsaWVudFR5cGUqICBwQ2xpZW50U1RBID0gTlVMTDsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjUW9TT2Zmc2V0ID0gV0xBTjgwMjExX01BTkRBVE9SWV9IRUFERVJfU0laRTsKICB2X1U4X3QgICAgICAgICAgICAgICAgIHVjU3RhSWQ7CiNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYX1VQTE9BRAogIHZfQk9PTF90ICAgICAgICAgICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfRkFMU0U7CiAgdl9TSVpFX3QgICAgICAgICAgICAgICB3SUFQUFNuYXBTaXplID0gV0xBTlRMX0xMQ19IRUFERVJfTEVOOwogIHZfVThfdCAgICAgICAgICAgICAgICAgd0lBUFBTbmFwW1dMQU5UTF9MTENfSEVBREVSX0xFTl0gPSB7MH07CiNlbmRpZgogICp1Y1dEU0VuYWJsZWQgPSAwOyAvLyBkZWZhdWx0IFdEUyBvZmYuCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wb3BfaGVhZCggdm9zRGF0YUJ1ZmYsICZ3ODAyM0hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodzgwMjNIZWFkZXIpKTsKCiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOiBQYWNrZXQgcG9wIGhlYWRlciBmYWlscyBvbiBXTEFOVExfVHJhbnNsYXRlODAyM1RvODAyMTFIZWFkZXIiKSk7CiAgICAgcmV0dXJuIHZvc1N0YXR1czsKICB9CgogIGlmKCBOVUxMID09IHB1Y1N0YUlkICkKICB7CiAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICJXTEFOIFRMOiBJbnZhbGlkIHBvaW50ZXIgZm9yIFN0YUlkIikpOwogICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQogIHVjU3RhSWQgPSAqcHVjU3RhSWQ7CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwoKICBpZiAoIFdMQU5fU1RBX0lORlJBID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU3RhSWRdLT53U1RBRGVzYy53U1RBVHlwZQogICAgICAmJiBwVExDYi0+dWNUZGxzUGVlckNvdW50ICkKICB7CiAgICB2X1U4X3QgdWNJbmRleCA9IDA7CiAgICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1NUQV9DT1VOVCA7IHVjSW5kZXgrKykKICAgIHsKICAgICAgaWYgKCB1Y0luZGV4ICE9IHVjU3RhSWQgJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0gJiYgcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPnVjRXhpc3RzICYmCiAgICAgICAgICAocFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0tPnRsU3RhdGUgPT0gV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEKSAmJgogICAgICAgICAgKCFwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y0luZGV4XS0+dWNUeFN1c3BlbmRlZCkgJiYKICAgICAgICAgIHZvc19tZW1fY29tcGFyZSggKHZvaWQqKXBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcy5ieXRlcywKICAgICAgICAgICAgKHZvaWQqKXc4MDIzSGVhZGVyLnZEQSwgNikgKQogICAgICB7CiAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fTE9XLAogICAgICAgICAgICAgICJXTEFOIFRMOiBHb3QgYSBURExTIHN0YXRpb24uIFVzaW5nIHRoYXQgaW5kZXgiKSk7CiAgICAgICAgdWNTdGFJZCA9IHVjSW5kZXg7CiAgICAgICAgKnB1Y1N0YUlkID0gdWNTdGFJZDsKICAgICAgICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTdGFJZF07CiAgICAgICAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogICAgICAgIHsKICAgICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiNlbmRpZgoKI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FECmlmICgoMCA9PSB3ODAyM0hlYWRlci51c0xlblR5cGUpICYmIChwQ2xpZW50U1RBLT53U1RBRGVzYy51Y0lzQ2N4U3RhKSkKewogICAgdm9zX3BrdF9leHRyYWN0X2RhdGEodm9zRGF0YUJ1ZmYsMCwmd0lBUFBTbmFwWzBdLCZ3SUFQUFNuYXBTaXplKTsKICAgIGlmICh2b3NfbWVtX2NvbXBhcmUod0lBUFBTbmFwLFdMQU5UTF9BSVJPTkVUX1NOQVBfSEVBREVSLFdMQU5UTF9MTENfSEVBREVSX0xFTikpCiAgICB7CiAgICAgICAgLypUaGUgU05BUCBhbmQgdGhlIHByb3RvY29sIHR5cGUgYXJlIGFscmVhZHkgaW4gdGhlIGRhdGEgYnVmZmVyLgogICAgICAgICBUaGV5IGFyZSBmaWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uICh3cGFfc3VwcGxpY2FudCkuIFNvLCBTa2lwIEFkZGluZyBMTEMgYmVsb3cuKi8KICAgICAgICAgYklBUFBUeHdpdGhMTEMgPSBWT1NfVFJVRTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBiSUFQUFR4d2l0aExMQyA9IFZPU19GQUxTRTsKICAgIH0KfQojZW5kaWYgLyogRkVBVFVSRV9XTEFOX0NDWF9VUExPQUQgKi8KCiAgaWYgKCgwICE9IHBDbGllbnRTVEEtPndTVEFEZXNjLnVjQWRkUm12TExDKQojaWZkZWYgRkVBVFVSRV9XTEFOX0NDWF9VUExPQUQKICAgICAgJiYgKCFiSUFQUFR4d2l0aExMQykKI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FEICovCiAgICAgKQogIHsKICAgIC8qIFB1c2ggdGhlIGxlbmd0aCAqLwogICAgdm9zU3RhdHVzID0gdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSwgc2l6ZW9mKHc4MDIzSGVhZGVyLnVzTGVuVHlwZSkpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBldGhlciB0eXBlIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgojaWZkZWYgQlRBTVBfVEVTVAogICAgLy8gVGhlIFNUQSBzaWRlIHdpbGwgZXhlY3V0ZSB0aGlzLCBhIGhhY2sgdG8gdGVzdCBCVEFNUCBieSB1c2luZyB0aGUKICAgIC8vIGluZnJhIHNldHVwLiBPbiByZWFsIEJUQU1QIHRoaXMgd2lsbCBjb21lIGZyb20gQkFQIGl0c2VsZi4KICAgIHsKICAgIHN0YXRpYyB2X1U4X3QgV0xBTlRMX0JUX0FNUF9MTENfSEVBREVSW10gPSAgezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MTksIDB4NTggfTsKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBXTEFOVExfQlRfQU1QX0xMQ19IRUFERVIsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdMQU5UTF9CVF9BTVBfTExDX0hFQURFUikpOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFBhY2tldCBwdXNoIExMQyBoZWFkZXIgZmFpbHMgb24iCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogICAgICAgcmV0dXJuIHZvc1N0YXR1czsKICAgIH0KICAgIH0KI2Vsc2UKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcHVzaF9oZWFkKHZvc0RhdGFCdWZmLCBXTEFOVExfTExDX0hFQURFUiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0xBTlRMX0xMQ19IRUFERVIpKTsKCiAgICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBQYWNrZXQgcHVzaCBMTEMgaGVhZGVyIGZhaWxzIG9uIgogICAgICAgICAgICAgICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciIpKTsKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CiNlbmRpZgogIH0vKklmIGFkZCBMTEMgaXMgZW5hYmxlZCovCiAgZWxzZQogIHsKI2lmZGVmIEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FECiAgICAgIGJJQVBQVHh3aXRoTExDID0gVk9TX0ZBTFNFOyAvKlJlc2V0IHRoZSBGbGFnIGhlcmUgdG8gc3RhcnQgYWZyZXNoIHdpdGggdGhlIG5leHQgVFggcGt0Ki8KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FEICovCiAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJXTEFOIFRMOiBTVEEgQ2xpZW50IHJlZ2lzdGVyZWQgdG8gbm90IHJlbW92ZSBMTEMiCiAgICAgICAgICAgICAgICAgICIgV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyIikpOwogIH0KCiNpZmRlZiBCVEFNUF9URVNUCiAgcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgPSBXTEFOX1NUQV9CVF9BTVA7CiNlbmRpZgoKICAvLyBGaW5kIHRoZSBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIDgwMi4xMSBoZWFkZXIgZm9ybWF0CiAgLy8gYmFzZWQgb24gdGhlIGZyYW1lIGNvbnRyb2wgZmllbGRzLgogIHVjSGVhZGVyU2l6ZSA9IE1hbmRhdG9yeXVjSGVhZGVyU2l6ZTsKICBpZiAocENsaWVudFNUQS0+d1NUQURlc2MudWNRb3NFbmFibGVkKQogIHsgIAogICAgdWNIZWFkZXJTaXplICs9IHNpemVvZihwdzgwMjExSGVhZGVyLT51c1Fvc0N0cmwpOwogIH0KICBpZiAocENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfQlRfQU1QKQogIHsgIAogICAgdWNIZWFkZXJTaXplICs9IHNpemVvZihwdzgwMjExSGVhZGVyLT5vcHR2QTQpOwogICAgdWNRb1NPZmZzZXQgKz0gc2l6ZW9mKHB3ODAyMTFIZWFkZXItPm9wdHZBNCk7CiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAiIFdMQU5UTF9UcmFuc2xhdGU4MDIzVG84MDIxMUhlYWRlciA6IEhlYWRlciBzaXplID0gJWQgIiwgdWNIZWFkZXJTaXplKSk7CgogIHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCB2b3NEYXRhQnVmZiwgJnBwdkJESGVhZGVyLCB1Y0hlYWRlclNpemUgKTsKICBpZiAoIE5VTEwgPT0gcHB2QkRIZWFkZXIgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOlZPU1MgcGFja2V0IGNvcnJ1cHRlZCAiKSk7CiAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIHJldHVybiAqcHZvc1N0YXR1czsKICB9CgoKICAvLyBPSyBub3cgd2UgaGF2ZSB0aGUgc3BhY2UuIEZpbGwgdGhlIDgwMjExIGhlYWRlcgogIC8qIEZpbGwgQTIgKi8KICBwdzgwMjExSGVhZGVyID0gKFdMQU5UTF84MDIxMUhlYWRlclR5cGUgKikocHB2QkRIZWFkZXIpOwogIC8vIG9ubHkgY2xlYXIgdGhlIHJlcXVpcmVkIHNwYWNlLgogIHZvc19tZW1fc2V0KCBwdzgwMjExSGVhZGVyLCB1Y0hlYWRlclNpemUsIDAgKTsKICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMiwgdzgwMjNIZWFkZXIudlNBLCAgVk9TX01BQ19BRERSX1NJWkUpOwoKCiNpZmRlZiBGRUFUVVJFX1dMQU5fV0FQSQogIGlmICgoIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlIHx8CiAgICAgICAgcENsaWVudFNUQS0+cHRrSW5zdGFsbGVkICkgJiYgZ1VjSXNXYWkgIT0gMSkKI2Vsc2UKICBpZiAoIFdMQU5UTF9TVEFfQVVUSEVOVElDQVRFRCA9PSBwQ2xpZW50U1RBLT50bFN0YXRlIHx8CiAgICAgICBwQ2xpZW50U1RBLT5wdGtJbnN0YWxsZWQgKQojZW5kaWYKICB7CiAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC53ZXAgPQogICAgICAgICAgICAgICAgIHBDbGllbnRTVEEtPndTVEFEZXNjLnVjUHJvdGVjdGVkRnJhbWU7CiAgfQoKICBwdzgwMjExSGVhZGVyLT51c0R1cmF0aW9uSWQgPSAwOwogIHB3ODAyMTFIZWFkZXItPnVzU2VxQ3RybCAgICA9IDA7CgogIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnR5cGUgICAgID0gV0xBTlRMXzgwMjExX0RBVEFfVFlQRTsKCgoKICBpZihwQ2xpZW50U1RBLT53U1RBRGVzYy51Y1Fvc0VuYWJsZWQpCiAgewogICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5zdWJUeXBlICA9IFdMQU5UTF84MDIxMV9EQVRBX1FPU19TVUJUWVBFOwoKICAgICAgKigodl9VMTZfdCAqKSgodl9VOF90ICopcHB2QkRIZWFkZXIgKyB1Y1FvU09mZnNldCkpID0gdGxNZXRhSW5mby0+dWNVUDsKCiAgfQogIGVsc2UKICB7CiAgICAgIHB3ODAyMTFIZWFkZXItPndGcm1DdHJsLnN1YlR5cGUgID0gMDsKCiAgLy8gTk8gTk8gTk8gLSB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgdG8gd3JpdGUgdGhlIFFPUyBjdHJsICAKICAvLyBmaWVsZCwgaXQgd2lsbCBvdmVyd3JpdGUgdGhlIGZpcnN0IDIgYnl0ZXMgb2YgdGhlIGRhdGEgcGFja2V0KExMQyBoZWFkZXIpCiAgLy8gcHc4MDIxMUhlYWRlci0+dXNRb3NDdHJsICAgICAgICAgPSAwOwogIH0KCgogIHN3aXRjaCggcENsaWVudFNUQS0+d1NUQURlc2Mud1NUQVR5cGUgKQogIHsKICAgICBjYXNlIFdMQU5fU1RBX0lCU1M6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDA7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CgogICAgICAgIC8qCiAgICAgICAgICogSWYgdGhlIGZyYW1lIGlzIGEgbXVsdGljYXN0IGZyYW1lLCB0aGVuLCB0aGUgQWRkcmVzczEKICAgICAgICAgKiBzaG91bGQgYmUgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZmlsbGVkIGluIHRoZSBwYWNrZXQuIFdoaWNoIGlzCiAgICAgICAgICogdGhlIG11bHRpY2FzdCBhZGRyZXNzLiBPdGhlcndpc2UsIHNldCBpdCB0byBCU1NJRAogICAgICAgICAqLwogICAgICAgIGlmICgwID09IHRsTWV0YUluZm8tPnVjQmNhc3QgJiYgMSA9PSB0bE1ldGFJbmZvLT51Y01jYXN0KQogICAgICAgIHsKICAgICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfTUFDQUREUl90KikmdzgwMjNIZWFkZXIudkRBKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB9CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgLAogICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBicmVhazsKCiAgICAgY2FzZSBXTEFOX1NUQV9CVF9BTVA6CiAgICAgICAgKnVjV0RTRW5hYmxlZCA9IDE7IC8vIFdEUyBvbi4KICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMTsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMTsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTEsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMiwKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICB2b3NfY29weV9tYWNhZGRyKCAodl9NQUNBRERSX3QqKSZwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZTVEFNQUNBZGRyZXNzKTsKICAgICAgICAvKiBmaWxsIHRoZSBvcHRpb25hbCBBNCBoZWFkZXIgKi8KICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPm9wdHZBNCwKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJCVEFNUCBDQVNFIE5PVyAtLS0tLS0tLS1zdGFpZD0lZCIsCiAgICAgICAgICAgICAgICAgdWNTdGFJZCkpOwogICAgICAgIGJyZWFrOwoKICAgICBjYXNlIFdMQU5fU1RBX1NPRlRBUDoKICAgICAgICAqdWNXRFNFbmFibGVkID0gMDsgLy8gV0RTIG9mZi4KICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMTsKICAgICAgICAvKkNvcHkgdGhlIERBIHRvIEExKi8KICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMSwgdzgwMjNIZWFkZXIudkRBICwgVk9TX01BQ19BRERSX1NJWkUpOyAgIAogICAgICAgIHZvc19jb3B5X21hY2FkZHIoICh2X01BQ0FERFJfdCopJnB3ODAyMTFIZWFkZXItPnZBMiwKICAgICAgICAgICAgICAmcENsaWVudFNUQS0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzKTsKICAgICAgICB2b3NfbWVtX2NvcHkoIHB3ODAyMTFIZWFkZXItPnZBMywKICAgICAgICAgICAgICB3ODAyM0hlYWRlci52U0EsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJzdyA4MDIgdG8gODAyMTEgc29mdGFwIGNhc2UgIC0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogICAgIGNhc2UgV0xBTl9TVEFfVERMUzoKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC50b0RTICAgICAgICAgID0gMDsKICAgICAgICBwdzgwMjExSGVhZGVyLT53RnJtQ3RybC5mcm9tRFMgICAgICAgID0gMDsKICAgICAgICAvKkZpeCBtZSovCiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsCiAgICAgICAgICAgICAgJnBDbGllbnRTVEEtPndTVEFEZXNjLnZCU1NJRGZvcklCU1MgLAogICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgKCJUTDpURExTIENBU0UgTk9XIC0tLS0tLS0tLXN0YWlkPSVkIiksIHVjU3RhSWQpOwogICAgICAgIGJyZWFrOwojZW5kaWYKICAgICBjYXNlIFdMQU5fU1RBX0lORlJBOgogICAgIGRlZmF1bHQ6CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwudG9EUyAgICAgICAgICA9IDE7CiAgICAgICAgcHc4MDIxMUhlYWRlci0+d0ZybUN0cmwuZnJvbURTICAgICAgICA9IDA7CiAgICAgICAgdm9zX2NvcHlfbWFjYWRkciggKHZfTUFDQUREUl90KikmcHc4MDIxMUhlYWRlci0+dkExLAogICAgICAgICAgICAgICZwQ2xpZW50U1RBLT53U1RBRGVzYy52U1RBTUFDQWRkcmVzcyk7CiAgICAgICAgdm9zX21lbV9jb3B5KCBwdzgwMjExSGVhZGVyLT52QTMsIHc4MDIzSGVhZGVyLnZEQSAsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICJSRUdVTEFSIElORlJBIExJTksgQ0FTRS0tLS0tLS0tLXN0YWlkPSVkIiwKICAgICAgICAgICAgICAgICB1Y1N0YUlkKSk7CiAgICAgICAgYnJlYWs7CiAgfQogIC8vIE9LIG5vdyB3ZSBoYXZlIHRoZSBzcGFjZS4gRmlsbCB0aGUgODAyMTEgaGVhZGVyCiAgLyogRmlsbCBBMiAqLwogIHB3ODAyMTFIZWFkZXIgPSAoV0xBTlRMXzgwMjExSGVhZGVyVHlwZSAqKShwcHZCREhlYWRlcik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjNUbzgwMjExSGVhZGVyKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIEJFR0lOIExPRyBGVU5DVElPTiAgICAhISEgUmVtb3ZlIG1lIG9yIGNsZWFuIG1lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KI2lmIDAgLy9kZWYgV0xBTlRMX0RFQlVHCgojZGVmaW5lIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FICAgIDE2CiNkZWZpbmUgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEUgICAgNAoKc3RhdGljIHZfVk9JRF90IFdMQU5UTF9EZWJ1Z0ZyYW1lCigKICAgdl9QVk9JRF90ICAgZGF0YVBvaW50ZXIsCiAgIHZfVTMyX3QgICAgIGRhdGFTaXplCikKewogICB2X1U4X3QgICBsaW5lQnVmZmVyW1dMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FXTsKICAgdl9VMzJfdCAgbnVtTGluZXM7CiAgIHZfVTMyX3QgIG51bUJ5dGVzOwogICB2X1UzMl90ICBpZHg7CiAgIHZfVThfdCAgICpsaW5lUG9pbnRlcjsKCiAgIG51bUxpbmVzID0gZGF0YVNpemUgLyBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORTsKICAgbnVtQnl0ZXMgPSBkYXRhU2l6ZSAlIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FOwogICBsaW5lUG9pbnRlciA9ICh2X1U4X3QgKilkYXRhUG9pbnRlcjsKCiAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwgIldMQU4gVEw6RnJhbWUgRGVidWcgRnJhbWUgU2l6ZSAlZCwgUG9pbnRlciAweCVwIiwgZGF0YVNpemUsIGRhdGFQb2ludGVyKSk7CiAgIGZvcihpZHggPSAwOyBpZHggPCBudW1MaW5lczsgaWR4KyspCiAgIHsKICAgICAgbWVtc2V0KGxpbmVCdWZmZXIsIDAsIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9MSU5FKTsKICAgICAgbWVtY3B5KGxpbmVCdWZmZXIsIGxpbmVQb2ludGVyLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9TQUwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICJXTEFOIFRMOjB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IDB4JTJ4IiwKICAgICAgICAgICAgICAgICBsaW5lQnVmZmVyWzBdLCBsaW5lQnVmZmVyWzFdLCBsaW5lQnVmZmVyWzJdLCBsaW5lQnVmZmVyWzNdLCBsaW5lQnVmZmVyWzRdLCBsaW5lQnVmZmVyWzVdLCBsaW5lQnVmZmVyWzZdLCBsaW5lQnVmZmVyWzddLAogICAgICAgICAgICAgICAgIGxpbmVCdWZmZXJbOF0sIGxpbmVCdWZmZXJbOV0sIGxpbmVCdWZmZXJbMTBdLCBsaW5lQnVmZmVyWzExXSwgbGluZUJ1ZmZlclsxMl0sIGxpbmVCdWZmZXJbMTNdLCBsaW5lQnVmZmVyWzE0XSwgbGluZUJ1ZmZlclsxNV0pKTsKICAgICAgbGluZVBvaW50ZXIgKz0gV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkU7CiAgIH0KCiAgIGlmKDAgPT0gbnVtQnl0ZXMpCiAgICAgIHJldHVybjsKCiAgIG1lbXNldChsaW5lQnVmZmVyLCAwLCBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfTElORSk7CiAgIG1lbWNweShsaW5lQnVmZmVyLCBsaW5lUG9pbnRlciwgbnVtQnl0ZXMpOwogICBmb3IoaWR4ID0gMDsgaWR4IDwgV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0xJTkUgLyBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURTsgaWR4KyspCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1NBTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiV0xBTiBUTDoweCUyeCAweCUyeCAweCUyeCAweCUyeCIsCiAgICAgICAgICAgICAgICBsaW5lQnVmZmVyW2lkeCAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFXSwgbGluZUJ1ZmZlclsxICsgaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLAogICAgICAgICAgICAgICAgbGluZUJ1ZmZlclsyICsgaWR4ICogV0xBTlRMX0RFQlVHX0ZSQU1FX0JZVEVfUEVSX0JZVEVdLCBsaW5lQnVmZmVyWzMgKyBpZHggKiBXTEFOVExfREVCVUdfRlJBTUVfQllURV9QRVJfQllURV0pKTsKICAgICAgaWYoKChpZHggKyAxKSAqIFdMQU5UTF9ERUJVR19GUkFNRV9CWVRFX1BFUl9CWVRFKSA+PSBudW1CeXRlcykKICAgICAgICAgYnJlYWs7CiAgIH0KCiAgIHJldHVybjsKfQojZW5kaWYKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgRU5EIExPRyBGVU5DVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHRyYW5zbGF0aW5nIGFuZCA4MDIuMTEgaGVhZGVyIGludG8gYW4gODAyLjMgaGVhZGVyLgoKICBERVBFTkRFTkNJRVMKCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICBwVExDYjogICAgICAgICAgICBUTCBjb250cm9sIGJsb2NrCiAgICB1Y1N0YUlkOiAgICAgICAgICBzdGF0aW9uIElECiAgICB1Y0hlYWRlckxlbjogICAgICBMZW5ndGggb2YgdGhlIGhlYWRlciBmcm9tIEJECiAgICB1Y0FjdHVhbEhMZW46ICAgICBMZW5ndGggb2YgaGVhZGVyIGluY2x1ZGluZyBwYWRkaW5nIG9yIGFueSBvdGhlciB0cmFpbGVycwoKICAgSU4vT1VUCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIsIHdpbGwgY29udGFpbiB0aGUgbmV3IGhlYWRlciBvbiBvdXRwdXQKCiAgIE9VVAogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KCiAgIFJFVFVSTiBWQUxVRQoKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCiAgICBWT1NfU1RBVFVTX1NVQ0NFU1M6ICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHJhbnNsYXRlODAyMTFUbzgwMjNIZWFkZXIKKAogIHZvc19wa3RfdCogICAgICB2b3NEYXRhQnVmZiwKICBWT1NfU1RBVFVTKiAgICAgcHZvc1N0YXR1cywKICB2X1UxNl90ICAgICAgICAgdXNBY3R1YWxITGVuLAogIHZfVThfdCAgICAgICAgICB1Y0hlYWRlckxlbiwKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IsCiAgdl9VOF90ICAgICAgICAgIHVjU1RBSWQsCiAgdl9CT09MX3QgICAgICAgIGJGb3J3YXJkSUFQUHdpdGhMTEMKKQp7CiAgV0xBTlRMXzgwMjNIZWFkZXJUeXBlICB3ODAyM0hlYWRlcjsKICBXTEFOVExfODAyMTFIZWFkZXJUeXBlIHc4MDIxMUhlYWRlcjsKICB2X1U4X3QgICAgICAgICAgICAgICAgIGF1Y0xMQ0hlYWRlcltXTEFOVExfTExDX0hFQURFUl9MRU5dOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgdm9zU3RhdHVzOwogIHZfVTE2X3QgICAgICAgICAgICAgICAgdXNEYXRhU3RhcnRPZmZzZXQgPSAwOwogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICBpZiAoIHNpemVvZih3ODAyMTFIZWFkZXIpIDwgdWNIZWFkZXJMZW4gKQogIHsKICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgIldhcm5pbmcgITogQ2hlY2sgdGhlIGhlYWRlciBzaXplIGZvciB0aGUgUnggZnJhbWUgc3RydWN0dXJlPSVkIHJlY2VpdmVkPSVkbiIsCiAgICAgICBzaXplb2YodzgwMjExSGVhZGVyKSwgdWNIZWFkZXJMZW4pKTsKICAgICB1Y0hlYWRlckxlbiA9IHNpemVvZih3ODAyMTFIZWFkZXIpOwogIH0KCiAgLy8gVGhpcyB3aWxsIHRha2UgY2FyZSBvZiBoZWFkZXJzIG9mIGFsbCBzaXplcywgMyBhZGRyZXNzLCAzIGFkZHIgUU9TLAogIC8vIFdEUyBub24tUU9TIGFuZCBXRFMgUW9TIGV0Yy4gV2UgaGF2ZSBzcGFjZSBmb3IgYWxsIGluIHRoZSA4MDIuMTEgaGVhZGVyIHN0cnVjdHVyZS4KICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BvcF9oZWFkKCB2b3NEYXRhQnVmZiwgJnc4MDIxMUhlYWRlciwgdWNIZWFkZXJMZW4pOwoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogRmFpbGVkIHRvIHBvcCA4MDIxMSBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgdm9zU3RhdHVzKSk7CgogICAgIHJldHVybiB2b3NTdGF0dXM7CiAgfQoKICBzd2l0Y2ggKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwuZnJvbURTICkKICB7CiAgY2FzZSAwOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIC8vU29mdEFQIEFQIG1vZGUKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52REEsIHc4MDIxMUhlYWRlci52QTMsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgdm9zX21lbV9jb3B5KCB3ODAyM0hlYWRlci52U0EsIHc4MDIxMUhlYWRlci52QTIsIFZPU19NQUNfQUREUl9TSVpFKTsKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEwgU29mdEFQOiA4MDIgMyBEQSAlMDh4IFNBICUwOHgiLAogICAgICAgICAgICAgICAgICB3ODAyM0hlYWRlci52REEsIHc4MDIzSGVhZGVyLnZTQSkpOwogICAgfQogICAgZWxzZSAKICAgIHsKICAgICAgLyogSUJTUyAqLwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZEQSwgdzgwMjExSGVhZGVyLnZBMSwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgICB2b3NfbWVtX2NvcHkoIHc4MDIzSGVhZGVyLnZTQSwgdzgwMjExSGVhZGVyLnZBMiwgVk9TX01BQ19BRERSX1NJWkUpOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSAxOgogICAgaWYgKCB3ODAyMTFIZWFkZXIud0ZybUN0cmwudG9EUyApCiAgICB7CiAgICAgIC8qIEJULUFNUCBjYXNlICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEyLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBlbHNlCiAgICB7IC8qIEluZnJhICovCiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudkRBLCB3ODAyMTFIZWFkZXIudkExLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICAgIHZvc19tZW1fY29weSggdzgwMjNIZWFkZXIudlNBLCB3ODAyMTFIZWFkZXIudkEzLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgICB9CiAgICBicmVhazsKICB9CgogIGlmKCB1c0FjdHVhbEhMZW4gPiB1Y0hlYWRlckxlbiApCiAgewogICAgIHVzRGF0YVN0YXJ0T2Zmc2V0ID0gdXNBY3R1YWxITGVuIC0gdWNIZWFkZXJMZW47CiAgfQoKICBpZiAoIDAgPCB1c0RhdGFTdGFydE9mZnNldCApCiAgewogICAgdm9zU3RhdHVzID0gdm9zX3BrdF90cmltX2hlYWQoIHZvc0RhdGFCdWZmLCB1c0RhdGFTdGFydE9mZnNldCApOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byB0cmltIGhlYWRlciBmcm9tIHBhY2tldCAlZCIsCiAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwogICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQogIH0KCiAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZiAoIDAgIT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPndTVEFEZXNjLnVjQWRkUm12TExDCiNpZmRlZiBGRUFUVVJFX1dMQU5fQ0NYX1VQTE9BRAogICAgJiYgKCFiRm9yd2FyZElBUFB3aXRoTExDKQojZW5kaWYgLyogIEZFQVRVUkVfV0xBTl9DQ1hfVVBMT0FEICovCiAgICAgKQogIHsKICAgIC8vIEV4dHJhY3QgdGhlIExMQyBoZWFkZXIKICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCBhdWNMTENIZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTExDX0hFQURFUl9MRU4pOwoKICAgIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IHZvc1N0YXR1cyApCiAgICB7CiAgICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICJXTEFOIFRMOiBGYWlsZWQgdG8gcG9wIExMQyBoZWFkZXIgZnJvbSBwYWNrZXQgJWQiLAogICAgICAgICAgICAgICAgICB2b3NTdGF0dXMpKTsKCiAgICAgICByZXR1cm4gdm9zU3RhdHVzOwogICAgfQoKICAgIC8vRXh0cmFjdCB0aGUgbGVuZ3RoCiAgICB2b3NfbWVtX2NvcHkoJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSwKICAgICAgJmF1Y0xMQ0hlYWRlcltXTEFOVExfTExDX0hFQURFUl9MRU4gLSBzaXplb2YodzgwMjNIZWFkZXIudXNMZW5UeXBlKV0sCiAgICAgIHNpemVvZih3ODAyM0hlYWRlci51c0xlblR5cGUpICk7CiAgfQogIGVsc2UKICB7CiAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnc4MDIzSGVhZGVyLnVzTGVuVHlwZSk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzICkKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IEZhaWxlZCB0byBnZXQgcGFja2V0IGxlbmd0aCAlZCIsCiAgICAgICAgICAgICAgICAgIHZvc1N0YXR1cykpOwoKICAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgICB9CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAiV0xBTiBUTDogQlRBTVAgbGVuIChldGhlcnR5cGUpIGZsZCA9ICVkIiwKICAgICAgICB3ODAyM0hlYWRlci51c0xlblR5cGUpKTsKICAgIHc4MDIzSGVhZGVyLnVzTGVuVHlwZSA9IHZvc19jcHVfdG9fYmUxNih3ODAyM0hlYWRlci51c0xlblR5cGUpOwogIH0KCiAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsICZ3ODAyM0hlYWRlciwgc2l6ZW9mKHc4MDIzSGVhZGVyKSk7CgojaWZkZWYgQlRBTVBfVEVTVAogIHsKICAvLyBBUCBzaWRlIHdpbGwgZXhlY3V0ZSB0aGlzLgogIHZfVThfdCAqdGVtcF93ODAyM0hlYWRlciA9IE5VTEw7CiAgdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCAwLAogICAgJnRlbXBfdzgwMjNIZWFkZXIsIHNpemVvZih3ODAyM0hlYWRlcikgKTsKICB9CiNlbmRpZgojaWYgMCAvKlRMX0RFQlVHKi8KICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKHZvc0RhdGFCdWZmLCAmdXNMZW4pOwogIHZvc19wa3RfcG9wX2hlYWQoIHZvc0RhdGFCdWZmLCBhdWNEYXRhLCB1c0xlbik7CgogIFdMQU5UTF9EZWJ1Z0ZyYW1lKGF1Y0RhdGEsIHVzTGVuKTsKCiAgdm9zX3BrdF9wdXNoX2hlYWQodm9zRGF0YUJ1ZmYsIGF1Y0RhdGEsIHVzTGVuKTsKCiNlbmRpZgoKICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX1RyYW5zbGF0ZTgwMjExVG84MDIzSGVhZGVyKi8KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYwoKICBERVNDUklQVElPTgogICAgVXRpbGl0eSBmdW5jdGlvbiB0byBmaW5kIHdoZXRoZXIgcmVjZWl2ZWQgZnJhbWUgaXMgYnJvYWRjYXN0LCBtdWx0aWNhc3QKICAgIG9yIHVuaWNhc3QuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFNUQSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBUTCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgoKICBQQVJBTUVURVJTCgogICBJTgogICBwVExDYjogICAgICAgICAgcG9pbnRlciB0byB0aGUgVEwncyBjb250cm9sIGJsb2NrCiAgIHVjU1RBSWQ6ICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBzdGF0aW9uIGJlaW5nIHByb2Nlc3NlZAogICB2b3NEYXRhQnVmZjogICAgcG9pbnRlciB0byB0aGUgdm9zIGJ1ZmZlcgoKICAgSU4vT1VUCiAgICBwdWNCY01jVWM6ICAgICAgIHBvaW50ZXIgdG8gYnVmZmVyLCB3aWxsIGNvbnRhaW4gZnJhbWUgdHlwZSBvbiByZXR1cm4KCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfRV9CQURNU0c6ICBmYWlsZWQgdG8gZXh0cmFjdCBpbmZvIGZyb20gZGF0YSBidWZmZXIKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBzdWNjZXNzCgogIFNJREUgRUZGRUNUUwogICAgTm9uZS4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMKV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMKKAogIFdMQU5UTF9DYlR5cGUgKnBUTENiLAogIHZfVThfdCAgICAgICAgdWNTVEFJZCwKICB2b3NfcGt0X3QgICAgICp2b3NEYXRhQnVmZiwKICB2X1U4X3QgICAgICAgICpwdWNCY01jVWMKKQp7CiAgIFZPU19TVEFUVVMgICAgdm9zU3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogICB2X1BWT0lEX3QgICAgIGF1Y0JESGVhZGVyOwogICB2X1BWT0lEX3QgICAgIHB2UGVla0RhdGE7CiAgIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBTYW5pdHkgY2hlY2sKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGlmICgoTlVMTCA9PSBwVExDYikgfHwgCiAgICAgICAoTlVMTCA9PSB2b3NEYXRhQnVmZikgfHwgCiAgICAgICAoTlVMTCA9PSBwdWNCY01jVWMpKQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgaW4gV0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMiKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmICggTlVMTCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXSApCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgfQoKICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBFeHRyYWN0IEJEIGhlYWRlciBhbmQgY2hlY2sgaWYgdmFsaWQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHZvc1N0YXR1cyA9IFdEQV9EU19QZWVrUnhQYWNrZXRJbmZvKHZvc0RhdGFCdWZmLCAodl9QVk9JRF90KSZhdWNCREhlYWRlciwgMC8qU3dhcCBCRCovICk7CgogICBpZiAoTlVMTCA9PSBhdWNCREhlYWRlcikKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gQ2Fubm90IGV4dHJhY3QgQkQgaGVhZGVyIikpOwogICAgICBWT1NfQVNTRVJUKDApOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0JBRE1TRzsKICAgfQoKICAgaWYgKCgwID09IFdEQV9HRVRfUlhfRlRfRE9ORShhdWNCREhlYWRlcikpICYmCiAgICAgICAoMCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1NUQURlc2MudWNTd0ZyYW1lUlhYbGF0aW9uKSkKICAgewogICAgICAvKiBJdHMgYW4gODAyLjExIGZyYW1lLCBleHRyYWN0IE1BQyBhZGRyZXNzIDEgKi8KICAgICAgVExMT0cyKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIldMQU4gVEw6V0xBTlRMX0ZpbmRGcmFtZVR5cGVCY01jVWMgLSA4MDIuMTEgZnJhbWUsIHBlZWtpbmcgQWRkcjEiKSk7CiAgICAgIHZvc1N0YXR1cyA9IHZvc19wa3RfcGVla19kYXRhKHZvc0RhdGFCdWZmLCBXTEFOVExfTUFDX0FERFJfQUxJR04oMSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIC8qIEl0cyBhbiA4MDIuMyBmcmFtZSwgZXh0cmFjdCBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLwogICAgICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpXTEFOVExfRmluZEZyYW1lVHlwZUJjTWNVYyAtIDgwMi4zIGZyYW1lLCBwZWVraW5nIERBIikpOwogICAgICB2b3NTdGF0dXMgPSB2b3NfcGt0X3BlZWtfZGF0YSh2b3NEYXRhQnVmZiwgV0xBTlRMX01BQ19BRERSX0FMSUdOKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZwdlBlZWtEYXRhLCBWT1NfTUFDX0FERFJfU0laRSk7CiAgIH0KCiAgIGlmIChWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gdm9zU3RhdHVzKSAKICAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gRmFpbGVkIHRvIHBlZWsgTUFDIGFkZHJlc3MiKSk7CiAgICAgIHJldHVybiB2b3NTdGF0dXM7CiAgIH0KCiAgIGlmICgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSA9PSAweGZmKQogICB7CiAgICAgICpwdWNCY01jVWMgPSBXTEFOVExfRlJBTUVfVFlQRV9CQ0FTVDsKICAgfQogICBlbHNlCiAgIHsKICAgICAgaWYgKCgoKHRBTklfVTggKilwdlBlZWtEYXRhKVswXSAmIDB4MDEpID09IDB4MDEpCiAgICAgICAgICpwdWNCY01jVWMgPSBXTEFOVExfRlJBTUVfVFlQRV9NQ0FTVDsKICAgICAgZWxzZQogICAgICAgICAqcHVjQmNNY1VjID0gV0xBTlRMX0ZSQU1FX1RZUEVfVUNBU1Q7CiAgIH0KCiAgIFRMTE9HMihWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICJXTEFOIFRMOldMQU5UTF9GaW5kRnJhbWVUeXBlQmNNY1VjIC0gQWRkcjFCeXRlMSBpczogJXgiLCAKICAgICAgICAgICgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdKSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCiNpZiAwCiNpZmRlZiBXTEFOX1BFUkYgCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRmFzdEh3RndkRGF0YUZyYW1lCgogIERFU0NSSVBUSU9OIAogICAgRmFzdCBwYXRoIGZ1bmN0aW9uIHRvIHF1aWNrbHkgZm9yd2FyZCBhIGRhdGEgZnJhbWUgaWYgSEFMIGRldGVybWluZXMgQkQgCiAgICBzaWduYXR1cmUgY29tcHV0ZWQgaGVyZSBtYXRjaGVzIHRoZSBzaWduYXR1cmUgaW5zaWRlIGN1cnJlbnQgVk9TUyBwYWNrZXQuIAogICAgSWYgdGhlcmUgaXMgYSBtYXRjaCwgSEFMIGFuZCBUTCBmaWxscyBpbiB0aGUgc3dhcHBlZCBwYWNrZXQgbGVuZ3RoIGludG8gCiAgICBCRCBoZWFkZXIgYW5kIER4RSBoZWFkZXIsIHJlc3BlY3RpdmVseS4gT3RoZXJ3aXNlLCBwYWNrZXQgZ29lcyBiYWNrIHRvIAogICAgbm9ybWFsIChzbG93KSBwYXRoIGFuZCBhIG5ldyBCRCBzaWduYXR1cmUgd291bGQgYmUgdGFnZ2VkIGludG8gQkQgaW4gdGhpcwogICAgVk9TUyBwYWNrZXQgbGF0ZXIgYnkgdGhlIFdMQU5IQUxfRmlsbFR4QmQoKSBmdW5jdGlvbi4KCiAgREVQRU5ERU5DSUVTIAogICAgIAogIFBBUkFNRVRFUlMgCgogICBJTgogICAgICAgIHB2b3NHQ3R4ICAgIFZPUyBjb250ZXh0CiAgICAgICAgdm9zRGF0YUJ1ZmYgUHRyIHRvIFZPU1MgcGFja2V0CiAgICAgICAgcE1ldGFJbmZvICAgRm9yIGdldHRpbmcgZnJhbWUncyBUSUQKICAgICAgICBwU3RhSW5mbyAgICBGb3IgY2hlY2tpbmcgU1RBIHR5cGUKICAgIAogICBPVVQKICAgICAgICBwdm9zU3RhdHVzICByZXR1cm5lZCBzdGF0dXMKICAgICAgICBwdUZhc3RGd2RPSyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgZnJhbWUgY291bGQgYmUgZmFzdCBmb3J3YXJkZWQKICAgCiAgUkVUVVJOIFZBTFVFCiAgICBObyByZXR1cm4uICAgCgogIFNJREUgRUZGRUNUUyAKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnN0YXRpYyB2b2lkCldMQU5UTF9GYXN0SHdGd2REYXRhRnJhbWUKKCAKICB2X1BWT0lEX3QgICAgIHB2b3NHQ3R4LAogIHZvc19wa3RfdCogICAgdm9zRGF0YUJ1ZmYsCiAgVk9TX1NUQVRVUyogICBwdm9zU3RhdHVzLAogIHZfVTMyX3QqICAgICAgIHB1RmFzdEZ3ZE9LLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUqICBwTWV0YUluZm8sCiAgV0xBTl9TVEFEZXNjVHlwZSogIHBTdGFJbmZvCiAKKQp7CiAgICB2X1BWT0lEX3QgICBwdlBlZWtEYXRhOwogICAgdl9VOF90ICAgICAgdWNEeEVCRFdMQU5IZWFkZXJMZW4gPSBXTEFOVExfQkRfSEVBREVSX0xFTigwKSArIHNpemVvZihXTEFOQkFMX3NEWEVIZWFkZXJUeXBlKTsgCiAgICB2X1U4X3QgICAgICB1Y0lzVW5pY2FzdDsKICAgIFdMQU5CQUxfc0RYRUhlYWRlclR5cGUgICpwRHhFSGVhZGVyOwogICAgdl9QVk9JRF90ICAgcHZCREhlYWRlcjsKICAgIHZfUFZPSURfdCAgIHB1Y0J1ZmZQdHI7CiAgICB2X1UxNl90ICAgICAgdXNQa3RMZW47CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IHBhY2tldCBsZW5ndGgKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgJnVzUGt0TGVuKTsKCiAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTUFDIGFkZHJlc3MKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICpwdm9zU3RhdHVzID0gdm9zX3BrdF9wZWVrX2RhdGEoIHZvc0RhdGFCdWZmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZfUFZPSURfdCkmcHZQZWVrRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPU19NQUNfQUREUl9TSVpFICk7CgogICAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKSAKICAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6RmFpbGVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBNQUMgQWRkciAlZCIsIAogICAgICAgICAgICAgICAgICAqcHZvc1N0YXR1cykpOwogICAgICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgICByZXR1cm47CiAgICB9CgogICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSZXNlcnZlIGhlYWQgcm9vbSBmb3IgRHhFIGhlYWRlciwgQkQsIGFuZCBXTEFOIGhlYWRlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIHZvc19wa3RfcmVzZXJ2ZV9oZWFkKCB2b3NEYXRhQnVmZiwgJnB1Y0J1ZmZQdHIsIAogICAgICAgICAgICAgICAgICAgICAgICB1Y0R4RUJEV0xBTkhlYWRlckxlbiApOwogICAgaWYgKCBOVUxMID09IHB1Y0J1ZmZQdHIgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiV0xBTiBUTDpObyBlbm91Z2ggc3BhY2UgaW4gVk9TUyBwYWNrZXQgJXAgZm9yIER4RS9CRC9XTEFOIGhlYWRlciIsIHZvc0RhdGFCdWZmKSk7CiAgICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwRHhFSGVhZGVyID0gKFdMQU5CQUxfc0RYRUhlYWRlclR5cGUgICopcHVjQnVmZlB0cjsKICAgIHB2QkRIZWFkZXIgPSAodl9QVk9JRF90KSAmcER4RUhlYWRlclsxXTsKCiAgICAvKiBVTUEgVHggYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQuIAogICAgICogVU1BIHdvdWxkIGhlbHAgY29udmVydCBmcmFtZXMgdG8gODAyLjExLCBmaWxsIHBhcnRpYWwgQkQgZmllbGRzIGFuZCAKICAgICAqIGNvbnN0cnVjdCBMTEMgaGVhZGVyLiBUbyBmdXJ0aGVyIGFjY2VsZXJhdGUgdGhpcyBraW5kIG9mIGZyYW1lcywKICAgICAqIEhBTCB3b3VsZCBhdHRlbXB0IHRvIHJldXNlIHRoZSBCRCBkZXNjcmlwdG9yIGlmIHRoZSBCRCBzaWduYXR1cmUgCiAgICAgKiBtYXRjaGVzIHRvIHRoZSBzYXZlZCBCRCBkZXNjcmlwdG9yLgogICAgICovCiAgICAgaWYocFN0YUluZm8tPndTVEFUeXBlID09IFdMQU5fU1RBX0lCU1MpCiAgICAgICAgdWNJc1VuaWNhc3QgPSAhKCgodEFOSV9VOCAqKXB2UGVla0RhdGEpWzBdICYgMHgwMSk7CiAgICAgZWxzZQogICAgICAgIHVjSXNVbmljYXN0ID0gMTsKIAogICAgICpwdUZhc3RGd2RPSyA9ICh2X1UzMl90KSBXTEFOSEFMX1R4QmRGYXN0RndkKHB2b3NHQ3R4LCBwdlBlZWtEYXRhLCBwTWV0YUluZm8tPnVjVElELCB1Y0lzVW5pY2FzdCwgcHZCREhlYWRlciwgdXNQa3RMZW4gKTsKICAgIAogICAgICAvKiBDYW4ndCBiZSBmYXN0IGZvcndhcmRlZC4gVHJpbSB0aGUgVk9TIGhlYWQgYmFjayB0byBvcmlnaW5hbCBsb2NhdGlvbi4gKi8KICAgICAgaWYoISAqcHVGYXN0RndkT0spewogICAgICAgICAgdm9zX3BrdF90cmltX2hlYWQodm9zRGF0YUJ1ZmYsIHVjRHhFQkRXTEFOSGVhZGVyTGVuKTsKICAgICAgfWVsc2V7CiAgICAgICAgLyogY291bGQgYmUgZmFzdCBmb3J3YXJkZWQuIE5vdyBub3RpZnkgQkFMIER4RSBoZWFkZXIgZmlsbGluZyBjb3VsZCBiZSBjb21wbGV0ZWx5IHNraXBwZWQKICAgICAgICAgKi8KICAgICAgICB2X1UzMl90IHVQYWNrZXRTaXplID0gV0xBTlRMX0JEX0hFQURFUl9MRU4oMCkgKyB1c1BrdExlbjsKICAgICAgICB2b3NfcGt0X3NldF91c2VyX2RhdGFfcHRyKCB2b3NEYXRhQnVmZiwgVk9TX1BLVF9VU0VSX0RBVEFfSURfQkFMLCAKICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXVQYWNrZXRTaXplKTsKICAgICAgICBwRHhFSGVhZGVyLT5zaXplICA9IFNXQVBfRU5ESUFOX1VJTlQzMih1UGFja2V0U2l6ZSk7CiAgICAgIH0KICAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgcmV0dXJuOwp9CiNlbmRpZiAvKldMQU5fUEVSRiovCiNlbmRpZgoKI2lmIDAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBGVU5DVElPTiAgICBXTEFOVExfUHJlcGFyZUJESGVhZGVyCgogIERFU0NSSVBUSU9OCiAgICBJbmxpbmUgZnVuY3Rpb24gZm9yIHByZXBhcmluZyBCRCBoZWFkZXIgYmVmb3JlIEhBTCBwcm9jZXNzaW5nLgoKICBERVBFTkRFTkNJRVMKICAgIEp1c3Qgbm90aWZ5IEhBTCB0aGF0IHN1c3BlbmQgaW4gVEwgaXMgY29tcGxldGUuCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgICB2b3NEYXRhQnVmZjogICAgICB2b3MgZGF0YSBidWZmZXIKICAgIHVjRGlzYWJsZUZybVh0bDogIGlzIGZyYW1lIHh0bCBkaXNhYmxlZAoKICAgT1VUCiAgICBwcHZCREhlYWRlcjogICAgICBpdCB3aWxsIGNvbnRhaW4gdGhlIEJEIGhlYWRlcgogICAgcHZEZXN0TWFjQWRkZHI6ICAgaXQgd2lsbCBjb250YWluIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcwogICAgcHZvc1N0YXR1czogICAgICAgc3RhdHVzIG9mIHRoZSBjb21iaW5lZCBwcm9jZXNzaW5nCiAgICBwdXNQa3RMZW46ICAgICAgICBwYWNrZXQgbGVuLgoKICBSRVRVUk4gVkFMVUUKICAgIE5vIHJldHVybi4KCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kdm9pZApXTEFOVExfUHJlcGFyZUJESGVhZGVyCigKICB2b3NfcGt0X3QqICAgICAgdm9zRGF0YUJ1ZmYsCiAgdl9QVk9JRF90KiAgICAgIHBwdkJESGVhZGVyLAogIHZfTUFDQUREUl90KiAgICBwdkRlc3RNYWNBZGRkciwKICB2X1U4X3QgICAgICAgICAgdWNEaXNhYmxlRnJtWHRsLAogIFZPU19TVEFUVVMqICAgICBwdm9zU3RhdHVzLAogIHZfVTE2X3QqICAgICAgICBwdXNQa3RMZW4sCiAgdl9VOF90ICAgICAgICAgIHVjUW9zRW5hYmxlZCwKICB2X1U4X3QgICAgICAgICAgdWNXRFNFbmFibGVkLAogIHZfVThfdCAgICAgICAgICBleHRyYUhlYWRTcGFjZQopCnsKICB2X1U4X3QgICAgICB1Y0hlYWRlck9mZnNldDsKICB2X1U4X3QgICAgICB1Y0hlYWRlckxlbjsKICB2X1U4X3QgICAgICB1Y0JESGVhZGVyTGVuID0gV0xBTlRMX0JEX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKTsKCiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBHZXQgaGVhZGVyIHBvaW50ZXIgZnJvbSBWT1NTCiAgICAhISEgbWFrZSBzdXJlIHJlc2VydmUgaGVhZCB6ZXJvcyBvdXQgdGhlIG1lbW9yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB2b3NfcGt0X2dldF9wYWNrZXRfbGVuZ3RoKCB2b3NEYXRhQnVmZiwgcHVzUGt0TGVuKTsKCiAgaWYgKCBXTEFOVExfTUFDX0hFQURFUl9MRU4odWNEaXNhYmxlRnJtWHRsKSA+ICpwdXNQa3RMZW4gKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6IExlbmd0aCBvZiB0aGUgcGFja2V0IHNtYWxsZXIgdGhhbiBleHBlY3RlZCBuZXR3b3JrIgogICAgICAgICAgICAgICAiIGhlYWRlciAlZCIsICpwdXNQa3RMZW4gKSk7CgogICAgKnB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICByZXR1cm47CiAgfQoKICB2b3NfcGt0X3Jlc2VydmVfaGVhZCggdm9zRGF0YUJ1ZmYsIHBwdkJESGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICB1Y0JESGVhZGVyTGVuICk7CiAgaWYgKCBOVUxMID09ICpwcHZCREhlYWRlciApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgIldMQU4gVEw6Vk9TUyBwYWNrZXQgY29ycnVwdGVkIG9uIEF0dGFjaCBCRCBoZWFkZXIiKSk7CiAgICAqcHZvc1N0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgIHJldHVybjsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEV4dHJhY3QgTUFDIGFkZHJlc3MKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHsKICAgdl9TSVpFX3QgdXNNYWNBZGRyU2l6ZSA9IFZPU19NQUNfQUREUl9TSVpFOwogICAqcHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjQkRIZWFkZXJMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTlRMX01BQ19BRERSX0FMSUdOKHVjRGlzYWJsZUZybVh0bCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KXB2RGVzdE1hY0FkZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzTWFjQWRkclNpemUgKTsKICB9CiAgaWYgKCBWT1NfU1RBVFVTX1NVQ0NFU1MgIT0gKnB2b3NTdGF0dXMgKQogIHsKICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDpGYWlsZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBleHRyYWN0IE1BQyBBZGRyICVkIiwKICAgICAgICAgICAgICAgICpwdm9zU3RhdHVzKSk7CiAgfQogIGVsc2UKICB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZpbGwgTVBEVSBpbmZvIGZpZWxkczoKICAgICAgICAgIC0gTVBEVSBkYXRhIHN0YXJ0IG9mZnNldAogICAgICAgICAgLSBNUERVIGhlYWRlciBzdGFydCBvZmZzZXQKICAgICAgICAgIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCiAgICAgICAgICAtIE1QRFUgbGVuZ3RoIC0gdGhpcyBpcyBhIDE2YiBmaWVsZCAtIG5lZWRzIHN3YXBwaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICB1Y0hlYWRlck9mZnNldCA9IHVjQkRIZWFkZXJMZW47CiAgICB1Y0hlYWRlckxlbiAgICA9IFdMQU5UTF9NQUNfSEVBREVSX0xFTih1Y0Rpc2FibGVGcm1YdGwpOwoKICAgIGlmICggMCAhPSB1Y0Rpc2FibGVGcm1YdGwgKQogICAgewogICAgICBpZiAoIDAgIT0gdWNRb3NFbmFibGVkICkKICAgICAgewogICAgICAgIHVjSGVhZGVyTGVuICs9IFdMQU5UTF84MDJfMTFfSEVBREVSX1FPU19DVEw7CiAgICAgIH0KCiAgICAgIC8vIFNpbWlsYXIgdG8gUW9zIHdlIG5lZWQgc29tZXRoaW5nIGZvciBXRFMgZm9ybWF0ICEKICAgICAgaWYgKCB1Y1dEU0VuYWJsZWQgIT0gMCApCiAgICAgIHsKICAgICAgICAvLyBJZiB3ZSBoYXZlIGZyYW1lIHRyYW5zbGF0aW9uIGVuYWJsZWQKICAgICAgICB1Y0hlYWRlckxlbiAgICArPSBXTEFOVExfODAyXzExX0hFQURFUl9BRERSNF9MRU47CiAgICAgIH0KICAgICAgaWYgKCBleHRyYUhlYWRTcGFjZSAhPSAwICkKICAgICAgewogICAgICAgIC8vIERlY3JlYXNlIHRoZSBwYWNrZXQgbGVuZ3RoIHdpdGggdGhlIGV4dHJhIHBhZGRpbmcgYWZ0ZXIgdGhlIGhlYWRlcgogICAgICAgICpwdXNQa3RMZW4gPSAqcHVzUGt0TGVuIC0gZXh0cmFIZWFkU3BhY2U7CiAgICAgIH0KICAgIH0KCiAgICBXTEFOSEFMX1RYX0JEX1NFVF9NUERVX0hFQURFUl9MRU4oICpwcHZCREhlYWRlciwgdWNIZWFkZXJMZW4pOwogICAgV0xBTkhBTF9UWF9CRF9TRVRfTVBEVV9IRUFERVJfT0ZGU0VUKCAqcHB2QkRIZWFkZXIsIHVjSGVhZGVyT2Zmc2V0KTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfREFUQV9PRkZTRVQoICpwcHZCREhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNIZWFkZXJPZmZzZXQgKyB1Y0hlYWRlckxlbiArIGV4dHJhSGVhZFNwYWNlKTsKICAgIFdMQU5IQUxfVFhfQkRfU0VUX01QRFVfTEVOKCAqcHB2QkRIZWFkZXIsICpwdXNQa3RMZW4pOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICAiV0xBTiBUTDogVkFMVUVTIEFSRSBITGVuPSV4IEhvZmY9JXggZG9mZj0leCBsZW49JXggZXg9JWQiLAogICAgICAgICAgICAgICAgdWNIZWFkZXJMZW4sIHVjSGVhZGVyT2Zmc2V0LCAKICAgICAgICAgICAgICAgICh1Y0hlYWRlck9mZnNldCArIHVjSGVhZGVyTGVuICsgZXh0cmFIZWFkU3BhY2UpLCAKICAgICAgICAgICAgICAgICpwdXNQa3RMZW4sIGV4dHJhSGVhZFNwYWNlKSk7CiAgfS8qIGlmIHBlZWsgTUFDIHN1Y2Nlc3MqLwoKfS8qIFdMQU5UTF9QcmVwYXJlQkRIZWFkZXIgKi8KI2VuZGlmCgovL1RISVMgSVMgQSBIQUNLIEFORCBORUVEUyBUTyBCRSBGSVhFRCBGT1IgQ09OQ1VSUkVOQ1kKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5fVExHZXROZXh0VHhJZHMKCiAgREVTQ1JJUFRJT04KICAgIEdldHMgdGhlIG5leHQgc3RhdGlvbiBhbmQgbmV4dCBBQyBpbiB0aGUgbGlzdCB0aGF0IHNob3VsZCBiZSBzZXJ2ZWQgYnkgdGhlIFRMLgoKICAgIE11bHRpcGxlIFN0YXRpb24gU2NoZWR1bGluZyBhbmQgVEwgcXVldWUgbWFuYWdlbWVudC4gCgogICAgNCBIREQgQkMvTUMgZGF0YSBwYWNrZXQgcXVldWUgc3RhdHVzIGlzIHNwZWNpZmllZCBhcyBTdGF0aW9uIDAncyBzdGF0dXMuIFdlaWdodHMgdXNlZAogICAgaW4gV0ZRIGFsZ29yaXRoIGFyZSBpbml0aWFsaXplZCBpbiBXTEFOVExfT1BFTiBhbmQgY29udGFpbmVkIGluIHRsQ29uZmlnSW5mbyBmaWVsZC4KICAgIEVhY2ggc3RhdGlvbiBoYXMgZmllbGRzIG9mIHVjUGt0UGVuZGluZyBhbmQgQUMgbWFzayB0byB0ZWxsIHdoZXRoZXIgYSBBQyBoYXMgdHJhZmZpYwogICAgb3Igbm90LgogICAgICAKICAgIFN0YXRpb25zIGFyZSBzZXJ2ZWQgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIGZyb20gaGlnaGVzdCBwcmlvcml0eSB0byBsb3dlc3QgcHJpb3JpdHkuCiAgICBUaGUgbnVtYmVyIG9mIHJvdW5kLXJvYmluIHRpbWVzIG9mIGVhY2ggcHJpb2lydHkgZXF1YWxzIHRvIHRoZSBXRlEgd2VpZ2h0cyBhbmQgZGlmZmVyZXRpYXRlcwogICAgdGhlIHRyYWZmaWMgb2YgZGlmZmVyZW50IHByaW9pcnR5LiBBcyBzdWNoLCBzdGF0aW9ucyBjYW4gbm90IHByb3ZpZGUgbG93IHByaW9yaXR5IHBhY2tldHMgaWYKICAgIGhpZ2ggcHJpb3JpdHkgcGFja2V0cyBhcmUgYWxsIHNlcnZlZC4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgIE9VVAogICBwdWNTVEFJZDogICAgU3RhdGlvbiBJRAoKICBSRVRVUk4gVkFMVUUKICAgIFRoZSByZXN1bHQgY29kZSBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCgogICAgVk9TX1NUQVRVU19TVUNDRVNTOiAgIEV2ZXJ5dGhpbmcgaXMgZ29vZAoKICBTSURFIEVGRkVDVFMKICAgCiAgIFRMIGNvbnRleHQgY29udGFpbnMgY3VycmVudGx5IHNlcnZlZCBzdGF0aW9uIElEIGluIHVjQ3VycmVudFNUQSBmaWVsZCwgY3VycmVudGx5IHNlcnZlZCBBQwogICBpbiB1Q3VyU2VydmVkQUMgZmllbGQsIGFuZCB1bnNlcnZlZCB3ZWlnaHRzIG9mIGN1cnJlbnQgQUMgaW4gdUN1ckxlZnRXZWlnaHQuCiAgIFdoZW4gZXhpc3RpbmcgZnJvbSB0aGUgZnVuY3Rpb24sIHRoZXNlIHRocmVlIGZpZWxkcyBhcmUgY2hhbmdlZCBhY2NvcmRpbmdseS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5fVExBUEdldE5leHRUeElkcwooCiAgdl9QVk9JRF90ICAgIHB2b3NHQ3R4LAogIHZfVThfdCogICAgICBwdWNTVEFJZAopCnsKICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2I7CiAgdl9VOF90ICAgICAgICAgIHVjQUNGaWx0ZXIgPSAxOwogIHZfVThfdCAgICAgICAgICB1Y05leHRTVEEgOyAKICB2X0JPT0xfdCAgICAgICAgaXNTZXJ2ZWQgPSBUUlVFOyAgLy9jdXJyZW50IHJvdW5kIGhhcyBmaW5kIGEgcGFja2V0IG9yIG5vdAogIHZfVThfdCAgICAgICAgICB1Y0FDTG9vcE51bSA9IFdMQU5UTF9BQ19WTyArIDE7IC8vbnVtYmVyIG9mIGxvb3AgdG8gZ28KICB2X1U4X3QgICAgICAgICAgdUZsb3dNYXNrOyAvLyBUWCBGbG93TWFzayBmcm9tIFdEQQogIHVpbnQ4ICAgICAgICAgICB1Y0FDTWFzazsgCiAgdWludDggICAgICAgICAgIGkgPSAwOyAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAvL0VOVEVSKCk7CgogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5fVExBUEdldE5leHRUeElkcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSBXREFfRFNfR2V0VHhGbG93TWFzayggcHZvc0dDdHgsICZ1Rmxvd01hc2sgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDpGYWlsZWQgdG8gcmV0cmlldmUgRmxvdyBjb250cm9sIG1hc2sgZnJvbSBXREEiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgdWNOZXh0U1RBID0gcFRMQ2ItPnVjQ3VycmVudFNUQTsKCiAgKyt1Y05leHRTVEE7CgogIGlmICggV0xBTl9NQVhfU1RBX0NPVU5UIDw9IHVjTmV4dFNUQSApCiAgewogICAgLy9vbmUgcm91bmQgaXMgZG9uZS4KICAgIHVjTmV4dFNUQSA9IDA7CiAgICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0LS07CiAgICBpc1NlcnZlZCA9IEZBTFNFOwogICAgaWYgKCAwID09IHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgKQogICAgewogICAgICAvL2N1cnJlbnQgcHJpb2lydHkgaXMgZG9uZQogICAgICBpZiAoIFdMQU5UTF9BQ19CSyA9PSAoV0xBTlRMX0FDRW51bVR5cGUpcFRMQ2ItPnVDdXJTZXJ2ZWRBQyApCiAgICAgIHsKICAgICAgICAvL2VuZCBvZiBjdXJyZW50IFZPLCBWSSwgQkUsIEJLIGxvb3AuIFJlc2V0IHByaW9yaXR5LgogICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgPSBXTEFOVExfQUNfVk87CiAgICAgIH0KICAgICAgZWxzZSAKICAgICAgewogICAgICAgIHBUTENiLT51Q3VyU2VydmVkQUMgLS07CiAgICAgIH0KCiAgICAgIHBUTENiLT51Y0N1ckxlZnRXZWlnaHQgPSAgcFRMQ2ItPnRsQ29uZmlnSW5mby51Y0FjV2VpZ2h0c1twVExDYi0+dUN1clNlcnZlZEFDXTsKIAogICAgfSAvLyAoMCA9PSBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0KQogIH0gLy8oIFdMQU5fTUFYX1NUQV9DT1VOVCA9PSB1Y05leHRTVEEgKQoKICAvL2RlY2lkZSBob3cgbWFueSBsb29wcyB0byBnby4gaWYgY3VycmVudCBsb29wIGlzIHBhcnRpYWwsIGRvIG9uZSBleHRyYSB0byBtYWtlIHN1cmUKICAvL3dlIGNvdmVyIGV2ZXJ5IHN0YXRpb24KICBpZiAoKDEgPT0gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCkgJiYgKHVjTmV4dFNUQSAhPSAwKSkKICB7CiAgICB1Y0FDTG9vcE51bSArKzsgLy8gbm93IGlzIDUgbG9vcHMKICB9CgogIC8qIFN0YXJ0IHdpdGggaGlnaGVzdCBwcmlvcml0eS4gdWNOZXh0U1RBLCBwVExDYi0+dUN1clNlcnZlZEFDLCBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0CiAgICAgYWxsIGhhdmUgcHJldmlvdXMgdmFsdWVzLiovCiAgZm9yICg7IHVjQUNMb29wTnVtID4gMDsgIHVjQUNMb29wTnVtLS0pCiAgewoKICAgIHVjQUNGaWx0ZXIgPSAxIDw8IHBUTENiLT51Q3VyU2VydmVkQUM7CgogICAgLy8gcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCBrZWVwcyBwcmV2aW91cyByZXN1bHRzLgogICAgZm9yICg7IChwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID4gMCkgJiYgKHVGbG93TWFzayAmIHVjQUNGaWx0ZXIpOyBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0LS0gKQogICAgewoKICAgICAgZm9yICggOyB1Y05leHRTVEEgPCBXTEFOX01BWF9TVEFfQ09VTlQ7IHVjTmV4dFNUQSArKyApCiAgICAgIHsKICAgICAgICBpZihOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0pCiAgICAgICAgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgV0xBTl9UTF9BQ19BUlJBWV8yX01BU0sgKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0sIHVjQUNNYXNrLCBpKTsKCiAgICAgICAgaWYgKCAoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y0V4aXN0cykgfHwKICAgICAgICAgICAgICgoMCA9PSBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y05leHRTVEFdLT51Y1BrdFBlbmRpbmcpICYmICEodWNBQ01hc2spKSB8fAogICAgICAgICAgICAgKDAgPT0gKHVjQUNNYXNrICYgdWNBQ0ZpbHRlcikpICkKCiAgICAgICAgewogICAgICAgICAgLy9jdXJyZW50IHN0YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaGF2ZSBhbnkgcGFja2V0IHRvIHNlcnZlLgogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnRsU3RhdGUpCiAgICAgICAgewogICAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiJXMgU3RhICVkIG5vdCBpbiBhdXRoIHN0YXRlIHNvIHNraXBwaW5nIGl0LiIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIHVjTmV4dFNUQSkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvL2dvIHRvIG5leHQgc3RhdGlvbiBpZiBjdXJyZW50IHN0YXRpb24gY2FuJ3Qgc2VuZCBkdWUgdG8gZmxvdyBjb250cm9sCiAgICAgICAgLy9TdGF0aW9uIGlzIGFsbG93ZWQgdG8gc2VuZCB3aGVuIGl0IGlzIG5vdCBpbiBMV00gbW9kZS4gV2hlbiBzdGF0aW9uIGlzIGluIExXTSBtb2RlLAogICAgICAgIC8vc3RhdGlvbiBpcyBhbGxvd2VkIHRvIHNlbmQgb25seSBhZnRlciBGVyByZXBvcnRzIEZXIG1lbW9yeSBpcyBiZWxvdyB0aHJlc2hvbGQgYW5kIG9uLWZseQogICAgICAgIC8vcGFja2V0cyBhcmUgbGVzcyB0aGVuIGFsbG93ZWQgdmFsdWUKICAgICAgICBpZiAoIChUUlVFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjTHdtTW9kZUVuYWJsZWQpICYmCiAgICAgICAgICAgICAoKEZBTFNFID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjTHdtRXZlbnRSZXBvcnRlZCkgfHwKICAgICAgICAgICAgICAgICAoMCA8IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVCdWZmVGhyZXNob2xkTWF4KSkKICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKCiAgICAgICAgLy8gRmluZCBhIHN0YXRpb24uIFdlaWdodCBpcyB1cGRhdGVkIGFscmVhZHkuCiAgICAgICAgKnB1Y1NUQUlkID0gdWNOZXh0U1RBOwogICAgICAgIHBUTENiLT51Y0N1cnJlbnRTVEEgPSB1Y05leHRTVEE7CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgPSBwVExDYi0+dUN1clNlcnZlZEFDOwogIAogICAgICAgIFRMTE9HNChWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0xPVywKICAgICAgICAgICAgICAgICAgICIgVEwgc2VydmUgb25lIHN0YXRpb24gQUM6ICVkICBXOiAlZCBTdGFJZDogJWQiLAogICAgICAgICAgICAgICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQywgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCwgcFRMQ2ItPnVjQ3VycmVudFNUQSApKTsKICAgICAgCiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKICAgICAgfSAvL1NUQSBsb29wCgogICAgICB1Y05leHRTVEEgPSAwOwogICAgICBpZiAoIEZBTFNFID09IGlzU2VydmVkICkKICAgICAgewogICAgICAgIC8vY3VycmVudCBsb29wIGZpbmRzIG5vIHBhY2tldC5ubyBuZWVkIHRvIHJlcGVhdCBmb3IgdGhlIHNhbWUgcHJpb3JpdHkKICAgICAgICBicmVhazsKICAgICAgfQogICAgICAvL2N1cnJlbnQgbG9vcCBpcyBwYXJ0aWFsIGxvb3AuIGdvIGZvciBvbmUgbW9yZSBsb29wLgogICAgICBpc1NlcnZlZCA9IEZBTFNFOwoKICAgIH0gLy9XZWlnaHQgbG9vcAoKICAgIGlmIChXTEFOVExfQUNfQksgPT0gcFRMQ2ItPnVDdXJTZXJ2ZWRBQykKICAgIHsKICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19WTzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQy0tOwogICAgfQogICAgcFRMQ2ItPnVjQ3VyTGVmdFdlaWdodCA9ICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3BUTENiLT51Q3VyU2VydmVkQUNdOwoKICB9Ly8gQUMgbG9vcAoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAgICAgIiBUTCBjYW4ndCBmaW5kIG9uZSBzdGF0aW9uIHRvIHNlcnZlIiApKTsKCiAgcFRMQ2ItPnVDdXJTZXJ2ZWRBQyA9IFdMQU5UTF9BQ19CSzsKICBwVExDYi0+dWNDdXJMZWZ0V2VpZ2h0ID0gMTsKICAvL2ludmFsaWQgbnVtYmVyIHdpbGwgYmUgY2FwdHVyZWQgYnkgY2FsbGVyCiAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IFdMQU5fTUFYX1NUQV9DT1VOVDsgCgogICpwdWNTVEFJZCA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CiAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOX1RMR2V0TmV4dFR4SWRzCgogIERFU0NSSVBUSU9OCiAgICBHZXRzIHRoZSBuZXh0IHN0YXRpb24gYW5kIG5leHQgQUMgaW4gdGhlIGxpc3QKCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgIElOCiAgIHB2b3NHQ3R4OiAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKCiAgIE9VVAogICBwdWNTVEFJZDogICAgU3RhdGlvbiBJRAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOX1RMR2V0TmV4dFR4SWRzCigKICB2X1BWT0lEX3QgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgIHB1Y1NUQUlkCikKewogIFdMQU5UTF9DYlR5cGUqICBwVExDYjsKICB2X1U4X3QgICAgICAgICAgdWNOZXh0QUM7CiAgdl9VOF90ICAgICAgICAgIHVjTmV4dFNUQTsgCiAgdl9VOF90ICAgICAgICAgIHVjQ291bnQ7IAogIHZfVThfdCAgICAgICAgICB1Rmxvd01hc2s7IC8vIFRYIEZsb3dNYXNrIGZyb20gV0RBCiAgdl9VOF90ICAgICAgICAgIHVjQUNNYXNrID0gMDsKICB2X1U4X3QgICAgICAgICAgaSA9IDA7IAoKICB0QnNzU3lzdGVtUm9sZSBzeXN0ZW1Sb2xlOyAvL1JHIEhBQ0sgdG8gYmUgcmVtb3ZlZAogIHRwQW5pU2lyR2xvYmFsIHBNYWM7CgogIHBNYWMgPSB2b3NfZ2V0X2NvbnRleHQoVk9TX01PRFVMRV9JRF9QRSwgcHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwTWFjICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IEludmFsaWQgcE1hYyIsIF9fZnVuY19fKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiAgc3lzdGVtUm9sZSA9IHdkYUdldEdsb2JhbFN5c3RlbVJvbGUocE1hYyk7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5fVExHZXROZXh0VHhJZHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmICgoZVNZU1RFTV9BUF9ST0xFID09IHN5c3RlbVJvbGUpIHx8ICh2b3NfY29uY3VycmVudF9zZXNzaW9uc19ydW5uaW5nKCkpIHx8IHBUTENiLT51Y1RkbHNQZWVyQ291bnQpCiNlbHNlCiAgaWYgKChlU1lTVEVNX0FQX1JPTEUgPT0gc3lzdGVtUm9sZSkgfHwgKHZvc19jb25jdXJyZW50X3Nlc3Npb25zX3J1bm5pbmcoKSkpCiNlbmRpZgogIHsKICAgIHJldHVybiBXTEFOX1RMQVBHZXROZXh0VHhJZHMocHZvc0dDdHgscHVjU1RBSWQpOwogIH0KCgogIGlmICggVk9TX1NUQVRVU19TVUNDRVNTICE9IFdEQV9EU19HZXRUeEZsb3dNYXNrKCBwdm9zR0N0eCwgJnVGbG93TWFzayApICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICJXTEFOIFRMOkZhaWxlZCB0byByZXRyaWV2ZSBGbG93IGNvbnRyb2wgbWFzayBmcm9tIFdEQSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKlNUQSBpZCAtIG5vIHByaW9yaXR5IHlldCBpbXBsZW1lbnRlZCAqLwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENob29zZSB0aGUgbmV4dCBTVEEgZm9yIHR4IC0gZm9yIG5vdyBnbyBpbiBhIHJvdW5kIHJvYmluIGZhc2hpb24KICAgIHRocm91Z2ggYWxsIHRoZSBzdGF0aW9ucyB0aGF0IGhhdmUgcGVuZGluZyBwYWNrZXRzICAgICAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICB1Y05leHRTVEEgPSBwVExDYi0+dWNDdXJyZW50U1RBOwogIAogIHBUTENiLT51Y0N1cnJlbnRTVEEgPSBXTEFOX01BWF9TVEFfQ09VTlQ7IAogIGZvciAoIHVjQ291bnQgPSAwOyAKICAgICAgICB1Y0NvdW50IDwgV0xBTl9NQVhfU1RBX0NPVU5UOwogICAgICAgIHVjQ291bnQrKyApCiAgewogICAgdWNOZXh0U1RBID0gKCAodWNOZXh0U1RBKzEpID49IFdMQU5fTUFYX1NUQV9DT1VOVCApPzA6KHVjTmV4dFNUQSsxKTsKICAgIGlmKE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNOZXh0U1RBXSkKICAgIHsKICAgICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjRXhpc3RzICkgJiYKICAgICAgICAoIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnVjUGt0UGVuZGluZyApKQogICAgewogICAgICBpZiAoV0xBTlRMX1NUQV9BVVRIRU5USUNBVEVEID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjTmV4dFNUQV0tPnRsU3RhdGUpCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiU1RBIElEOiAlZCBvbiBXTEFOX1RMR2V0TmV4dFR4SWRzIiwgKnB1Y1NUQUlkKSk7CiAgICAgICAgcFRMQ2ItPnVjQ3VycmVudFNUQSA9IHVjTmV4dFNUQTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgICAiJXMgU3RhICVkIGlzIG5vdCBpbiBhdXRoIHN0YXRlLCBza2lwcGluZyB0aGlzIHN0YS4iLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgdWNOZXh0U1RBKSk7CiAgICAgIH0KICAgIH0KICB9CgogICpwdWNTVEFJZCA9IHBUTENiLT51Y0N1cnJlbnRTVEE7CgogIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCAqcHVjU1RBSWQgKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgIldMQU4gVEw6Tm8gc3RhdGlvbiByZWdpc3RlcmVkIHdpdGggVEwgYXQgdGhpcyBwb2ludCIpKTsKCiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwoKICB9CgogIC8qQ29udmVydCB0aGUgYXJyYXkgdG8gYSBtYXNrIGZvciBlYXNpZXIgb3BlcmF0aW9uKi8KICBXTEFOX1RMX0FDX0FSUkFZXzJfTUFTSyggcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXSwgdWNBQ01hc2ssIGkpOwogIAogIGlmICggMCA9PSB1Y0FDTWFzayApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAiV0xBTiBUTDogTWFzayAwICIKICAgICAgIlNUQSBJRDogJWQgb24gV0xBTl9UTEdldE5leHRUeElkcyIsICpwdWNTVEFJZCkpOwoKICAgICAvKnNldHRpbmcgU1RBIGlkIHRvIGludmFsaWQgaWYgbWFzayBpcyAwKi8KICAgICAqcHVjU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CgogICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBQyBpcyB1cGRhdGVkIHdoZW5ldmVyIGEgcGFja2V0IGlzIGZldGNoZWQgZnJvbSBIREQgLT4gdGhlIGN1cnJlbnQKICAgIHdlaWdodCBvZiBzdWNoIGFuIEFDIGNhbm5vdCBiZSAwIC0+IGluIHRoaXMgY2FzZSBUTCBpcyBleHBlY3RlZCB0bwogICAgZXhpdCB0aGlzIGZ1bmN0aW9uIGF0IHRoaXMgcG9pbnQgZHVyaW5nIHRoZSBtYWluIFR4IGxvb3AKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAwIDwgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0ICApCiAgewogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IE1haW50YWluaW5nIHNlcnZpY2VkIEFDIHRvOiAlZCBmb3IgV2VpZ2h0OiAlZCIsCiAgICAgICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDICwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0KSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIENob29zZSBoaWdoZXN0IHByaW9yaXR5IEFDIC0gISEhIG9wdGltaXplIG1lCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHVjTmV4dEFDID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUM7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIk5leHQgQUM6ICVkIiwgdWNOZXh0QUMpKTsKCiAgd2hpbGUgKCAwICE9IHVjQUNNYXNrICkKICB7CiAgICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIiBBQyBNYXNrOiAlZCBOZXh0OiAlZCBSZXMgOiAlZCIsCiAgICAgICAgICAgICAgIHVjQUNNYXNrLCAoIDEgPDwgdWNOZXh0QUMgKSwgKCB1Y0FDTWFzayAmICggMSA8PCB1Y05leHRBQyApKSkpOwoKICAgIGlmICggMCAhPSAoIHVjQUNNYXNrICYgKCAxIDw8IHVjTmV4dEFDICkgJiB1Rmxvd01hc2sgKSkKICAgIHsKICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDICAgICA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdMQU5UTF9BQ0VudW1UeXBlKXVjTmV4dEFDOwogICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjTmV4dEFDXTsKCiAgICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAgIldMQU4gVEw6IFN3aXRjaGluZyBzZXJ2aWNlZCBBQyB0bzogJWQgd2l0aCBXZWlnaHQ6ICVkIiwKICAgICAgICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50QUMgLAogICAgICAgICAgICAgICAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1sqcHVjU1RBSWRdLT51Y0N1cnJlbnRXZWlnaHQpKTsKICAgICAgIGJyZWFrOwogICAgfQoKICAgIHVjTmV4dEFDID0gKCB1Y05leHRBQyAtIDEgKSAmIFdMQU5UTF9NQVNLX0FDOwoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJOZXh0IEFDICVkIiwgdWNOZXh0QUMpKTsKCiAgfQoKICBUTExPRzIoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICAgICAgIiBDIEFDOiAlZCBDIFc6ICVkIiwKICAgICAgICAgICAgIHBUTENiLT5hdGxTVEFDbGllbnRzWypwdWNTVEFJZF0tPnVjQ3VycmVudEFDLAogICAgICAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbKnB1Y1NUQUlkXS0+dWNDdXJyZW50V2VpZ2h0KSk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOX1RMR2V0TmV4dFR4SWRzICovCgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgREVGQVVMVCBIQU5ETEVSUzogUmVnaXN0ZXJlZCBhdCBpbml0aWFsaXphdGlvbiB3aXRoIFRMCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IE1nbXQgRnJtIHJ4IGNhbGxiYWNrOiBhc3NlcnRzIGFsbCB0aGUgdGltZS4gSWYgdGhpcyBmdW5jdGlvbiBnZXRzCiAgICBjYWxsZWQgIGl0IG1lYW5zIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgcnggY2IgcG9pbnRlciBmb3IgTWdtdCBGcm0uCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfTWdtdEZybVJ4RGVmYXVsdENiCigKICB2X1BWT0lEX3QgIHB2b3NHQ3R4LAogIHZfUFZPSURfdCAgdm9zQnVmZgopCnsKICBpZiAoIE5VTEwgIT0gdm9zQnVmZiApCiAgewogICAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgIldMQU4gVEw6RmF0YWwgZmFpbHVyZTogTm8gcmVnaXN0ZXJlZCBNZ210IEZybSBjbGllbnQgb24gcGt0IFJYIikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCgodm9zX3BrdF90ICopdm9zQnVmZik7CiAgfQoKICAgICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgICAiV0xBTiBUTDogTm8gcmVnaXN0ZXJlZCBNZ210IEZybSBjbGllbnQgb24gcGt0IFJYLiBMb2FkL1VubG9hZCBpbiBwcm9ncmVzcywgSWdub3JlIikpOwoKICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cn0vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgIFdMQU5UTF9CQVBSeERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBCQVAgcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBCQVAuCgogIERFUEVOREVOQ0lFUwoKICBQQVJBTUVURVJTCiAgICBOb3QgdXNlZC4KCiAgUkVUVVJOIFZBTFVFCgogICBWT1NfU1RBVFVTX0VfRkFJTFVSRTogQWx3YXlzIEZBSUxVUkUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQkFQUnhEZWZhdWx0Q2IKKAogIHZfUFZPSURfdCAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICB2b3NEYXRhQnVmZiwKICBXTEFOVExfQkFQRnJhbWVFbnVtVHlwZSBmcmFtZVR5cGUKKQp7CiAgVExMT0dQKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0ZBVEFMLAogICAgICAgICAgICAgIldMQU4gVEw6RmF0YWwgZmFpbHVyZTogTm8gcmVnaXN0ZXJlZCBCQVAgY2xpZW50IG9uIEJBUCBwa3QgUlgiKSk7CiNpZm5kZWYgQlRBTVBfVEVTVAogIFZPU19BU1NFUlQoMCk7CiNlbmRpZgogIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9TVEFSeERlZmF1bHRDYgoKICBERVNDUklQVElPTgogICAgRGVmYXVsdCBTVEEgcnggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCByeCBjYiBwb2ludGVyIGZvciBzdGF0aW9uLgogICAgKE1lbSBjb3JydXB0aW9uIG1vc3QgbGlrZWx5LCBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuKQoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICAgTm90IHVzZWQuCgogIFJFVFVSTiBWQUxVRQoKICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFSeERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdm9zX3BrdF90KiAgICAgICAgICAgICAgdm9zRGF0YUJ1ZmYsCiAgdl9VOF90ICAgICAgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfUnhNZXRhSW5mb1R5cGUqICBwUnhNZXRhSW5mbwopCnsKICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAiV0xBTiBUTDogTm8gcmVnaXN0ZXJlZCBTVEEgY2xpZW50IHJ4IGNiIGZvciBTVEFJRDogJWQgZHJvcHBpbmcgcGt0IiwKICAgICAgICAgICAgICAgdWNTVEFJZCkpOwogIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYiovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfU1RBRmV0Y2hQa3REZWZhdWx0Q2IKCiAgREVTQ1JJUFRJT04KICAgIERlZmF1bHQgZmV0Y2ggY2FsbGJhY2s6IGFzc2VydHMgYWxsIHRoZSB0aW1lLiBJZiB0aGlzIGZ1bmN0aW9uIGdldHMKICAgIGNhbGxlZCAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBmZXRjaCBjYiBwb2ludGVyIGZvciBzdGF0aW9uLgogICAgKE1lbSBjb3JydXB0aW9uIG1vc3QgbGlrZWx5LCBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuKQoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwogICAgTm90IHVzZWQuCgogIFJFVFVSTiBWQUxVRQoKICAgIFZPU19TVEFUVVNfRV9GQUlMVVJFOiBBbHdheXMgRkFJTFVSRS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9TVEFGZXRjaFBrdERlZmF1bHRDYgooCiAgdl9QVk9JRF90ICAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgIHB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICAgICAgdWNBQywKICB2b3NfcGt0X3QqKiAgICAgICAgICAgIHZvc0RhdGFCdWZmLAogIFdMQU5UTF9NZXRhSW5mb1R5cGUqICAgdGxNZXRhSW5mbwopCnsKICBUTExPR1AoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRkFUQUwsCiAgICAgICAgICAgICAiV0xBTiBUTDpGYXRhbCBmYWlsdXJlOiBObyByZWdpc3RlcmVkIFNUQSBjbGllbnQgb24gZGF0YSBwa3QgUlgiKSk7CiAgVk9TX0FTU0VSVCgwKTsKICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7Cn0vKldMQU5UTF9NZ210RnJtUnhEZWZhdWx0Q2IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfVHhDb21wRGVmYXVsdENiCgogIERFU0NSSVBUSU9OCiAgICBEZWZhdWx0IHR4IGNvbXBsZXRlIGhhbmRsZXIuIEl0IHdpbGwgcmVsZWFzZSB0aGUgY29tcGxldGVkIHBrdCB0bwogICAgcHJldmVudCBtZW1vcnkgbGVha3MuCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8KICAgICAgICAgICAgICAgICAgICBUTC9IQUwvUEUvQkFQL0hERCBjb250cm9sIGJsb2NrIGNhbiBiZSBleHRyYWN0ZWQgZnJvbQogICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZXh0CiAgICB2b3NEYXRhQnVmZjogICBwb2ludGVyIHRvIHRoZSBWT1NTIGRhdGEgYnVmZmVyIHRoYXQgd2FzIHRyYW5zbWl0dGVkCiAgICB3VHhTVEF0dXM6ICAgICAgc3RhdHVzIG9mIHRoZSB0cmFuc21pc3Npb24KCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb247IHBsZWFzZQogICAgY2hlY2sgdm9zX3BrdF9yZXR1cm5fcGFja2V0IGZvciBwb3NzaWJsZSBlcnJvciBjb2Rlcy4KCiAgICBQbGVhc2UgY2hlY2sgIHZvc19wa3RfcmV0dXJuX3BhY2tldCBBUEkgZm9yIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfVHhDb21wRGVmYXVsdENiCigKIHZfUFZPSURfdCAgICAgIHB2b3NHQ3R4LAogdm9zX3BrdF90KiAgICAgdm9zRGF0YUJ1ZmYsCiBWT1NfU1RBVFVTICAgICB3VHhTVEF0dXMKKQp7CiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgIldMQU4gVEw6VFhDb21wIG5vdCByZWdpc3RlcmVkLCByZWxlYXNpbmcgcGt0IHRvIHByZXZlbnQgbWVtIGxlYWsiKSk7CiAgcmV0dXJuIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7Cn0vKldMQU5UTF9UeENvbXBEZWZhdWx0Q2IqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgQ2xlYW51cCBmdW5jdGlvbnMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEZVTkNUSU9OICAgIFdMQU5UTF9DbGVhbkNCCgogIERFU0NSSVBUSU9OCiAgICBDbGVhbnMgVEwgY29udHJvbCBibG9jawoKICBERVBFTkRFTkNJRVMKCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwVExDYjogICAgICAgcG9pbnRlciB0byBUTCdzIGNvbnRyb2wgYmxvY2sKICAgIHVjRW1wdHk6ICAgICBzZXQgaWYgVEwgaGFzIHRvIGNsZWFuIHVwIHRoZSBxdWV1ZXMgYW5kIHJlbGVhc2UgcGVkbmluZyBwa3RzCgogIFJFVFVSTiBWQUxVRQogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICAgVk9TX1NUQVRVU19FX0lOVkFMOiAgIGludmFsaWQgaW5wdXQgcGFyYW1ldGVycwogICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xlYW5DQgooCiAgV0xBTlRMX0NiVHlwZSogIHBUTENiLAogIHZfVThfdCAgICAgIHVjRW1wdHkKKQp7CiAgdl9VOF90IHVjSW5kZXg7CiAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DbGVhbkNCIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qIG51bWJlciBvZiBwYWNrZXRzIHNlbnQgdG8gQkFMIHdhaXRpbmcgZm9yIHR4IGNvbXBsZXRlIGNvbmZpcm1hdGlvbiAqLwogIHBUTENiLT51c1BlbmRpbmdUeENvbXBsZXRlQ291bnQgPSAwOwoKICAvKiBnbG9iYWwgc3VzcGVuZCBmbGFnICovCiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcFRMQ2ItPnVjVHhTdXNwZW5kZWQsIDEpOwoKICAvKiByZXNvdXJjZSBmbGFnICovCiAgcFRMQ2ItPnVSZXNDb3VudCA9IDA7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIENsaWVudCBzdGF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5fTUFYX1NUQV9DT1VOVCA7IHVjSW5kZXgrKykKICB7CiAgICBpZihOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjSW5kZXhdKQogICAgewogICAgICAgIFdMQU5UTF9DbGVhblNUQSggcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNJbmRleF0sIHVjRW1wdHkpOwogICAgfQogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBNYW5hZ2VtZW50IEZyYW1lIGNsaWVudAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnVjRXhpc3RzID0gMDsKCiAgaWYgKCAoIDAgIT0gdWNFbXB0eSkgJiYKICAgICAgICggTlVMTCAhPSBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiApKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgfQoKICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgPSBOVUxMOwoKICAvKiBzZXQgdG8gYSBkZWZhdWx0IGNiIGluIG9yZGVyIHRvIHByZXZlbnQgY29uc3RhbnQgY2hlY2tpbmcgZm9yIE5VTEwgKi8KICBwVExDYi0+dGxNZ210RnJtQ2xpZW50LnBmblRsTWdtdEZybVJ4ID0gV0xBTlRMX01nbXRGcm1SeERlZmF1bHRDYjsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBCVCBBTVAgY2xpZW50CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiLT50bEJBUENsaWVudC51Y0V4aXN0cyA9IDA7CgogIGlmICgoIDAgIT0gdWNFbXB0eSkgJiYKICAgICAgKCBOVUxMICE9IHBUTENiLT50bEJBUENsaWVudC52b3NQZW5kaW5nRGF0YUJ1ZmYgKSkKICB7CiAgICB2b3NfcGt0X3JldHVybl9wYWNrZXQocFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZik7CiAgfQogIAogIGlmICgoIDAgIT0gdWNFbXB0eSkgJiYKICAgICAgKCBOVUxMICE9IHBUTENiLT52b3NEdW1teUJ1ZiApKQogIHsKICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldChwVExDYi0+dm9zRHVtbXlCdWYpOwogIH0KCiAgcFRMQ2ItPnRsQkFQQ2xpZW50LnZvc1BlbmRpbmdEYXRhQnVmZiAgPSBOVUxMOwoKICBwVExDYi0+dm9zRHVtbXlCdWYgPSBOVUxMOwogIHBUTENiLT52b3NUZW1wQnVmICA9IE5VTEw7CiAgcFRMQ2ItPnVjQ2FjaGVkU1RBSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CgogIC8qIHNldCB0byBhIGRlZmF1bHQgY2IgaW4gb3JkZXIgdG8gcHJldmVudCBjb25zdGFudCBjaGVja2luZyBmb3IgTlVMTCAqLwogIHBUTENiLT50bEJBUENsaWVudC5wZm5UbEJBUFJ4ID0gV0xBTlRMX0JBUFJ4RGVmYXVsdENiOwoKICBwVExDYi0+dWNSZWdpc3RlcmVkU3RhSWQgPSBXTEFOX01BWF9TVEFfQ09VTlQ7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cgp9LyogV0xBTlRMX0NsZWFuQ0IqLwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfQ2xlYW5TVEEKCiAgREVTQ1JJUFRJT04KICAgIENsZWFucyBhIHN0YXRpb24gY29udHJvbCBibG9jay4KCiAgREVQRU5ERU5DSUVTCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y0VtcHR5OiAgICAgICAgaWYgc2V0IHRoZSBxdWV1ZXMgYW5kIHBlbmRpbmcgcGt0cyB3aWxsIGJlIGVtcHR5ZWQKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfRV9JTlZBTDogICBpbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfQ2xlYW5TVEEKKAogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgcHRsU1RBQ2xpZW50LAogIHZfVThfdCAgICAgICAgICAgICB1Y0VtcHR5CikKewogIHZfVThfdCAgdWNJbmRleDsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHB0bFNUQUNsaWVudCApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIHBhcmFtZXRlciBzZW50IG9uIFdMQU5UTF9DbGVhblNUQSIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2xlYXIgc3RhdGlvbiBmcm9tIFRMCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICJXTEFOIFRMOiBDbGVhcmluZyBTVEEgQ2xpZW50IElEOiAlZCwgRW1wdHkgZmxhZzogJWQiLAogICAgICAgICAgICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1NUQUlkLCB1Y0VtcHR5ICkpOwoKICBwdGxTVEFDbGllbnQtPnBmblNUQVJ4ICAgICAgICAgID0gV0xBTlRMX1NUQVJ4RGVmYXVsdENiOwogIHB0bFNUQUNsaWVudC0+cGZuU1RBVHhDb21wICAgICAgPSBXTEFOVExfVHhDb21wRGVmYXVsdENiOwogIHB0bFNUQUNsaWVudC0+cGZuU1RBRmV0Y2hQa3QgICAgPSBXTEFOVExfU1RBRmV0Y2hQa3REZWZhdWx0Q2I7CgogIHB0bFNUQUNsaWVudC0+dGxTdGF0ZSAgICAgICAgICAgPSBXTEFOVExfU1RBX0lOSVQ7CiAgcHRsU1RBQ2xpZW50LT50bFByaSAgICAgICAgICAgICA9IFdMQU5UTF9TVEFfUFJJX05PUk1BTDsKCiAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudlNUQU1BQ0FkZHJlc3MgKTsKICB2b3NfemVyb19tYWNhZGRyKCAmcHRsU1RBQ2xpZW50LT53U1RBRGVzYy52QlNTSURmb3JJQlNTICk7CiAgdm9zX3plcm9fbWFjYWRkciggJnB0bFNUQUNsaWVudC0+d1NUQURlc2MudlNlbGZNQUNBZGRyZXNzICk7CgogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNTVEFJZCAgPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2Mud1NUQVR5cGUgPSBXTEFOX1NUQV9NQVg7CgogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNRb3NFbmFibGVkICAgICA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y0FkZFJtdkxMQyAgICAgID0gMDsKICBwdGxTVEFDbGllbnQtPndTVEFEZXNjLnVjU3dGcmFtZVRYWGxhdGlvbiA9IDA7CiAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1N3RnJhbWVSWFhsYXRpb24gPSAwOwogIHB0bFNUQUNsaWVudC0+d1NUQURlc2MudWNQcm90ZWN0ZWRGcmFtZSA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQU1TRFUgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCAoIDAgIT0gdWNFbXB0eSApICYmCiAgICAgICAoIE5VTEwgIT0gcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCApKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9GQVRBTCwKICAgICAgICAgICAgICAgIldMQU4gVEw6Tm9uIE5VTEwgdm9zQU1TRFVDaGFpblJvb3Qgb24gV0xBTlRMX0NsZWFuU1RBLCAiCiAgICAgICAgICAgICAgICJzdXNwZWN0aW5nIGEgbWVtb3J5IGNvcnJ1cHRpb24iKSk7CgogIH0KCiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluICAgICA9IE5VTEw7CiAgcHRsU1RBQ2xpZW50LT52b3NBTVNEVUNoYWluUm9vdCA9IE5VTEw7CgogIHZvc19tZW1femVybyggKHZfUFZPSURfdClwdGxTVEFDbGllbnQtPmF1Y01QRFVIZWFkZXIsCiAgICAgICAgICAgICAgICAgV0xBTlRMX01QRFVfSEVBREVSX0xFTik7CiAgcHRsU1RBQ2xpZW50LT51Y01QRFVIZWFkZXJMZW4gICAgPSAwOwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFJlb3JkZXJpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBTVEEKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZm9yICggdWNJbmRleCA9IDA7IHVjSW5kZXggPCBXTEFOX01BWF9USUQgOyB1Y0luZGV4KyspCiAgewogICAgaWYoMCA9PSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0udWNFeGlzdHMpCiAgICB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYoTlVMTCAhPSBwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0ucmVvcmRlckJ1ZmZlcikKICAgIHsKICAgICAgcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmlzQXZhaWxhYmxlID0gVk9TX1RSVUU7CiAgICAgIG1lbXNldCgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLnJlb3JkZXJCdWZmZXItPmFycmF5QnVmZmVyWzBdLCAwLCBXTEFOVExfTUFYX1dJTlNJWkUgKiBzaXplb2Yodl9QVk9JRF90KSk7CiAgICB9CiAgICB2b3NfdGltZXJfZGVzdHJveSgmcHRsU1RBQ2xpZW50LT5hdGxCQVJlb3JkZXJJbmZvW3VjSW5kZXhdLmFnaW5nVGltZXIpOwogICAgbWVtc2V0KCZwdGxTVEFDbGllbnQtPmF0bEJBUmVvcmRlckluZm9bdWNJbmRleF0sIDAsIHNpemVvZihXTEFOVExfQkFSZW9yZGVyVHlwZSkpOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgUU9TIGluZm9ybWF0aW9uIGZvciB0aGUgU1RBCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgcHRsU1RBQ2xpZW50LT51Y0N1cnJlbnRBQyAgICAgPSBXTEFOVExfQUNfVk87CiAgIHB0bFNUQUNsaWVudC0+dWNDdXJyZW50V2VpZ2h0ID0gMDsKICAgcHRsU1RBQ2xpZW50LT51Y1NlcnZpY2VkQUMgICAgPSBXTEFOVExfQUNfQks7CgogICB2b3NfbWVtX3plcm8oIHB0bFNUQUNsaWVudC0+YXVjQUNNYXNrLCBzaXplb2YocHRsU1RBQ2xpZW50LT5hdWNBQ01hc2spKTsKICAgdm9zX21lbV96ZXJvKCAmcHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvLCBzaXplb2YocHRsU1RBQ2xpZW50LT53VUFQU0RJbmZvKSk7CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTdGF0cyBpbmZvCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIHZvc19tZW1femVybyggcHRsU1RBQ2xpZW50LT5hdVJ4Q291bnQsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0bFNUQUNsaWVudC0+YXVSeENvdW50WzBdKSogV0xBTl9NQVhfVElEKTsKICAgdm9zX21lbV96ZXJvKCBwdGxTVEFDbGllbnQtPmF1VHhDb3VudCwKICAgICAgICAgICAgICAgICBzaXplb2YocHRsU1RBQ2xpZW50LT5hdVR4Q291bnRbMF0pKiBXTEFOX01BWF9USUQpOwogICBwdGxTVEFDbGllbnQtPnJzc2lBdmcgPSAwOwoKICAgLypUeCBub3Qgc3VzcGVuZGVkIGFuZCBzdGF0aW9uIGZ1bGx5IHJlZ2lzdGVyZWQqLwogICB2b3NfYXRvbWljX3NldF9VOCggJnB0bFNUQUNsaWVudC0+dWNUeFN1c3BlbmRlZCwgMCk7CiAgIHZvc19hdG9taWNfc2V0X1U4KCAmcHRsU1RBQ2xpZW50LT51Y05vTW9yZURhdGEsIDEpOwoKICBpZiAoIDAgPT0gdWNFbXB0eSApCiAgewogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y1VjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX1VfU0lHOwogICAgcHRsU1RBQ2xpZW50LT53U1RBRGVzYy51Y0JjYXN0U2lnICAgICAgID0gV0xBTl9UTF9JTlZBTElEX0JfU0lHOwogIH0KCiAgcHRsU1RBQ2xpZW50LT51Y0V4aXN0cyAgICAgICA9IDA7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFN0YXRpc3RpY3MgaW5mbyAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBtZW1zZXQoJnB0bFNUQUNsaWVudC0+dHJhZmZpY1N0YXRpc3RpY3MsCiAgICAgICAgIDAsCiAgICAgICAgIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKCiAgLypmaXggbWUhITogYWRkIG5ldyB2YWx1ZXMgZnJvbSB0aGUgVEwgQ2IgZm9yIGNsZWFudXAgKi8KICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9LyogV0xBTlRMX0NsZWFuU1RBICovCgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgIFdMQU5UTF9FbmFibGVVQVBTREZvckFDCgogIERFU0NSSVBUSU9OCiAgIENhbGxlZCBieSBIREQgdG8gZW5hYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZW5hYmxlIHRoZQogICBsb2dpYyBpbiBGVy9TTE0gdG8gc3RhcnQgc2VuZGluZyB0cmlnZ2VyIGZyYW1lcy4gUHJldmlvdXNseSBUTCBoYWQgdGhlCiAgIHRyaWdnZXIgZnJhbWUgbG9naWMgd2hpY2ggbGF0ZXIgbW92ZWQgZG93biB0byBGVy4gSGVuY2UKICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIElkCiAgICB1Y0FDOiAgICAgICAgICAgQUMgZm9yIHdoaWNoIFUtQVBTRCBpcyBiZWluZyBlbmFibGVkCiAgICB1Y1RpZDogICAgICAgICAgVElEIGZvciB3aGljaCBVLUFQU0QgaXMgc2V0dXAKICAgIHVjVVA6ICAgICAgICAgICB1c2VkIHRvIHBsYWNlIGluIHRoZSB0cmlnZ2VyIGZyYW1lIGdlbmVyYXRpb24KICAgIHVjU2VydmljZUludDogICBzZXJ2aWNlIGludGVydmFsIHVzZWQgYnkgVEwgdG8gc2VuZCB0cmlnZ2VyIGZyYW1lcwogICAgdWNTdXNwZW5kSW50OiAgIHN1c3BlbmQgaW50ZXJ2YWwgdXNlZCBieSBUTCB0byBkZXRlcm1pbmUgdGhhdCBhbgogICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpZGxlIGFuZCBzaG91bGQgc3RhcnQgc2VuZGluZyB0cmlnZyBmcm1zIGxlc3Mgb2Z0ZW4KICAgIHdUU0RpcjogICAgICAgICBkaXJlY3Rpb24gb2YgVFNwZWMKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRW5hYmxlVUFQU0RGb3JBQwooCiAgdl9QVk9JRF90ICAgICAgICAgIHB2b3NHQ3R4LAogIHZfVThfdCAgICAgICAgICAgICB1Y1NUQUlkLAogIFdMQU5UTF9BQ0VudW1UeXBlICB1Y0FDLAogIHZfVThfdCAgICAgICAgICAgICB1Y1RpZCwKICB2X1U4X3QgICAgICAgICAgICAgdWNVUCwKICB2X1UzMl90ICAgICAgICAgICAgdVNlcnZpY2VJbnQsCiAgdl9VMzJfdCAgICAgICAgICAgIHVTdXNwZW5kSW50LAogIFdMQU5UTF9UU0RpclR5cGUgICB3VFNEaXIKKQp7CgogIFdMQU5UTF9DYlR5cGUqICAgICAgcFRMQ2IgICAgICA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICB2b3NTdGF0dXMgICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICB0VWFwc2RJbmZvICAgICAgICAgIGhhbFVBUFNESW5mbzsgCiAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkKICAgICAgfHwgICBXTEFOVExfQUNfSU5WQUxJRCh1Y0FDKSkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgaW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9FbmFibGVVQVBTREZvckFDIgogICAgICAgICAgICAgICAiIFRMOiAlcCAgU1RBOiAlZCAgQUM6ICVkIiwKICAgICAgICAgICAgICAgcFRMQ2IsIHVjU1RBSWQsIHVjQUMpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qU2V0IHRoaXMgZmxhZyBpbiBvcmRlciB0byByZW1lbWJlciB0aGF0IHRoaXMgaXMgYSB0cmlnZ2VyIGVuYWJsZWQgQUMqLwogIHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53VUFQU0RJbmZvW3VjQUNdLnVjU2V0ID0gMTsKCiNpZmRlZiBGRUFUVVJFX1dMQU5fVERMUwogIGlmKHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT53U1RBRGVzYy53U1RBVHlwZSAhPSBXTEFOX1NUQV9URExTKQojZW5kaWYKICB7CiAgICBpZiggMCA9PSB1U2VydmljZUludCApCiAgICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW5wdXQgcGFyYW1zIG9uIFdMQU5UTF9FbmFibGVVQVBTREZvckFDIgogICAgICAgICAgICAgICAiIFNJOiAlZCIsIHVTZXJ2aWNlSW50ICkpOwogICAgfQoKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkVuYWJsaW5nIFUtQVBTRCBpbiBGVyBmb3IgU1RBOiAlZCBBQzogJWQgU0k6ICVkIFNQSTogJWQgIgogICAgICAgICAgICAgICAiREk6ICVkIiwKICAgICAgICAgICAgICAgdWNTVEFJZCwgdWNBQywgdVNlcnZpY2VJbnQsIHVTdXNwZW5kSW50LAogICAgICAgICAgICAgICBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludCkpOwoKICAgIC8qU2F2ZSBhbGwgaW5mbyBmb3IgSEFMKi8KICAgIGhhbFVBUFNESW5mby5zdGFpZHggICAgICAgICA9IHVjU1RBSWQ7CiAgICBoYWxVQVBTREluZm8uYWMgICAgICAgICAgICAgPSB1Y0FDOwogICAgaGFsVUFQU0RJbmZvLnVwICAgICAgICAgICAgID0gdWNVUDsKICAgIGhhbFVBUFNESW5mby5zcnZJbnRlcnZhbCAgICA9IHVTZXJ2aWNlSW50OwogICAgaGFsVUFQU0RJbmZvLnN1c0ludGVydmFsICAgID0gdVN1c3BlbmRJbnQ7CiAgICBoYWxVQVBTREluZm8uZGVsYXlJbnRlcnZhbCAgPSBwVExDYi0+dGxDb25maWdJbmZvLnVEZWxheWVkVHJpZ2dlckZybUludDsKCiAgICAvKk5vdGlmeSBIQUwqLwogICAgdm9zU3RhdHVzID0gV0RBX0VuYWJsZVVhcHNkQWNQYXJhbXMocHZvc0dDdHgsIHVjU1RBSWQsICZoYWxVQVBTREluZm8pOwogIH0KICByZXR1cm4gdm9zU3RhdHVzOwoKfS8qV0xBTlRMX0VuYWJsZVVBUFNERm9yQUMqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMKCiAgREVTQ1JJUFRJT04KICAgQ2FsbGVkIGJ5IEhERCB0byBkaXNhYmxlIFVBUFNELiBUTCBpbiB0dXJuIGNhbGxzIFdEQSBBUEkgdG8gZGlzYWJsZSB0aGUKICAgbG9naWMgaW4gRlcvU0xNIHRvIHN0b3Agc2VuZGluZyB0cmlnZ2VyIGZyYW1lcy4gUHJldmlvdXNseSBUTCBoYWQgdGhlCiAgIHRyaWdnZXIgZnJhbWUgbG9naWMgd2hpY2ggbGF0ZXIgbW92ZWQgZG93biB0byBGVy4gSGVuY2UKICAgSEREIC0+IFRMIC0+IFdEQSAtPiBGVyBjYWxsIGZsb3cuCgogIERFUEVOREVOQ0lFUwogICAgVGhlIFRMIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZC4KCiAgUEFSQU1FVEVSUwoKICAgIElOCiAgICBwdm9zR0N0eDogICAgICAgcG9pbnRlciB0byB0aGUgZ2xvYmFsIHZvcyBjb250ZXh0OyBhIGhhbmRsZSB0byBUTCdzCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQKICAgIHVjU1RBSWQ6ICAgICAgICBzdGF0aW9uIElkCiAgICB1Y0FDOiAgICAgICAgIEFDIGZvciB3aGljaCBVLUFQU0QgaXMgYmVpbmcgZW5hYmxlZAoKCiAgUkVUVVJOIFZBTFVFCiAgICBUaGUgcmVzdWx0IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgoKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogICBFdmVyeXRoaW5nIGlzIGdvb2QgOikKCiAgU0lERSBFRkZFQ1RTCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUwpXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMKKAogIHZfUFZPSURfdCAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QgICAgICAgICAgICAgdWNTVEFJZCwKICBXTEFOVExfQUNFbnVtVHlwZSAgdWNBQwopCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYjsKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKICBpZiAoKCBOVUxMID09IHBUTENiICkgfHwgV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkKICAgICAgfHwgICBXTEFOVExfQUNfSU5WQUxJRCh1Y0FDKSApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAiV0xBTiBUTDpJbnZhbGlkIGlucHV0IHBhcmFtcyBvbiBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMiCiAgICAgICAgICAgICAgICIgVEw6ICVwICBTVEE6ICVkICBBQzogJWQiLCBwVExDYiwgdWNTVEFJZCwgdWNBQyApKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBpZiAoIE5VTEwgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0gKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIC8qUmVzZXQgdGhpcyBmbGFnIGFzIHRoaXMgaXMgbm8gbG9uZ2VyIGEgdHJpZ2dlciBlbmFibGVkIEFDKi8KICBwVExDYi0+YXRsU1RBQ2xpZW50c1t1Y1NUQUlkXS0+d1VBUFNESW5mb1t1Y0FDXS51Y1NldCA9IDE7CgogIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAiV0xBTiBUTDpEaXNhYmxpbmcgVS1BUFNEIGluIEZXIGZvciBTVEE6ICVkIEFDOiAlZCAiLAogICAgICAgICAgICAgdWNTVEFJZCwgdWNBQykpOwoKICAvKk5vdGlmeSBIQUwqLwogIFdEQV9EaXNhYmxlVWFwc2RBY1BhcmFtcyhwdm9zR0N0eCwgdWNTVEFJZCwgdWNBQyk7CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0vKiBXTEFOVExfRGlzYWJsZVVBUFNERm9yQUMgKi8KCiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX1JlZ1JTU0lJbmRpY2F0aW9uQ0IKCiAgREVTQ1JJUFRJT04gIFJlZ2lzdHJhdGlvbiBmdW5jdGlvbiB0byBnZXQgbm90aWZpY2F0aW9uIGlmIFJTU0kgY3Jvc3MKICAgICAgICAgICAgICAgdGhyZXNob2xkLgogICAgICAgICAgICAgICBDbGllbnQgc2hvdWxkIHJlZ2lzdGVyIHRocmVzaG9sZCwgZGlyZWN0aW9uLCBhbmQgbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gcnNzaVZhbHVlIC0gUlNTSSB0aHJlc2hvbGQgdmFsdWUKICAgICAgICAgICAgICAgaW4gdHJpZ2dlckV2ZW50IC0gQ3Jvc3MgZGlyZWN0aW9uIHNob3VsZCBiZSBub3RpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCiAgICAgICAgICAgICAgIGluIGNyb3NzQ0JGdW5jdGlvbiAtIE5vdGlmaWNhdGlvbiBDQiBGdW5jdGlvbgogICAgICAgICAgICAgICBpbiB1c3JDdHh0IC0gdXNlciBjb250ZXh0CgogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWdSU1NJSW5kaWNhdGlvbkNCCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9TN190ICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICBXTEFOVExfUlNTSUNyb3NzVGhyZXNob2xkQ0JUeXBlIGNyb3NzQ0JGdW5jdGlvbiwKICAgVk9TX01PRFVMRV9JRCAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0CikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTUmVnUlNTSUluZGljYXRpb25DQihwQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3NpVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzQ0JGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JDdHh0KTsKCiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgV0xBTlRMX0RlcmVnUlNTSUluZGljYXRpb25DQgoKICBERVNDUklQVElPTiAgUmVtb3ZlIHNwZWNpZmljIHRocmVzaG9sZCBmcm9tIGxpc3QKCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gcnNzaVZhbHVlIC0gUlNTSSB0aHJlc2hvbGQgdmFsdWUKICAgICAgICAgICAgICAgaW4gdHJpZ2dlckV2ZW50IC0gQ3Jvc3MgZGlyZWN0aW9uIHNob3VsZCBiZSBub3RpZmllZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUCwgRE9XTiwgYW5kIENST1NTCiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9EZXJlZ1JTU0lJbmRpY2F0aW9uQ0IKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1M3X3QgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc2lWYWx1ZSwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQsCiAgIFdMQU5UTF9SU1NJQ3Jvc3NUaHJlc2hvbGRDQlR5cGUgY3Jvc3NDQkZ1bmN0aW9uLAogICBWT1NfTU9EVUxFX0lEICAgICAgICAgICAgICAgICAgIG1vZHVsZUlECikKewogICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwoKICAgc3RhdHVzID0gV0xBTlRMX0hTRGVyZWdSU1NJSW5kaWNhdGlvbkNCKHBBZGFwdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNzaVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3NDQkZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlSUQpOwogICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgIFdMQU5UTF9TZXRBbHBoYQoKICBERVNDUklQVElPTiAgQUxQTEEgaXMgd2VpZ2h0IHZhbHVlIHRvIGNhbGN1bGF0ZSBBVkcgUlNTSQogICAgICAgICAgICAgICBhdmdSU1NJID0gKEFMUEhBICogaGlzdG9yeVJTU0kpICsgKCgxMCAtIEFMUEhBKSAqIG5ld1JTU0kpCiAgICAgICAgICAgICAgIGF2Z1JTU0kgaGFzIChBTFBIQSAqIDEwKSUgb2YgaGlzdG9yeSBSU1NJIHdlaWdodCBhbmQKICAgICAgICAgICAgICAgKDEwIC0gQUxQSEEpJSBvZiBuZXdSU1NJIHdlaWdodAogICAgICAgICAgICAgICBUaGlzIHBvcnRpb24gaXMgZHluYW1pY2FsbHkgY29uZmlndXJhYmxlLgogICAgICAgICAgICAgICBEZWZhdWx0IGlzID8KCiAgREVQRU5ERU5DSUVTIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgaW4gdmFsdWVBbHBhaCAtIEFMUEhBCiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9TZXRBbHBoYQooCiAgIHZfUFZPSURfdCBwQWRhcHRlciwKICAgdl9VOF90ICAgIHZhbHVlQWxwaGEKKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNTZXRBbHBoYShwQWRhcHRlciwgdmFsdWVBbHBoYSk7CiAgIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIEZVTkNUSU9OCgogICBERVNDUklQVElPTiAKICAgIAogICBQQVJBTUVURVJTIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfQk1QU1JTU0lSZWdpb25DaGFuZ2VkTm90aWZpY2F0aW9uCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgIHBBZGFwdGVyLAogICB0cFNpclJTU0lOb3RpZmljYXRpb24gcFJTU0lOb3RpZmljYXRpb24KKQp7CiAgIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CgogICBzdGF0dXMgPSBXTEFOVExfSFNCTVBTUlNTSVJlZ2lvbkNoYW5nZWROb3RpZmljYXRpb24ocEFkYXB0ZXIsIHBSU1NJTm90aWZpY2F0aW9uKTsKICAgcmV0dXJuIHN0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICBXTEFOVExfUmVnR2V0VHJhZmZpY1N0YXR1cwoKICBERVNDUklQVElPTiAgUmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGZvciB0cmFmZmljIHN0YXR1cyBtb25pdG9yaW5nCiAgICAgICAgICAgICAgIER1cmluZyBtZWFzdXJlIHBlcmlvZCBjb3VudCBkYXRhIGZyYW1lcy4KICAgICAgICAgICAgICAgSWYgZnJhbWUgY291bnQgaXMgbGFyZ2VyIHRoZW4gSURMRSB0aHJlc2hvbGQgc2V0IGFzIHRyYWZmaWMgT04KICAgICAgICAgICAgICAgb3IgT0ZGLgogICAgICAgICAgICAgICBBbmQgdHJhZmZpYyBzdGF0dXMgaXMgY2hhbmdlZCBzZW5kIHJlcG9ydCB0byBjbGllbnQgd2l0aAogICAgICAgICAgICAgICByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uCgogIERFUEVOREVOQ0lFUyBOT05FCiAgICAKICBQQVJBTUVURVJTICAgaW4gcEFkYXB0ZXIgLSBHbG9iYWwgaGFuZGxlCiAgICAgICAgICAgICAgIGluIGlkbGVUaHJlc2hvbGQgLSBUcmFmZmljIG9uIG9yIG9mZiB0aHJlc2hvbGQKICAgICAgICAgICAgICAgaW4gbWVhc3VyZVBlcmlvZCAtIFRyYWZmaWMgc3RhdGUgY2hlY2sgcGVyaW9kCiAgICAgICAgICAgICAgIGluIHRyZmZpY1N0YXR1c0NCIC0gdHJhZmZpYyBzdGF0dXMgY2hhbmdlZCBub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQiBmdW5jdGlvbgogICAgICAgICAgICAgICBpbiB1c3JDdHh0IC0gdXNlciBjb250ZXh0CiAgIAogIFJFVFVSTiBWQUxVRSBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9SZWdHZXRUcmFmZmljU3RhdHVzCigKICAgdl9QVk9JRF90ICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlciwKICAgdl9VMzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlVGhyZXNob2xkLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVQZXJpb2QsCiAgIFdMQU5UTF9UcmFmZmljU3RhdHVzQ2hhbmdlZENCVHlwZSAgdHJmZmljU3RhdHVzQ0IsCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyQ3R4dAopCnsKICAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKCiAgIHN0YXR1cyA9IFdMQU5UTF9IU1JlZ0dldFRyYWZmaWNTdGF0dXMocEFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlUGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZmZpY1N0YXR1c0NCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzckN0eHQpOwogICByZXR1cm4gc3RhdHVzOwp9CiNlbmRpZgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U3RhdGlzdGljcwoKICBERVNDUklQVElPTiAgIEdldCB0cmFmZmljIHN0YXRpc3RpY3MgZm9yIGlkZW50aWZpZWQgc3RhdGlvbiAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBvdXQgc3RhdEJ1ZmZlciAtIHRyYWZmaWMgc3RhdGlzdGljcyBidWZmZXIKICAgCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfR2V0U3RhdGlzdGljcwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICBXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUgICpzdGF0QnVmZmVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIGlmKE5VTEwgPT0gc3RhdEJ1ZmZlcikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgc3RhdGlzdGljcyBidWZmZXIgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBzdGF0aXN0aWNzID0gJnBDbGllbnRTVEEtPnRyYWZmaWNTdGF0aXN0aWNzOwogIHZvc19tZW1fY29weShzdGF0QnVmZmVyLCBzdGF0aXN0aWNzLCBzaXplb2YoV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFKSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFN0YXRpc3RpY3MKCiAgREVTQ1JJUFRJT04gICBSZXNldCBzdGF0aXN0aWNzIHN0cnVjdHVyZSBmb3IgaWRlbnRpZmllZCBzdGF0aW9uIElECiAgICAgICAgICAgICAgICBSZXNldCBtZWFucyBzZXQgdmFsdWVzIGFzIDAKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgIAogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3RhdGlzdGljcwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICB2X1U4X3QgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CgogIHBDbGllbnRTVEEgPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tTVEFpZF07CgogIGlmICggTlVMTCA9PSBwQ2xpZW50U1RBICkKICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBSUxVUkU7CiAgfQoKICBpZigwID09IHBDbGllbnRTVEEtPnVjRXhpc3RzKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgIldMQU4gVEw6ICVkIFNUQSBJRCBkb2VzIG5vdCBleGlzdCIsIFNUQWlkKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogIH0KCiAgc3RhdGlzdGljcyA9ICZwQ2xpZW50U1RBLT50cmFmZmljU3RhdGlzdGljczsKICB2b3NfbWVtX3plcm8oKHZfVk9JRF90ICopc3RhdGlzdGljcywgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKICByZXR1cm4gc3RhdHVzOwp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0U3BlY1N0YXRpc3RpYwoKICBERVNDUklQVElPTiAgIEdldCBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yCiAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQgCgogIERFUEVOREVOQ0lFUyAgTk9ORQoKICBQQVJBTUVURVJTICAgIGluIHBBZGFwdGVyIC0gR2xvYmFsIGhhbmRsZQogICAgICAgICAgICAgICAgaW4gc3RhdFR5cGUgLSBzcGVjaWZpYyBzdGF0aXN0aWNzIGZpZWxkIHRvIHJlc2V0CiAgICAgICAgICAgICAgICBpbiBTVEFpZCAgICAtIFN0YXRpb24gSUQKICAgICAgICAgICAgICAgIG91dCBidWZmZXIgIC0gU3RhdGlzdGljIHZhbHVlCiAgIAogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX0dldFNwZWNTdGF0aXN0aWMKKAogICB2X1BWT0lEX3QgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLAogICBXTEFOVExfVFJBTlNGRVJfU1RBVElDX1RZUEUgIHN0YXRUeXBlLAogICB2X1UzMl90ICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKICAgdl9VOF90ICAgICAgICAgICAgICAgICAgICAgICBTVEFpZAopCnsKICBXTEFOVExfQ2JUeXBlICAgICAgICAgICAgKnBUTENiICA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogIFdMQU5UTF9TVEFDbGllbnRUeXBlKiAgICAgcENsaWVudFNUQSA9IE5VTEw7CiAgVk9TX1NUQVRVUyAgICAgICAgICAgICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0aXN0aWNzID0gTlVMTDsKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmIChOVUxMID09IHBUTENiKSAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICB9CiAgcENsaWVudFNUQSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW1NUQWlkXTsKCiAgaWYgKCBOVUxMID09IHBDbGllbnRTVEEgKQogIHsKICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgIldMQU4gVEw6Q2xpZW50IE1lbW9yeSB3YXMgbm90IGFsbG9jYXRlZCBvbiAlcyIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CgogIGlmKDAgPT0gcENsaWVudFNUQS0+dWNFeGlzdHMpCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAiV0xBTiBUTDogJWQgU1RBIElEIGRvZXMgbm90IGV4aXN0IiwgU1RBaWQpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICBpZihOVUxMID09IGJ1ZmZlcikKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOkludmFsaWQgVEwgc3RhdGlzdGljIGJ1ZmZlciBwb2ludGVyIG9uIFdMQU5UTF9HZXRTdGF0aXN0aWNzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgc3dpdGNoKHN0YXRUeXBlKQogIHsKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhVQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhCQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhVQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhNQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+dHhCQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhVQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19GQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCQ0ZjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhVQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhNQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCQ0JjbnQ7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UOgogICAgICAqYnVmZmVyID0gc3RhdGlzdGljcy0+cnhCY250OwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVF9DUkNfT0s6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeEJjbnRDUkNvazsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1JBVEU6CiAgICAgICpidWZmZXIgPSBzdGF0aXN0aWNzLT5yeFJhdGU7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICpidWZmZXIgPSAwOwogICAgICBzdGF0dXMgPSBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgICAgIGJyZWFrOwogIH0KCgogIHJldHVybiBzdGF0dXM7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9SZXNldFNwZWNTdGF0aXN0aWMKCiAgREVTQ1JJUFRJT04gICBSZXNldCBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gc3RhdGlzdGljcyBzdHJ1Y3R1cmUgZm9yCiAgICAgICAgICAgICAgICBpZGVudGlmaWVkIHN0YXRpb24gSUQKICAgICAgICAgICAgICAgIFJlc2V0IG1lYW5zIHNldCBhcyAwCgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBwQWRhcHRlciAtIEdsb2JhbCBoYW5kbGUKICAgICAgICAgICAgICAgIGluIHN0YXRUeXBlIC0gc3BlY2lmaWMgc3RhdGlzdGljcyBmaWVsZCB0byByZXNldAogICAgICAgICAgICAgICAgaW4gU1RBaWQgICAgLSBTdGF0aW9uIElECgogIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoKICBTSURFIEVGRkVDVFMgIE5PTkUKICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovClZPU19TVEFUVVMgV0xBTlRMX1Jlc2V0U3BlY1N0YXRpc3RpYwooCiAgIHZfUFZPSURfdCAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXIsCiAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFUSUNfVFlQRSAgc3RhdFR5cGUsCiAgIHZfVThfdCAgICAgICAgICAgICAgICAgICAgICAgU1RBaWQKKQp7CiAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICBXTEFOVExfU1RBQ2xpZW50VHlwZSogICAgIHBDbGllbnRTVEEgPSBOVUxMOwogIFZPU19TVEFUVVMgICAgICAgICAgICAgICAgc3RhdHVzID0gVk9TX1NUQVRVU19TVUNDRVNTOwogIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSAqc3RhdGlzdGljcyA9IE5VTEw7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTYW5pdHkgY2hlY2sKICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZiAoTlVMTCA9PSBwVExDYikgCiAgewogICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBvbiBXTEFOVExfR2V0U3RhdGlzdGljcyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQoKICBwQ2xpZW50U1RBID0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbU1RBaWRdOwoKICBpZiAoIE5VTEwgPT0gcENsaWVudFNUQSApCiAgewogICAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogIH0KCiAgaWYoMCA9PSBwQ2xpZW50U1RBLT51Y0V4aXN0cykKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICJXTEFOIFRMOiAlZCBTVEEgSUQgZG9lcyBub3QgZXhpc3QiLCBTVEFpZCkpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIHN0YXRpc3RpY3MgPSAmcENsaWVudFNUQS0+dHJhZmZpY1N0YXRpc3RpY3M7CiAgc3dpdGNoKHN0YXRUeXBlKQogIHsKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eFVDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eE1DRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT50eEJDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9VQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eFVDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9NQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eE1DQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19UWF9CQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT50eEJDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeFVDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeE1DRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19GQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJDRmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9VQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeFVDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9NQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeE1DQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ19CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJDQmNudCA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgV0xBTlRMX1NUQVRJQ19SWF9CQ05UOgogICAgICBzdGF0aXN0aWNzLT5yeEJjbnQgPSAwOwogICAgICBicmVhazsKCiAgICBjYXNlIFdMQU5UTF9TVEFUSUNfUlhfQkNOVF9DUkNfT0s6CiAgICAgIHN0YXRpc3RpY3MtPnJ4QmNudENSQ29rID0gMDsKICAgICAgYnJlYWs7CgogICAgY2FzZSBXTEFOVExfU1RBVElDX1JYX1JBVEU6CiAgICAgIHN0YXRpc3RpY3MtPnJ4UmF0ZSA9IDA7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIHN0YXR1cyA9IFZPU19TVEFUVVNfRV9JTlZBTDsKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OICAgUmVhZCBSU1NJIHZhbHVlIG91dCBvZiBhIFJYIEJECiAgICAKICAgUEFSQU1FVEVSUzogIENhbGxlciBtdXN0IHZhbGlkYXRlIGFsbCBwYXJhbWV0ZXJzIAoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVhZFJTU0kKKAogICB2X1BWT0lEX3QgICAgICAgIHBBZGFwdGVyLAogICB2X1BWT0lEX3QgICAgICAgIHBCREhlYWRlciwKICAgdl9VOF90ICAgICAgICAgICBTVEFpZAopCnsKICAgV0xBTlRMX0NiVHlwZSAgICp0bEN0eHQgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICAgdl9TN190ICAgICAgICAgICBjdXJyZW50UlNTSSwgY3VycmVudFJTU0kwLCBjdXJyZW50UlNTSTE7CgoKICAgaWYoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICAgVExMT0dFKFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsICIlcyBJbnZhbGlkIFRMIGhhbmRsZSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmICggTlVMTCA9PSB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdICkKICAgewogICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgb24gJXMiLCBfX2Z1bmNfXykpOwogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQUlMVVJFOwogICB9CgogICBjdXJyZW50UlNTSTAgPSBXTEFOVExfR0VUUlNTSTAocEJESGVhZGVyKTsKICAgY3VycmVudFJTU0kxID0gV0xBTlRMX0dFVFJTU0kxKHBCREhlYWRlcik7CiAgIGN1cnJlbnRSU1NJICA9IChjdXJyZW50UlNTSTAgPiBjdXJyZW50UlNTSTEpID8gY3VycmVudFJTU0kwIDogY3VycmVudFJTU0kxOwoKICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+cnNzaUF2ZyA9IGN1cnJlbnRSU1NJOwoKICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgRlVOQ1RJT04KCiAgIERFU0NSSVBUSU9OICAgUmVhZCBTTlIgdmFsdWUgb3V0IG9mIGEgUlggQkQKCiAgIFBBUkFNRVRFUlM6ICBDYWxsZXIgbXVzdCB2YWxpZGF0ZSBhbGwgcGFyYW1ldGVycwoKICAgUkVUVVJOIFZBTFVFCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KVk9TX1NUQVRVUyBXTEFOVExfUmVhZFNOUgooCiAgIHZfUFZPSURfdCAgICAgICAgcEFkYXB0ZXIsCiAgIHZfUFZPSURfdCAgICAgICAgcEJESGVhZGVyLAogICB2X1U4X3QgICAgICAgICAgIFNUQWlkCikKewogICBXTEFOVExfQ2JUeXBlICAgKnRsQ3R4dCA9IFZPU19HRVRfVExfQ0IocEFkYXB0ZXIpOwogICB2X1M3X3QgICAgICAgICAgIGN1cnJlbnRTTlI7CgoKICAgaWYgKE5VTEwgPT0gdGxDdHh0KQogICB7CiAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICIlcyBJbnZhbGlkIFRMIGhhbmRsZSIsIF9fZnVuY19fKSk7CiAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgIH0KCiAgIGlmIChOVUxMID09IHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0pCiAgIHsKICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAiV0xBTiBUTDpDbGllbnQgTWVtb3J5IHdhcyBub3QgYWxsb2NhdGVkIG9uICVzIiwgX19mdW5jX18pKTsKICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgfQoKICAgY3VycmVudFNOUiA9IFdMQU5UTF9HRVRTTlIocEJESGVhZGVyKTsKCiAgIC8qIFNOUiByZXBvcnRlZCBpbiB0aGUgQnVmZmVyIERlc2NyaXB0b3IgaXMgc2NhbGVkIHVwIGJ5IDIoU05SKjIpLAogICAgKiBHZXQgdGhlIGNvcnJlY3QgU05SIHZhbHVlCiAgICAqLwogICBjdXJyZW50U05SID0gY3VycmVudFNOUiA+PiAxOwoKICAgLyogU05SIHJlcG9ydGVkIGJ5IEhXIGNhbm5vdCBiZSBtb3JlIHRoYW4gMzVkQiBkdWUgdG8gSFcgbGltaXRhdGlvbnMgKi8KICAgY3VycmVudFNOUiA9IChXTEFOVExfTUFYX0hXX1NOUiA+IGN1cnJlbnRTTlIgPyBjdXJyZW50U05SIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTEFOVExfTUFYX0hXX1NOUik7CgogICBUTExPRzIoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAiJXM6IHNucnN1bTogJWQgc25yaWR4OiAlZCBwcmV2c25yYXZnOiAlZCIsCiAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtLAogICAgICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCwKICAgICAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5wcmV2U25yQXZnKSk7CgogICAvKiBUaGUgU05SIHJldHVybmVkIGZvciBhbGwgcHVycG9zZXMgaXMgdGhlIGF2ZXJhZ2UgU05SIG92ZXIKICAgICogV0xBTlRMX01BWF9TTlJfREFUQV9TTUFQTEVTLldoZW4gZGF0YSBzYW1wbGVzCiAgICAqID4gV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTIGFyZSBvYnRhaW5lZCwKICAgICogc3RvcmUgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNhbXBsZXMgaW4gcHJldlNuckF2ZwogICAgKiBhbmQgc3RhcnQgYSBuZXcgYXZlcmFnaW5nIHdpbmRvdy4gVGhlIHByZXZTbnJBdmcgaXMgdXNlZCB3aGVuCiAgICAqIGVub3VnaCBkYXRhIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiBhcHBsaWNhdGlvbnMKICAgICogYWN0dWFsbHkgcXVlcnkgZm9yIFNOUi4KICAgICoKICAgICogU0VFOiBXTEFOVExfR2V0U25yKCkKICAgICovCiAgIGlmICh0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5zbnJJZHggPj0gV0xBTlRMX01BWF9TTlJfREFUQV9TQU1QTEVTKQogICB7CiAgICAgICB0bEN0eHQtPmF0bFNUQUNsaWVudHNbU1RBaWRdLT5wcmV2U25yQXZnID0KICAgICAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtIC8KICAgICAgICAgICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25ySWR4OwogICAgICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtID0gMDsKICAgICAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCA9IDA7CiAgIH0KICAgdGxDdHh0LT5hdGxTVEFDbGllbnRzW1NUQWlkXS0+c25yU3VtICs9IGN1cnJlbnRTTlI7CiAgIHRsQ3R4dC0+YXRsU1RBQ2xpZW50c1tTVEFpZF0tPnNucklkeCArPSAxOwoKICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfQoKLyoKIERFU0NSSVBUSU9OIAogICAgVEwgcmV0dXJucyB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGluIFRMLgogSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCgogT1VUCiAgICBwQUNXZWlnaHRzOiAgICAgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGZpbGxpbmcgaW4gd2VpZ2h0cwoKIFJFVFVSTiBWQUxVRSAgVk9TX1NUQVRVUwoqLwpWT1NfU1RBVFVTICAKV0xBTlRMX0dldEFDV2VpZ2h0cyAKKCAKICB2X1BWT0lEX3QgICAgICAgICAgICAgcHZvc0dDdHgsCiAgdl9VOF90KiAgICAgICAgICAgICAgIHBBQ1dlaWdodHMKKQp7CiAgIFdMQU5UTF9DYlR5cGUqICBwVExDYiA9IE5VTEw7CiAgIHZfVThfdCAgICAgICAgICB1Y0luZGV4OyAKICAvKi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbml0eSBjaGVjawogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggTlVMTCA9PSBwQUNXZWlnaHRzICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIHNlbnQgb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfSU5WQUw7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBUTCBjb250cm9sIGJsb2NrIGFuZCBjaGVjayBleGlzdGFuY2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwogIGlmICggTlVMTCA9PSBwVExDYiApCiAgewogICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICJXTEFOIFRMOkludmFsaWQgVEwgcG9pbnRlciBmcm9tIHB2b3NHQ3R4IG9uIFdMQU5UTF9HZXRBQ1dlaWdodHMiKSk7CiAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogIH0KICBmb3IgKCB1Y0luZGV4ID0gMDsgdWNJbmRleCA8IFdMQU5UTF9NQVhfQUMgOyB1Y0luZGV4KyspCiAgewogICAgcEFDV2VpZ2h0c1t1Y0luZGV4XSA9IHBUTENiLT50bENvbmZpZ0luZm8udWNBY1dlaWdodHNbdWNJbmRleF07CiAgfQoKICByZXR1cm4gVk9TX1NUQVRVU19TVUNDRVNTOwp9CgoKCi8qCiBERVNDUklQVElPTiAKICAgIENoYW5nZSB0aGUgd2VpZ2h0IGN1cnJlbnRseSBtYWludGFpbmVkIGJ5IFRMLgogSU4KICAgIHB2b3NHQ3R4OiAgICAgICBwb2ludGVyIHRvIHRoZSBnbG9iYWwgdm9zIGNvbnRleHQ7IGEgaGFuZGxlIHRvIFRMJ3MgCiAgICAgICAgICAgICAgICAgICAgb3IgU01FJ3MgY29udHJvbCBibG9jayBjYW4gYmUgZXh0cmFjdGVkIGZyb20gaXRzIGNvbnRleHQgCiAgICBwQUNXZWlnaHRzOiAgICAgQ2FsbGVyIGFsbG9jYXRlZCBtZW1vcnkgY29udGFpbiB0aGUgd2VpZ2h0cyB0byB1c2UKCgogUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTCiovClZPU19TVEFUVVMgIApXTEFOVExfU2V0QUNXZWlnaHRzIAooIAogIHZfUFZPSURfdCAgICAgICAgICAgICBwdm9zR0N0eCwKICB2X1U4X3QqICAgICAgICAgICAgICAgcEFDV2VpZ2h0cwopCnsKICAgV0xBTlRMX0NiVHlwZSogIHBUTENiID0gTlVMTDsKICAgdl9VOF90ICAgICAgICAgIHVjSW5kZXg7IAogIC8qLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgU2FuaXR5IGNoZWNrCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYgKCBOVUxMID09IHBBQ1dlaWdodHMgKQogIHsKICAgIFRMTE9HRShWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBwYXJhbWV0ZXIgc2VudCBvbiBXTEFOVExfR2V0QUNXZWlnaHRzIikpOwogICAgcmV0dXJuIFZPU19TVEFUVVNfRV9JTlZBTDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IFRMIGNvbnRyb2wgYmxvY2sgYW5kIGNoZWNrIGV4aXN0YW5jZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgaWYgKCBOVUxMID09IHBUTENiICkKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgIldMQU4gVEw6SW52YWxpZCBUTCBwb2ludGVyIGZyb20gcHZvc0dDdHggb24gV0xBTlRMX0dldEFDV2VpZ2h0cyIpKTsKICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgfQogIGZvciAoIHVjSW5kZXggPSAwOyB1Y0luZGV4IDwgV0xBTlRMX01BWF9BQyA7IHVjSW5kZXgrKykKICB7CiAgICBwVExDYi0+dGxDb25maWdJbmZvLnVjQWNXZWlnaHRzW3VjSW5kZXhdID0gcEFDV2VpZ2h0c1t1Y0luZGV4XTsKICB9CgogIHJldHVybiBWT1NfU1RBVFVTX1NVQ0NFU1M7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBGVU5DVElPTgoKICAgREVTQ1JJUFRJT04gCiAgICAKICAgUEFSQU1FVEVSUyAKCiAgIFJFVFVSTiBWQUxVRQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQgV0xBTlRMX1Bvd2VyU3RhdGVDaGFuZ2VkQ0IKKAogICB2X1BWT0lEX3QgcEFkYXB0ZXIsCiAgIHRQbWNTdGF0ZSBuZXdTdGF0ZQopCnsKICAgV0xBTlRMX0NiVHlwZSAgICAgICAgICAgICAgICAqdGxDdHh0ID0gVk9TX0dFVF9UTF9DQihwQWRhcHRlcik7CgogICBpZiAoTlVMTCA9PSB0bEN0eHQpCiAgIHsKICAgICBWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICIlczogSW52YWxpZCBUTCBDb250cm9sIEJsb2NrIiwgX19mdW5jX18gKTsKICAgICByZXR1cm47CiAgIH0KCiAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk8sICJQb3dlciBzdGF0ZSBjaGFuZ2VkLCBuZXcgc3RhdGUgaXMgJWQiLCBuZXdTdGF0ZSApOwogICBzd2l0Y2gobmV3U3RhdGUpCiAgIHsKICAgICAgY2FzZSBGVUxMX1BPV0VSOgogICAgICAgICB0bEN0eHQtPmlzQk1QUyA9IFZPU19GQUxTRTsKICAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEJNUFM6CiNpZiBkZWZpbmVkIFdMQU5fRkVBVFVSRV9ORUlHSEJPUl9ST0FNSU5HCiAgICAgICAgIFdMQU5UTF9TZXRGV1JTU0lUaHJlc2hvbGRzKHBBZGFwdGVyKTsKI2VuZGlmCgogICAgICAgICB0bEN0eHQtPmlzQk1QUyA9IFZPU19UUlVFOwogICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSU1QUzoKICAgICAgY2FzZSBMT1dfUE9XRVI6CiAgICAgIGNhc2UgUkVRVUVTVF9CTVBTOgogICAgICBjYXNlIFJFUVVFU1RfRlVMTF9QT1dFUjoKICAgICAgY2FzZSBSRVFVRVNUX0lNUFM6CiAgICAgIGNhc2UgU1RPUFBFRDoKICAgICAgY2FzZSBSRVFVRVNUX1NUQVJUX1VBUFNEOgogICAgICBjYXNlIFJFUVVFU1RfU1RPUF9VQVBTRDoKICAgICAgY2FzZSBVQVBTRDoKICAgICAgY2FzZSBSRVFVRVNUX1NUQU5EQlk6CiAgICAgIGNhc2UgU1RBTkRCWToKICAgICAgY2FzZSBSRVFVRVNUX0VOVEVSX1dPV0w6CiAgICAgIGNhc2UgUkVRVUVTVF9FWElUX1dPV0w6CiAgICAgIGNhc2UgV09XTDoKICAgICAgICAgVExMT0dXKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX1dBUk4sICJOb3QgaGFuZGxlIHRoaXMgZXZlbnRzICVkIiwgbmV3U3RhdGUgKSk7CiAgICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICAgVExMT0dFKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiTm90IGEgdmFsaWQgZXZlbnQgJWQiLCBuZXdTdGF0ZSApKTsKICAgICAgICAgYnJlYWs7CiAgIH0KCiAgIHJldHVybjsKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgRlVOQ1RJT04gICAgICBXTEFOVExfR2V0RXRoZXJUeXBlCgogIERFU0NSSVBUSU9OICAgRXh0cmFjdCBFdGhlciB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIEJECgogIERFUEVOREVOQ0lFUyAgTk9ORQogICAgCiAgUEFSQU1FVEVSUyAgICBpbiBhdWNCREhlYWRlciAtIEJEIGhlYWRlcgogICAgICAgICAgICAgICAgaW4gdm9zRGF0YUJ1ZmYgLSBkYXRhIGJ1ZmZlcgogICAgICAgICAgICAgICAgaW4gdWNNUERVSExlbiAgLSBNUERVIGhlYWRlciBsZW5ndGgKICAgICAgICAgICAgICAgIG91dCBwVXNFdGhlclR5cGUgLSBwb2ludGVyIHRvIEV0aGVydHlwZQoKICBSRVRVUk4gVkFMVUUgIFZPU19TVEFUVVNfU1VDQ0VTUyA6IGlmIHRoZSBFdGhlclR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAogICAgICAgICAgICAgICAgVk9TX1NUQVRVU19GQUlMVVJFIDogaWYgdGhlIEV0aGVyVHlwZSBleHRyYWN0aW9uIGZhaWxlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXQgd2FzIGRyb3BwZWQKCiAgU0lERSBFRkZFQ1RTICBOT05FCiAgCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpzdGF0aWMgVk9TX1NUQVRVUyBXTEFOVExfR2V0RXRoZXJUeXBlCigKICAgdl9VOF90ICAgICAgICAgICAgICAgKiBhdWNCREhlYWRlciwKICAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogICB2X1UxNl90ICAgICAgICAgICAgICAqIHBVc0V0aGVyVHlwZQopCnsKICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gKnBVc0V0aGVyVHlwZTsKICB2X1NJWkVfdCAgICAgICAgICAgICAgICAgdXNMTENTaXplID0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ2hlY2sgaWYgTExDIGlzIHByZXNlbnQgLSBpZiBub3QsIFRMIGlzIHVuYWJsZSB0byBkZXRlcm1pbmUgdHlwZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmICggVk9TX0ZBTFNFID09IFdEQV9JU19SWF9MTENfUFJFU0VOVCggYXVjQkRIZWFkZXIgKSApCiAgewogICAgdWNPZmZzZXQgPSBXTEFOVExfODAyXzNfSEVBREVSX0xFTiAtIHNpemVvZih1c0V0aGVyVHlwZSk7IAogIH0KICBlbHNlCiAgewogICAgdWNPZmZzZXQgPSB1Y01QRFVITGVuICsgV0xBTlRMX0xMQ19QUk9UT19UWVBFX09GRlNFVDsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFeHRyYWN0IExMQyB0eXBlIAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdm9zU3RhdHVzID0gdm9zX3BrdF9leHRyYWN0X2RhdGEoIHZvc0RhdGFCdWZmLCB1Y09mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2X1BWT0lEX3QpJnVzRXRoZXJUeXBlLCAmdXNMTENTaXplKTsgCgogIGlmICgoIFZPU19TVEFUVVNfU1VDQ0VTUyAhPSB2b3NTdGF0dXMgKSB8fCAKICAgICAgKCBzaXplb2YodXNFdGhlclR5cGUpICE9IHVzTExDU2l6ZSApKQogICAgICAKICB7CiAgICBUTExPR0UoVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkVycm9yIGV4dHJhY3RpbmcgRXRoZXIgdHlwZSBmcm9tIGRhdGEgcGFja2V0IikpOwogICAgLyogRHJvcCBwYWNrZXQgKi8KICAgIHZvc19wa3RfcmV0dXJuX3BhY2tldCh2b3NEYXRhQnVmZik7CiAgICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICB9CiAgZWxzZQogIHsKICAgIFRMTE9HMihWT1NfVFJBQ0UoIFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9JTkZPX0hJR0gsCiAgICAgICAgICAgICAgICJXTEFOIFRMOkV0aGVyIHR5cGUgcmV0cmlldmVkIGJlZm9yZSBlbmRpYW5lc3MgY29udjogJWQiLCAKICAgICAgICAgICAgICAgdXNFdGhlclR5cGUpKTsKCiAgICB1c0V0aGVyVHlwZSA9IHZvc19iZTE2X3RvX2NwdSh1c0V0aGVyVHlwZSk7CiAgICAqcFVzRXRoZXJUeXBlID0gdXNFdGhlclR5cGU7CgogICAgVExMT0cyKFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQ6ICVkIiwgdXNFdGhlclR5cGUpKTsKICB9CiAgCiAgcmV0dXJuIHZvc1N0YXR1czsKfQoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIEZVTkNUSU9OICAgICAgV0xBTlRMX0dldFNvZnRBUFN0YXRpc3RpY3MKCiAgREVTQ1JJUFRJT04gICBDb2xsZWN0IHRoZSBjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yIGFsbCBTb2Z0YXAgc3RhdGlvbnMKCiAgREVQRU5ERU5DSUVTICBOT05FCiAgICAKICBQQVJBTUVURVJTICAgIGluIHB2b3NHQ3R4ICAtIFBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dAogICAgICAgICAgICAgICAgICAgYlJlc2V0ICAgIC0gSWYgc2V0IFRMIHN0YXRpc3RpY3Mgd2lsbCBiZSBjbGVhcmVkIGFmdGVyIHJlYWRpbmcKICAgICAgICAgICAgICAgIG91dCBzdGF0c1N1bSAtIHBvaW50ZXIgdG8gY29sbGVjdGVkIHN0YXRpc3RpY3MKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTX1NVQ0NFU1MgOiBpZiB0aGUgU3RhdGlzdGljcyBhcmUgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZAoKICBTSURFIEVGRkVDVFMgIE5PTkUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTIFdMQU5UTF9HZXRTb2Z0QVBTdGF0aXN0aWNzKHZfUFZPSURfdCBwQWRhcHRlciwgV0xBTlRMX1RSQU5TRkVSX1NUQV9UWVBFICpzdGF0c1N1bSwgdl9CT09MX3QgYlJlc2V0KQp7CiAgICB2X1U4X3QgaSA9IDA7CiAgICBWT1NfU1RBVFVTICB2b3NTdGF0dXMgPSBWT1NfU1RBVFVTX1NVQ0NFU1M7CiAgICBXTEFOVExfQ2JUeXBlICpwVExDYiAgPSBWT1NfR0VUX1RMX0NCKHBBZGFwdGVyKTsKICAgIFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSBzdGF0QnVmZmVyVGVtcDsKICAgIHZvc19tZW1femVybygodl9WT0lEX3QgKikmc3RhdEJ1ZmZlclRlbXAsIHNpemVvZihXTEFOVExfVFJBTlNGRVJfU1RBX1RZUEUpKTsKICAgIHZvc19tZW1femVybygodl9WT0lEX3QgKilzdGF0c1N1bSwgc2l6ZW9mKFdMQU5UTF9UUkFOU0ZFUl9TVEFfVFlQRSkpOwoKCiAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogICAgewogICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKICAgIH0gCgogICAgLy8gU3VtIHVwIGFsbCB0aGUgc3RhdGlzdGljcyBmb3Igc3RhdGlvbnMgb2YgU29mdCBBUCBmcm9tIFRMCiAgICBmb3IgKGkgPSAwOyBpIDwgV0xBTl9NQVhfU1RBX0NPVU5UOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW2ldKQogICAgICAgIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChwVExDYi0+YXRsU1RBQ2xpZW50c1tpXS0+d1NUQURlc2Mud1NUQVR5cGUgPT0gV0xBTl9TVEFfU09GVEFQKQogICAgICAgIHsKICAgICAgICAgICB2b3NTdGF0dXMgPSBXTEFOVExfR2V0U3RhdGlzdGljcyhwQWRhcHRlciwgJnN0YXRCdWZmZXJUZW1wLCBpKTsvLyBDYW4gaW5jbHVkZSBzdGFJZCAxIGJlY2F1c2Ugc3RhdGlzdGljcyBub3QgY29sbGVjdGVkIGZvciBpdAoKICAgICAgICAgICBpZiAoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NTdGF0dXMpKQogICAgICAgICAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9GQVVMVDsKCiAgICAgICAgICAgIC8vIEFkZCB0byB0aGUgY291bnRlcnMKICAgICAgICAgICBzdGF0c1N1bS0+dHhVQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhVQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4TUNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4TUNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eEJDRmNudCArPSBzdGF0QnVmZmVyVGVtcC50eEJDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+dHhVQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAudHhVQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnR4TUNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnR4TUNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT50eEJDQmNudCArPSBzdGF0QnVmZmVyVGVtcC50eEJDQmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhVQ0ZjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhVQ0ZjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4TUNGY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4TUNGY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeEJDRmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeEJDRmNudDsKICAgICAgICAgICBzdGF0c1N1bS0+cnhVQ0JjbnQgKz0gc3RhdEJ1ZmZlclRlbXAucnhVQ0JjbnQ7CiAgICAgICAgICAgc3RhdHNTdW0tPnJ4TUNCY250ICs9IHN0YXRCdWZmZXJUZW1wLnJ4TUNCY250OwogICAgICAgICAgIHN0YXRzU3VtLT5yeEJDQmNudCArPSBzdGF0QnVmZmVyVGVtcC5yeEJDQmNudDsKCiAgICAgICAgICAgaWYgKGJSZXNldCkKICAgICAgICAgICB7CiAgICAgICAgICAgICAgdm9zU3RhdHVzID0gV0xBTlRMX1Jlc2V0U3RhdGlzdGljcyhwQWRhcHRlciwgaSk7CiAgICAgICAgICAgICAgaWYgKCFWT1NfSVNfU1RBVFVTX1NVQ0NFU1Modm9zU3RhdHVzKSkKICAgICAgICAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7ICAgICAgICAgICAgICAgCiAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB2b3NTdGF0dXM7Cn0KI2lmZGVmIEZFQVRVUkVfV0xBTl9URExTX0lOVEVSTkFMCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRFdGhlclR5cGVfMgoKICBERVNDUklQVElPTiAgIEV4dHJhY3QgRXRoZXIgdHlwZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRAoKICBERVBFTkRFTkNJRVMgIE5PTkUKICAgIAogIFBBUkFNRVRFUlMgICAgaW4gYXVjQkRIZWFkZXIgLSBCRCBoZWFkZXIKICAgICAgICAgICAgICAgIGluIHZvc0RhdGFCdWZmIC0gZGF0YSBidWZmZXIKICAgICAgICAgICAgICAgIGluIHVjTVBEVUhMZW4gIC0gTVBEVSBoZWFkZXIgbGVuZ3RoCiAgICAgICAgICAgICAgICBvdXQgcFVzRXRoZXJUeXBlIC0gcG9pbnRlciB0byBFdGhlcnR5cGUKCiAgUkVUVVJOIFZBTFVFICBWT1NfU1RBVFVTX1NVQ0NFU1MgOiBpZiB0aGUgRXRoZXJUeXBlIGlzIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQKICAgICAgICAgICAgICAgIFZPU19TVEFUVVNfRkFJTFVSRSA6IGlmIHRoZSBFdGhlclR5cGUgZXh0cmFjdGlvbiBmYWlsZWQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0IHdhcyBkcm9wcGVkCgogIFNJREUgRUZGRUNUUyAgTk9ORQogIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8Kc3RhdGljIFZPU19TVEFUVVMgV0xBTlRMX0dldEV0aGVyVHlwZV8yCigKICAgdl9VOF90ICAgICAgICAgICAgICAgKiBhdWNCREhlYWRlciwKICAgdm9zX3BrdF90ICAgICAgICAgICAgKiB2b3NEYXRhQnVmZiwKICAgdl9VOF90ICAgICAgICAgICAgICAgICB1Y01QRFVITGVuLAogICB2X1UxNl90ICAgICAgICAgICAgICAqIHBVc0V0aGVyVHlwZQopCnsKICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNPZmZzZXQ7CiAgdl9VMTZfdCAgICAgICAgICAgICAgICAgIHVzRXRoZXJUeXBlID0gKnBVc0V0aGVyVHlwZTsKICB2X1NJWkVfdCAgICAgICAgICAgICAgICAgdXNMTENTaXplID0gc2l6ZW9mKHVzRXRoZXJUeXBlKTsKICBWT1NfU1RBVFVTICAgICAgICAgICAgICAgdm9zU3RhdHVzICA9IFZPU19TVEFUVVNfU1VDQ0VTUzsKICAvL3ZfVThfdCAgICAgICAgICAgICAgICAgICB1Y0xMQ0hlYWRlcjsKICB2X1U4X3QgICAgICAgICAgICAgICAgICAgdWNNUERVSE9mZnNldCA7IAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDaGVjayBpZiBMTEMgaXMgcHJlc2VudCAtIGlmIG5vdCwgVEwgaXMgdW5hYmxlIHRvIGRldGVybWluZSB0eXBlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgLy91Y01QRFVIT2Zmc2V0ID0gKHZfVThfdClXTEFOSEFMX1JYX0JEX0dFVF9NUERVX0hfT0ZGU0VUKGF1Y0JESGVhZGVyKSA7CiAgLy91Y0xMQ0hlYWRlciAgID0gKHZfVThfdClXTEFOSEFMX1JYX0JEX0dFVF9MTEMoYXVjQkRIZWFkZXIpOwogIHVjTVBEVUhPZmZzZXQgPSAodl9VOF90KVdEQV9HRVRfUlhfTVBEVV9IRUFERVJfT0ZGU0VUKGF1Y0JESGVhZGVyKTsKCiAgaWYgKCBWT1NfVFJVRSA9PSBXREFfSVNfUlhfTExDX1BSRVNFTlQoYXVjQkRIZWFkZXIpICkKICB7CiAgICB1Y09mZnNldCA9IHVjTVBEVUhPZmZzZXQgKyBXTEFOVExfODAyXzNfSEVBREVSX0xFTiAtIHNpemVvZih1c0V0aGVyVHlwZSk7IAogIH0KICBlbHNlCiAgewogICAgdWNPZmZzZXQgPSBXTEFOSEFMX1JYX0JEX0hFQURFUl9TSVpFICsgdWNNUERVSExlbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFdMQU5UTF9MTENfUFJPVE9fVFlQRV9PRkZTRVQ7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRXh0cmFjdCBMTEMgdHlwZSAKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIHZvc1N0YXR1cyA9IHZvc19wa3RfZXh0cmFjdF9kYXRhKCB2b3NEYXRhQnVmZiwgdWNPZmZzZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodl9QVk9JRF90KSZ1c0V0aGVyVHlwZSwgJnVzTExDU2l6ZSk7IAoKICAvKiBUT0RPOiBEbyBpdCBpbiBiZXR0ZXIgd2F5ICovCiAgaWYodm9zX2JlMTZfdG9fY3B1KHVzRXRoZXJUeXBlKSA9PSAweDg5MGQpCiAgewogICAgIFZPU19UUkFDRShWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfRVJST1IsIAogICAgICAgICAgICAgICAgICAgICAgKCJURExTIGZyYW1lIGxsYyAleCIpLCB2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpKSA7CiAgfQogICAgICAKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQgYmVmb3JlIGVuZGlhbmVzcyBjb252OiAlZCIsIAogICAgICAgICAgICAgICB1c0V0aGVyVHlwZSk7CgogICAgdXNFdGhlclR5cGUgPSB2b3NfYmUxNl90b19jcHUodXNFdGhlclR5cGUpOwogICAgKnBVc0V0aGVyVHlwZSA9IHVzRXRoZXJUeXBlOwoKICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0lORk9fSElHSCwKICAgICAgICAgICAgICAgIldMQU4gVEw6RXRoZXIgdHlwZSByZXRyaWV2ZWQ6ICVkIiwgdXNFdGhlclR5cGUpOwogIAogIHJldHVybiB2b3NTdGF0dXM7Cn0KI2VuZGlmIC8qIEZFQVRVUkVfV0xBTl9URExTICovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9Jc1JlcGxheVBhY2tldAogICAgIAogIERFU0NSSVBUSU9OICAgVGhpcyBmdW5jdGlvbiBkb2VzIHJlcGxheSBjaGVjayBmb3IgdmFsaWQgc3RhdGlvbnMKIAogIERFUEVOREVOQ0lFUyAgVmFsaWRpdHkgb2YgcmVwbGF5IGNoZWNrIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIGZ1bmN0aW9uIAogICAgICAgICAgICAgICAgaXMgY2FsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUEFSQU1FVEVSUyAgICBjdXJyZW50UmVwbGF5Q291bnRlciAgICBjdXJyZW50IHJlcGxheSBjb3VudGVyIHRha2VuIGZyb20gUlggQkQgCiAgICAgICAgICAgICAgICBwcmV2aW91c1JlcGxheUNvdW50ZXIgICBwcmV2aW91cyByZXBsYXkgY291bnRlciB0YWtlbiBmcm9tIFRMIENCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFJFVFJVTiAgICAgICAgVk9TX1RSVUUgICAgcGFja2V0IGlzIGEgcmVwbGF5IHBhY2tldAogICAgICAgICAgICAgICAgVk9TX0ZBTFNFICAgcGFja2V0IGlzIG5vdCBhIHJlcGxheSBwYWNrZXQKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfQk9PTF90CldMQU5UTF9Jc1JlcGxheVBhY2tldAooCiAgdl9VNjRfdCAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciwKICB2X1U2NF90ICAgIHVsbHByZXZpb3VzUmVwbGF5Q291bnRlcgopCnsKICAgLyogRG8gdGhlIHJlcGxheSBjaGVjayBieSBjb21wYXJpbmcgcHJldmlvdXMgcmVjZWl2ZWQgcmVwbGF5IGNvdW50ZXIgd2l0aAogICAgICBjdXJyZW50IHJlY2VpdmVkIHJlcGxheSBjb3VudGVyKi8KICAgIGlmKHVsbHByZXZpb3VzUmVwbGF5Q291bnRlciA8IHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyKQogICAgewogICAgICAgIC8qIFZhbGlkIHBhY2tldCBub3QgcmVwbGF5ICovCiAgICAgICAgcmV0dXJuIFZPU19GQUxTRTsKICAgIH0KICAgIGVsc2UKICAgIHsKCiAgICAgICAgLyogQ3VycmVudCBwYWNrZXQgbnVtYmVyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwcmV2aXVvcyByZWNlaXZlZCAKICAgICAgICAgICBwYWNrZXQgbm8sIHRoaXMgbWVhbnMgY3VycmVudCBwYWNrZXQgaXMgcmVwbGF5IHBhY2tldCAqLwogICAgICAgIFZPU19UUkFDRSggVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICJXTEFOIFRMOiBSZXBsYXkgcGFja2V0IGZvdW5kIHdpdGggcmVwbGF5IGNvdW50ZXIgOlsweCVsbFhdIix1bGxjdXJyZW50UmVwbGF5Q291bnRlcik7CiAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIFZPU19UUlVFOwogICAgfQp9CgojaWYgMAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9HZXRSZXBsYXlDb3VudGVyRnJvbVJ4QkQKICAgICAKICBERVNDUklQVElPTiAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgNDgtYml0IHJlcGxheSBwYWNrZXQgbnVtYmVyIGZyb20gUlggQkQgCiAKICBERVBFTkRFTkNJRVMgIFZhbGlkaXR5IG9mIHJlcGxheSBjaGVjayBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBmdW5jdGlvbiAKICAgICAgICAgICAgICAgIGlzIGNhbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgIAogIFBBUkFNRVRFUlMgICAgcHVjUnhIZWFkZXIgcG9pbnRlciB0byBSWCBCRCBoZWFkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgUkVUUlVOICAgICAgICB2X1U2NF90ICAgIFBhY2tldCBudW1iZXIgZXh0YXJjdGVkIGZyb20gUlggQkQKCiAgU0lERSBFRkZFQ1RTICAgbm9uZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZfVTY0X3QKV0xBTlRMX0dldFJlcGxheUNvdW50ZXJGcm9tUnhCRAooCiAgIHZfVThfdCAqcHVjUnhCREhlYWRlcgopCnsKLyogNDgtYml0IHJlcGxheSBjb3VudGVyIGlzIGNyZWF0ZWQgYXMgZm9sbG93cwogICBmcm9tIFJYIEJEIDYgYnl0ZSBQTUkgY29tbWFuZDoKICAgQWRkciA6IEFFUy9US0lQCiAgIDB4MzggOiBwbjMvdHNjMwogICAweDM5IDogcG4yL3RzYzIKICAgMHgzYSA6IHBuMS90c2MxCiAgIDB4M2IgOiBwbjAvdHNjMAoKICAgMHgzYyA6IHBuNS90c2M1CiAgIDB4M2QgOiBwbjQvdHNjNCAqLwoKI2lmZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KICAgIHZfVTY0X3QgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAwOwogICAgLyogR2V0dGluZyA0OC1iaXQgcmVwbGF5IGNvdW50ZXIgZnJvbSB0aGUgUlggQkQgKi8KICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyID0gV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzIwVE8yMyhwdWNSeEJESGVhZGVyKTsgCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA8PD0gMTY7CiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciB8PSAoKCBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjRUTzI1KHB1Y1J4QkRIZWFkZXIpICYgMHhGRkZGMDAwMCkgPj4gMTYpOwogICAgcmV0dXJuIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyOwojZWxzZQogICAgdl9VNjRfdCB1bGxjdXJyZW50UmVwbGF5Q291bnRlciA9IDA7CiAgICAvKiBHZXR0aW5nIDQ4LWJpdCByZXBsYXkgY291bnRlciBmcm9tIHRoZSBSWCBCRCAqLwogICAgdWxsY3VycmVudFJlcGxheUNvdW50ZXIgPSAoV0xBTkhBTF9SWF9CRF9HRVRfUE1JQ01EXzI0VE8yNShwdWNSeEJESGVhZGVyKSAmIDB4MDAwMEZGRkYpOyAKICAgIHVsbGN1cnJlbnRSZXBsYXlDb3VudGVyIDw8PSAzMjsgCiAgICB1bGxjdXJyZW50UmVwbGF5Q291bnRlciB8PSBXTEFOSEFMX1JYX0JEX0dFVF9QTUlDTURfMjBUTzIzKHB1Y1J4QkRIZWFkZXIpOyAKICAgIHJldHVybiB1bGxjdXJyZW50UmVwbGF5Q291bnRlcjsKI2VuZGlmCn0KI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgIFdMQU5UTF9Qb3N0UmVzTmVlZGVkCiAgICAgCiAgREVTQ1JJUFRJT04gICBUaGlzIGZ1bmN0aW9uIHBvc3RzIG1lc3NhZ2UgdG8gVEwgdG8gcmVzZXJ2ZSBCRC9QRFUgbWVtb3J5CiAKICBERVBFTkRFTkNJRVMgIE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAKICBQQVJBTUVURVJTICAgIHB2b3NHQ3R4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFJFVFVSTiAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1Bvc3RSZXNOZWVkZWQodl9QVk9JRF90IHB2b3NHQ3R4KQp7CiAgdm9zX21zZ190ICAgICAgICAgICAgdm9zTXNnOwoKICB2b3NNc2cucmVzZXJ2ZWQgPSAwOwogIHZvc01zZy5ib2R5cHRyICA9IE5VTEw7CiAgdm9zTXNnLnR5cGUgICAgID0gV0xBTlRMX1RYX1JFU19ORUVERUQ7CiAgVk9TX1RSQUNFKCBWT1NfTU9EVUxFX0lEX1RMLCBWT1NfVFJBQ0VfTEVWRUxfSU5GT19ISUdILAogICAgICAgICJXTEFOIFRMOiBCRC9QRFUgYXZhaWxhYmxlIGludGVycnVwdCByZWNlaXZlZCwgUG9zdGluZyBtZXNzYWdlIHRvIFRMIik7CiAgaWYoIVZPU19JU19TVEFUVVNfU1VDQ0VTUyh2b3NfdHhfbXFfc2VyaWFsaXplKCBWT1NfTVFfSURfVEwsICZ2b3NNc2cpKSkKICB7CiAgICBWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgIiAlcyBmYWlscyB0byBwb3N0IG1lc3NhZ2UiLCBfX2Z1bmNfXyk7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlUnNzaUJtcHMKCiAgREVTQ1JJUFRJT04gICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBUTCdzIFJTU0kgKGluIEJNUFMgbW9kZSkKCiAgREVQRU5ERU5DSUVTICAgTm9uZQoKICBQQVJBTUVURVJTCgogICAgcHZvc0dDdHggICAgICAgICBWT1MgY29udGV4dCAgICAgICAgICBWT1MgR2xvYmFsIGNvbnRleHQKICAgIHN0YUlkICAgICAgICAgICAgU3RhdGlvbiBJRCAgICAgICAgICAgU3RhdGlvbiBJRAogICAgcnNzaSAgICAgICAgICAgICBSU1NJIChCTVBTIG1vZGUpICAgICBSU1NJIGluIEJNUFMgbW9kZQoKICBSRVRVUk4gICAgICAgICBOb25lCgogIFNJREUgRUZGRUNUUyAgIG5vbmUKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKdm9pZCBXTEFOVExfVXBkYXRlUnNzaUJtcHModl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsIHZfUzdfdCByc3NpKQp7CiAgV0xBTlRMX0NiVHlwZSogcFRMQ2IgPSBWT1NfR0VUX1RMX0NCKHB2b3NHQ3R4KTsKCiAgaWYgKE5VTEwgIT0gcFRMQ2IgJiYgTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0pCiAgewogICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5yc3NpQXZnQm1wcyA9IHJzc2k7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlU25yQm1wcwoKICBERVNDUklQVElPTiAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIFRMJ3MgU05SIChpbiBCTVBTIG1vZGUpCgogIERFUEVOREVOQ0lFUyAgIE5vbmUKCiAgUEFSQU1FVEVSUwoKICAgIHB2b3NHQ3R4ICAgICAgICAgVk9TIGNvbnRleHQgICAgICAgICAgVk9TIEdsb2JhbCBjb250ZXh0CiAgICBzdGFJZCAgICAgICAgICAgIFN0YXRpb24gSUQgICAgICAgICAgIFN0YXRpb24gSUQKICAgIHNuciAgICAgICAgICAgICBTTlIgKEJNUFMgbW9kZSkgICAgIFNOUiBpbiBCTVBTIG1vZGUKCiAgUkVUVVJOICAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1VwZGF0ZVNuckJtcHModl9QVk9JRF90IHB2b3NHQ3R4LCB2X1U4X3Qgc3RhSWQsIHZfUzdfdCBzbnIpCnsKICBXTEFOVExfQ2JUeXBlKiBwVExDYiA9IFZPU19HRVRfVExfQ0IocHZvc0dDdHgpOwoKICBpZiAoTlVMTCAhPSBwVExDYiAmJiBOVUxMICE9IHBUTENiLT5hdGxTVEFDbGllbnRzW3N0YUlkXSkKICB7CiAgICBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0tPnNuckF2Z0JtcHMgPSBzbnI7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBGVU5DVElPTiAgICAgICBXTEFOVExfVXBkYXRlTGlua0NhcGFjaXR5CgogIERFU0NSSVBUSU9OICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgU1RBJ3MgTGluayBDYXBhY2l0eSBpbiBUTAoKICBERVBFTkRFTkNJRVMgICBOb25lCgogIFBBUkFNRVRFUlMKCiAgICBwdm9zR0N0eCAgICAgICAgIFZPUyBjb250ZXh0ICAgICAgICAgIFZPUyBHbG9iYWwgY29udGV4dAogICAgc3RhSWQgICAgICAgICAgICBTdGF0aW9uIElEICAgICAgICAgICBTdGF0aW9uIElECiAgICBsaW5rQ2FwYWNpdHkgICAgIGxpbmtDYXBhY2l0eSAgICAgICAgIExpbmsgQ2FwYWNpdHkKCiAgUkVUVVJOICAgICAgICAgTm9uZQoKICBTSURFIEVGRkVDVFMgICBub25lCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnZvaWQgV0xBTlRMX1VwZGF0ZUxpbmtDYXBhY2l0eSh2X1BWT0lEX3QgcHZvc0dDdHgsIHZfVThfdCBzdGFJZCwgdl9VMzJfdCBsaW5rQ2FwYWNpdHkpCnsKICAgIFdMQU5UTF9DYlR5cGUqIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CgogICAgaWYgKE5VTEwgIT0gcFRMQ2IgJiYgTlVMTCAhPSBwVExDYi0+YXRsU1RBQ2xpZW50c1tzdGFJZF0pCiAgICB7CiAgICAgICAgcFRMQ2ItPmF0bFNUQUNsaWVudHNbc3RhSWRdLT5saW5rQ2FwYWNpdHkgPSBsaW5rQ2FwYWNpdHk7CiAgICB9Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBGVU5DVElPTiAgICBXTEFOVExfR2V0U1RBTGlua0NhcGFjaXR5CgogIERFU0NSSVBUSU9OCgogICAgUmV0dXJucyBMaW5rIENhcGFjaXR5IG9mIGEgcGFydGljdWxhciBTVEEuCgogIERFUEVOREVOQ0lFUwoKICAgIEEgc3RhdGlvbiBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSBpdHMgc3RhdGUgY2FuIGJlIHJldHJpZXZlZC4KCgogIFBBUkFNRVRFUlMKCiAgICBJTgogICAgcHZvc0dDdHg6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCB2b3MgY29udGV4dDsgYSBoYW5kbGUgdG8gVEwncwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgYmxvY2sgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGl0cyBjb250ZXh0CiAgICB1Y1NUQUlkOiAgICAgICAgaWRlbnRpZmllciBvZiB0aGUgc3RhdGlvbgoKICAgIE9VVAogICAgcGxpbmtDYXBhY2l0eTogIHRoZSBjdXJyZW50IGxpbmsgY2FwYWNpdHkgdGhlIGNvbm5lY3Rpb24gdG8KICAgICAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gc3RhdGlvbgoKCiAgUkVUVVJOIFZBTFVFCgogICAgVGhlIHJlc3VsdCBjb2RlIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KCiAgICBWT1NfU1RBVFVTX0VfSU5WQUw6ICBJbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkCiAgICBWT1NfU1RBVFVTX0VfRkFVTFQ6ICBTdGF0aW9uIElEIGlzIG91dHNpZGUgYXJyYXkgYm91bmRhcmllcyBvciBwb2ludGVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICBUTCBjYiBpcyBOVUxMIDsgYWNjZXNzIHdvdWxkIGNhdXNlIGEgcGFnZSBmYXVsdAogICAgVk9TX1NUQVRVU19FX0VYSVNUUzogU3RhdGlvbiB3YXMgbm90IHJlZ2lzdGVyZWQKICAgIFZPU19TVEFUVVNfU1VDQ0VTUzogIEV2ZXJ5dGhpbmcgaXMgZ29vZCA6KQoKICBTSURFIEVGRkVDVFMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpWT1NfU1RBVFVTCldMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkKKAogICAgdl9QVk9JRF90ICAgICAgICAgICAgIHB2b3NHQ3R4LAogICAgdl9VOF90ICAgICAgICAgICAgICAgIHVjU1RBSWQsCiAgICB2X1UzMl90ICAgICAgICAgICAgICAgKnBsaW5rQ2FwYWNpdHkKKQp7CiAgICBXTEFOVExfQ2JUeXBlKiAgcFRMQ2IgPSBOVUxMOwogICAgLyotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgU2FuaXR5IGNoZWNrCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGlmICggTlVMTCA9PSBwbGlua0NhcGFjaXR5ICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkludmFsaWQgcGFyYW1ldGVyIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0lOVkFMOwogICAgfQoKICAgIGlmICggV0xBTlRMX1NUQV9JRF9JTlZBTElEKCB1Y1NUQUlkICkgKQogICAgewogICAgICAgIFRMTE9HRShWT1NfVFJBQ0UoVk9TX01PRFVMRV9JRF9UTCwgVk9TX1RSQUNFX0xFVkVMX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6SW52YWxpZCBzdGF0aW9uIGlkIikpKTsKICAgICAgICByZXR1cm4gVk9TX1NUQVRVU19FX0ZBVUxUOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIEV4dHJhY3QgVEwgY29udHJvbCBibG9jayBhbmQgY2hlY2sgZXhpc3RhbmNlCiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIHBUTENiID0gVk9TX0dFVF9UTF9DQihwdm9zR0N0eCk7CiAgICBpZiAoIE5VTEwgPT0gcFRMQ2IgKQogICAgewogICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICBGTCgiV0xBTiBUTDpJbnZhbGlkIFRMIHBvaW50ZXIgZnJvbSBwdm9zR0N0eCIpKSk7CiAgICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFVTFQ7CiAgICB9CgogICAgaWYgKCBOVUxMID09IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZMKCJXTEFOIFRMOkNsaWVudCBNZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQiKSkpOwogICAgICAgIHJldHVybiBWT1NfU1RBVFVTX0VfRkFJTFVSRTsKICAgIH0KCiAgICBpZiAoIDAgPT0gcFRMQ2ItPmF0bFNUQUNsaWVudHNbdWNTVEFJZF0tPnVjRXhpc3RzICkKICAgIHsKICAgICAgICBUTExPR0UoVk9TX1RSQUNFKFZPU19NT0RVTEVfSURfVEwsIFZPU19UUkFDRV9MRVZFTF9XQVJOLAogICAgICAgICAgICAgICAgICAgICAgICAgRkwoIldMQU4gVEw6U3RhdGlvbiB3YXMgbm90IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCIpKSk7CiAgICAgICAgcmV0dXJuIFZPU19TVEFUVVNfRV9FWElTVFM7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgR2V0IFNUQSBzdGF0ZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAqcGxpbmtDYXBhY2l0eSA9IHBUTENiLT5hdGxTVEFDbGllbnRzW3VjU1RBSWRdLT5saW5rQ2FwYWNpdHk7CgogICAgcmV0dXJuIFZPU19TVEFUVVNfU1VDQ0VTUzsKfS8qIFdMQU5UTF9HZXRTVEFMaW5rQ2FwYWNpdHkgKi8K