ZGlmZiAtLWdpdCBhL0ZpbGVsaXN0IGIvRmlsZWxpc3QKaW5kZXggZGRiY2UyNi4uYzdiYzUxNSAxMDA2NDQKLS0tIGEvRmlsZWxpc3QKKysrIGIvRmlsZWxpc3QKQEAgLTI5MSwxMSArMjkxLDkgQEAKIAkJc3JjL0d2aW1FeHQvdW5pbnN0LmJhdCBcCiAJCVJFQURNRV9zcmNkb3MudHh0IFwKIAkJc3JjL0lOU1RBTExwYy50eHQgXAotCQlzcmMvTWFrZV9iYzMubWFrIFwKIAkJc3JjL01ha2VfYmM1Lm1hayBcCiAJCXNyYy9NYWtlX2N5Zy5tYWsgXAogCQlzcmMvTWFrZV9jeWdfbWluZy5tYWsgXAotCQlzcmMvTWFrZV9kamcubWFrIFwKIAkJc3JjL01ha2VfaXZjLm1hayBcCiAJCXNyYy9NYWtlX2R2Yy5tYWsgXAogCQlzcmMvTWFrZV9taW5nLm1hayBcCkBAIC0zMjEsOCArMzE5LDYgQEAKIAkJc3JjL2lmX3BlcmxfbXN2Yy9zdGRib29sLmggXAogCQlzcmMvaWlkX29sZS5jIFwKIAkJc3JjL29zX2Rvcy5oIFwKLQkJc3JjL29zX21zZG9zLmMgXAotCQlzcmMvb3NfbXNkb3MuaCBcCiAJCXNyYy9vc193MzJkbGwuYyBcCiAJCXNyYy9vc193MzJleGUuYyBcCiAJCXNyYy9vc193aW4zMi5jIFwKQEAgLTMzMCw3ICszMjYsNiBAQAogCQlzcmMvb3Nfd2luMzIuaCBcCiAJCXNyYy9wcm90by9ndWlfdzMyLnBybyBcCiAJCXNyYy9wcm90by9pZl9vbGUucHJvIFwKLQkJc3JjL3Byb3RvL29zX21zZG9zLnBybyBcCiAJCXNyYy9wcm90by9vc193aW4zMi5wcm8gXAogCQlzcmMvcHJvdG8vb3NfbXN3aW4ucHJvIFwKIAkJc3JjL3Rlc3RkaXIvTWFrZV9kb3MubWFrIFwKQEAgLTM0NSw5ICszNDAsNyBAQAogCQlzcmMvdmltdGJhci5oIFwKIAkJc3JjL3hwbV93MzIuYyBcCiAJCXNyYy94cG1fdzMyLmggXAotCQlzcmMveHhkL01ha2VfYmMzLm1hayBcCiAJCXNyYy94eGQvTWFrZV9iYzUubWFrIFwKLQkJc3JjL3h4ZC9NYWtlX2RqZy5tYWsgXAogCQlzcmMveHhkL01ha2VfbWluZy5tYWsgXAogCQlzcmMveHhkL01ha2VfbXZjLm1hayBcCiAJCW5zaXMvZ3ZpbS5uc2kgXApkaWZmIC0tZ2l0IGEvc3JjL01ha2VfYmMzLm1hayBiL3NyYy9NYWtlX2JjMy5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTc4NDcuLjAwMDAwMDAKLS0tIGEvc3JjL01ha2VfYmMzLm1haworKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyAzLjEgb3IgNC4wIHRvIGNvbXBpbGUgYSAxNiBiaXQgdmVyc2lvbiBvZiBWaW0uCi0jCi0jIE5PVEU6IFRISVMgSVMgT0xEIEFORCBQUk9CQUJMWSBOTyBMT05HRVIgV09SS1MuCi0jCi0jIFRoZXJlIGFyZSBjb21waWxhdGlvbiBvcHRpb25zIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgotIwotIyBDb21tYW5kIGxpbmUgdmFyaWFibGVzOgotIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgKEU6XEJPUkxBTkRDKQotIyBERUJVRwkJc2V0IHRvICJ5ZXMiIGZvciBkZWJ1Z2dpbmcgKG5vKQotIyBTUEFXTk8JcGF0aCB0byB0aGUgc3Bhd25vIGxpYnJhcnkgZGlyZWN0b3J5LCBlbXB0eSBpZiB5b3UgZG8gbm90IGhhdmUKLSMJCWl0OyB1c2UgOC4zIGZpbGVuYW1lcyEgKEM6XENDXFNQQVdOKQotCi0uQVVUT0RFUEVORAotCi0haWZuZGVmIEJPUgotQk9SID0gRTpcQk9STEFOREMKLSFlbmRpZgotCi0haWYgKCIkKERFQlVHKSIgPT0gInllcyIpCi1ERUJVR19GTEFHID0gLXYKLSFlbHNlCi1ERUJVR19GTEFHID0KLSFlbmRpZgotCi1DQyA9ICQoQk9SKVxiaW5cYmNjLmV4ZSArVklNLkNGRwotVExJTksgPSAkKEJPUilcYmluXHRsaW5rLmV4ZQotCi0haWZuZGVmIFNQQVdOTwotU1BBV05PID0gQzpcQ0NcU1BBV04KLSFlbmRpZgotCi0haWYgKCIkKFNQQVdOTykiID09ICIiKQotTElCUEFUSCA9ICQoQk9SKVxMSUIKLUlOQ0xVREVQQVRIID0gJChCT1IpXElOQ0xVREUKLVNQQVdORCA9Ci1TUEFXTkwgPQotIWVsc2UKLUxJQlBBVEggPSAkKEJPUilcTElCOyQoU1BBV05PKQotSU5DTFVERVBBVEggPSAkKEJPUilcSU5DTFVERTskKFNQQVdOTykKLVNQQVdORCA9IDtTUEFXTk8KLVNQQVdOTCA9IHNwYXdubC5saWIKLSFlbmRpZgotCi0KLSMJCSpJbXBsaWNpdCBSdWxlcyoKLSMKLSMgdXNlIC12IGZvciBkZWJ1Z2dpbmcKLSMKLS5jLm9iajoKLQkkKENDKSAtYyAkKERFQlVHX0ZMQUcpIHskPCB9Ci0KLSMJCSpMaXN0IE1hY3JvcyoKLQotCi1FWEVfZGVwZW5kZW5jaWVzID0gXAotCWJsb3dmaXNoLm9iaiBcCi0JYnVmZmVyLm9iaiBcCi0JY2hhcnNldC5vYmogXAotCWNyeXB0Lm9iaiBcCi0JY3J5cHRfemlwLm9iaiBcCi0JZGlmZi5vYmogXAotCWRpZ3JhcGgub2JqIFwKLQllZGl0Lm9iaiBcCi0JZXZhbC5vYmogXAotCWV4X2NtZHMub2JqIFwKLQlleF9jbWRzMi5vYmogXAotCWV4X2RvY21kLm9iaiBcCi0JZXhfZXZhbC5vYmogXAotCWV4X2dldGxuLm9iaiBcCi0JZmlsZWlvLm9iaiBcCi0JZm9sZC5vYmogXAotCWdldGNoYXIub2JqIFwKLQloYXJkY29weS5vYmogXAotCWhhc2h0YWIub2JqIFwKLQlqc29uLm9iaiBcCi0JbWFpbi5vYmogXAotCW1hcmsub2JqIFwKLQltZW1maWxlLm9iaiBcCi0JbWVtbGluZS5vYmogXAotCW1lbnUub2JqIFwKLQltZXNzYWdlLm9iaiBcCi0JbWlzYzEub2JqIFwKLQltaXNjMi5vYmogXAotCW1vdmUub2JqIFwKLQlvc19tc2Rvcy5vYmogXAotCW5vcm1hbC5vYmogXAotCW9wcy5vYmogXAotCW9wdGlvbi5vYmogXAotCXBvcHVwbW51Lm9iaiBcCi0JcXVpY2tmaXgub2JqIFwKLQlyZWdleHAub2JqIFwKLQlzY3JlZW4ub2JqIFwKLQlzZWFyY2gub2JqIFwKLQlzaGEyNTYub2JqIFwKLQlzcGVsbC5vYmogXAotCXN5bnRheC5vYmogXAotCXRhZy5vYmogXAotCXRlcm0ub2JqIFwKLQl1aS5vYmogXAotCXVuZG8ub2JqIFwKLQl3aW5kb3cub2JqCi0KLWFsbDogdmltLmV4ZSBpbnN0YWxsLmV4ZSB1bmluc3RhbC5leGUgeHhkL3h4ZC5leGUKLQotIwkJKkV4cGxpY2l0IFJ1bGVzKgotCi12aW0uZXhlOiB2aW0uY2ZnICQoRVhFX2RlcGVuZGVuY2llcykgdmVyc2lvbi5jCi0JJChDQykgJChERUJVR19GTEFHKSAtYyB2ZXJzaW9uLmMKLQkkKFRMSU5LKSAveC9jL0wkKExJQlBBVEgpICQoREVCVUdfRkxBRykgQCYmfAotYzBsLm9iaiAkKEVYRV9kZXBlbmRlbmNpZXMpIHZlcnNpb24ub2JqCi12aW0KLQkJIyBubyBtYXAgZmlsZQotJChTUEFXTkwpIGNsLmxpYgotfAotCi1pbnN0YWxsLmV4ZTogZG9zaW5zdC5jCi0JJChDQykgLWVpbnN0YWxsICQoREVCVUdfRkxBRykgZG9zaW5zdC5jCi0KLXVuaW5zdGFsLmV4ZTogdW5pbnN0YWwuYwotCSQoQ0MpICQoREVCVUdfRkxBRykgdW5pbnN0YWwuYwotCi0jIFRoaXMgbWF5IGZhaWwgZm9yIG9sZGVyIG1ha2UgdmVyc2lvbnMsIGJ1aWxkaW5nIHh4ZCB3aWxsIGZhaWwgYW55d2F5IHRoZW4uCi14eGQveHhkLmV4ZTogeHhkL3h4ZC5jCi0JY2QgeHhkCi0JJChNQUtFKSAtZiBNYWtlX2JjMy5tYWsgQk9SPSQoQk9SKSBERUJVRz0kKERFQlVHKQotCWNkIC4uCi0KLSMgY2xlYW5pbmcgdXA6IERlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzCi1jbGVhbjoKLQktZGVsICoub2JqCi0JLWRlbCB2aW0uZXhlCi0JLWRlbCB2aW0uc3ltCi0JLWRlbCBpbnN0YWxsLmV4ZQotCS1kZWwgdW5pbnN0YWwuZXhlCi0JLWRlbCB4eGRcKi5vYmoKLQktZGVsIHh4ZFx4eGQuZXhlCi0JLWRlbCB2aW0uY2ZnCi0JLWRlbCB0ZXN0ZGlyXCoub3V0Ci0KLSMgSW5kaXZpZHVhbCBGaWxlIERlcGVuZGVuY2llcyAoaW5jb21wbGV0ZSkKLWV4X2RvY21kLm9iajogZXhfZG9jbWQuYyBleF9jbWRzLmgKLQotZXhfZXZhbC5vYmo6IGV4X2V2YWwuYyBleF9jbWRzLmgKLQotbWFpbi5vYmo6IG1haW4uYyBnbG9iYWxzLmggb3B0aW9uLmgKLQotdGVybS5vYmo6IHRlcm0uYyB0ZXJtLmgKLQotdmVyc2lvbi5vYmo6IHZlcnNpb24uYyB2ZXJzaW9uLmgKLQotCi0jIENvbXBpbGVyIENvbmZpZ3VyYXRpb24gRmlsZQotIwotIyBUaGUgZm9sbG93aW5nIGNvbXBpbGUgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBmb3IgYmV0dGVyIG1hY2hpbmVzLgotIwlyZXBsYWNlIC0xLSB3aXRoIC0yIHRvIHByb2R1Y2UgY29kZSBmb3IgYSA4MDI4NiBvciBoaWdoZXIKLSMJcmVwbGFjZSAtMS0gd2l0aCAtMyB0byBwcm9kdWNlIGNvZGUgZm9yIGEgODAzODYgb3IgaGlnaGVyCi0jCWFkZCAtdiBmb3Igc291cmNlIGRlYnVnZ2luZwotdmltLmNmZzogTWFrZV9iYzMubWFrCi0JY29weSAmJnwKLS1tbAotLTEtCi0tZi0KLS1DCi0tTgotLU8KLS1aCi0tay0KLS1kCi0taAotLXZpLQotLUg9VklNLlNZTQotLXctcGFyCi0td2VhcwotLXdwcmUKLS1JcHJvdG8KLS1JJChJTkNMVURFUEFUSCkKLS1MJChMSUJQQVRIKQotLURNU0RPUztGRUFUX1RJTlkkKFNQQVdORCkKLXwgdmltLmNmZwotCi10ZXN0OgotCWNkIHRlc3RkaXIKLQkkKE1BS0UpIC1mIE1ha2VfZG9zLm1hayBzbWFsbAotCWNkIC4uCmRpZmYgLS1naXQgYS9zcmMvTWFrZV9iYzUubWFrIGIvc3JjL01ha2VfYmM1Lm1hawppbmRleCBjYjQ4Y2UwLi4wMTI4NjZiIDEwMDY0NAotLS0gYS9zcmMvTWFrZV9iYzUubWFrCisrKyBiL3NyYy9NYWtlX2JjNS5tYWsKQEAgLTcsNiArNyw3IEBACiAjCiAjIENvbnRyaWJ1dGVkIGJ5IEJlbiBTaW5nZXIuCiAjIFVwZGF0ZWQgNC8xOTk3IGJ5IFJvbiBBYXJvbgorIwkyMDE2OiByZW1vdmVkIHN1cHBvcnQgZm9yIDE2IGJpdCBET1MKICMJNi8xOTk3IC0gYWRkZWQgc3VwcG9ydCBmb3IgMTYgYml0IERPUwogIwlOb3RlOiB0aGlzIGhhcyBiZWVuIHRlc3RlZCwgYW5kIHdvcmtzLCBmb3IgQkM1LiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LgogIwlIYXMgYmVlbiByZXBvcnRlZCBOT1QgdG8gd29yayB3aXRoIEJDIDQuNTIuICBNYXliZSBpdCBjYW4gYmUgZml4ZWQ/CkBAIC0zNCw4ICszNSw3IEBACiAjIG5hbWUJCXZhbHVlIChkZWZhdWx0KQogIwogIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgaW5zdGFsbCAoYzpcYmM1KQotIyBMSU5LCQluYW1lIG9mIHRoZSBsaW5rZXIgKCQoQk9SKVxiaW5caWxpbmsgaWYgT1NUWVBFIGlzIERPUzE2LAotIwkJJChCT1IpXGJpblxpbGluazMyIG90aGVyd2lzZSkKKyMgTElOSwkJbmFtZSBvZiB0aGUgbGlua2VyICgkKEJPUilcYmluXGlsaW5rMzIpCiAjIEdVSQkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3YW50IHRoZSBHVUkgdmVyc2lvbiAoeWVzKQogIyBMVUEgICAgIGRlZmluZSB0byBwYXRoIHRvIEx1YSBkaXIgdG8gZ2V0IEx1YSBzdXBwb3J0IChub3QgZGVmaW5lZCkKICMgICBMVUFfVkVSCSAgZGVmaW5lIHRvIHZlcnNpb24gb2YgTHVhIGJlaW5nIHVzZWQgKDUxKQpAQCAtNzAsNyArNzAsNiBAQAogIyBHRVRURVhUCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCAoeWVzKQogIyBJQ09OVgkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGZvciBkeW5hbWljIGljb252IHN1cHBvcnQgKHllcykKICMgT0xFCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgdG8gbWFrZSBPTEUgZ3ZpbSAobm8pCi0jIE9TVFlQRQlET1MxNiBvciBXSU4zMiAoV0lOMzIpCiAjIERFQlVHCQlubyBvciB5ZXM6IHNldCB0byB5ZXMgaWYgeW91IHdpc2ggYSBERUJVR2dpbmcgYnVpbGQgKG5vKQogIyBDT0RFR1VBUkQJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3YW50IHRvIHVzZSBDT0RFR1VBUkQgKG5vKQogIyBDUFVOUgkJMSB0aHJvdWdoIDY6IHNlbGVjdCAtQ1BVIGFyZ3VtZW50IHRvIGNvbXBpbGUgd2l0aCAoMykKQEAgLTc4LDEyICs3NywxMSBAQAogIyBVU0VETEwJbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIHVzZSB0aGUgUnVudGltZSBsaWJyYXJ5IERMTCAobm8pCiAjCQlGb3IgVVNFRExMPXllcyB0aGUgY2MzMjUwLmRsbCBpcyByZXF1aXJlZCB0byBydW4gVmltLgogIyBWSU1ETEwJbm8gb3IgeWVzOiBjcmVhdGUgdmltMzIuZGxsLCBhbmQgc3R1YiAoZyl2aW0uZXhlIChubykKLSMgQUxJR04JCTEsIDIgb3IgNDogQWxpZ25tZW50IHRvIHVzZSAoNCBmb3IgV2luMzIsIDIgZm9yIERPUzE2KQorIyBBTElHTgkJMSwgMiBvciA0OiBBbGlnbm1lbnQgdG8gdXNlICg0IGZvciBXaW4zMikKICMgRkFTVENBTEwJbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIHVzZSByZWdpc3Rlci1iYXNlZCBmdW5jdGlvbiBwcm90b2NvbCAoeWVzKQogIyBPUFRJTUlaRQlTUEFDRSwgU1BFRUQsIG9yIE1BWFNQRUVEOiB0eXBlIG9mIG9wdGltaXphdGlvbiAoTUFYU1BFRUQpCiAjIFBPU1RTQ1JJUFQJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGZvciBQb3N0U2NyaXB0IHByaW50aW5nCi0jIEZFQVRVUkVTCVRJTlksIFNNQUxMLCBOT1JNQUwsIEJJRyBvciBIVUdFCi0jCQkoQklHIGZvciBXSU4zMiwgU01BTEwgZm9yIERPUzE2KQorIyBGRUFUVVJFUwlUSU5ZLCBTTUFMTCwgTk9STUFMLCBCSUcgb3IgSFVHRSAoQklHIGZvciBXSU4zMikKICMgV0lOVkVSCTB4MDQwMCBvciAweDA1MDA6IG1pbmltdW0gV2luMzIgdmVyc2lvbiB0byBzdXBwb3J0ICgweDA0MDApCiAjIENTQ09QRQlubyBvciB5ZXM6IGluY2x1ZGUgc3VwcG9ydCBmb3IgQ3Njb3BlIGludGVyZmFjZSAoeWVzKQogIyBORVRCRUFOUwlubyBvciB5ZXM6IGluY2x1ZGUgc3VwcG9ydCBmb3IgTmV0YmVhbnMgaW50ZXJmYWNlOyBhbHNvCkBAIC05OSw4ICs5Nyw3IEBACiBCT1IgPSBjOlxiYzUKICFlbmRpZgogCi0jIyMgTElOSzogTmFtZSBvZiB0aGUgbGlua2VyOiB0bGluayBvciBpbGluazMyICh0aGlzIGlzIGJlbG93LCBkZXBlbmRzIG9uCi0jICQoT1NUWVBFKQorIyMjIExJTks6IE5hbWUgb2YgdGhlIGxpbmtlcjogaWxpbmszMiAodGhpcyBpcyBiZWxvdykKIAogIyMjIEdVSTogeWVzIGZvciBHVUkgdmVyc2lvbiwgbm8gZm9yIGNvbnNvbGUgdmVyc2lvbgogIWlmICgiJChHVUkpIj09IiIpCkBAIC0xNjYsMTIgKzE2Myw2IEBACiAjIyMgT0xFOiBubyBmb3Igbm9ybWFsIGd2aW0sIHllcyBmb3IgT0xFLWNhcGFibGUgZ3ZpbSAob25seSB3b3JrcyB3aXRoIEdVSSkKICNPTEUgPSB5ZXMKIAotIyMjIE9TVFlQRTogRE9TMTYgZm9yIFdpbmRvd3MgMy4xIHZlcnNpb24sIFdJTjMyIGZvciBXaW5kb3dzIDk1Lzk4L05ULzIwMDAKLSMgICB2ZXJzaW9uCi0haWYgKCIkKE9TVFlQRSkiPT0iIikKLU9TVFlQRSA9IFdJTjMyCi0hZW5kaWYKLQogIyMjIERFQlVHOiBVbmNvbW1lbnQgdG8gbWFrZSBhbiBleGVjdXRhYmxlIGZvciBkZWJ1Z2dpbmcKICMgREVCVUcgPSB5ZXMKICFpZiAoIiQoREVCVUcpIj09InllcyIpCkBAIC0yMDgsMTQgKzE5OSwxMCBAQAogIyMjIFZJTURMTDogeWVzIGZvciBhIERMTCB2ZXJzaW9uIG9mIFZJTSAoTk9UIFJFQ09NTUVOREVEKSwgbm8gb3RoZXJ3aXNlCiAjVklNRExMID0geWVzCiAKLSMjIyBBTElHTjogYWxpZ25tZW50IHlvdSBkZXNpcmU6ICgxLDIgb3IgNDogcy9iIDQgZm9yIFdpbjMyLCAyIGZvciBET1MpCisjIyMgQUxJR046IGFsaWdubWVudCB5b3UgZGVzaXJlOiAoMSwyIG9yIDQ6IHMvYiA0IGZvciBXaW4zMikKICFpZiAoIiQoQUxJR04pIj09IiIpCi0haWYgKCQoT1NUWVBFKT09RE9TMTYpCi1BTElHTiA9IDIKLSFlbHNlCiBBTElHTiA9IDQKICFlbmRpZgotIWVuZGlmCiAKICMjIyBGQVNUQ0FMTDogeWVzIHRvIHVzZSBGQVNUQ0FMTCBjYWxsaW5nIGNvbnZlbnRpb24gKFJFQ09NTUVOREVEISksIG5vIG90aGVyd2lzZQogIyAgIEluY29tcGF0aWJsZSB3aGVuIGNhbGxpbmcgZXh0ZXJuYWwgZnVuY3Rpb25zIChsaWtlIE1TVkMtY29tcGlsZWQgRExMcyksIHNvCkBAIC0yMzksMTMgKzIyNiw5IEBACiBPUFRJTUlaRSA9IE1BWFNQRUVECiAhZW5kaWYKIAotIyMjIEZFQVRVUkVTOiBUSU5ZLCBTTUFMTCwgTk9STUFMLCBCSUcgb3IgSFVHRSAoQklHIGZvciBXSU4zMiwgU01BTEwgZm9yIERPUzE2KQorIyMjIEZFQVRVUkVTOiBUSU5ZLCBTTUFMTCwgTk9STUFMLCBCSUcgb3IgSFVHRSAoQklHIGZvciBXSU4zMikKICFpZiAoIiQoRkVBVFVSRVMpIj09IiIpCi0hIGlmICgkKE9TVFlQRSk9PURPUzE2KQotRkVBVFVSRVMgPSBTTUFMTAotISBlbHNlCiBGRUFUVVJFUyA9IEJJRwotISBlbmRpZgogIWVuZGlmCiAKICMjIyBQT1NUU0NSSVBUOiB1bmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IFBvc3RTY3JpcHQgcHJpbnRpbmcKQEAgLTI2NiwyNCArMjQ5LDcgQEAKICMgU2FuaXR5IGNoZWNrcyBmb3IgdGhlIGFib3ZlIG9wdGlvbnM6CiAjCiAKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLSFpZiAoKCQoQ1BVTlIpKzApPjQpCi0hZXJyb3IgQ1BVTlIgTXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCBmb3IgRE9TMTYKLSFlbmRpZgotCi0haWYgKCgkKEFMSUdOKSswKT4yKQotIWVycm9yIEFMSUdOIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDIgZm9yIERPUzE2Ci0hZW5kaWYKLQotIWVsc2UJIyBub3QgRE9TMTYKLSFpZiAoKCQoQ1BVTlIpKzApPDMpCi0hZXJyb3IgQ1BVTlIgTXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIDMgZm9yIFdJTjMyCi0hZW5kaWYKLSFlbmRpZgotCi0haWYgKCQoT1NUWVBFKSE9V0lOMzIpICYmICgkKE9TVFlQRSkhPURPUzE2KQotIWVycm9yIENoZWNrIHRoZSBPU1RZUEUgdmFyaWFibGUgYWdhaW46ICQoT1NUWVBFKSBpcyBub3Qgc3VwcG9ydGVkIQotIWVuZGlmCitPU1RZUEUgPSBXSU4zMgogCiAjCiAjIE9wdGltaXphdGlvbnM6IGNoYW5nZSBhcyBkZXNpcmVkIChSRUNPTU1FTkRBVElPTjogRG9uJ3QgY2hhbmdlISk6CkBAIC0zMDUsMTEgKzI3MSw2IEBACiBPUFQgPSAkKE9QVCkgLXZpLQogIWVuZGlmCiAhZW5kaWYKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLSF1bmRlZiBHVUkKLSF1bmRlZiBWSU1ETEwKLSF1bmRlZiBVU0VETEwKLSFlbmRpZgogIyBzaG91bGRuJ3QgaGF2ZSB0byBjaGFuZ2U6CiBMSUIgPSAkKEJPUilcbGliCiBJTkNMVURFID0gJChCT1IpXGluY2x1ZGU7Ljtwcm90bwpAQCAtNDgzLDE2ICs0NDQsOSBAQAogIyBmb3Igbm93LCBhbnl3YXk6IFZJTURMTCBpcyBvbmx5IGZvciB0aGUgR1VJIHZlcnNpb24KIFRBUkdFVCA9IHZpbS5leGUKICFlbmRpZgotIWlmICgkKE9TVFlQRSk9PURPUzE2KQotREVGSU5FUz0gLURGRUFUXyQoRkVBVFVSRVMpIC1ETVNET1MKLUVYRVRZUEU9LW1sCi1TVEFSVFVQT0JKID0gYzBsLm9iagotTElOSzIgPQotIWVsc2UKIEVYRVRZUEU9LVdDCiBTVEFSVFVQT0JKID0gYzB4MzIub2JqCiBMSU5LMiA9IC1hcCAtT1MgLW8gLVAKLSFlbmRpZgogUkVTRklMRSA9IHZpbS5yZXMKICFlbmRpZgogCkBAIC01NDUsMTYgKzQ5OSw2IEBACiAjIyMjIyBCQVNFIENPTVBJTEVSL1RPT0xTIFJVTEVTICMjIyMjCiBNQUtFID0gJChCT1IpXGJpblxtYWtlCiBDRkxBR1MgPSAtdy1hdXMgLXctcGFyIC13LXBjaCAtdy1uZ3UgLXctY3N1IC1JJChJTkNMVURFKQotIWlmICgkKE9TVFlQRSk9PURPUzE2KQotQlJDID0KLSFpZiAoIiQoTElOSykiPT0iIikKLUxJTksJPSAkKEJPUilcQklOXFRMaW5rCi0hZW5kaWYKLUNDICAgPSAkKEJPUilcQklOXEJjYwotTEZMQUdTCT0gLVRkZSAtYyAtbSAtTCQoTElCKSAkKERFQlVHX0ZMQUcpICQoTElOSzIpCi1MRkxBR1NETEwgID0KLUNGTEFHUyA9ICQoQ0ZMQUdTKSAtSC0gJChIRUFERVJTKQotIWVsc2UKIEJSQyA9ICQoQk9SKVxCSU5cYnJjMzIKICFpZiAoIiQoTElOSykiPT0iIikKIExJTksJPSAkKEJPUilcQklOXElMaW5rMzIKQEAgLTU2Myw3ICs1MDcsNiBAQAogTEZMQUdTCT0gLU9TIC1UcGUgLWMgLW0gLUwkKExJQikgJChERUJVR19GTEFHKSAkKExJTksyKQogTEZMQUdTRExMICA9IC1UcGQgLWMgLW0gLUwkKExJQikgJChERUJVR19GTEFHKSAkKExJTksyKQogQ0ZMQUdTID0gJChDRkxBR1MpIC1kIC1SVC0gLWstIC1PaSAkKEhFQURFUlMpIC1mLQotIWVuZGlmCiAKIENDMSA9IC1jCiBDQzIgPSAtbwpAQCAtNTgzLDggKzUyNiw2IEBACiAuY3BwLm9iajoKIAkkKENDKSAkKENDQVJHKSAkKENDMSkgJChDQzIpJEAgJCouY3BwCiAKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLSFlbHNlICMgd2luMzI6CiB2aW1tYWluID0gXAogCSQoT0JKRElSKVxvc193MzJleGUub2JqCiAhaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKQEAgLTU5NCw3ICs1MzUsNiBAQAogdmltd2lubWFpbiA9IFwKIAkkKE9CSkRJUilcb3NfdzMyZXhlLm9iagogIWVuZGlmCi0hZW5kaWYKIAogdmltb2JqID0gIFwKIAkkKE9CSkRJUilcYmxvd2Zpc2gub2JqIFwKQEAgLTcyMCwxMyArNjYwLDggQEAKIAkkKE9CSkRJUilcZ3VpX3czMi5vYmoKICFlbmRpZgogCi0haWYgKCQoT1NUWVBFKT09V0lOMzIpCiB2aW1vYmogPSAkKHZpbW9iaikgXAogCSQoT0JKRElSKVxvc193aW4zMi5vYmogJChPQkpESVIpXG9zX21zd2luLm9iaiAkKE9CSkRJUilcd2luY2xpcC5vYmoKLSFlbGlmICgkKE9TVFlQRSk9PURPUzE2KQotdmltb2JqID0gJCh2aW1vYmopIFwKLQkkKE9CSkRJUilcb3NfbXNkb3Mub2JqCi0hZW5kaWYKICMgQmxhYiB3aGF0IHdlIGFyZSBnb2luZyB0byBkbzoKIE1TRyA9IENvbXBpbGluZyAkKE9TVFlQRSkgJChUQVJHRVQpICQoT0xFVEFSR0VUKSwgd2l0aDoKICFpZiAoIiQoR1VJKSI9PSJ5ZXMiKQpAQCAtODE4LDE0ICs3NTMsMTAgQEAKIAogIW1lc3NhZ2UgJChNU0cpCiAKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLVRBUkdFVFMgPSAkKFRBUkdFVCkKLSFlbHNlCiAhaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKIFRBUkdFVFMgPSAkKERMTFRBUkdFVCkKICFlbmRpZgogVEFSR0VUUyA9ICQoVEFSR0VUUykgJChUQVJHRVQpCi0hZW5kaWYKIAogIyBUYXJnZXRzOgogYWxsOiB2aW0gdmltcnVuLmV4ZSBpbnN0YWxsLmV4ZSB4eGQgdW5pbnN0YWwuZXhlIEd2aW1FeHQvZ3ZpbWV4dC5kbGwKQEAgLTg1MSwxOCArNzgyLDEwIEBACiAJY2QgLi4KIAogaW5zdGFsbC5leGU6IGRvc2luc3QuYyAkKE9CSkRJUilcYmNjLmNmZwotIWlmICgkKE9TVFlQRSk9PVdJTjMyKQogCSQoQ0MpICQoQ0NBUkcpIC1XQyAtRFdJTjMyIC1laW5zdGFsbCBkb3NpbnN0LmMKLSFlbHNlCi0JJChDQykgJChDQ0FSRykgLVdDIC1laW5zdGFsbCBkb3NpbnN0LmMKLSFlbmRpZgogCiB1bmluc3RhbC5leGU6IHVuaW5zdGFsLmMgJChPQkpESVIpXGJjYy5jZmcKLSFpZiAoJChPU1RZUEUpPT1XSU4zMikKIAkkKENDKSAkKENDQVJHKSAtV0MgLURXSU4zMiAtTzIgLWV1bmluc3RhbCB1bmluc3RhbC5jCi0hZWxzZQotCSQoQ0MpICQoQ0NBUkcpIC1XQyAtTzIgLWV1bmluc3RhbCB1bmluc3RhbC5jCi0hZW5kaWYKIAogY2xlYW46CiAhaWYgIiQoT1MpIiA9PSAiV2luZG93c19OVCIKQEAgLTkyMywxMCArODQ2LDcgQEAKIAljZzMyLmxpYisKICFlbmRpZgogIyAkKE9TVFlQRSk9PVdJTjMyIGNhdXNlcyBvc19tc3dpbi5jIGNvbXBpbGF0aW9uLiBGRUFUX1NIT1JUQ1VUIGluIGl0IG5lZWRzIE9MRQotIWlmICgiJChPTEUpIj09InllcyIgfHwgJChPU1RZUEUpPT1XSU4zMikKIAlvbGUydzMyLmxpYiArCi0hZW5kaWYKLSFpZiAoJChPU1RZUEUpPT1XSU4zMikKIAlpbXBvcnQzMi5saWIrCiAhaWZkZWYgTFVBCiAJJChMVUFfTElCX0ZMQUcpbHVhLmxpYisKQEAgLTk1NSw5ICs4NzUsNiBAQAogCWN3MzIubGliCiAhZW5kaWYKIAl2aW0uZGVmCi0hZWxzZQotCWNsLmxpYgotIWVuZGlmCiB8CiAKICFpZiAoIiQoVklNRExMKSI9PSJ5ZXMiKQpAQCAtOTc0LDE0ICs4OTEsMTEgQEAKIAkkKHZpbW9iaikKICFlbmRpZgogCSQ8LCQqCi0haWYgKCQoT1NUWVBFKT09V0lOMzIpCiAhaWYgKCIkKENPREVHVUFSRCkiPT0ieWVzIikKIAljZzMyLmxpYisKICFlbmRpZgogIyAkKE9TVFlQRSk9PVdJTjMyIGNhdXNlcyBvc19tc3dpbi5jIGNvbXBpbGF0aW9uLiBGRUFUX1NIT1JUQ1VUIGluIGl0IG5lZWRzIE9MRQotIWlmICgiJChPTEUpIj09InllcyIgfHwgJChPU1RZUEUpPT1XSU4zMikKIAlvbGUydzMyLmxpYiArCi0hZW5kaWYKIAlpbXBvcnQzMi5saWIrCiAhaWZkZWYgTFVBCiAJJChMVUFfTElCX0ZMQUcpbHVhLmxpYisKQEAgLTEwMTEsOSArOTI1LDYgQEAKICFlbmRpZgogCiAJJChPQkpESVIpXCQoUkVTRklMRSkKLSFlbHNlCi0JZW11LmxpYiArIGNsLmxpYgotIWVuZGlmCiB8CiAKIHRlc3Q6CmRpZmYgLS1naXQgYS9zcmMvTWFrZV9kamcubWFrIGIvc3JjL01ha2VfZGpnLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3N2I1Yy4uMDAwMDAwMAotLS0gYS9zcmMvTWFrZV9kamcubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIFZJTSBvbiBNU0RPUywgdXNpbmcgREpHUFAgMi4wCi0jCi0jIE5PVEU6IFRISVMgSVMgT0xEIEFORCBQUk9CQUJMWSBOTyBMT05HRVIgV09SS1MuCi0jCi0KLSM+Pj4+PiBjaG9vc2Ugb3B0aW9uczoKLQotIyMjIFNlZSBmZWF0dXJlLmggZm9yIGEgbGlzdCBvZiBvcHRpb25hbHMuCi0jIyMgQW55IG90aGVyIGRlZmluZXMgY2FuIGJlIGluY2x1ZGVkIGhlcmUuCi0KLURFRklORVMgPQotCi0jPj4+Pj4gbmFtZSBvZiB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciwgbmFtZSBvZiBsaWIgZGlyZWN0b3J5Ci1DQyA9IGdjYwotCi0jPj4+Pj4gZW5kIG9mIGNob2ljZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1JTkNMID0gdmltLmggZ2xvYmFscy5oIG9wdGlvbi5oIGtleW1hcC5oIG1hY3Jvcy5oIGFzY2lpLmggdGVybS5oIG9zX21zZG9zLmggc3RydWN0cy5oCi1DRkxBR1MgPSAtTzIgLURNU0RPUyAtSXByb3RvICQoREVGSU5FUykgLVdhbGwgLURpbnRlcnJ1cHQ9IC1EZmFyPSAtRE1BWE1FTT01MTIgLURfTkFJVkVfRE9TX1JFR1MKLQotT0JKID0gXAotCW9iai9ibG93ZmlzaC5vIFwKLQlvYmovYnVmZmVyLm8gXAotCW9iai9jaGFyc2V0Lm8gXAotCW9iai9jcnlwdC5vIFwKLQlvYmovY3J5cHRfemlwLm8gXAotCW9iai9kaWZmLm8gXAotCW9iai9kaWdyYXBoLm8gXAotCW9iai9lZGl0Lm8gXAotCW9iai9ldmFsLm8gXAotCW9iai9leF9jbWRzLm8gXAotCW9iai9leF9jbWRzMi5vIFwKLQlvYmovZXhfZG9jbWQubyBcCi0Jb2JqL2V4X2V2YWwubyBcCi0Jb2JqL2V4X2dldGxuLm8gXAotCW9iai9maWxlaW8ubyBcCi0Jb2JqL2ZvbGQubyBcCi0Jb2JqL2dldGNoYXIubyBcCi0Jb2JqL2hhcmRjb3B5Lm8gXAotCW9iai9oYXNodGFiLm8gXAotCW9iai9tYWluLm8gXAotCW9iai9tYXJrLm8gXAotCW9iai9tZW1maWxlLm8gXAotCW9iai9tZW1saW5lLm8gXAotCW9iai9tZW51Lm8gXAotCW9iai9tZXNzYWdlLm8gXAotCW9iai9taXNjMS5vIFwKLQlvYmovbWlzYzIubyBcCi0Jb2JqL21vdmUubyBcCi0Jb2JqL21ieXRlLm8gXAotCW9iai9ub3JtYWwubyBcCi0Jb2JqL29wcy5vIFwKLQlvYmovb3B0aW9uLm8gXAotCW9iai9vc19tc2Rvcy5vIFwKLQlvYmovcG9wdXBtbnUubyBcCi0Jb2JqL3F1aWNrZml4Lm8gXAotCW9iai9yZWdleHAubyBcCi0Jb2JqL3NjcmVlbi5vIFwKLQlvYmovc2VhcmNoLm8gXAotCW9iai9zaGEyNTYubyBcCi0Jb2JqL3NwZWxsLm8gXAotCW9iai9zeW50YXgubyBcCi0Jb2JqL3RhZy5vIFwKLQlvYmovdGVybS5vIFwKLQlvYmovdWkubyBcCi0Jb2JqL3VuZG8ubyBcCi0Jb2JqL3dpbmRvdy5vIFwKLQkkKFRFUk1MSUIpCi0KLWFsbDogdmltLmV4ZSBpbnN0YWxsLmV4ZSB1bmluc3RhbC5leGUgeHhkL3h4ZC5leGUKLQotIyB2ZXJzaW9uLmMgaXMgY29tcGlsZWQgZWFjaCB0aW1lLCBzbyB0aGF0IGl0IHNldHMgdGhlIGJ1aWxkIHRpbWUuCi12aW0uZXhlOiBvYmogJChPQkopIHZlcnNpb24uYyB2ZXJzaW9uLmgKLQkkKENDKSAkKENGTEFHUykgLXMgLW8gdmltLmV4ZSB2ZXJzaW9uLmMgJChPQkopIC1scGMKLQotaW5zdGFsbC5leGU6IGRvc2luc3QuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtcyAtbyBpbnN0YWxsLmV4ZSBkb3NpbnN0LmMgLWxwYwotCi11bmluc3RhbC5leGU6IHVuaW5zdGFsLmMKLQkkKENDKSAkKENGTEFHUykgLXMgLW8gdW5pbnN0YWwuZXhlIHVuaW5zdGFsLmMgLWxwYwotCi0jIFRoaXMgcmVxdWlyZXMgR05VIG1ha2UuCi14eGQveHhkLmV4ZTogeHhkL3h4ZC5jCi0JJChNQUtFKSAtLWRpcmVjdG9yeT14eGQgLWYgTWFrZV9kamcubWFrCi0KLW9iajoKLQlta2RpciBvYmoKLQotdGFnczoKLQljb21tYW5kIC9jIGN0YWdzICouYyAkKElOQ0wpIGV4X2NtZHMuaAotCi1jbGVhbjoKLQktZGVsIG9ialwqLm8KLQktcm1kaXIgb2JqCi0JLWRlbCB2aW0uZXhlCi0JLWRlbCBpbnN0YWxsLmV4ZQotCS1kZWwgeHhkXHh4ZC5leGUKLQktZGVsIHRlc3RkaXJcKi5vdXQKLQotIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgotdGVzdDoKLQkkKE1BS0UpIC0tZGlyZWN0b3J5PXRlc3RkaXIgLWYgTWFrZV9kb3MubWFrCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1vYmovJS5vOiAlLmMgb2JqICQoSU5DTCkKLQkkKENDKSAtYyAkKENGTEFHUykgLW8gJEAgJDwKLQotIyBFeHRyYSBkZXBlbmRlbmN5ICh0aGVyZSBhcmUgYWN0dWFsbHkgbWFueSBtb3JlLi4uKQotb2JqL2V4X2RvY21kLm86CWV4X2NtZHMuaApkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlIGIvc3JjL01ha2VmaWxlCmluZGV4IDEzYzdiYzYuLjEzMjZjZjAgMTAwNjQ0Ci0tLSBhL3NyYy9NYWtlZmlsZQorKysgYi9zcmMvTWFrZWZpbGUKQEAgLTkwOCw3ICs5MDgsNyBAQAogIyMjIGFmdGVyIGNoYW5naW5nIHRoaXMsIHlvdSBuZWVkIHRvIGRvICJtYWtlIHJlY29uZmlnIi4KICNDT05GX1RFUk1fTElCID0gLS13aXRoLXRsaWI9bmN1cnNlcwogCi0jIyMgRm9yIEdDQyBvbiBNU0RPUywgdGhlICIuZXhlIiBzdWZmaXggd2lsbCBiZSBhZGRlZC4KKyMjIyBGb3IgR0NDIG9uIE1TLVdpbmRvd3MsIHRoZSAiLmV4ZSIgc3VmZml4IHdpbGwgYmUgYWRkZWQuCiAjRVhFRVhUID0gLmV4ZQogI0xOS0VYVCA9IC5leGUKIApAQCAtMTcxNSw3ICsxNzE1LDcgQEAKICMgUmVzb3VyY2VzIHVzZWQgZm9yIHRoZSBNYWMgYXJlIGluIG9uZSBkaXJlY3RvcnkuCiBSU1JDX0RJUiA9IG9zX21hY19yc3JjCiAKLVBST19NQU5VQUwgPSBvc19hbWlnYS5wcm8gb3NfbXNkb3MucHJvIG9zX3dpbjMyLnBybyBcCitQUk9fTUFOVUFMID0gb3NfYW1pZ2EucHJvIG9zX3dpbjMyLnBybyBcCiAJb3NfbXN3aW4ucHJvIHdpbmNsaXAucHJvIG9zX2Jlb3MucHJvIG9zX3Ztcy5wcm8gJChQRVJMX1BSTykKIAogIyBEZWZhdWx0IHRhcmdldCBpcyBtYWtpbmcgdGhlIGV4ZWN1dGFibGUgYW5kIHRvb2xzCkBAIC0xODM2LDcgKzE4MzYsNyBAQAogIyBHZW5lcmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhpcyBpcyBub3QgbmVlZGVkIHRvIGNvbXBpbGUgdmltLCBidXQgaWYKICMgeW91IHdhbnQgdG8gdXNlIGl0LCBjcHJvdG8gaXMgb3V0IHRoZXJlIG9uIHRoZSBuZXQgc29tZXdoZXJlIC0tIFdlYmIKICMKLSMgV2hlbiBnZW5lcmF0aW5nIG9zX2FtaWdhLnBybywgb3NfbXNkb3MucHJvIGFuZCBvc193aW4zMi5wcm8gdGhlcmUgd2lsbCBiZSBhCisjIFdoZW4gZ2VuZXJhdGluZyBvc19hbWlnYS5wcm8gYW5kIG9zX3dpbjMyLnBybyB0aGVyZSB3aWxsIGJlIGEKICMgZmV3IGluY2x1ZGUgZmlsZXMgdGhhdCBjYW4gbm90IGJlIGZvdW5kLCB0aGF0J3MgT0suCiAKIHByb3RvOiAkKFBST19BVVRPKSAkKFBST19NQU5VQUwpCkBAIC0xODY0LDEwICsxODY0LDYgQEAKIAkkKENQUk9UTykgLURBTUlHQSAtVUhBVkVfQ09ORklHX0ggLURCUFRSPWNoYXIqICQ8ID4gcHJvdG8vJEAKIAllY2hvICIvKiB2aW06IHNldCBmdD1jIDogKi8iID4+IHByb3RvLyRACiAKLW9zX21zZG9zLnBybzogb3NfbXNkb3MuYwotCSQoQ1BST1RPKSAtRE1TRE9TIC1VSEFWRV9DT05GSUdfSCAkPCA+IHByb3RvLyRACi0JZWNobyAiLyogdmltOiBzZXQgZnQ9YyA6ICovIiA+PiBwcm90by8kQAotCiBvc193aW4zMi5wcm86IG9zX3dpbjMyLmMKIAkkKENQUk9UTykgLURXSU4zMiAtVUhBVkVfQ09ORklHX0ggJDwgPiBwcm90by8kQAogCWVjaG8gIi8qIHZpbTogc2V0IGZ0PWMgOiAqLyIgPj4gcHJvdG8vJEAKZGlmZiAtLWdpdCBhL3NyYy9ibG93ZmlzaC5jIGIvc3JjL2Jsb3dmaXNoLmMKaW5kZXggZDI0YWEyYy4uMzdkNWE1NSAxMDA2NDQKLS0tIGEvc3JjL2Jsb3dmaXNoLmMKKysrIGIvc3JjL2Jsb3dmaXNoLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBjaGFyX3UgICB1Y1s4XTsKIH0gYmxvY2s4OwogCi0jaWYgZGVmaW5lZChXSU4zMjY0KSB8fCBkZWZpbmVkKERPUzMyKQorI2lmIGRlZmluZWQoV0lOMzI2NCkKICAgLyogTVMtV2luZG93cyBpcyBhbHdheXMgbGl0dGxlIGVuZGlhbiAqLwogI2Vsc2UKICMgaWZkZWYgSEFWRV9DT05GSUdfSApkaWZmIC0tZ2l0IGEvc3JjL2J1ZmZlci5jIGIvc3JjL2J1ZmZlci5jCmluZGV4IDlmNjFlZWYuLjg5ZGVkYzUgMTAwNjQ0Ci0tLSBhL3NyYy9idWZmZXIuYworKysgYi9zcmMvYnVmZmVyLmMKQEAgLTU0MSw5ICs1NDEsNyBAQAogewogICAgIGJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID0gMTsKICAgICB1bmNoYW5nZWQoYnVmLCBUUlVFKTsKLSNpZm5kZWYgU0hPUlRfRk5BTUUKICAgICBidWYtPmJfc2hvcnRuYW1lID0gRkFMU0U7Ci0jZW5kaWYKICAgICBidWYtPmJfcF9lb2wgPSBUUlVFOwogICAgIGJ1Zi0+Yl9zdGFydF9lb2wgPSBUUlVFOwogI2lmZGVmIEZFQVRfTUJZVEUKQEAgLTI5MTEsOSArMjkwOSw3IEBACiAgICAgfQogI2VuZGlmCiAKLSNpZm5kZWYgU0hPUlRfRk5BTUUKICAgICBidWYtPmJfc2hvcnRuYW1lID0gRkFMU0U7Ci0jZW5kaWYKIAogICAgIGJ1Zl9uYW1lX2NoYW5nZWQoYnVmKTsKICAgICByZXR1cm4gT0s7CkBAIC00NDgwLDcgKzQ0NzYsNyBAQAogIyBpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKIAkgICAgfHwgc3Ryc3RyKChjaGFyICopZm5hbWUsICJcXFxcIikgIT0gTlVMTAogIyBlbmRpZgotIyBpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKERKR1BQKQorIyBpZiBkZWZpbmVkKE1TV0lOKQogCSAgICB8fCB2aW1fc3RyY2hyKGZuYW1lLCAnficpICE9IE5VTEwKICMgZW5kaWYKIAkgICAgKQpkaWZmIC0tZ2l0IGEvc3JjL2RpZmYuYyBiL3NyYy9kaWZmLmMKaW5kZXggZGIxZDA2Ni4uYmU3ZTM4YyAxMDA2NDQKLS0tIGEvc3JjL2RpZmYuYworKysgYi9zcmMvZGlmZi5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBpbnQgZGlmZl9hX3dvcmtzID0gTUFZQkU7IC8qIFRSVUUgd2hlbiAiZGlmZiAtYSIgd29ya3MsIEZBTFNFIHdoZW4gaXQKIAkJCQkgICAgZG9lc24ndCB3b3JrLCBNQVlCRSB3aGVuIG5vdCBjaGVja2VkIHlldCAqLwotI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChNU1dJTikKIHN0YXRpYyBpbnQgZGlmZl9iaW5fd29ya3MgPSBNQVlCRTsgLyogVFJVRSB3aGVuICJkaWZmIC0tYmluYXJ5IiB3b3JrcywgRkFMU0UKIAkJCQkgICAgICB3aGVuIGl0IGRvZXNuJ3Qgd29yaywgTUFZQkUgd2hlbiBub3QKIAkJCQkgICAgICBjaGVja2VkIHlldCAqLwpAQCAtNzMzLDcgKzczMyw3IEBACiAJICAgIGJyZWFrOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJLyogSWYgdGhlICItYSIgYXJndW1lbnQgd29ya3MsIGFsc28gY2hlY2sgaWYgIi0tYmluYXJ5IiB3b3Jrcy4gKi8KIAlpZiAob2sgJiYgZGlmZl9hX3dvcmtzID09IE1BWUJFICYmIGRpZmZfYmluX3dvcmtzID09IE1BWUJFKQogCXsKQEAgLTc2NCw3ICs3NjQsNyBAQAogCSAgICBFTVNHKF8oIkU4MTA6IENhbm5vdCByZWFkIG9yIHdyaXRlIHRlbXAgZmlsZXMiKSk7CiAJRU1TRyhfKCJFOTc6IENhbm5vdCBjcmVhdGUgZGlmZnMiKSk7CiAJZGlmZl9hX3dvcmtzID0gTUFZQkU7Ci0jaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKE1TV0lOKQogCWRpZmZfYmluX3dvcmtzID0gTUFZQkU7CiAjZW5kaWYKIAlnb3RvIHRoZWVuZDsKQEAgLTg0NSw3ICs4NDUsNyBAQAogCSAgICAgKiBub24temVybyB3aGVuIGRpZmZlcmVuY2VzIGhhdmUgYmVlbiBmb3VuZC4gKi8KIAkgICAgdmltX3NucHJpbnRmKChjaGFyICopY21kLCBsZW4sICJkaWZmICVzJXMlcyVzJXMgJXMiLAogCQkgICAgZGlmZl9hX3dvcmtzID09IEZBTFNFID8gIiIgOiAiLWEgIiwKLSNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCSAgICBkaWZmX2Jpbl93b3JrcyA9PSBUUlVFID8gIi0tYmluYXJ5ICIgOiAiIiwKICNlbHNlCiAJCSAgICAiIiwKZGlmZiAtLWdpdCBhL3NyYy9kaWdyYXBoLmMgYi9zcmMvZGlncmFwaC5jCmluZGV4IDIxOTVkNjQuLjVkYWI1MWIgMTAwNjQ0Ci0tLSBhL3NyYy9kaWdyYXBoLmMKKysrIGIvc3JjL2RpZ3JhcGguYwpAQCAtMzksNzQgKzM5LDcgQEAKICAqIGNvbXBpbGVycyBjYW5ub3QgaGFuZGxlIHRoZW0gKEFtaWdhIFNBUy9DIGlzIHRoZSBtb3N0IHBpY2t5IG9uZSkuCiAgKi8KIHN0YXRpYyBkaWdyX1QgZGlncmFwaGRlZmF1bHRbXSA9Ci0jaWYgZGVmaW5lZChNU0RPUykKLQkvKgotCSAqIE1TRE9TIGRpZ3JhcGhzLgotCSAqLwotICAgICAgIHt7J0MnLCAnLCcsIDEyOH0sCS8qIH5AIFhYICovCi0Jeyd1JywgJyInLCAxMjl9LAkvKiCBICovCi0JeydlJywgJ1wnJywgMTMwfSwJLyoggiAqLwotCXsnYScsICdeJywgMTMxfSwJLyoggyAqLwotCXsnYScsICciJywgMTMyfSwJLyoghCAqLwotCXsnYScsICdgJywgMTMzfSwJLyoghSAqLwotCXsnYScsICdAJywgMTM0fSwJLyoghiAqLwotCXsnYycsICcsJywgMTM1fSwJLyogfkcgWFggKi8KLQl7J2UnLCAnXicsIDEzNn0sCS8qIH5IIFhYICovCi0JeydlJywgJyInLCAxMzd9LAkvKiCJICovCi0JeydlJywgJ2AnLCAxMzh9LAkvKiCKICovCi0JeydpJywgJyInLCAxMzl9LAkvKiCLICovCi0JeydpJywgJ14nLCAxNDB9LAkvKiCMICovCi0JeydpJywgJ2AnLCAxNDF9LAkvKiCNICovCi0JeydBJywgJyInLCAxNDJ9LAkvKiB+TiBYWCAqLwotCXsnQScsICdAJywgMTQzfSwJLyogjyAqLwotCXsnRScsICdcJycsIDE0NH0sCS8qIJAgKi8KLQl7J2EnLCAnZScsIDE0NX0sCS8qIJEgKi8KLQl7J0EnLCAnRScsIDE0Nn0sCS8qIJIgKi8KLQl7J28nLCAnXicsIDE0N30sCS8qIJMgKi8KLQl7J28nLCAnIicsIDE0OH0sCS8qIJQgKi8KLQl7J28nLCAnYCcsIDE0OX0sCS8qIJUgKi8KLQl7J3UnLCAnXicsIDE1MH0sCS8qIJYgKi8KLQl7J3UnLCAnYCcsIDE1MX0sCS8qIJcgKi8KLQl7J3knLCAnIicsIDE1Mn0sCS8qIJggKi8KLQl7J08nLCAnIicsIDE1M30sCS8qIJkgKi8KLQl7J1UnLCAnIicsIDE1NH0sCS8qIJogKi8KLQl7J2MnLCAnfCcsIDE1NX0sCS8qIJsgKi8KLQl7JyQnLCAnJCcsIDE1Nn0sCS8qIJwgKi8KLQl7J1knLCAnLScsIDE1N30sCS8qIH5dIFhYICovCi0JeydQJywgJ3QnLCAxNTh9LAkvKiCeICovCi0JeydmJywgJ2YnLCAxNTl9LAkvKiCfICovCi0JeydhJywgJ1wnJywgMTYwfSwJLyogoCAqLwotCXsnaScsICdcJycsIDE2MX0sCS8qIKEgKi8KLQl7J28nLCAnXCcnLCAxNjJ9LAkvKiCiICovCi0Jeyd1JywgJ1wnJywgMTYzfSwJLyogeCBYWCAqLwotCXsnbicsICd+JywgMTY0fSwJLyogpCAqLwotCXsnTicsICd+JywgMTY1fSwJLyogpSAqLwotCXsnYScsICdhJywgMTY2fSwJLyogpiAqLwotCXsnbycsICdvJywgMTY3fSwJLyogpyAqLwotCXsnficsICc/JywgMTY4fSwJLyogqCAqLwotCXsnLScsICdhJywgMTY5fSwJLyogqSAqLwotCXsnYScsICctJywgMTcwfSwJLyogqiAqLwotCXsnMScsICcyJywgMTcxfSwJLyogqyAqLwotCXsnMScsICc0JywgMTcyfSwJLyogrCAqLwotCXsnficsICchJywgMTczfSwJLyogrSAqLwotCXsnPCcsICc8JywgMTc0fSwJLyogriAqLwotCXsnPicsICc+JywgMTc1fSwJLyogryAqLwotCi0JeydzJywgJ3MnLCAyMjV9LAkvKiDhICovCi0JeydqJywgJ3UnLCAyMzB9LAkvKiDmICovCi0JeydvJywgJy8nLCAyMzd9LAkvKiDtICovCi0JeycrJywgJy0nLCAyNDF9LAkvKiDxICovCi0Jeyc+JywgJz0nLCAyNDJ9LAkvKiDyICovCi0Jeyc8JywgJz0nLCAyNDN9LAkvKiDzICovCi0Jeyc6JywgJy0nLCAyNDZ9LAkvKiD2ICovCi0Jeyd+JywgJ34nLCAyNDd9LAkvKiD3ICovCi0Jeyd+JywgJ28nLCAyNDh9LAkvKiD4ICovCi0JeycyJywgJzInLCAyNTN9LAkvKiD9ICovCi0Je05VTCwgTlVMLCBOVUx9Ci0JfTsKLQotI2Vsc2UJLyogIU1TRE9TICovCi0jIGlmZGVmIF9fTUlOVF9fCisjaWZkZWYgX19NSU5UX18KIAogCS8qCiAJICogQVRBUkkgZGlncmFwaHMKQEAgLTE3MSw4ICsxMDQsOCBAQAogCXtOVUwsIE5VTCwgTlVMfQogCX07CiAKLSMgZWxzZQkvKiAhX19NSU5UX18gKi8KLSMgIGlmZGVmIEhQVVhfRElHUkFQSFMKKyNlbHNlCS8qICFfX01JTlRfXyAqLworIyBpZmRlZiBIUFVYX0RJR1JBUEhTCiAKIAkvKgogCSAqIGRpZmZlcmVudCBIUFVYIGRpZ3JhcGhzCkBAIC0yNzUsOSArMjA4LDkgQEAKIAl7TlVMLCBOVUwsIE5VTH0KIAl9OwogCi0jICBlbHNlCS8qICFIUFVYX0RJR1JBUEhTICovCisjIGVsc2UJLyogIUhQVVhfRElHUkFQSFMgKi8KIAotIyAgIGlmZGVmIEVCQ0RJQworIyAgaWZkZWYgRUJDRElDCiAKIAkvKgogCSAqIEVCQ0RJQyAtIElTTyBkaWdyYXBocwpAQCAtMzg3LDggKzMyMCw4IEBACiAJe05VTCwgTlVMLCBOVUx9CiAJfTsKIAotIyAgIGVsc2UKLSMgICAgaWYgZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoRkVBVF9NQllURSkKKyMgIGVsc2UKKyMgICBpZiBkZWZpbmVkKE1BQ09TKSAmJiAhZGVmaW5lZChGRUFUX01CWVRFKQogCiAJLyoKIAkgKiBNYWNpbnRvc2ggZGlncmFwaHMKQEAgLTUxNiw5ICs0NDksOSBAQAogCXtOVUwsIE5VTCwgTlVMfQogCX07CiAKLSMgICAgZWxzZQkvKiAhTUFDT1MgKi8KKyMgICBlbHNlCS8qICFNQUNPUyAqLwogCi0jICAgICBpZmRlZiBPTERfRElHUkFQSFMKKyMgICAgaWZkZWYgT0xEX0RJR1JBUEhTCiAKIAkvKgogCSAqIGRpZ3JhcGhzIGNvbXBhdGlibGUgd2l0aCBWaW0gNS54CkBAIC02MjUsNyArNTU4LDcgQEAKIAl7J3knLCAnIicsIDI1NX0sCS8qIHggWFggKi8KIAl7TlVMLCBOVUwsIE5VTH0KIAl9OwotIyAgICAgZWxzZSAvKiBPTERfRElHUkFQSFMgKi8KKyMgICAgZWxzZSAvKiBPTERfRElHUkFQSFMgKi8KIAogCS8qCiAJICogZGlncmFwaHMgZm9yIFVuaWNvZGUgZnJvbSBSRkMxMzQ1CkBAIC0yMDAxLDEzICsxOTM0LDEyIEBACiAJe05VTCwgTlVMLCBOVUx9CiAgICAgICAgfTsKIAotIyAgICAgZW5kaWYgLyogT0xEX0RJR1JBUEhTICovCisjICAgIGVuZGlmIC8qIE9MRF9ESUdSQVBIUyAqLwogCi0jICAgIGVuZGlmIC8qIE1hY2ludG9zaCAqLwotIyAgIGVuZGlmIC8qIEVCQ0RJQyAqLwotIyAgZW5kaWYgICAgLyogIUhQVVhfRElHUkFQSFMgKi8KLSMgZW5kaWYJLyogIV9fTUlOVF9fICovCi0jZW5kaWYJLyogIU1TRE9TICovCisjICAgZW5kaWYgLyogTWFjaW50b3NoICovCisjICBlbmRpZiAvKiBFQkNESUMgKi8KKyMgZW5kaWYgICAgLyogIUhQVVhfRElHUkFQSFMgKi8KKyNlbmRpZgkvKiAhX19NSU5UX18gKi8KIAogLyoKICAqIGhhbmRsZSBkaWdyYXBocyBhZnRlciB0eXBpbmcgYSBjaGFyYWN0ZXIKZGlmZiAtLWdpdCBhL3NyYy9kb3NpbnN0LmggYi9zcmMvZG9zaW5zdC5oCmluZGV4IDk3ZDgzZDkuLmI3M2YwOTcgMTAwNjQ0Ci0tLSBhL3NyYy9kb3NpbnN0LmgKKysrIGIvc3JjL2Rvc2luc3QuaApAQCAtNDYsMTQgKzQ2LDE0IEBACiBjaGFyICpzZWFyY2hwYXRoKGNoYXIgKm5hbWUpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFVOSVhfTElOVCkKKyNpZiBkZWZpbmVkKFVOSVhfTElOVCkKICMgaW5jbHVkZSA8dW5pc3RkLmg+CiAjIGluY2x1ZGUgPGVycm5vLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgInZlcnNpb24uaCIKIAotI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoVU5JWF9MSU5UKQorI2lmIGRlZmluZWQoVU5JWF9MSU5UKQogIyBkZWZpbmUgdmltX21rZGlyKHgsIHkpIG1rZGlyKChjaGFyICopKHgpLCB5KQogI2Vsc2UKICMgaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCkBAIC02Myw5ICs2Myw3IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmbmRlZiBESkdQUAotIyBkZWZpbmUgc2xlZXAobikgU2xlZXAoKG4pICogMTAwMCkKLSNlbmRpZgorI2RlZmluZSBzbGVlcChuKSBTbGVlcCgobikgKiAxMDAwKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTQyMyw5ICs0MjEsNyBAQAogICAgIGNoYXIJKnA7CiAKICAgICAvKiBPbiBXaW5OVCwgJ3N0YXJ0JyBpcyBhIHNoZWxsIGJ1aWx0LWluIGZvciBjbWQuZXhlIHJhdGhlciB0aGFuIGFuCi0gICAgICogZXhlY3V0YWJsZSAoc3RhcnQuZXhlKSBsaWtlIGluIFdpbjl4LiAgREpHUFAsIGJlaW5nIGEgRE9TIHByb2dyYW0sCi0gICAgICogaXMgZ2l2ZW4gdGhlIENPTVNQRUMgY29tbWFuZC5jb20gYnkgV2luTlQsIHNvIHdlIGhhdmUgdG8gZmluZAotICAgICAqIGNtZC5leGUgbWFudWFsbHkgYW5kIHVzZSBpdC4gKi8KKyAgICAgKiBleGVjdXRhYmxlIChzdGFydC5leGUpIGxpa2UgaW4gV2luOXguICovCiAgICAgY21kX3BhdGggPSBzZWFyY2hwYXRoX3NhdmUoImNtZC5leGUiKTsKICAgICBpZiAoY21kX3BhdGggIT0gTlVMTCkKICAgICB7CkBAIC02NDAsMTQgKzYzNiw2IEBACiAgICAgc3RhdGljIHZvaWQKIGRvX2luaXRzKGNoYXIgKiphcmd2KQogewotI2lmZGVmIERKR1BQCi0gICAgLyoKLSAgICAgKiBVc2UgTG9uZyBGaWxlIE5hbWVzIGJ5IGRlZmF1bHQsIGlmICRMRk4gbm90IHNldC4KLSAgICAgKi8KLSAgICBpZiAoZ2V0ZW52KCJMRk4iKSA9PSBOVUxMKQotCXB1dGVudigiTEZOPXkiKTsKLSNlbmRpZgotCiAgICAgLyogRmluZCBvdXQgdGhlIGZ1bGwgcGF0aCBvZiBvdXIgZXhlY3V0YWJsZS4gKi8KICAgICBpZiAobXlfZnVsbHBhdGgoaW5zdGFsbGRpciwgYXJndlswXSwgQlVGU0laRSkgPT0gTlVMTCkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvZXZhbC5jIGIvc3JjL2V2YWwuYwppbmRleCAzNDExOTljLi4zYjExNzJlIDEwMDY0NAotLS0gYS9zcmMvZXZhbC5jCisrKyBiL3NyYy9ldmFsLmMKQEAgLTEzNTAzLDEzICsxMzUwMyw2IEBACiAjaWZkZWYgX19CRU9TX18KIAkiYmVvcyIsCiAjZW5kaWYKLSNpZmRlZiBNU0RPUwotIyBpZmRlZiBESkdQUAotCSJkb3MzMiIsCi0jIGVsc2UKLQkiZG9zMTYiLAotIyBlbmRpZgotI2VuZGlmCiAjaWZkZWYgTUFDT1MKIAkibWFjIiwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2V4X2NtZHMuYyBiL3NyYy9leF9jbWRzLmMKaW5kZXggNzhkOWY5NS4uYTIxODZiMiAxMDA2NDQKLS0tIGEvc3JjL2V4X2NtZHMuYworKysgYi9zcmMvZXhfY21kcy5jCkBAIC0xOTI1LDE0ICsxOTI1LDEwIEBACiAjaWZkZWYgVU5JWAogCQkJCSAgICBzaG9ydG5hbWUsCiAjZWxzZQotIyBpZmRlZiBTSE9SVF9GTkFNRQotCQkJCSAgICBUUlVFLAotIyBlbHNlCi0jICBpZmRlZiBGRUFUX0dVSV9XMzIKKyMgaWZkZWYgRkVBVF9HVUlfVzMyCiAJCQkJICAgIGd1aV9pc193aW4zMnMoKSwKLSMgIGVsc2UKKyMgZWxzZQogCQkJCSAgICBGQUxTRSwKLSMgIGVuZGlmCiAjIGVuZGlmCiAjZW5kaWYKIAkJCQkgICAgZm5hbWUsCmRpZmYgLS1naXQgYS9zcmMvZXhfY21kczIuYyBiL3NyYy9leF9jbWRzMi5jCmluZGV4IGUxMDVmYTAuLmVjMjBkYWEgMTAwNjQ0Ci0tLSBhL3NyYy9leF9jbWRzMi5jCisrKyBiL3NyYy9leF9jbWRzMi5jCkBAIC00MjU2LDggKzQyNTYsNyBAQAogewogICAgIGNoYXJfdQkqbG9jOwogCi0gICAgLyogT2J0YWluIHRoZSBsb2NhbGUgdmFsdWUgZnJvbSB0aGUgbGlicmFyaWVzLiAgRm9yIERKR1BQIHRoaXMgaXMKLSAgICAgKiByZWRlZmluZWQgYW5kIGl0IGRvZXNuJ3QgdXNlIHRoZSBhcmd1bWVudHMuICovCisgICAgLyogT2J0YWluIHRoZSBsb2NhbGUgdmFsdWUgZnJvbSB0aGUgbGlicmFyaWVzLiAqLwogICAgIGxvYyA9IChjaGFyX3UgKilzZXRsb2NhbGUod2hhdCwgTlVMTCk7CiAKICMgaWZkZWYgV0lOMzIKZGlmZiAtLWdpdCBhL3NyYy9leF9kb2NtZC5jIGIvc3JjL2V4X2RvY21kLmMKaW5kZXggMTMyMWI3Zi4uMWY0OTNhZCAxMDA2NDQKLS0tIGEvc3JjL2V4X2RvY21kLmMKKysrIGIvc3JjL2V4X2RvY21kLmMKQEAgLTM3NTgsNyArMzc1OCw3IEBACiAKIAkvKiBDaGVjayBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KIAlpZiAoKnhwLT54cF9wYXR0ZXJuID09ICckJwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJfHwgKnhwLT54cF9wYXR0ZXJuID09ICclJwogI2VuZGlmCiAJCSkKZGlmZiAtLWdpdCBhL3NyYy9leF9nZXRsbi5jIGIvc3JjL2V4X2dldGxuLmMKaW5kZXggYTBjOTg3Ny4uNjc0MWUxMSAxMDA2NDQKLS0tIGEvc3JjL2V4X2dldGxuLmMKKysrIGIvc3JjL2V4X2dldGxuLmMKQEAgLTQ5MTgsNyArNDkxOCw3IEBACiAJaWYgKCpzID09ICcgJykKIAkgICAgKytzOwkvKiBTa2lwIHNwYWNlIHVzZWQgZm9yIGFic29sdXRlIHBhdGggbmFtZS4gKi8KIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAllID0gdmltX3N0cmNocihzLCAnOycpOwogI2Vsc2UKIAllID0gdmltX3N0cmNocihzLCAnOicpOwpAQCAtNTIxNyw3ICs1MjE3LDcgQEAKIAljb3B5X29wdGlvbl9wYXJ0KCZwYXRoLCBidWYsIE1BWFBBVEhMLCAiLCIpOwogCWlmIChTVFJMRU4oYnVmKSArIFNUUkxFTihmaWxlKSArIDIgPCBNQVhQQVRITCkKIAl7Ci0jIGlmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisjIGlmIGRlZmluZWQoTVNXSU4pCiAJICAgIC8qIFVzaW5nIHRoZSBwbGF0Zm9ybSdzIHBhdGggc2VwYXJhdG9yIChcKSBtYWtlcyB2aW0gaW5jb3JyZWN0bHkKIAkgICAgICogdHJlYXQgaXQgYXMgYW4gZXNjYXBlIGNoYXJhY3RlciwgdXNlICcvJyBpbnN0ZWFkLiAqLwogCSAgICBpZiAoKmJ1ZiAhPSBOVUwgJiYgIWFmdGVyX3BhdGhzZXAoYnVmLCBidWYgKyBTVFJMRU4oYnVmKSkpCmRpZmYgLS1naXQgYS9zcmMvZmVhdHVyZS5oIGIvc3JjL2ZlYXR1cmUuaAppbmRleCBhYjBlYzVhLi40MTUwZjA3IDEwMDY0NAotLS0gYS9zcmMvZmVhdHVyZS5oCisrKyBiL3NyYy9mZWF0dXJlLmgKQEAgLTY1LDE0ICs2NSwxMCBAQAogIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChNQUNPUykKICMgIGRlZmluZSBGRUFUX0hVR0UKICMgZWxzZQotIyAgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoQU1JR0EpCisjICBpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChBTUlHQSkKICMgICBkZWZpbmUgRkVBVF9CSUcKICMgIGVsc2UKLSMgICBpZmRlZiBNU0RPUwotIyAgICBkZWZpbmUgRkVBVF9TTUFMTAotIyAgIGVsc2UKLSMgICAgZGVmaW5lIEZFQVRfTk9STUFMCi0jICAgZW5kaWYKKyMgICBkZWZpbmUgRkVBVF9OT1JNQUwKICMgIGVuZGlmCiAjIGVuZGlmCiAjZW5kaWYKQEAgLTQ2Nyw3ICs0NjMsNyBAQAogICoJCQlhbmQgYnl0ZTJsaW5lKCkuCiAgKgkJCU5vdGU6IFJlcXVpcmVkIGZvciBNYWNpbnRvc2guCiAgKi8KLSNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiAhZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKEZFQVRfTk9STUFMKQogIyBkZWZpbmUgRkVBVF9USVRMRQogI2VuZGlmCiAKQEAgLTU0MSw3ICs1MzcsNiBAQAogICoJCQl3aXRoIEhBVkVfVEdFVEVOVCBkZWZpbmVkKS4KICAqCiAgKiAobm90aGluZykJCU1hY2hpbmUgc3BlY2lmaWMgdGVybWNhcCBlbnRyaWVzIHdpbGwgYmUgaW5jbHVkZWQuCi0gKgkJCVRoaXMgaXMgZGVmYXVsdCBmb3Igd2luMTYgdG8gc2F2ZSBzdGF0aWMgZGF0YS4KICAqCiAgKiBTT01FX0JVSUxUSU5fVENBUFMJSW5jbHVkZSBtb3N0IHVzZWZ1bCBidWlsdGluIHRlcm1jYXAgZW50cmllcyAodXNlZCBvbmx5CiAgKgkJCXdpdGggTk9fQlVJTFRJTl9UQ0FQUyBub3QgZGVmaW5lZCkuCkBAIC0xMDYwLDcgKzEwNTUsNyBAQAogIyBpZmRlZiBGRUFUX0JJRwogIyAgZGVmaW5lIEZFQVRfTU9VU0VfU0dSCiAjIGVuZGlmCi0jIGlmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpKQorIyBpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiBkZWZpbmVkKFdJTjMyNjQpCiAjICBkZWZpbmUgRE9TX01PVVNFCiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoRkVBVF9OT1JNQUwpICYmIGRlZmluZWQoX19RTlhfXykKQEAgLTExNzYsNyArMTE3MSw3IEBACiAgKi8KICNpZmRlZiBGRUFUX05PUk1BTAogLyogTVMtRE9TIGNvbnNvbGUgYW5kIFdpbjMyIGNvbnNvbGUgY2FuIGNoYW5nZSBjdXJzb3Igc2hhcGUgKi8KLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKSkKKyMgaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCiAjICBkZWZpbmUgTUNIX0NVUlNPUl9TSEFQRQogIyBlbmRpZgogIyBpZiBkZWZpbmVkKEZFQVRfR1VJX1czMikgfHwgZGVmaW5lZChGRUFUX0dVSV9NT1RJRikgXApkaWZmIC0tZ2l0IGEvc3JjL2ZpbGVpby5jIGIvc3JjL2ZpbGVpby5jCmluZGV4IGM1YTNmMmEuLmVkOGQ0NWIgMTAwNjQ0Ci0tLSBhL3NyYy9maWxlaW8uYworKysgYi9zcmMvZmlsZWlvLmMKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCSAgICByZXR1cm4gRkFJTDsKIAl9CiAjZW5kaWYKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJLyoKIAkgKiBNUy1XaW5kb3dzIGFsbG93cyBvcGVuaW5nIGEgZGV2aWNlLCBidXQgd2Ugd2lsbCBwcm9iYWJseSBnZXQgc3R1Y2sKIAkgKiB0cnlpbmcgdG8gcmVhZCBpdC4KQEAgLTUyMSwxMiArNTIxLDEyIEBACiAKIC8qCiAgKiBmb3IgVU5JWDogY2hlY2sgcmVhZG9ubHkgd2l0aCBwZXJtIGFuZCBtY2hfYWNjZXNzKCkKLSAqIGZvciBNU0RPUyBhbmQgQW1pZ2E6IGNoZWNrIHJlYWRvbmx5IGJ5IHRyeWluZyB0byBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgKiBmb3IgQW1pZ2E6IGNoZWNrIHJlYWRvbmx5IGJ5IHRyeWluZyB0byBvcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCiAgKi8KICAgICBmaWxlX3JlYWRvbmx5ID0gRkFMU0U7CiAgICAgaWYgKHJlYWRfc3RkaW4pCiAgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkvKiBGb3JjZSBiaW5hcnkgSS9PIG9uIHN0ZGluIHRvIGF2b2lkIENSLUxGIC0+IExGIGNvbnZlcnNpb24uICovCiAJc2V0bW9kZSgwLCBPX0JJTkFSWSk7CiAjZW5kaWYKQEAgLTU2MSw3ICs1NjEsNyBAQAogCW1zZ19zY3JvbGwgPSBtc2dfc2F2ZTsKICNpZm5kZWYgVU5JWAogCS8qCi0JICogT24gTVNET1MgYW5kIEFtaWdhIHdlIGNhbid0IG9wZW4gYSBkaXJlY3RvcnksIGNoZWNrIGhlcmUuCisJICogT24gQW1pZ2Egd2UgY2FuJ3Qgb3BlbiBhIGRpcmVjdG9yeSwgY2hlY2sgaGVyZS4KIAkgKi8KIAlpc2Rpcl9mID0gKG1jaF9pc2RpcihmbmFtZSkpOwogCXBlcm0gPSBtY2hfZ2V0cGVybShmbmFtZSk7ICAvKiBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgKi8KQEAgLTM1NDYsNyArMzU0Niw3IEBACiAgICAgfQogICAgIGlmIChjID09IE5PREVfV1JJVEFCTEUpCiAgICAgewotIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorIyBpZiBkZWZpbmVkKE1TV0lOKQogCS8qIE1TLVdpbmRvd3MgYWxsb3dzIG9wZW5pbmcgYSBkZXZpY2UsIGJ1dCB3ZSB3aWxsIHByb2JhYmx5IGdldCBzdHVjawogCSAqIHRyeWluZyB0byB3cml0ZSB0byBpdC4gICovCiAJaWYgKCFwX29kZXYpCkBAIC0zNzkxLDcgKzM3OTEsNyBAQAogCSAgICBzdHJ1Y3Qgc3RhdAlzdF9uZXc7CiAJICAgIGNoYXJfdQkqZGlycDsKIAkgICAgY2hhcl91CSpyb290bmFtZTsKLSNpZiBkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKFNIT1JUX0ZOQU1FKQorI2lmIGRlZmluZWQoVU5JWCkKIAkgICAgaW50CQlkaWRfc2V0X3Nob3J0bmFtZTsKICNlbmRpZgogCkBAIC0zODM0LDcgKzM4MzQsNyBAQAogCQkgICAgZ290byBub2JhY2t1cDsKIAkJfQogCi0jaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChTSE9SVF9GTkFNRSkKKyNpZiBkZWZpbmVkKFVOSVgpCiAJCWRpZF9zZXRfc2hvcnRuYW1lID0gRkFMU0U7CiAjZW5kaWYKIApAQCAtMzg0NiwxMiArMzg0Niw3IEBACiAJCSAgICAvKgogCQkgICAgICogTWFrZSBiYWNrdXAgZmlsZSBuYW1lLgogCQkgICAgICovCi0JCSAgICBiYWNrdXAgPSBidWZfbW9kbmFtZSgKLSNpZmRlZiBTSE9SVF9GTkFNRQotCQkJICAgIFRSVUUsCi0jZWxzZQotCQkJICAgIChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKLSNlbmRpZgorCQkgICAgYmFja3VwID0gYnVmX21vZG5hbWUoKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAogCQkJCQkJIHJvb3RuYW1lLCBiYWNrdXBfZXh0LCBGQUxTRSk7CiAJCSAgICBpZiAoYmFja3VwID09IE5VTEwpCiAJCSAgICB7CkBAIC0zODc4LDcgKzM4NzMsNiBAQAogCQkJewogCQkJICAgIHZpbV9mcmVlKGJhY2t1cCk7CiAJCQkgICAgYmFja3VwID0gTlVMTDsJLyogbm8gYmFja3VwIGZpbGUgdG8gZGVsZXRlICovCi0jIGlmbmRlZiBTSE9SVF9GTkFNRQogCQkJICAgIC8qCiAJCQkgICAgICogbWF5IHRyeSBhZ2FpbiB3aXRoICdzaG9ydG5hbWUnIHNldAogCQkJICAgICAqLwpAQCAtMzg5MSw3ICszODg1LDYgQEAKIAkJCQkvKiBzZXR0aW5nIHNob3J0bmFtZSBkaWRuJ3QgaGVscCAqLwogCQkJICAgIGlmIChkaWRfc2V0X3Nob3J0bmFtZSkKIAkJCQlidWYtPmJfc2hvcnRuYW1lID0gRkFMU0U7Ci0jIGVuZGlmCiAJCQkgICAgYnJlYWs7CiAJCQl9CiAjZW5kaWYKQEAgLTQwNTksMTIgKzQwNTIsNyBAQAogCQkgICAgYmFja3VwID0gTlVMTDsKIAkJZWxzZQogCQl7Ci0JCSAgICBiYWNrdXAgPSBidWZfbW9kbmFtZSgKLSNpZmRlZiBTSE9SVF9GTkFNRQotCQkJICAgIFRSVUUsCi0jZWxzZQotCQkJICAgIChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKLSNlbmRpZgorCQkgICAgYmFja3VwID0gYnVmX21vZG5hbWUoKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAogCQkJCQkJIHJvb3RuYW1lLCBiYWNrdXBfZXh0LCBGQUxTRSk7CiAJCSAgICB2aW1fZnJlZShyb290bmFtZSk7CiAJCX0KQEAgLTQ5MTEsMTIgKzQ4OTksNyBAQAogICAgICAqLwogICAgIGlmICgqcF9wbSAmJiBkb2JhY2t1cCkKICAgICB7Ci0JY2hhciAqb3JnID0gKGNoYXIgKilidWZfbW9kbmFtZSgKLSNpZmRlZiBTSE9SVF9GTkFNRQotCQkJCQlUUlVFLAotI2Vsc2UKLQkJCQkJKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAotI2VuZGlmCisJY2hhciAqb3JnID0gKGNoYXIgKilidWZfbW9kbmFtZSgoYnVmLT5iX3Bfc24gfHwgYnVmLT5iX3Nob3J0bmFtZSksCiAJCQkJCQkJICBmbmFtZSwgcF9wbSwgRkFMU0UpOwogCiAJaWYgKGJhY2t1cCAhPSBOVUxMKQpAQCAtNTI4Nyw3ICs1MjcwLDcgQEAKICAgICBzdGF0aWMgaW50CiB0aW1lX2RpZmZlcnMobG9uZyB0MSwgbG9uZyB0MikKIHsKLSNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChNU1dJTikKICAgICAvKiBPbiBhIEZBVCBmaWxlc3lzdGVtLCBlc3AuIHVuZGVyIExpbnV4LCB0aGVyZSBhcmUgb25seSA1IGJpdHMgdG8gc3RvcmUKICAgICAgKiB0aGUgc2Vjb25kcy4gIFNpbmNlIHRoZSByb3VuZG9mZiBpcyBkb25lIHdoZW4gZmx1c2hpbmcgdGhlIGlub2RlLCB0aGUKICAgICAgKiB0aW1lIG1heSBjaGFuZ2UgdW5leHBlY3RlZGx5IGJ5IG9uZSBzZWNvbmQhISEgKi8KQEAgLTYwMzAsOSArNjAxMyw5IEBACiAgICAgaWYgKGZuYW1lbmNtcChkaXJfbmFtZSwgZnVsbF9wYXRoLCBsZW4pID09IDApCiAgICAgewogCXAgPSBmdWxsX3BhdGggKyBsZW47Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCS8qCi0JICogTVNET1M6IHdoZW4gYSBmaWxlIGlzIGluIHRoZSByb290IGRpcmVjdG9yeSwgZGlyX25hbWUgd2lsbCBlbmQgaW4gYQorCSAqIE1TV0lOOiB3aGVuIGEgZmlsZSBpcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnksIGRpcl9uYW1lIHdpbGwgZW5kIGluIGEKIAkgKiBzbGFzaCwgc2luY2UgQzogYnkgaXRzZWxmIGRvZXMgbm90IGRlZmluZSBhIHNwZWNpZmljIGRpci4gSW4gdGhpcwogCSAqIGNhc2UgcCBtYXkgYWxyZWFkeSBiZSBjb3JyZWN0LiA8bmVncmk+CiAJICovCkBAIC02MDQ3LDcgKzYwMzAsNyBAQAogI2VuZGlmCiAJfQogICAgIH0KLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAgICAgLyoKICAgICAgKiBXaGVuIHVzaW5nIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkcml2ZSwgcmVtb3ZlIHRoZSBkcml2ZSBuYW1lOgogICAgICAqICJBOlxkaXJcZmlsZSIgLT4gIlxkaXJcZmlsZSIuICBUaGlzIGhlbHBzIHdoZW4gbW92aW5nIGEgc2Vzc2lvbiBmaWxlIG9uCkBAIC02MTYzLDEyICs2MTQ2LDcgQEAKICAgICBjaGFyX3UgKmV4dCwKICAgICBpbnQJICAgIHByZXBlbmRfZG90KQkvKiBtYXkgcHJlcGVuZCBhICcuJyB0byBmaWxlIG5hbWUgKi8KIHsKLSAgICByZXR1cm4gYnVmX21vZG5hbWUoCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkJCVRSVUUsCi0jZWxzZQotCQkJKGN1cmJ1Zi0+Yl9wX3NuIHx8IGN1cmJ1Zi0+Yl9zaG9ydG5hbWUpLAotI2VuZGlmCisgICAgcmV0dXJuIGJ1Zl9tb2RuYW1lKChjdXJidWYtPmJfcF9zbiB8fCBjdXJidWYtPmJfc2hvcnRuYW1lKSwKIAkJCQkJCSAgICAgZm5hbWUsIGV4dCwgcHJlcGVuZF9kb3QpOwogfQogCkBAIC02MjA3LDkgKzYxODUsNyBAQAogCSAgICByZXR2YWxbZm5hbWVsZW4rK10gPSBQQVRIU0VQOwogCSAgICByZXR2YWxbZm5hbWVsZW5dID0gTlVMOwogCX0KLSNpZm5kZWYgU0hPUlRfRk5BTUUKIAlwcmVwZW5kX2RvdCA9IEZBTFNFOwkgICAgLyogbm90aGluZyB0byBwcmVwZW5kIGEgZG90IHRvICovCi0jZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTYyMzUsOSArNjIxMSw3IEBACiAjaWZkZWYgVVNFX0xPTkdfRk5BTUUKIAkJICAgICYmICghVVNFX0xPTkdfRk5BTUUgfHwgc2hvcnRuYW1lKQogI2Vsc2UKLSMgaWZuZGVmIFNIT1JUX0ZOQU1FCiAJCSAgICAmJiBzaG9ydG5hbWUKLSMgZW5kaWYKICNlbmRpZgogCQkJCQkJCQkpCiAJICAgIGlmICgqcHRyID09ICcuJykJLyogcmVwbGFjZSAnLicgYnkgJ18nICovCkBAIC02MjUwLDEwICs2MjI0LDggQEAKICAgICB9CiAKICAgICAvKiB0aGUgZmlsZSBuYW1lIGhhcyBhdCBtb3N0IEJBU0VOQU1FTEVOIGNoYXJhY3RlcnMuICovCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgaWYgKFNUUkxFTihwdHIpID4gKHVuc2lnbmVkKUJBU0VOQU1FTEVOKQogCXB0cltCQVNFTkFNRUxFTl0gPSAnXDAnOwotI2VuZGlmCiAKICAgICBzID0gcHRyICsgU1RSTEVOKHB0cik7CiAKQEAgLTYyNjMsOSArNjIzNSw3IEBACiAjaWZkZWYgVVNFX0xPTkdfRk5BTUUKICAgICBpZiAoIVVTRV9MT05HX0ZOQU1FIHx8IHNob3J0bmFtZSkKICNlbHNlCi0jIGlmbmRlZiBTSE9SVF9GTkFNRQogICAgIGlmIChzaG9ydG5hbWUpCi0jIGVuZGlmCiAjZW5kaWYKICAgICB7CiAJLyoKQEAgLTYzMjAsNyArNjI5MCw2IEBACiAgICAgICovCiAgICAgU1RSQ1BZKHMsIGV4dCk7CiAKLSNpZm5kZWYgU0hPUlRfRk5BTUUKICAgICAvKgogICAgICAqIFByZXBlbmQgdGhlIGRvdC4KICAgICAgKi8KQEAgLTYzMzMsNyArNjMwMiw2IEBACiAJU1RSTU9WRShlICsgMSwgZSk7CiAJKmUgPSAnLic7CiAgICAgfQotI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIHRoYXQsIGFmdGVyIGFwcGVuZGluZyB0aGUgZXh0ZW5zaW9uLCB0aGUgZmlsZSBuYW1lIGlzIHJlYWxseQpkaWZmIC0tZ2l0IGEvc3JjL2dldGNoYXIuYyBiL3NyYy9nZXRjaGFyLmMKaW5kZXggMDM0NzUxNC4uNGEyMjVlMSAxMDA2NDQKLS0tIGEvc3JjL2dldGNoYXIuYworKysgYi9zcmMvZ2V0Y2hhci5jCkBAIC0xNjc3LDE1ICsxNjc3LDYgQEAKIAkJYyA9IENTSTsKICNlbmRpZgogCX0KLSNpZmRlZiBNU0RPUwotCS8qCi0JICogSWYgS19OVUwgd2FzIHR5cGVkLCBpdCBpcyByZXBsYWNlZCBieSBLX05VTCwgMyBpbiBtY2hfaW5jaGFyKCkuCi0JICogRGVsZXRlIHRoZSAzIGhlcmUuCi0JICovCi0JZWxzZSBpZiAoYyA9PSBLX05VTCAmJiB2cGVla2MoKSA9PSAzKQotCSAgICAodm9pZCl2Z2V0b3JwZWVrKFRSVUUpOwotI2VuZGlmCi0KIAkvKiBhIGtleXBhZCBvciBzcGVjaWFsIGZ1bmN0aW9uIGtleSB3YXMgbm90IG1hcHBlZCwgdXNlIGl0IGxpa2UKIAkgKiBpdHMgQVNDSUkgZXF1aXZhbGVudCAqLwogCXN3aXRjaCAoYykKQEAgLTUyNDEsNyArNTIzMiw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTUFDT1MpCisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNQUNPUykKIAogI2RlZmluZSBWSVNfU0VMCShWSVNVQUwrU0VMRUNUTU9ERSkJLyogYWJicmV2aWF0aW9uICovCiAKQEAgLTUyNTQsNyArNTI0NSw3IEBACiAgICAgaW50CQltb2RlOwogfSBpbml0bWFwcGluZ3NbXSA9CiB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCS8qIFVzZSB0aGUgV2luZG93cyAoQ1VBKSBrZXliaW5kaW5ncy4gKi8KICMgaWZkZWYgRkVBVF9HVUkKIAkvKiBwYXN0ZSwgY29weSBhbmQgY3V0ICovCkBAIC01Mjc0LDE3ICs1MjY1LDYgQEAKIAogCS8qIHBhc3RlLCBjb3B5IGFuZCBjdXQgKi8KICMgIGlmZGVmIEZFQVRfQ0xJUEJPQVJECi0jICAgaWZkZWYgREpHUFAKLQl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcIipQIiwgTk9STUFMfSwJICAgIC8qIFNISUZULUluc2VydCBpcyAiKlAgKi8KLQl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcIi1kXCIqUCIsIFZJU19TRUx9LCAgIC8qIFNISUZULUluc2VydCBpcyAiLWQiKlAgKi8KLQl7KGNoYXJfdSAqKSJcMzE2XDEyMiBcMDIyXDAxNyoiLCBJTlNFUlR9LCAgLyogU0hJRlQtSW5zZXJ0IGlzIF5SXk8qICovCi0JeyhjaGFyX3UgKikiXDMxNlwyMjIgXCIqeSIsIFZJU19TRUx9LAkgICAgLyogQ1RSTC1JbnNlcnQgaXMgIip5ICovCi0jICAgIGlmIDAgLyogU2hpZnQtRGVsIHByb2R1Y2VzIHRoZSBzYW1lIGNvZGUgYXMgRGVsICovCi0JeyhjaGFyX3UgKikiXDMxNlwxMjMgXCIqZCIsIFZJU19TRUx9LAkgICAgLyogU0hJRlQtRGVsIGlzICIqZCAqLwotIyAgICBlbmRpZgotCXsoY2hhcl91ICopIlwzMTZcMjIzIFwiKmQiLCBWSVNfU0VMfSwJICAgIC8qIENUUkwtRGVsIGlzICIqZCAqLwotCXsoY2hhcl91ICopIlwwMzAgXCItZCIsIFZJU19TRUx9LAkgICAgLyogQ1RSTC1YIGlzICItZCAqLwotIyAgIGVsc2UKIAl7KGNoYXJfdSAqKSJcMzE2XDMyNCBcIipQIiwgTk9STUFMfSwJICAgIC8qIFNISUZULUluc2VydCBpcyAiKlAgKi8KIAl7KGNoYXJfdSAqKSJcMzE2XDMyNCBcIi1kXCIqUCIsIFZJU19TRUx9LCAgIC8qIFNISUZULUluc2VydCBpcyAiLWQiKlAgKi8KIAl7KGNoYXJfdSAqKSJcMzE2XDMyNCBcMDIyXDAxNyoiLCBJTlNFUlR9LCAgLyogU0hJRlQtSW5zZXJ0IGlzIF5SXk8qICovCkBAIC01MjkyLDcgKzUyNzIsNiBAQAogCXsoY2hhcl91ICopIlwzMTZcMzI3IFwiKmQiLCBWSVNfU0VMfSwJICAgIC8qIFNISUZULURlbCBpcyAiKmQgKi8KIAl7KGNoYXJfdSAqKSJcMzE2XDMzMCBcIipkIiwgVklTX1NFTH0sCSAgICAvKiBDVFJMLURlbCBpcyAiKmQgKi8KIAl7KGNoYXJfdSAqKSJcMDMwIFwiLWQiLCBWSVNfU0VMfSwJICAgIC8qIENUUkwtWCBpcyAiLWQgKi8KLSMgICBlbmRpZgogIyAgZWxzZQogCXsoY2hhcl91ICopIlwzMTZcMzI0IFAiLCBOT1JNQUx9LAkgICAgLyogU0hJRlQtSW5zZXJ0IGlzIFAgKi8KIAl7KGNoYXJfdSAqKSJcMzE2XDMyNCBcIi1kUCIsIFZJU19TRUx9LAkgICAgLyogU0hJRlQtSW5zZXJ0IGlzICItZFAgKi8KQEAgLTUzMjUsNyArNTMwNCw3IEBACiAgICAgdm9pZAogaW5pdF9tYXBwaW5ncyh2b2lkKQogewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8ZGVmaW5lZChNQUNPUykKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fGRlZmluZWQoTUFDT1MpCiAgICAgaW50CQlpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihpbml0bWFwcGluZ3MpIC8gc2l6ZW9mKHN0cnVjdCBpbml0bWFwKSk7ICsraSkKQEAgLTUzMzMsOCArNTMxMiw3IEBACiAjZW5kaWYKIH0KIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIFwKLQl8fCBkZWZpbmVkKEZFQVRfQ01EV0lOKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFBST1RPKQorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoRkVBVF9DTURXSU4pIHx8IGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoUFJPVE8pCiAvKgogICogQWRkIGEgbWFwcGluZyAibWFwIiBmb3IgbW9kZSAibW9kZSIuCiAgKiBOZWVkIHRvIHB1dCBzdHJpbmcgaW4gYWxsb2NhdGVkIG1lbW9yeSwgYmVjYXVzZSBkb19tYXAoKSB3aWxsIG1vZGlmeSBpdC4KZGlmZiAtLWdpdCBhL3NyYy9nbG9iYWxzLmggYi9zcmMvZ2xvYmFscy5oCmluZGV4IGI0M2YxYTIuLjZmZDg2ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9nbG9iYWxzLmgKKysrIGIvc3JjL2dsb2JhbHMuaApAQCAtMTksNyArMTksNyBAQAogICovCiBFWFRFUk4gbG9uZwlSb3dzCQkJLyogbnIgb2Ygcm93cyBpbiB0aGUgc2NyZWVuICovCiAjaWZkZWYgRE9fSU5JVAotIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisjIGlmIGRlZmluZWQoV0lOMzI2NCkKIAkJCSAgICA9IDI1TAogIyBlbHNlCiAJCQkgICAgPSAyNEwKQEAgLTk0OCw5ICs5NDgsNiBAQAogI2VuZGlmCiAKIEVYVEVSTiBpbnQJbm9fYWJiciBJTklUKD0gVFJVRSk7CS8qIFRSVUUgd2hlbiBubyBhYmJyZXZpYXRpb25zIGxvYWRlZCAqLwotI2lmZGVmIE1TRE9TCi1FWFRFUk4gaW50CWJlZXBfY291bnQgSU5JVCg9IDApOwkvKiBuciBvZiBiZWVwcyBzaW5jZSBsYXN0IGNoYXIgdHlwZWQgKi8KLSNlbmRpZgogCiAjaWZkZWYgVVNFX0VYRV9OQU1FCiBFWFRFUk4gY2hhcl91CSpleGVfbmFtZTsJCS8qIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlICovCmRpZmYgLS1naXQgYS9zcmMvbWFjcm9zLmggYi9zcmMvbWFjcm9zLmgKaW5kZXggMDEyZGVmNi4uZmZjMjlmMCAxMDA2NDQKLS0tIGEvc3JjL21hY3Jvcy5oCisrKyBiL3NyYy9tYWNyb3MuaApAQCAtMjI2LDcgKzIyNiw3IEBACiAjaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgIC8qIG9wZW4gaW4gcnctLS0tLS0tIG1vZGUgKi8KICMgZGVmaW5lIG1jaF9vcGVuX3J3KG4sIGYpCW1jaF9vcGVuKChuKSwgKGYpLCAobW9kZV90KTA2MDApCiAjZWxzZQotIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSAgLyogb3BlbiByZWFkL3dyaXRlICovCisjIGlmIGRlZmluZWQoTVNXSU4pICAvKiBvcGVuIHJlYWQvd3JpdGUgKi8KICMgIGRlZmluZSBtY2hfb3Blbl9ydyhuLCBmKQltY2hfb3BlbigobiksIChmKSwgU19JUkVBRCB8IFNfSVdSSVRFKQogIyBlbHNlCiAjICBkZWZpbmUgbWNoX29wZW5fcncobiwgZikJbWNoX29wZW4oKG4pLCAoZiksIDApCmRpZmYgLS1naXQgYS9zcmMvbWFpbi5jIGIvc3JjL21haW4uYwppbmRleCBmMTllYTFkLi5hYzRjN2E2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi5jCisrKyBiL3NyYy9tYWluLmMKQEAgLTEwLDEwICsxMCw2IEBACiAjZGVmaW5lIEVYVEVSTgogI2luY2x1ZGUgInZpbS5oIgogCi0jaWZkZWYgU1BBV05PCi0jIGluY2x1ZGUgPHNwYXduby5oPgkJLyogc3BlY2lhbCBNUy1ET1Mgc3dhcHBpbmcgbGlicmFyeSAqLwotI2VuZGlmCi0KICNpZmRlZiBfX0NZR1dJTl9fCiAjIGlmbmRlZiBXSU4zMgogIyAgaW5jbHVkZSA8Y3lnd2luL3ZlcnNpb24uaD4KQEAgLTUwNSw4ICs1MDEsNyBAQAogCiAgICAgLyoKICAgICAgKiBtY2hfaW5pdCgpIHNldHMgdXAgdGhlIHRlcm1pbmFsICh3aW5kb3cpIGZvciB1c2UuICBUaGlzIG11c3QgYmUKLSAgICAgKiBkb25lIGFmdGVyIHJlc2V0dGluZyBmdWxsX3NjcmVlbiwgb3RoZXJ3aXNlIGl0IG1heSBtb3ZlIHRoZSBjdXJzb3IKLSAgICAgKiAoTVNET1MpLgorICAgICAqIGRvbmUgYWZ0ZXIgcmVzZXR0aW5nIGZ1bGxfc2NyZWVuLCBvdGhlcndpc2UgaXQgbWF5IG1vdmUgdGhlIGN1cnNvci4KICAgICAgKiBOb3RlIHRoYXQgd2UgbWF5IHVzZSBtY2hfZXhpdCgpIGJlZm9yZSBtY2hfaW5pdCgpIQogICAgICAqLwogICAgIG1jaF9pbml0KCk7CkBAIC03MTAsMTAgKzcwNSw2IEBACiAgICAgfQogI2VuZGlmCiAKLSNpZmRlZiBTUEFXTk8JCS8qIHNwZWNpYWwgTVNET1Mgc3dhcHBpbmcgbGlicmFyeSAqLwotICAgIGluaXRfU1BBV05PKCIiLCBTV0FQX0FOWSk7Ci0jZW5kaWYKLQogI2lmZGVmIEZFQVRfVklNSU5GTwogICAgIC8qCiAgICAgICogUmVhZCBpbiByZWdpc3RlcnMsIGhpc3RvcnkgZXRjLCBidXQgbm90IG1hcmtzLCBmcm9tIHRoZSB2aW1pbmZvIGZpbGUuCmRpZmYgLS1naXQgYS9zcmMvbWJ5dGUuYyBiL3NyYy9tYnl0ZS5jCmluZGV4IGM1YjBiNTkuLjE2MDkyODQgMTAwNjQ0Ci0tLSBhL3NyYy9tYnl0ZS5jCisrKyBiL3NyYy9tYnl0ZS5jCkBAIC02MDA1LDcgKzYwMDUsNyBAQAogfQogCiAjaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChXSU4zMjY0KSBcCi0JfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChQUk9UTykKKwl8fCBkZWZpbmVkKFBST1RPKQogLyoKICAqIERvIGNvbnZlcnNpb24gb24gdHlwZWQgaW5wdXQgY2hhcmFjdGVycyBpbi1wbGFjZS4KICAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBub3QgTlVMIHRlcm1pbmF0ZWQhCmRpZmYgLS1naXQgYS9zcmMvbWVtZmlsZS5jIGIvc3JjL21lbWZpbGUuYwppbmRleCA1NjcxOWVlLi5mNmZkYThkIDEwMDY0NAotLS0gYS9zcmMvbWVtZmlsZS5jCisrKyBiL3NyYy9tZW1maWxlLmMKQEAgLTU0MSw3ICs1NDEsNyBAQAogewogICAgIGludAkJc3RhdHVzOwogICAgIGJoZHJfVAkqaHA7Ci0jaWYgZGVmaW5lZChTWU5DX0RVUF9DTE9TRSkgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChTWU5DX0RVUF9DTE9TRSkKICAgICBpbnQJCWZkOwogI2VuZGlmCiAgICAgaW50CQlnb3RfaW50X3NhdmUgPSBnb3RfaW50OwpAQCAtNjM1LDE4ICs2MzUsMTMgQEAKIAkJc3RhdHVzID0gRkFJTDsKIAl9CiAjZW5kaWYKLSNpZmRlZiBNU0RPUwotCWlmIChfZG9zX2NvbW1pdChtZnAtPm1mX2ZkKSkKLQkgICAgc3RhdHVzID0gRkFJTDsKLSNlbHNlCi0jIGlmZGVmIFNZTkNfRFVQX0NMT1NFCisjaWZkZWYgU1lOQ19EVVBfQ0xPU0UKIAkvKgogCSAqIFdpbjMyIGlzIGEgYml0IG1vcmUgd29yazogRHVwbGljYXRlIHRoZSBmaWxlIGhhbmRsZSBhbmQgY2xvc2UgaXQuCiAJICogVGhpcyBzaG91bGQgZmx1c2ggdGhlIGZpbGUgdG8gZGlzay4KIAkgKi8KIAlpZiAoKGZkID0gZHVwKG1mcC0+bWZfZmQpKSA+PSAwKQogCSAgICBjbG9zZShmZCk7Ci0jIGVuZGlmCiAjZW5kaWYKICNpZmRlZiBBTUlHQQogIyBpZiBkZWZpbmVkKF9fQVJPU19fKSB8fCBkZWZpbmVkKF9fYW1pZ2FvczRfXykKQEAgLTEyNjMsNyArMTI1OCw3IEBACiAgICAgICogZm5hbWUgY2Fubm90IGJlIE5hbWVCdWZmLCBiZWNhdXNlIGl0IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KICAgICAgKi8KICAgICBtZl9zZXRfZmZuYW1lKG1mcCk7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogICAgIC8qCiAgICAgICogQSAiOiFjZCBlOnh4eCIgbWF5IGNoYW5nZSB0aGUgZGlyZWN0b3J5IHdpdGhvdXQgdXMga25vd2luZywgdXNlIHRoZQogICAgICAqIGZ1bGwgcGF0aG5hbWUgYWx3YXlzLiAgQ2FyZWZ1bDogVGhpcyBmcmVlcyBmbmFtZSEKZGlmZiAtLWdpdCBhL3NyYy9tZW1saW5lLmMgYi9zcmMvbWVtbGluZS5jCmluZGV4IDFjYjFiYjAuLjE3MDYyODIgMTAwNjQ0Ci0tLSBhL3NyYy9tZW1saW5lLmMKKysrIGIvc3JjL21lbWxpbmUuYwpAQCAtMzI2LDEzICszMjYsNiBAQAogICAgIGN1cndpbi0+d19ucndpZHRoX2xpbmVfY291bnQgPSAwOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChESkdQUCkKLSAgICAvKiBmb3IgMTYgYml0IE1TLURPUyBjcmVhdGUgYSBzd2FwZmlsZSBub3csIGJlY2F1c2Ugd2UgcnVuIG91dCBvZgotICAgICAqIG1lbW9yeSB2ZXJ5IHF1aWNrbHkgKi8KLSAgICBpZiAocF91YyAhPSAwKQotCW1sX29wZW5fZmlsZShidWYpOwotI2VuZGlmCi0KIC8qCiAgKiBmaWxsIGJsb2NrMCBzdHJ1Y3QgYW5kIHdyaXRlIHBhZ2UgMAogICovCkBAIC02NDEsNyArNjM0LDcgQEAKICAgICBtZW1maWxlX1QJKm1mcDsKICAgICBjaGFyX3UJKmZuYW1lOwogICAgIGNoYXJfdQkqZGlycDsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAgICAgY2hhcl91CSpwOwogI2VuZGlmCiAKQEAgLTY3Miw3ICs2NjUsNyBAQAogCWlmIChmbmFtZSA9PSBOVUxMKQkgICAgLyogbm8gZmlsZSBuYW1lIGZvdW5kIGZvciB0aGlzIGRpciAqLwogCSAgICBjb250aW51ZTsKIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkvKgogCSAqIFNldCBmdWxsIHBhdGhuYW1lIGZvciBzd2FwIGZpbGUgbm93LCBiZWNhdXNlIGEgIjohY2QgZGlyIiBtYXkKIAkgKiBjaGFuZ2UgZGlyZWN0b3J5IHdpdGhvdXQgdXMga25vd2luZyBpdC4KQEAgLTcwNCw3ICs2OTcsNyBAQAogCSAgICB2aW1fZnJlZShtZnAtPm1mX2ZuYW1lKTsKIAkgICAgbWZwLT5tZl9mbmFtZSA9IGZuYW1lOwogCSAgICB2aW1fZnJlZShtZnAtPm1mX2ZmbmFtZSk7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCSAgICBtZnAtPm1mX2ZmbmFtZSA9IE5VTEw7ICAvKiBtZl9mbmFtZSBpcyBmdWxsIHBhdGhuYW1lIGFscmVhZHkgKi8KICNlbHNlCiAJICAgIG1mX3NldF9mZm5hbWUobWZwKTsKQEAgLTc5Nyw3ICs3OTAsNyBAQAogCSAgICBjb250aW51ZTsKIAlpZiAobWZfb3Blbl9maWxlKG1mcCwgZm5hbWUpID09IE9LKQkvKiBjb25zdW1lcyBmbmFtZSEgKi8KIAl7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCSAgICAvKgogCSAgICAgKiBzZXQgZnVsbCBwYXRobmFtZSBmb3Igc3dhcCBmaWxlIG5vdywgYmVjYXVzZSBhICI6IWNkIGRpciIgbWF5CiAJICAgICAqIGNoYW5nZSBkaXJlY3Rvcnkgd2l0aG91dCB1cyBrbm93aW5nIGl0LgpAQCAtOTg2LDcgKzk3OSw3IEBACiAJYjBwLT5iMF9mbmFtZVswXSA9IE5VTDsKICAgICBlbHNlCiAgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoQU1JR0EpCisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChBTUlHQSkKIAkvKiBTeXN0ZW1zIHRoYXQgY2Fubm90IHRyYW5zbGF0ZSAifnVzZXIiIGJhY2sgaW50byBhIHBhdGg6IGNvcHkgdGhlCiAJICogZmlsZSBuYW1lIHVubW9kaWZpZWQuICBEbyB1c2Ugc2xhc2hlcyBpbnN0ZWFkIG9mIGJhY2tzbGFzaGVzIGZvcgogCSAqIHBvcnRhYmlsaXR5LiAqLwpAQCAtMTI4MCw3ICsxMjczLDcgQEAKICAgICB7CiAJbXNnX3N0YXJ0KCk7CiAJbXNnX291dHRyYW5zX2F0dHIobWZwLT5tZl9mbmFtZSwgYXR0ciB8IE1TR19ISVNUKTsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJaWYgKFNUUk5DTVAoYjBwLT5iMF9obmFtZSwgIlBDICIsIDMpID09IDApCiAJICAgIE1TR19QVVRTX0FUVFIoXygiIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbS5cbiIpLAogCQkJCQkJCSAgICAgYXR0ciB8IE1TR19ISVNUKTsKQEAgLTIxNDcsNyArMjE0MCw3IEBACiAKIAkJaWYgKGIwX21hZ2ljX3dyb25nKCZiMCkpCiAJCXsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCSAgICBpZiAoU1RSTkNNUChiMC5iMF9obmFtZSwgIlBDICIsIDMpID09IDApCiAJCQlNU0dfUFVUUyhfKCJcbiAgICAgICAgIFtub3QgdXNhYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIFZpbV0iKSk7CiAJCSAgICBlbHNlCkBAIC0yMTcyLDEzICsyMTY1LDYgQEAKIHsKICAgICBpbnQJCW51bV9uYW1lczsKIAotI2lmZGVmIFNIT1JUX0ZOQU1FCi0gICAgLyoKLSAgICAgKiAoTVMtRE9TKSBhbHdheXMgc2hvcnQgbmFtZXMKLSAgICAgKi8KLSAgICBuYW1lc1swXSA9IG1vZG5hbWUocGF0aCwgKGNoYXJfdSAqKSIuc3c/IiwgRkFMU0UpOwotICAgIG51bV9uYW1lcyA9IDE7Ci0jZWxzZSAvKiAhU0hPUlRfRk5BTUUgKi8KICAgICAvKgogICAgICAqIChXaW4zMiBhbmQgV2luNjQpIG5ldmVyIHNob3J0IG5hbWVzLCBidXQgZG8gcHJlcGVuZCBhIGRvdC4KICAgICAgKiAoTm90IE1TLURPUyBvciBXaW4zMiBvciBXaW42NCkgbWF5YmUgc2hvcnQgbmFtZSwgbWF5YmUgbm90OiBUcnkgYm90aC4KQEAgLTIyNjIsOCArMjI0OCw2IEBACiAgICAgY3VyYnVmLT5iX3Nob3J0bmFtZSA9IHNob3J0bmFtZTsKICMgZW5kaWYKIAotI2VuZGlmIC8qICFTSE9SVF9GTkFNRSAqLwotCiAgICAgcmV0dXJuIG51bV9uYW1lczsKIH0KIApAQCAtMzk1MywxMSArMzkzNyw3IEBACiAjZW5kaWYKIAogICAgIHIgPSBidWZfbW9kbmFtZSgKLSNpZmRlZiBTSE9SVF9GTkFNRQotCSAgICBUUlVFLAotI2Vsc2UKIAkgICAgKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAotI2VuZGlmCiAJICAgIGZuYW1lX3JlcywKIAkgICAgKGNoYXJfdSAqKQogI2lmIGRlZmluZWQoVk1TKQpAQCAtMzk2NSwxMyArMzk0NSw4IEBACiAjZWxzZQogCSAgICAiLnN3cCIsCiAjZW5kaWYKLSNpZmRlZiBTSE9SVF9GTkFNRQkJLyogYWx3YXlzIDguMyBmaWxlIG5hbWUgKi8KLQkgICAgRkFMU0UKLSNlbHNlCiAJICAgIC8qIFByZXBlbmQgYSAnLicgdG8gdGhlIHN3YXAgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuICovCi0JICAgIGRpcl9uYW1lWzBdID09ICcuJyAmJiBkaXJfbmFtZVsxXSA9PSBOVUwKLSNlbmRpZgotCSAgICAgICApOworCSAgICBkaXJfbmFtZVswXSA9PSAnLicgJiYgZGlyX25hbWVbMV0gPT0gTlVMKTsKICAgICBpZiAociA9PSBOVUxMKQkgICAgLyogb3V0IG9mIG1lbW9yeSAqLwogCXJldHVybiBOVUxMOwogCkBAIC00MTUyLDEyICs0MTI3LDEwIEBACiAjaWZkZWYgQU1JR0EKICAgICBCUFRSCWZoOwogI2VuZGlmCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgaW50CQlyOwotI2VuZGlmCiAgICAgY2hhcl91CSpidWZfZm5hbWUgPSBidWYtPmJfZm5hbWU7CiAKLSNpZiAhZGVmaW5lZChTSE9SVF9GTkFNRSkgJiYgIWRlZmluZWQoVU5JWCkKKyNpZiAhZGVmaW5lZChVTklYKQogIyBkZWZpbmUgQ1JFQVRFX0RVTU1ZX0ZJTEUKICAgICBGSUxFCSpkdW1teWZkID0gTlVMTDsKIApAQCAtNDIxNyw3ICs0MTkwLDcgQEAKIAkgICAgZm5hbWUgPSBOVUxMOwogCSAgICBicmVhazsKIAl9Ci0jaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChTSE9SVF9GTkFNRSkKKyNpZiBkZWZpbmVkKFVOSVgpCiAvKgogICogU29tZSBzeXN0ZW1zIGhhdmUgYSBNUy1ET1MgY29tcGF0aWJsZSBmaWxlc3lzdGVtIHRoYXQgdXNlIDguMyBjaGFyYWN0ZXIKICAqIGZpbGUgbmFtZXMuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRyeSBhbmQgdGhlIHN3YXAgZmlsZSBuYW1lIGRvZXMgbm90IGZpdCBpbgpAQCAtNDM1Niw3ICs0MzI5LDYgQEAKIAkgKi8KIAlpZiAoZm5hbWVbbiAtIDJdID09ICd3JyAmJiBmbmFtZVtuIC0gMV0gPT0gJ3AnKQkvKiBmaXJzdCB0cnkgKi8KIAl7Ci0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAJICAgIC8qCiAJICAgICAqIG9uIE1TLURPUyBjb21wYXRpYmxlIGZpbGVzeXN0ZW1zIChlLmcuIG1lc3N5ZG9zKSBmaWxlLmRvYy5zd3AKIAkgICAgICogYW5kIGZpbGUuZG9jIGFyZSB0aGUgc2FtZSBmaWxlLiBUbyBndWVzcyBpZiB0aGlzIHByb2JsZW0gaXMKQEAgLTQzNzksNyArNDM1MSw2IEBACiAJCSAgICBjb250aW51ZTsJICAgIC8qIHRyeSBhZ2FpbiB3aXRoICcuJyByZXBsYWNlZCB3aXRoICdfJyAqLwogCQl9CiAJICAgIH0KLSNlbmRpZgogCSAgICAvKgogCSAgICAgKiBJZiB3ZSBnZXQgaGVyZSB0aGUgIi5zd3AiIGZpbGUgcmVhbGx5IGV4aXN0cy4KIAkgICAgICogR2l2ZSBhbiBlcnJvciBtZXNzYWdlLCB1bmxlc3MgcmVjb3ZlcmluZywgbm8gZmlsZSBuYW1lLCB3ZSBhcmUKZGlmZiAtLWdpdCBhL3NyYy9taXNjMS5jIGIvc3JjL21pc2MxLmMKaW5kZXggY2I0NWE3Mi4uMjdjYTgzZSAxMDA2NDQKLS0tIGEvc3JjL21pc2MxLmMKKysrIGIvc3JjL21pc2MxLmMKQEAgLTM2NzYsMjggKzM2NzYsOSBAQAogCQkgICAgJiYgIShndWkuaW5fdXNlICYmIGd1aS5zdGFydGluZykKICNlbmRpZgogCQkgICAgKQotCSAgICB7CiAJCW91dF9zdHIoVF9WQik7Ci0JICAgIH0KIAkgICAgZWxzZQotCSAgICB7Ci0jaWZkZWYgTVNET1MKLQkJLyoKLQkJICogVGhlIG51bWJlciBvZiBiZWVwcyBvdXRwdXR0ZWQgaXMgcmVkdWNlZCB0byBhdm9pZCBoYXZpbmcgdG8KLQkJICogd2FpdCBmb3IgYWxsIHRoZSBiZWVwcyB0byBmaW5pc2guIFRoaXMgaXMgb25seSBhIHByb2JsZW0gb24KLQkJICogc3lzdGVtcyB3aGVyZSB0aGUgYmVlcHMgZG9uJ3Qgb3ZlcmxhcC4KLQkJICovCi0JCWlmIChiZWVwX2NvdW50ID09IDAgfHwgYmVlcF9jb3VudCA9PSAxMCkKLQkJewotCQkgICAgb3V0X2NoYXIoQkVMTCk7Ci0JCSAgICBiZWVwX2NvdW50ID0gMTsKLQkJfQotCQllbHNlCi0JCSAgICArK2JlZXBfY291bnQ7Ci0jZWxzZQogCQlvdXRfY2hhcihCRUxMKTsKLSNlbmRpZgotCSAgICB9CiAJfQogCiAJLyogV2hlbiAndmVyYm9zZScgaXMgc2V0IGFuZCB3ZSBhcmUgc291cmNpbmcgYSBzY3JpcHQgb3IgZXhlY3V0aW5nIGEKQEAgLTM4MTEsNyArMzc5Miw3IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKICAgICAvKgogICAgICAqIERlZmF1bHQgaG9tZSBkaXIgaXMgQzovCiAgICAgICogQmVzdCBhc3N1bXB0aW9uIHdlIGNhbiBtYWtlIGluIHN1Y2ggYSBzaXR1YXRpb24uCkBAIC0zOTQ3LDcgKzM5MjgsNyBAQAogCQkgICAgJiYgYXRfc3RhcnQKICNlbmRpZgogCSAgICkKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCXx8ICpzcmMgPT0gJyUnCiAjZW5kaWYKIAkJfHwgKCpzcmMgPT0gJ34nICYmIGF0X3N0YXJ0KSkKQEAgLTM5NzYsNyArMzk1Nyw3IEBACiAjZW5kaWYKIAkJewogCQkgICAgd2hpbGUgKGMtLSA+IDAgJiYgKnRhaWwgIT0gTlVMICYmICgodmltX2lzSURjKCp0YWlsKSkKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCQkgICAgfHwgKCpzcmMgPT0gJyUnICYmICp0YWlsICE9ICclJykKICNlbmRpZgogCQkJICAgICkpCkBAIC0zOTg1LDcgKzM5NjYsNyBAQAogCQkgICAgfQogCQl9CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFVOSVgpCisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChVTklYKQogIyBpZmRlZiBVTklYCiAJCWlmIChzcmNbMV0gPT0gJ3snICYmICp0YWlsICE9ICd9JykKICMgZWxzZQpAQCAtNDAwMyw3ICszOTg0LDcgQEAKICNlbmRpZgogCQkgICAgKnZhciA9IE5VTDsKIAkJICAgIHZhciA9IHZpbV9nZXRlbnYoZHN0LCAmbXVzdGZyZWUpOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoVU5JWCkKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFVOSVgpCiAJCX0KICNlbmRpZgogCSAgICB9CkBAIC00MTk0LDcgKzQxNzUsNyBAQAogICAgIGNoYXJfdQkqcGVuZDsKICAgICBpbnQJCXZpbXJ1bnRpbWU7CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAgICAgLyogdXNlICJDOi8iIHdoZW4gJEhPTUUgaXMgbm90IHNldCAqLwogICAgIGlmIChTVFJDTVAobmFtZSwgIkhPTUUiKSA9PSAwKQogCXJldHVybiBob21lZGlyOwpAQCAtNDkzMiw3ICs0OTEzLDcgQEAKIHsKICAgICBjaGFyX3UgICpyZXR2YWw7CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAgICAgLyogbWF5IHNraXAgImM6IiAqLwogICAgIGlmIChpc2FscGhhKHBhdGhbMF0pICYmIHBhdGhbMV0gPT0gJzonKQogCXJldHZhbCA9IHBhdGggKyAyOwpAQCAtOTczNCwxMyArOTcxNSwxMyBAQAogc3RhdGljIGludCBleHBhbmRfYmFja3RpY2soZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpwYXQsIGludCBmbGFncyk7CiAjIGVuZGlmCiAKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorIyBpZiBkZWZpbmVkKFdJTjMyNjQpCiAvKgogICogRmlsZSBuYW1lIGV4cGFuc2lvbiBjb2RlIGZvciBNUy1ET1MsIFdpbjE2IGFuZCBXaW4zMi4gIEl0J3MgaGVyZSBiZWNhdXNlCiAgKiBpdCdzIHNoYXJlZCBiZXR3ZWVuIHRoZXNlIHN5c3RlbXMuCiAgKi8KLSMgaWYgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChQUk9UTykKLSMgIGRlZmluZSBfY2RlY2wJICAgIC8qIERKR1BQIGRvZXNuJ3QgaGF2ZSB0aGlzICovCisjIGlmIGRlZmluZWQoUFJPVE8pCisjICBkZWZpbmUgX2NkZWNsCiAjIGVsc2UKICMgIGlmZGVmIF9fQk9STEFORENfXwogIyAgIGRlZmluZSBfY2RlY2wgX1JUTEVOVFJZRgpAQCAtOTc2MiwxNCArOTc0Myw4IEBACiAgICAgY2hhcl91ICpkLAogICAgIGNoYXJfdSAqcykKIHsKLSMgIGlmZGVmIERKR1BQCi0gICAgaWYgKFVTRV9MT05HX0ZOQU1FKQkgICAgLyogZG9uJ3QgbG93ZXIgY2FzZSBvbiBXaW5kb3dzIDk1L05UIHN5c3RlbXMgKi8KLQl3aGlsZSAoKnMpCi0JICAgICpkKysgPSAqcysrOwotICAgIGVsc2UKLSMgIGVuZGlmCi0Jd2hpbGUgKCpzKQotCSAgICAqZCsrID0gVE9MT1dFUl9MT0MoKnMrKyk7CisgICAgd2hpbGUgKCpzKQorCSpkKysgPSBUT0xPV0VSX0xPQygqcysrKTsKICAgICAqZCA9IE5VTDsKIH0KICMgZW5kaWYKQEAgLTEwMDc4LDcgKzEwMDUzLDcgQEAKIHsKICAgICByZXR1cm4gZG9zX2V4cGFuZHBhdGgoZ2FwLCBwYXRoLCAwLCBmbGFncywgRkFMU0UpOwogfQotIyBlbmRpZiAvKiBNU0RPUyB8fCBXSU4zMjY0ICovCisjIGVuZGlmIC8qIFdJTjMyNjQgKi8KIAogI2lmIChkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKFZNUykpIHx8IGRlZmluZWQoVVNFX1VOSVhGSUxFTkFNRSkgXAogCXx8IGRlZmluZWQoUFJPVE8pCkBAIC0xMDQ0NCw3ICsxMDQxOSw3IEBACiAJaWYgKGdhX2dyb3coZ2FwLCAxKSA9PSBGQUlMKQogCSAgICBicmVhazsKIAotIyBpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorIyBpZiBkZWZpbmVkKE1TV0lOKQogCS8qIEF2b2lkIHRoZSBwYXRoIGVuZGluZyBpbiBhIGJhY2tzbGFzaCwgaXQgZmFpbHMgd2hlbiBhIGNvbW1hIGlzCiAJICogYXBwZW5kZWQuICovCiAJbGVuID0gKGludClTVFJMRU4oYnVmKTsKQEAgLTEwNDgyLDcgKzEwNDU3LDcgQEAKIAlpbnQgaiA9IDA7CiAKIAl3aGlsZSAoKGZuYW1lW2pdID09IHBhdGhfcGFydFtpXVtqXQotIyBpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorIyBpZiBkZWZpbmVkKE1TV0lOKQogCQl8fCAodmltX2lzcGF0aHNlcChmbmFtZVtqXSkgJiYgdmltX2lzcGF0aHNlcChwYXRoX3BhcnRbaV1bal0pKQogI2VuZGlmCiAJCQkgICAgICkgJiYgZm5hbWVbal0gIT0gTlVMICYmIHBhdGhfcGFydFtpXVtqXSAhPSBOVUwpCkBAIC0xMDYwMyw3ICsxMDU3OCw3IEBACiAJICAgICAqLwogCSAgICBzaG9ydF9uYW1lID0gc2hvcnRlbl9mbmFtZShwYXRoLCBjdXJkaXIpOwogCSAgICBpZiAoc2hvcnRfbmFtZSAhPSBOVUxMICYmIHNob3J0X25hbWUgPiBwYXRoICsgMQotI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChNU1dJTikKIAkJICAgIC8qIE9uIHdpbmRvd3MsCiAJCSAgICAgKgkgICAgc2hvcnRlbl9mbmFtZSgiYzpcYVxhLnR4dCIsICJjOlxhXGIiKQogCQkgICAgICogcmV0dXJucyAiXGFcYS50eHQiLCB3aGljaCBpcyBub3QgcmVhbGx5IHRoZSBzaG9ydApAQCAtMTA3NDMsNyArMTA3MTgsNyBAQAogCWlmICgqcCA9PSAnXFwnICYmIHBbMV0gIT0gTlVMKQogCSAgICArK3A7CiAJZWxzZSBpZiAodmltX3N0cmNocigoY2hhcl91ICopCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkJCSAgICAiJCUiCiAjZWxzZQogCQkJCSAgICAiJCIKZGlmZiAtLWdpdCBhL3NyYy9taXNjMi5jIGIvc3JjL21pc2MyLmMKaW5kZXggNzY2NWQyOS4uYzE1MTllZiAxMDA2NDQKLS0tIGEvc3JjL21pc2MyLmMKKysrIGIvc3JjL21pc2MyLmMKQEAgLTgwNSwxMiArODA1LDcgQEAKICAqIFNvbWUgbWVtb3J5IGlzIHJlc2VydmVkIGZvciBlcnJvciBtZXNzYWdlcyBhbmQgZm9yIGJlaW5nIGFibGUgdG8KICAqIGNhbGwgbWZfcmVsZWFzZV9hbGwoKSwgd2hpY2ggbmVlZHMgc29tZSBtZW1vcnkgZm9yIG1mX3RyYW5zX2FkZCgpLgogICovCi0jaWYgZGVmaW5lZChNU0RPUykgJiYgIWRlZmluZWQoREpHUFApCi0jIGRlZmluZSBTTUFMTF9NRU0KLSMgZGVmaW5lIEtFRVBfUk9PTSA4MTkyTAotI2Vsc2UKLSMgZGVmaW5lIEtFRVBfUk9PTSAoMiAqIDgxOTJMKQotI2VuZGlmCisjZGVmaW5lIEtFRVBfUk9PTSAoMiAqIDgxOTJMKQogI2RlZmluZSBLRUVQX1JPT01fS0IgKEtFRVBfUk9PTSAvIDEwMjRMKQogCiAvKgpAQCAtODkyLDcgKzg4Nyw3IEBACiAgICAgY2hhcl91CSpwOwkJICAgIC8qIHBvaW50ZXIgdG8gbmV3IHN0b3JhZ2Ugc3BhY2UgKi8KICAgICBzdGF0aWMgaW50CXJlbGVhc2luZyA9IEZBTFNFOyAgLyogZG9uJ3QgZG8gbWZfcmVsZWFzZV9hbGwoKSByZWN1cnNpdmUgKi8KICAgICBpbnQJCXRyeV9hZ2FpbjsKLSNpZiBkZWZpbmVkKEhBVkVfQVZBSUxfTUVNKSAmJiAhZGVmaW5lZChTTUFMTF9NRU0pCisjaWYgZGVmaW5lZChIQVZFX0FWQUlMX01FTSkKICAgICBzdGF0aWMgbG9uZ191IGFsbG9jYXRlZCA9IDA7ICAgIC8qIGFsbG9jYXRlZCBzaW5jZSBsYXN0IGF2YWlsIGNoZWNrICovCiAjZW5kaWYKIApAQCAtOTA5LDEyICs5MDQsNiBAQAogICAgIG1lbV9wcmVfYWxsb2NfbCgmc2l6ZSk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKERKR1BQKQotICAgIGlmIChzaXplID49IDB4ZmZmMCkJCS8qIGluIE1TRE9TIHdlIGNhbid0IGRlYWwgd2l0aCA+NjRLIGJsb2NrcyAqLwotCXAgPSBOVUxMOwotICAgIGVsc2UKLSNlbmRpZgotCiAgICAgLyoKICAgICAgKiBMb29wIHdoZW4gb3V0IG9mIG1lbW9yeTogVHJ5IHRvIHJlbGVhc2Ugc29tZSBtZW1maWxlIGJsb2NrcyBhbmQKICAgICAgKiBpZiBzb21lIGJsb2NrcyBhcmUgcmVsZWFzZWQgY2FsbCBtYWxsb2MgYWdhaW4uCkBAIC05MzQsMTQgKzkyMywxMyBAQAogCSAgICAvKiAxLiBObyBjaGVjayBmb3IgYXZhaWxhYmxlIG1lbW9yeTogSnVzdCByZXR1cm4uICovCiAJICAgIGdvdG8gdGhlZW5kOwogI2Vsc2UKLSMgaWZuZGVmIFNNQUxMX01FTQogCSAgICAvKiAyLiBTbG93IGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBjYWxsIG1jaF9hdmFpbF9tZW0oKSBhZnRlcgogCSAgICAgKiAgICBhbGxvY2F0aW5nIChLRUVQX1JPT00gLyAyKSBhbW91bnQgb2YgbWVtb3J5LiAqLwogCSAgICBhbGxvY2F0ZWQgKz0gc2l6ZTsKIAkgICAgaWYgKGFsbG9jYXRlZCA8IEtFRVBfUk9PTSAvIDIpCiAJCWdvdG8gdGhlZW5kOwogCSAgICBhbGxvY2F0ZWQgPSAwOwotIyBlbmRpZgorCiAJICAgIC8qIDMuIGNoZWNrIGZvciBhdmFpbGFibGUgbWVtb3J5OiBjYWxsIG1jaF9hdmFpbF9tZW0oKSAqLwogCSAgICBpZiAobWNoX2F2YWlsX21lbShUUlVFKSA8IEtFRVBfUk9PTV9LQiAmJiAhcmVsZWFzaW5nKQogCSAgICB7CkBAIC01NDUzLDcgKzU0NDEsNyBAQAogICAgIGlmICh2aW1faXNBYnNOYW1lKGZmX2ZpbGVfdG9fZmluZCkKIAkgICAgLyogIi4uIiwgIi4uL3BhdGgiLCAiLiIgYW5kICIuL3BhdGgiOiBkb24ndCB1c2UgdGhlIHBhdGhfb3B0aW9uICovCiAJICAgIHx8IHJlbF90b19jdXJkaXIKLSNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJICAgIC8qIGhhbmRsZSAiXHRtcCIgYXMgYWJzb2x1dGUgcGF0aCAqLwogCSAgICB8fCB2aW1faXNwYXRoc2VwKGZmX2ZpbGVfdG9fZmluZFswXSkKIAkgICAgLyogaGFuZGxlICJjOm5hbWUiIGFzIGFic29sdXRlIHBhdGggKi8KQEAgLTU1MDcsMTggKzU0OTUsMTAgQEAKIAkJYnVmID0gc3VmZml4ZXM7CiAJCWZvciAoOzspCiAJCXsKLQkJICAgIGlmICgKLSNpZmRlZiBESkdQUAotCQkJICAgIC8qICJDOiIgYnkgaXRzZWxmIHdpbGwgZmFpbCBmb3IgbWNoX2dldHBlcm0oKSwKLQkJCSAgICAgKiBhc3N1bWUgaXQncyBhbHdheXMgdmFsaWQuICovCi0JCQkgICAgKGZpbmRfd2hhdCAhPSBGSU5ERklMRV9GSUxFICYmIE5hbWVCdWZmWzBdICE9IE5VTAotCQkJCSAgJiYgTmFtZUJ1ZmZbMV0gPT0gJzonCi0JCQkJICAmJiBOYW1lQnVmZlsyXSA9PSBOVUwpIHx8Ci0jZW5kaWYKLQkJCSAgICAobWNoX2dldHBlcm0oTmFtZUJ1ZmYpID49IDAKKwkJICAgIGlmIChtY2hfZ2V0cGVybShOYW1lQnVmZikgPj0gMAogCQkJICAgICAmJiAoZmluZF93aGF0ID09IEZJTkRGSUxFX0JPVEgKIAkJCQkgfHwgKChmaW5kX3doYXQgPT0gRklOREZJTEVfRElSKQotCQkJCQkJICAgID09IG1jaF9pc2RpcihOYW1lQnVmZikpKSkpCisJCQkJCQkgICAgPT0gbWNoX2lzZGlyKE5hbWVCdWZmKSkpKQogCQkgICAgewogCQkJZmlsZV9uYW1lID0gdmltX3N0cnNhdmUoTmFtZUJ1ZmYpOwogCQkJZ290byB0aGVlbmQ7CmRpZmYgLS1naXQgYS9zcmMvbmV0YmVhbnMuYyBiL3NyYy9uZXRiZWFucy5jCmluZGV4IDA1MTQyYTguLmNhMDI3OGUgMTAwNjQ0Ci0tLSBhL3NyYy9uZXRiZWFucy5jCisrKyBiL3NyYy9uZXRiZWFucy5jCkBAIC0xNDMyLDcgKzE0MzIsNyBAQAogCQlpZiAoYnVmX3dhc19lbXB0eSkKIAkJewogCQkgICAgaWYgKGZmX2RldGVjdGVkID09IEVPTF9VTktOT1dOKQotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCWZmX2RldGVjdGVkID0gRU9MX0RPUzsKICNlbHNlCiAJCQlmZl9kZXRlY3RlZCA9IEVPTF9VTklYOwpkaWZmIC0tZ2l0IGEvc3JjL29wdGlvbi5jIGIvc3JjL29wdGlvbi5jCmluZGV4IDRmNzNjMGIuLmI2MjRhYWQgMTAwNjQ0Ci0tLSBhL3NyYy9vcHRpb24uYworKysgYi9zcmMvb3B0aW9uLmMKQEAgLTE1NSw5ICsxNTUsNyBAQAogI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKICMgZGVmaW5lIFBWX1NJCQlPUFRfQlVGKEJWX1NJKQogI2VuZGlmCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCi0jIGRlZmluZSBQVl9TTgkJT1BUX0JVRihCVl9TTikKLSNlbmRpZgorI2RlZmluZSBQVl9TTgkJT1BUX0JVRihCVl9TTikKICNpZmRlZiBGRUFUX1NZTl9ITAogIyBkZWZpbmUgUFZfU01DCQlPUFRfQlVGKEJWX1NNQykKICMgZGVmaW5lIFBWX1NZTgkJT1BUX0JVRihCVl9TWU4pCkBAIC0zNTIsOSArMzUwLDcgQEAKICNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCiBzdGF0aWMgaW50CXBfc2k7CiAjZW5kaWYKLSNpZm5kZWYgU0hPUlRfRk5BTUUKIHN0YXRpYyBpbnQJcF9zbjsKLSNlbmRpZgogc3RhdGljIGxvbmcJcF9zdHM7CiAjaWYgZGVmaW5lZChGRUFUX1NFQVJDSFBBVEgpCiBzdGF0aWMgY2hhcl91CSpwX3N1YTsKQEAgLTQ2NCw3ICs0NjAsNyBAQAogCiAvKiAnaXNwcmludCcgZm9yIGxhdGluMSBpcyBhbHNvIHVzZWQgZm9yIE1TLVdpbmRvd3MgY3AxMjUyLCB3aGVyZSAweDgwIGlzIHVzZWQKICAqIGZvciB0aGUgY3VycmVuY3kgc2lnbi4gKi8KLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAjIGRlZmluZSBJU1BfTEFUSU4xIChjaGFyX3UgKikiQCx+LTI1NSIKICNlbHNlCiAjIGRlZmluZSBJU1BfTEFUSU4xIChjaGFyX3UgKikiQCwxNjEtMjU1IgpAQCAtNDk3LDcgKzQ5Myw3IEBACiAJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCiAjZW5kaWYKIAkJCSAgICB7Ci0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKKyNpZiAoZGVmaW5lZChXSU4zMjY0KSkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQogCQkJICAgIChjaGFyX3UgKikxMjhMLAogI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopMjI0TCwKQEAgLTU3Miw3ICs1NjgsNyBAQAogICAgIHsiYmFja2dyb3VuZCIsICAiYmciLCAgIFBfU1RSSU5HfFBfVklfREVGfFBfUkNMUiwKIAkJCSAgICAoY2hhcl91ICopJnBfYmcsIFBWX05PTkUsCiAJCQkgICAgewotI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpKSAmJiAhZGVmaW5lZChGRUFUX0dVSSkKKyNpZiAoZGVmaW5lZChXSU4zMjY0KSkgJiYgIWRlZmluZWQoRkVBVF9HVUkpCiAJCQkgICAgKGNoYXJfdSAqKSJkYXJrIiwKICNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSJsaWdodCIsCkBAIC02MzcsMTEgKzYzMyw3IEBACiAJCQkgICAgKGNoYXJfdSAqKSZwX2JpbiwgUFZfQklOLAogCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJiaW9za2V5IiwJICAgICJiaW9zayIsUF9CT09MfFBfVklfREVGLAotI2lmZGVmIE1TRE9TCi0JCQkgICAgKGNoYXJfdSAqKSZwX2Jpb3NrLCBQVl9OT05FLAotI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKLSNlbmRpZgogCQkJICAgIHsoY2hhcl91ICopVFJVRSwgKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7ImJvbWIiLAkgICAgTlVMTCwgICBQX0JPT0x8UF9OT19NS1JDfFBfVklfREVGfFBfUlNUQVQsCiAjaWZkZWYgRkVBVF9NQllURQpAQCAtODg5LDExICs4ODEsNyBAQAogI2VuZGlmCiAJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7ImNvbnNrZXkiLAkgICAgImNvbnNrIixQX0JPT0x8UF9WSV9ERUYsCi0jaWZkZWYgTVNET1MKLQkJCSAgICAoY2hhcl91ICopJnBfY29uc2ssIFBWX05PTkUsCi0jZWxzZQogCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAotI2VuZGlmCiAJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7ImNvcHlpbmRlbnQiLCAgImNpIiwgICBQX0JPT0x8UF9WSV9ERUZ8UF9WSU0sCiAJCQkgICAgKGNoYXJfdSAqKSZwX2NpLCBQVl9DSSwKQEAgLTEzMTcsNyArMTMwNSw3IEBACiAJCQkgICAgewogIyBpZmRlZiBGRUFUX0dVSQogCQkJCShjaGFyX3UgKikibi12LWM6YmxvY2stQ3Vyc29yL2xDdXJzb3IsdmU6dmVyMzUtQ3Vyc29yLG86aG9yNTAtQ3Vyc29yLGktY2k6dmVyMjUtQ3Vyc29yL2xDdXJzb3Isci1jcjpob3IyMC1DdXJzb3IvbEN1cnNvcixzbTpibG9jay1DdXJzb3ItYmxpbmt3YWl0MTc1LWJsaW5rb2ZmMTUwLWJsaW5rb24xNzUiLAotIyBlbHNlCS8qIE1TRE9TIG9yIFdpbjMyIGNvbnNvbGUgKi8KKyMgZWxzZQkvKiBXaW4zMiBjb25zb2xlICovCiAJCQkJKGNoYXJfdSAqKSJuLXYtYzpibG9jayxvOmhvcjUwLGktY2k6aG9yMTUsci1jcjpob3IzMCxzbTpibG9jayIsCiAjIGVuZGlmCiAJCQkJICAgIChjaGFyX3UgKikwTH0KQEAgLTE1OTYsNyArMTU4NCw3IEBACiAgICAgeyJpc2lkZW50IiwJICAgICJpc2kiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAogCQkJICAgIChjaGFyX3UgKikmcF9pc2ksIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCSAgICAoY2hhcl91ICopIkAsNDgtNTcsXywxMjgtMTY3LDIyNC0yMzUiLAogI2Vsc2UKICMgaWZkZWYgRUJDRElDCkBAIC0xNjIyLDcgKzE2MTAsNyBAQAogCQkJCSAgICAiMjUxLTI1NCIsCiAjZWxzZQogCQkJCShjaGFyX3UgKikiQCw0OC01NyxfIiwKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkJCQkoY2hhcl91ICopIkAsNDgtNTcsXywxMjgtMTY3LDIyNC0yMzUiCiAjIGVsc2UKIAkJCQlJU0tfTEFUSU4xCkBAIC0xNjMyLDggKzE2MjAsNyBAQAogICAgIHsiaXNwcmludCIsCSAgICAiaXNwIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfUkFMTHxQX0NPTU1BfFBfTk9EVVAsCiAJCQkgICAgKGNoYXJfdSAqKSZwX2lzcCwgUFZfTk9ORSwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgXAotCQl8fCAoZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoTUFDT1NfWCkpIFwKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCAoZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoTUFDT1NfWCkpIFwKIAkJfHwgZGVmaW5lZChWTVMpCiAJCQkgICAgKGNoYXJfdSAqKSJALH4tMjU1IiwKICNlbHNlCkBAIC0xNjcyLDE5ICsxNjU5LDE5IEBACiAgICAgeyJrZXl3b3JkcHJnIiwgICJrcCIsICAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9TRUNVUkUsCiAJCQkgICAgKGNoYXJfdSAqKSZwX2twLCBQVl9LUCwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkJICAgIChjaGFyX3UgKikiOmhlbHAiLAogI2Vsc2UKLSNpZmRlZiBWTVMKKyMgaWZkZWYgVk1TCiAJCQkgICAgKGNoYXJfdSAqKSJoZWxwIiwKLSNlbHNlCi0jIGlmZGVmIFVTRU1BTl9TCi0JCQkgICAgKGNoYXJfdSAqKSJtYW4gLXMiLAogIyBlbHNlCisjICBpZmRlZiBVU0VNQU5fUworCQkJICAgIChjaGFyX3UgKikibWFuIC1zIiwKKyMgIGVsc2UKIAkJCSAgICAoY2hhcl91ICopIm1hbiIsCisjICBlbmRpZgogIyBlbmRpZgogI2VuZGlmCi0jZW5kaWYKIAkJCQkoY2hhcl91ICopMEx9IFNDUklQVElEX0lOSVR9LAogICAgIHsibGFuZ21hcCIsICAgICAibG1hcCIsIFBfU1RSSU5HfFBfVklfREVGfFBfT05FQ09NTUF8UF9OT0RVUHxQX1NFQ1VSRSwKICNpZmRlZiBGRUFUX0xBTkdNQVAKQEAgLTE3MjksNyArMTcxNiw3IEBACiAgICAgeyJsaW5lcyIsCSAgICBOVUxMLCAgIFBfTlVNfFBfTk9ERUZBVUxUfFBfTk9fTUtSQ3xQX1ZJX0RFRnxQX1JDTFIsCiAJCQkgICAgKGNoYXJfdSAqKSZSb3dzLCBQVl9OT05FLAogCQkJICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisjaWYgZGVmaW5lZChXSU4zMjY0KQogCQkJICAgIChjaGFyX3UgKikyNUwsCiAjZWxzZQogCQkJICAgIChjaGFyX3UgKikyNEwsCkBAIC0xODgwLDcgKzE4NjcsNyBAQAogICAgIHsibW91c2UiLAkgICAgTlVMTCwgICBQX1NUUklOR3xQX1ZJX0RFRnxQX0ZMQUdMSVNULAogCQkJICAgIChjaGFyX3UgKikmcF9tb3VzZSwgUFZfTk9ORSwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorI2lmIGRlZmluZWQoV0lOMzI2NCkKIAkJCQkoY2hhcl91ICopImEiLAogI2Vsc2UKIAkJCQkoY2hhcl91ICopIiIsCkBAIC0xOTAzLDcgKzE4OTAsNyBAQAogICAgIHsibW91c2Vtb2RlbCIsICAibW91c2VtIiwgUF9TVFJJTkd8UF9WSV9ERUYsCiAJCQkgICAgKGNoYXJfdSAqKSZwX21vdXNlbSwgUFZfTk9ORSwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkJCShjaGFyX3UgKikicG9wdXAiLAogI2Vsc2UKICMgaWYgZGVmaW5lZChNQUNPUykKQEAgLTE5NjIsNyArMTk0OSw3IEBACiAJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCiAJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7Im9wZW5kZXZpY2UiLCAgIm9kZXYiLCBQX0JPT0x8UF9WSV9ERUYsCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkJICAgIChjaGFyX3UgKikmcF9vZGV2LCBQVl9OT05FLAogI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKQEAgLTIwMDgsNyArMTk5NSw3IEBACiAgICAgeyJwYXRoIiwJICAgICJwYSIsICAgUF9TVFJJTkd8UF9FWFBBTkR8UF9WSV9ERUZ8UF9DT01NQXxQX05PRFVQLAogCQkJICAgIChjaGFyX3UgKikmcF9wYXRoLCBQVl9QQVRILAogCQkJICAgIHsKLSNpZiBkZWZpbmVkIEFNSUdBIHx8IGRlZmluZWQgTVNET1MgfHwgZGVmaW5lZCBNU1dJTgorI2lmIGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoTVNXSU4pCiAJCQkgICAgKGNoYXJfdSAqKSIuLCwiLAogI2Vsc2UKICMgaWYgZGVmaW5lZChfX0VNWF9fKQpAQCAtMjI5NCwyMSArMjI4MSwxNyBAQAogI2lmZGVmIFZNUwogCQkJICAgIChjaGFyX3UgKikiLSIsCiAjZWxzZQotIyBpZiBkZWZpbmVkKE1TRE9TKQotCQkJICAgIChjaGFyX3UgKikiY29tbWFuZCIsCi0jIGVsc2UKLSMgIGlmIGRlZmluZWQoV0lOMzI2NCkKKyMgaWYgZGVmaW5lZChXSU4zMjY0KQogCQkJICAgIChjaGFyX3UgKikiIiwJLyogc2V0IGluIHNldF9pbml0XzEoKSAqLwotIyAgZWxzZQorIyBlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSJzaCIsCi0jICBlbmRpZgogIyBlbmRpZgogI2VuZGlmIC8qIFZNUyAqLwogCQkJCShjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJzaGVsbGNtZGZsYWciLCJzaGNmIiwgUF9TVFJJTkd8UF9WSV9ERUZ8UF9TRUNVUkUsCiAJCQkgICAgKGNoYXJfdSAqKSZwX3NoY2YsIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCSAgICAoY2hhcl91ICopIi9jIiwKICNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSItYyIsCkBAIC0yMzY0LDcgKzIzNDcsNyBAQAogICAgIHsic2hlbGx4ZXNjYXBlIiwgInN4ZSIsIFBfU1RSSU5HfFBfVklfREVGfFBfU0VDVVJFLAogCQkJICAgIChjaGFyX3UgKikmcF9zeGUsIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAJCQkgICAgKGNoYXJfdSAqKSJcIiZ8PD4oKUBeIiwKICNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSIiLApAQCAtMjM4MSwxMSArMjM2NCw3IEBACiAJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSJmaWxueHRUb08ifQogCQkJICAgIFNDUklQVElEX0lOSVR9LAogICAgIHsic2hvcnRuYW1lIiwgICAic24iLCAgIFBfQk9PTHxQX1ZJX0RFRiwKLSNpZmRlZiBTSE9SVF9GTkFNRQotCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAotI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopJnBfc24sIFBWX1NOLAotI2VuZGlmCiAJCQkgICAgeyhjaGFyX3UgKilGQUxTRSwgKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7InNob3dicmVhayIsICAgInNiciIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JBTEwsCiAjaWZkZWYgRkVBVF9MSU5FQlJFQUsKQEAgLTI3OTUsNyArMjc3NCw3IEBACiAgICAgeyJ2aW1pbmZvIiwJICAgICJ2aSIsICAgUF9TVFJJTkd8UF9PTkVDT01NQXxQX05PRFVQfFBfU0VDVVJFLAogI2lmZGVmIEZFQVRfVklNSU5GTwogCQkJICAgIChjaGFyX3UgKikmcF92aW1pbmZvLCBQVl9OT05FLAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCSAgICB7KGNoYXJfdSAqKSIiLCAoY2hhcl91ICopIicxMDAsPDUwLHMxMCxoLHJBOixyQjoifQogI2Vsc2UKICMgaWZkZWYgQU1JR0EKQEAgLTMxODcsNyArMzE2Niw3IEBACiAgICAgICogRG9uJ3QgdXNlIGl0IGlmIGl0IGlzIGVtcHR5LgogICAgICAqLwogICAgIGlmICgoKHAgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiU0hFTEwiKSkgIT0gTlVMTCAmJiAqcCAhPSBOVUwpCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogIyBpZmRlZiBfX0VNWF9fCiAJICAgIHx8ICgocCA9IG1jaF9nZXRlbnYoKGNoYXJfdSAqKSJFTVhTSEVMTCIpKSAhPSBOVUxMICYmICpwICE9IE5VTCkKICMgZW5kaWYKQEAgLTMzNjMsNyArMzM0Miw3IEBACiAjaWZkZWYgRkVBVF9QT1NUU0NSSVBUCiAgICAgLyogJ3ByaW50ZXhwcicgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gYmUgYWJsZSB0byBldmFsdWF0ZSBpdC4gKi8KICAgICBzZXRfc3RyaW5nX2RlZmF1bHQoInBleHByIiwKLSMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkgICAgKGNoYXJfdSAqKSJzeXN0ZW0oJ2NvcHknIC4gJyAnIC4gdjpmbmFtZV9pbiAuICgmcHJpbnRkZXZpY2UgPT0gJycgPyAnIExQVDE6JyA6ICgnIFwiJyAuICZwcmludGRldmljZSAuICdcIicpKSkgLiBkZWxldGUodjpmbmFtZV9pbikiCiAjIGVsc2UKICMgIGlmZGVmIFZNUwpAQCAtMzUxMyw4ICszNDkyLDcgQEAKIAkJb3B0aW9uc1tvcHRfaWR4XS5mbGFncyB8PSBQX0RFRl9BTExPQ0VEOwogCSAgICB9CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1BQ09TKSBcCi0JCXx8IGRlZmluZWQoVk1TKQorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVk1TKQogCSAgICBpZiAoU1RSQ01QKHBfZW5jLCAibGF0aW4xIikgPT0gMAogIyBpZmRlZiBGRUFUX01CWVRFCiAJCSAgICB8fCBlbmNfdXRmOApAQCAtMzc5Myw3ICszNzcxLDcgQEAKICAgICBzZXRfbnVtYmVyX2RlZmF1bHQoIndpbmRvdyIsIFJvd3MgLSAxKTsKIAogICAgIC8qIEZvciBET1MgY29uc29sZSB0aGUgZGVmYXVsdCBpcyBhbHdheXMgYmxhY2suICovCi0jaWYgISgoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KSkgJiYgIWRlZmluZWQoRkVBVF9HVUkpKQorI2lmICEoKGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJKSkKICAgICAvKgogICAgICAqIElmICdiYWNrZ3JvdW5kJyB3YXNuJ3Qgc2V0IGJ5IHRoZSB1c2VyLCB0cnkgZ3Vlc3NpbmcgdGhlIHZhbHVlLAogICAgICAqIGRlcGVuZGluZyBvbiB0aGUgdGVybWluYWwgbmFtZS4gIE9ubHkgbmVlZCB0byBjaGVjayBmb3IgdGVybWluYWxzCkBAIC0zODM2LDcgKzM4MTQsNyBAQAogICAgIHN0YXRpYyBjaGFyX3UgKgogdGVybV9iZ19kZWZhdWx0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorI2lmIGRlZmluZWQoV0lOMzI2NCkKICAgICAvKiBET1MgY29uc29sZSBuZWFybHkgYWx3YXlzIGJsYWNrICovCiAgICAgcmV0dXJuIChjaGFyX3UgKikiZGFyayI7CiAjZWxzZQpAQCAtMzk2MywxNSArMzk0MSwxNCBAQAogICAgIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorI2lmIGRlZmluZWQoV0lOMzI2NCkKICAgICAvKgogICAgICAqIFNldCAnc2hlbGxjbWRmbGFnJywgJ3NoZWxseHF1b3RlJywgYW5kICdzaGVsbHF1b3RlJyBkZXBlbmRpbmcgb24gdGhlCiAgICAgICogJ3NoZWxsJyBvcHRpb24uCiAgICAgICogVGhpcyBpcyBkb25lIGFmdGVyIG90aGVyIGluaXRpYWxpemF0aW9ucywgd2hlcmUgJ3NoZWxsJyBtaWdodCBoYXZlIGJlZW4KICAgICAgKiBzZXQsIGJ1dCBvbmx5IGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQgYmVmb3JlLiAgRGVmYXVsdCBmb3IgcF9zaGNmIGlzCiAgICAgICogIi9jIiwgZm9yIHBfc2hxIGlzICIiLiAgRm9yICJzaCIgbGlrZSAgc2hlbGxzIGl0IGlzIGNoYW5nZWQgaGVyZSB0bwotICAgICAqICItYyIgYW5kICJcIiIsIGJ1dCBub3QgZm9yIERKR1BQLCBiZWNhdXNlIGl0IHN0YXJ0cyB0aGUgc2hlbGwgd2l0aG91dAotICAgICAqIGNvbW1hbmQuY29tLiAgQW5kIGZvciBXaW4zMiB3ZSBuZWVkIHRvIHNldCBwX3N4cSBpbnN0ZWFkLgorICAgICAqICItYyIgYW5kICJcIiIuICBBbmQgZm9yIFdpbjMyIHdlIG5lZWQgdG8gc2V0IHBfc3hxIGluc3RlYWQuCiAgICAgICovCiAgICAgaWYgKHN0cnN0cigoY2hhciAqKWdldHRhaWwocF9zaCksICJzaCIpICE9IE5VTEwpCiAgICAgewpAQCAtMzk4NCw4ICszOTYxLDcgQEAKIAkgICAgb3B0aW9uc1tpZHgzXS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gcF9zaGNmOwogCX0KIAotIyBpZm5kZWYgREpHUFAKLSMgIGlmZGVmIFdJTjMyNjQKKyMgaWZkZWYgV0lOMzI2NAogCS8qIFNvbWVob3cgV2luMzIgcmVxdWlyZXMgdGhlIHF1b3RlcyBhcm91bmQgdGhlIHJlZGlyZWN0aW9uIHRvbyAqLwogCWlkeDMgPSBmaW5kb3B0aW9uKChjaGFyX3UgKikic3hxIik7CiAJaWYgKGlkeDMgPj0gMCAmJiAhKG9wdGlvbnNbaWR4M10uZmxhZ3MgJiBQX1dBU19TRVQpKQpAQCAtMzk5MywxNCArMzk2OSwxMyBAQAogCSAgICBwX3N4cSA9IChjaGFyX3UgKikiXCIiOwogCSAgICBvcHRpb25zW2lkeDNdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3N4cTsKIAl9Ci0jICBlbHNlCisjIGVsc2UKIAlpZHgzID0gZmluZG9wdGlvbigoY2hhcl91ICopInNocSIpOwogCWlmIChpZHgzID49IDAgJiYgIShvcHRpb25zW2lkeDNdLmZsYWdzICYgUF9XQVNfU0VUKSkKIAl7CiAJICAgIHBfc2hxID0gKGNoYXJfdSAqKSJcIiI7CiAJICAgIG9wdGlvbnNbaWR4M10uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHBfc2hxOwogCX0KLSMgIGVuZGlmCiAjIGVuZGlmCiAgICAgfQogICAgIGVsc2UgaWYgKHN0cnN0cigoY2hhciAqKWdldHRhaWwocF9zaCksICJjbWQuZXhlIikgIT0gTlVMTCkKQEAgLTQ0MjQsOCArNDM5OSw4IEBACiAJICAgIH0KIAogCSAgICAvKgotCSAgICAgKiBhbGxvdyAnPScgYW5kICc6JyBhcyBNU0RPUyBjb21tYW5kLmNvbSBhbGxvd3Mgb25seSBvbmUKLQkgICAgICogJz0nIGNoYXJhY3RlciBwZXIgInNldCIgY29tbWFuZCBsaW5lLiBncnJyLiAoancpCisJICAgICAqIGFsbG93ICc9JyBhbmQgJzonIGZvciBoeXN0b3JpY2FsIHJlYXNvbnMgKE1TRE9TIGNvbW1hbmQuY29tCisJICAgICAqIGFsbG93cyBvbmx5IG9uZSAnPScgY2hhcmFjdGVyIHBlciAic2V0IiBjb21tYW5kIGxpbmUuIGdycnIuIChqdykKIAkgICAgICovCiAJICAgIGlmIChuZXh0Y2hhciA9PSAnPycKIAkJICAgIHx8IChwcmVmaXggPT0gMQpAQCAtNjU1OCw3ICs2NTMzLDcgQEAKIAl7CiAJICAgIG91dF9zdHIoVF9NRSk7CiAJICAgIHJlZHJhd19sYXRlcihDTEVBUik7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKSkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKIAkgICAgLyogU2luY2UgdF9tZSBoYXMgYmVlbiBzZXQsIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdXNlcgogCSAgICAgKiB3YW50cyB0byB1c2UgdGhpcyBhcyBkZWZhdWx0IGNvbG9ycy4gIE5lZWQgdG8gcmVzZXQgZGVmYXVsdAogCSAgICAgKiBiYWNrZ3JvdW5kL2ZvcmVncm91bmQgY29sb3JzLiAqLwpAQCAtODc5NCwxMiArODc2OSw2IEBACiAgICAgfQogICAgIGxpbWl0X3NjcmVlbl9zaXplKCk7CiAKLSNpZmRlZiBESkdQUAotICAgIC8qIGF2b2lkIGEgY3Jhc2ggYnkgY2hlY2tpbmcgZm9yIGEgdG9vIGxhcmdlIHZhbHVlIG9mICdjb2x1bW5zJyAqLwotICAgIGlmIChvbGRfQ29sdW1ucyAhPSBDb2x1bW5zICYmIGZ1bGxfc2NyZWVuICYmIHRlcm1fY29uc29sZSkKLQltY2hfY2hlY2tfY29sdW1ucygpOwotI2VuZGlmCi0KICAgICAvKgogICAgICAqIElmIHRoZSBzY3JlZW4gKHNoZWxsKSBoZWlnaHQgaGFzIGJlZW4gY2hhbmdlZCwgYXNzdW1lIGl0IGlzIHRoZQogICAgICAqIHBoeXNpY2FsIHNjcmVlbmhlaWdodC4KQEAgLTEwMzg5LDkgKzEwMzU4LDcgQEAKICNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCiAJY2FzZSBQVl9TSToJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX3NpKTsKICNlbmRpZgotI2lmbmRlZiBTSE9SVF9GTkFNRQogCWNhc2UgUFZfU046CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zbik7Ci0jZW5kaWYKIAljYXNlIFBWX1NUUzoJcmV0dXJuIChjaGFyX3UgKikmKGN1cmJ1Zi0+Yl9wX3N0cyk7CiAjaWZkZWYgRkVBVF9TRUFSQ0hQQVRICiAJY2FzZSBQVl9TVUE6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zdWEpOwpAQCAtMTA3MjIsOSArMTA2ODksNyBAQAogI2VuZGlmCiAJICAgIGJ1Zi0+Yl9wX3N0cyA9IHBfc3RzOwogCSAgICBidWYtPmJfcF9zdHNfbm9wYXN0ZSA9IHBfc3RzX25vcGFzdGU7Ci0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAJICAgIGJ1Zi0+Yl9wX3NuID0gcF9zbjsKLSNlbmRpZgogI2lmZGVmIEZFQVRfQ09NTUVOVFMKIAkgICAgYnVmLT5iX3BfY29tID0gdmltX3N0cnNhdmUocF9jb20pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3B0aW9uLmggYi9zcmMvb3B0aW9uLmgKaW5kZXggMjRlNDE4NC4uMmYxZjA0ZiAxMDA2NDQKLS0tIGEvc3JjL29wdGlvbi5oCisrKyBiL3NyYy9vcHRpb24uaApAQCAtMTgsNyArMTgsNyBAQAogI2lmZGVmIEFNSUdBCiAjIGRlZmluZSBERkxUX0VGTQkiJWY+JWw6JWM6JXQ6JW46JW0sJWY6JWw6ICV0JSpcXEQlbjogJW0sJWYgJWwgJXQlKlxcRCVuOiAlbSwlKlteXCJdXCIlZlwiJSpcXEQlbDogJW0sJWY6JWw6JW0sJWZ8JWx8ICVtIgogI2Vsc2UKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorIyBpZiBkZWZpbmVkKFdJTjMyNjQpCiAjICBkZWZpbmUgREZMVF9FRk0JIiVmKCVsKSA6ICV0JSpcXEQlbjogJW0sJSpbXlwiXVwiJWZcIiUqXFxEJWw6ICVtLCVmKCVsKSA6ICVtLCUqW14gXSAlZiAlbDogJW0sJWY6JWw6JWM6JW0sJWYoJWwpOiVtLCVmOiVsOiVtLCVmfCVsfCAlbSIKICMgZWxzZQogIyAgaWYgZGVmaW5lZChfX0VNWF9fKQkvKiBwdXQgbW9zdCBjb21tb24gaGVyZSAoaS5lLiBnY2MgZm9ybWF0KSBhdCBmcm9udCAqLwpAQCAtMzg2LDEwICszODYsNiBAQAogI2lmZGVmIEZFQVRfQlJPV1NFCiBFWFRFUk4gY2hhcl91CSpwX2JzZGlyOwkvKiAnYnJvd3NlZGlyJyAqLwogI2VuZGlmCi0jaWZkZWYgTVNET1MKLUVYVEVSTiBpbnQJcF9iaW9zazsJLyogJ2Jpb3NrZXknICovCi1FWFRFUk4gaW50CXBfY29uc2s7CS8qICdjb25za2V5JyAqLwotI2VuZGlmCiAjaWZkZWYgRkVBVF9MSU5FQlJFQUsKIEVYVEVSTiBjaGFyX3UJKnBfYnJlYWthdDsJLyogJ2JyZWFrYXQnICovCiAjZW5kaWYKQEAgLTY3MSw3ICs2NjcsNyBAQAogI2lmZGVmIEZFQVRfTVpTQ0hFTUUKIEVYVEVSTiBsb25nCXBfbXpxOwkJLyogJ216cXVhbnR1bSAqLwogI2VuZGlmCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogRVhURVJOIGludAlwX29kZXY7CQkvKiAnb3BlbmRldmljZScgKi8KICNlbmRpZgogRVhURVJOIGNoYXJfdQkqcF9vcGZ1bmM7CS8qICdvcGVyYXRvcmZ1bmMnICovCkBAIC0xMDc0LDkgKzEwNzAsNyBAQAogI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKICAgICAsIEJWX1NJCiAjZW5kaWYKLSNpZm5kZWYgU0hPUlRfRk5BTUUKICAgICAsIEJWX1NOCi0jZW5kaWYKICNpZmRlZiBGRUFUX1NZTl9ITAogICAgICwgQlZfU01DCiAgICAgLCBCVl9TWU4KZGlmZiAtLWdpdCBhL3NyYy9vc19tc2Rvcy5jIGIvc3JjL29zX21zZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTZlMzQuLjAwMDAwMDAKLS0tIGEvc3JjL29zX21zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDg2ICswLDAgQEAKLS8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6Ci0gKgotICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKLSAqCi0gKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KLSAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgotICogU2VlIFJFQURNRS50eHQgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBWaW0gc291cmNlIGNvZGUuCi0gKi8KLQotLyoKLSAqIG9zX21zZG9zLmMKLSAqCi0gKiBNU0RPUyBzeXN0ZW0tZGVwZW5kZW50IHJvdXRpbmVzLgotICogQSBjaGVhcCBwbGFzdGljIGltaXRhdGlvbiBvZiB0aGUgYW1pZ2EgZGVwZW5kZW50IGNvZGUuCi0gKiBBIGxvdCBpbiB0aGlzIGZpbGUgd2FzIG1hZGUgYnkgSnVlcmdlbiBXZWlnZXJ0IChqdykuCi0gKgotICogREpHUFAgY2hhbmdlcyBieSBHZXJ0IHZhbiBBbnR3ZXJwZW4KLSAqIEZhc3RlciB0ZXh0IHNjcmVlbnMgYnkgSm9obiBMYW5nZSAoamxhbmdlQHppbGtlci5uZXQpCi0gKiBXaW5kb3dzIGNsaXBib2FyZCBmdW5jdGlvbmFsaXR5IGFkZGVkIGJ5IERhdmlkIEtvdGNoYW4gKGRrKQotICoKLSAqIFNvbWUgZnVuY3Rpb25zIGFyZSBhbHNvIHVzZWQgZm9yIFdpbjE2IChNUy1XaW5kb3dzIDMuMSkuCi0gKi8KLQotI2luY2x1ZGUgInZpbS5oIgotCi0vKiBjcHJvdG8gZmFpbHMgb24gbWlzc2luZyBpbmNsdWRlIGZpbGVzICovCi0jaWZuZGVmIFBST1RPCi0jIGluY2x1ZGUgPGNvbmlvLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBQUk9UTwotIyBpbmNsdWRlIDxiaW9zLmg+Ci0jIGlmZGVmIERKR1BQCi0jICBpbmNsdWRlIDxkcG1pLmg+Ci0jICBpbmNsdWRlIDxzaWduYWwuaD4KLSMgIGluY2x1ZGUgPHN5cy9tb3ZlZGF0YS5oPgotIyAgaW5jbHVkZSA8Y3J0MC5oPgotIyAgaWZkZWYgRkVBVF9DTElQQk9BUkQKLSMgICBpbmNsdWRlIDxzeXMvc2VnbWVudHMuaD4KLSMgIGVuZGlmCi0jIGVsc2UKLSMgIGluY2x1ZGUgPGFsbG9jLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCi0jIGRlZmluZSBfY2RlY2wJICAgIC8qIERKR1BQIGRvZXNuJ3QgaGF2ZSB0aGlzICovCi0jZW5kaWYKLQotc3RhdGljIGludCBjYnJrX3ByZXNzZWQgPSBGQUxTRTsgICAgLyogc2V0IGJ5IGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCi1zdGF0aWMgaW50IGN0cmxjX3ByZXNzZWQgPSBGQUxTRTsgICAvKiBzZXQgd2hlbiBjdHJsLUMgb3IgY3RybC1icmVhayBkZXRlY3RlZCAqLwotc3RhdGljIGludCBkZWxheWVkX3JlZHJhdyA9IEZBTFNFOyAgLyogc2V0IHdoZW4gY3RybC1DIGRldGVjdGVkICovCi0KLXN0YXRpYyBpbnQgYmlvc2tleV9yZWFkID0gX05LRVlCUkRfUkVBRDsgICAvKiBiaW9za2V5KCkgYXJndW1lbnQ6IHJlYWQga2V5ICovCi1zdGF0aWMgaW50IGJpb3NrZXlfcmVhZHkgPSBfTktFWUJSRF9SRUFEWTsgLyogYmlvc2tleSgpIGFyZ3VtZW50OiBrZXkgcmVhZHk/ICovCi0KLSNpZmRlZiBGRUFUX01PVVNFCi1zdGF0aWMgaW50IG1vdXNlX2F2YWlsID0gRkFMU0U7CQkvKiBtb3VzZSBwcmVzZW50ICovCi1zdGF0aWMgaW50IG1vdXNlX2FjdGl2ZTsJCS8qIG1vdXNlIGVuYWJsZWQgKi8KLXN0YXRpYyBpbnQgbW91c2VfaGlkZGVuOwkJLyogbW91c2Ugbm90IHNob3duICovCi1zdGF0aWMgaW50IG1vdXNlX2NsaWNrID0gLTE7CQkvKiBtb3VzZSBzdGF0dXMgKi8KLXN0YXRpYyBpbnQgbW91c2VfbGFzdF9jbGljayA9IC0xOwkvKiBwcmV2aW91cyBzdGF0dXMgYXQgY2xpY2sgKi8KLXN0YXRpYyBpbnQgbW91c2VfeCA9IC0xOwkJLyogbW91c2UgeCBjb29yZGluYXRlICovCi1zdGF0aWMgaW50IG1vdXNlX3kgPSAtMTsJCS8qIG1vdXNlIHkgY29vcmRpbmF0ZSAqLwotc3RhdGljIGxvbmcgbW91c2VfY2xpY2tfdGltZSA9IDA7CS8qIGJpb3N0aW1lKCkgb2YgbGFzdCBjbGljayAqLwotc3RhdGljIGludCBtb3VzZV9jbGlja19jb3VudCA9IDA7CS8qIGNvdW50IGZvciBtdWx0aS1jbGlja3MgKi8KLXN0YXRpYyBpbnQgbW91c2VfY2xpY2tfeCA9IDA7CQkvKiB4IG9mIHByZXZpb3VzIG1vdXNlIGNsaWNrICovCi1zdGF0aWMgaW50IG1vdXNlX2NsaWNrX3kgPSAwOwkJLyogeSBvZiBwcmV2aW91cyBtb3VzZSBjbGljayAqLwotc3RhdGljIGxpbmVucl9UIG1vdXNlX3RvcGxpbmUgPSAwOwkvKiB3X3RvcGxpbmUgYXQgcHJldmlvdXMgbW91c2UgY2xpY2sgKi8KLSNpZmRlZiBGRUFUX0RJRkYKLXN0YXRpYyBpbnQgbW91c2VfdG9wZmlsbCA9IDA7CQkvKiB3X3RvcGZpbGwgYXQgcHJldmlvdXMgbW91c2UgY2xpY2sgKi8KLSNlbmRpZgotc3RhdGljIGludCBtb3VzZV94X2RpdiA9IDg7CQkvKiBjb2x1bW4gPSB4IGNvb3JkIC8gbW91c2VfeF9kaXYgKi8KLXN0YXRpYyBpbnQgbW91c2VfeV9kaXYgPSA4OwkJLyogbGluZSAgID0geSBjb29yZCAvIG1vdXNlX3lfZGl2ICovCi0jZW5kaWYKLQotI2RlZmluZSBCSU9TVElDSyAgICA1NQkJCS8qIGJpb3N0aW1lKCkgaW5jcmVhc2VzIG9uZSB0aWNrIGFib3V0Ci0JCQkJCSAgIGV2ZXJ5IDU1IG1zZWMgKi8KLQotc3RhdGljIGludCBvcmlnX2F0dHIgPSAweDA3MDA7CQkvKiB2aWRlbyBhdHRyaWJ1dGVzIHdoZW4gc3RhcnRpbmcgKi8KLQotc3RhdGljIGludCBTX2lMZWZ0ID0gMDsJCQkvKiBTY3JvbGwgd2luZG93OyB0aGVzZSBhcmUgMSBvZmZzZXQgKi8KLXN0YXRpYyBpbnQgU19pVG9wID0gMDsKLXN0YXRpYyBpbnQgU19pUmlnaHQgPSAwOwotc3RhdGljIGludCBTX2lCb3R0b20gPSAwOwotCi0vKgotICogTmVlZCB0byByZW1lbWJlciB0aGUgdmFsdWVzLCBiZWNhdXNlIHdlIHNldCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbAotICogZWRnZXMgc2VwYXJhdGVseS4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1teXdpbmRvdyhpbnQgaUxlZnQsIGludCBpVG9wLCBpbnQgaVJpZ2h0LCBpbnQgaUJvdHRvbSkKLXsKLSAgICBTX2lMZWZ0ID0gaUxlZnQ7Ci0gICAgU19pVG9wID0gaVRvcDsKLSAgICBTX2lSaWdodCA9IGlSaWdodDsKLSAgICBTX2lCb3R0b20gPSBpQm90dG9tOwotICAgIHdpbmRvdyhpTGVmdCwgaVRvcCwgaVJpZ2h0LCBpQm90dG9tKTsKLX0KLQotI2lmZGVmIERKR1BQCi0vKgotICogRm9yIERKR1BQLCB1c2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIGZhc3QgdGV4dCBzY3JlZW5zLiAgSk1MIDEvMTgvOTgKLSAqLwotCi11bnNpZ25lZCBsb25nCVNfdWxTY3JlZW5CYXNlID0gMHhiODAwMDsKLXVuc2lnbmVkIHNob3J0CVNfdWlBdHRyaWJ1dGUgPSAwOwotaW50CQlTX2lDdXJyZW50Um93ID0gMDsJLyogVGhlc2UgYXJlIDAgb2Zmc2V0ICovCi1pbnQJCVNfaUN1cnJlbnRDb2x1bW4gPSAwOwotc2hvcnQJCVNfc2VsVmlkZW87CS8qIFNlbGVjdG9yIGZvciBESkdQUCBkaXJlY3QgdmlkZW8gdHJhbnNmZXJzICovCi0KLS8qCi0gKiBVc2UgYnVyc3Qgd3JpdGVzIHRvIGltcHJvdmUgbWNoX3dyaXRlIHNwZWVkIC0gVkpOIDAxLzEwLzk5Ci0gKi8KLXVuc2lnbmVkIHNob3J0CVNfbGluZWJ1ZmZlcls4MDAwXTsgLyogPFZOPiBlbm91Z2ggZm9yIDE2MHg1MCAqLwotdW5zaWduZWQgc2hvcnQJU19ibGFua2J1ZmZlclsyNTZdOyAvKiA8Vk4+IG1heCBsZW5ndGggb2YgY29uc29sZSBsaW5lICovCi11bnNpZ25lZCBzaG9ydAkqU19saW5lYnVmZmVycG9zID0gU19saW5lYnVmZmVyOwotaW50CQlTX2lCdWZmZXJSb3c7Ci1pbnQJCVNfaUJ1ZmZlckNvbHVtbjsKLQotICAgIHN0YXRpYyB2b2lkCi1teWZsdXNoKHZvaWQpCi17Ci0gICAgaWYgKFNfbGluZWJ1ZmZlcnBvcyAhPSBTX2xpbmVidWZmZXIpCi0gICAgewotCV9kb3NtZW1wdXR3KFNfbGluZWJ1ZmZlciwgKFNfbGluZWJ1ZmZlcnBvcyAtIFNfbGluZWJ1ZmZlciksCi0JCVNfdWxTY3JlZW5CYXNlCi0JCSAgICAgICsgU19pQnVmZmVyUm93ICogKENvbHVtbnMgPDwgMSkgKyAoU19pQnVmZmVyQ29sdW1uIDw8IDEpKTsKLQlTX2xpbmVidWZmZXJwb3MgPSBTX2xpbmVidWZmZXI7Ci0gICAgfQotfQotCi0gICAgc3RhdGljIHZvaWQKLW15Z290b3h5KGludCB4LCBpbnQgeSkKLXsKLSAgICBTX2lDdXJyZW50Um93ID0geSAtIDE7Ci0gICAgU19pQ3VycmVudENvbHVtbiA9IHggLSAxOwotfQotCi0vKgotICogU2V0IHRoZSBzeXN0ZW0gY3Vyc29yIHRvIG91ciBjdXJzb3IgcG9zaXRpb24uCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotc2V0X3N5c19jdXJzb3Iodm9pZCkKLXsKLSAgICBpZiAodGVybV9jb25zb2xlICYmIGZ1bGxfc2NyZWVuKQotICAgIHsKLQlteWZsdXNoKCk7Ci0JZ290b3h5KFNfaUN1cnJlbnRDb2x1bW4gKyAxLCBTX2lDdXJyZW50Um93ICsgMSk7Ci0gICAgfQotfQotCi0gICAgc3RhdGljIHZvaWQKLXNldGJsYW5rYnVmZmVyKHVuc2lnbmVkIHNob3J0IHVpVmFsdWUpCi17Ci0gICAgaW50CQkJCWk7Ci0gICAgc3RhdGljIHVuc2lnbmVkIHNob3J0CW9sZHVpVmFsdWUgPSAwOwotCi0gICAgaWYgKG9sZHVpVmFsdWUgIT0gdWlWYWx1ZSkKLSAgICB7Ci0JLyogTG9hZCBibGFuayBsaW5lIGJ1ZmZlciB3aXRoIHNwYWNlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBDb2x1bW5zOyArK2kpCi0JICAgIFNfYmxhbmtidWZmZXJbaV0gPSB1aVZhbHVlOwotCW9sZHVpVmFsdWUgPSB1aVZhbHVlOwotICAgIH0KLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teWNscmVvbCh2b2lkKQotewotICAgIC8qIENsZWFyIHRvIGVuZCBvZiBsaW5lICovCi0gICAgc2V0YmxhbmtidWZmZXIoU191aUF0dHJpYnV0ZSB8ICcgJyk7Ci0gICAgX2Rvc21lbXB1dHcoU19ibGFua2J1ZmZlciwgU19pUmlnaHQgLSBTX2lDdXJyZW50Q29sdW1uLCBTX3VsU2NyZWVuQmFzZQotCQkJICsgKFNfaUN1cnJlbnRSb3cpICogKENvbHVtbnMgPDwgMSkKLQkJCSArIChTX2lDdXJyZW50Q29sdW1uIDw8IDEpKTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teWNscnNjcih2b2lkKQotewotICAgIC8qIENsZWFyIHdob2xlIHNjcmVlbiAqLwotICAgIHNob3J0CWlDb2x1bW47Ci0gICAgaW50CQllbmRwb2ludCA9IChSb3dzICogQ29sdW1ucykgPDwgMTsKLQotICAgIHNldGJsYW5rYnVmZmVyKFNfdWlBdHRyaWJ1dGUgfCAnICcpOwotCi0gICAgZm9yIChpQ29sdW1uID0gMDsgaUNvbHVtbiA8IGVuZHBvaW50OyBpQ29sdW1uICs9IChDb2x1bW5zIDw8IDEpKQotCV9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIENvbHVtbnMsIFNfdWxTY3JlZW5CYXNlICsgaUNvbHVtbik7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXlkZWxsaW5lKHZvaWQpCi17Ci0gICAgc2hvcnQgaVJvdywgaUNvbHVtbjsKLQotICAgIGlDb2x1bW4gPSAoU19pTGVmdCAtIDEpIDw8IDE7Ci0KLSAgICAvKiBDb3B5IHRoZSBsaW5lcyB1bmRlcm5lYXRoICovCi0gICAgZm9yIChpUm93ID0gU19pQ3VycmVudFJvdzsgaVJvdyA8IFNfaUJvdHRvbSAtIDE7IGlSb3crKykKLQltb3ZlZGF0YShTX3NlbFZpZGVvLCAoKChpUm93ICsgMSkgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCi0JCVNfc2VsVmlkZW8sICgoaVJvdyAqIENvbHVtbnMpIDw8IDEpICsgaUNvbHVtbiwKLQkJKFNfaVJpZ2h0IC0gU19pTGVmdCArIDEpIDw8IDEpOwotCi0gICAgLyogQ2xlYXIgdGhlIG5ldyByb3cgKi8KLSAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKLQotICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIChTX2lSaWdodCAtIFNfaUxlZnQpICsgMSwgU191bFNjcmVlbkJhc2UKLQkJCSArIChTX2lCb3R0b20gLSAxKSAqIChDb2x1bW5zIDw8IDEpICsgaUNvbHVtbik7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXlpbnNsaW5lKHZvaWQpCi17Ci0gICAgc2hvcnQgaVJvdywgaUNvbHVtbjsKLQotICAgIGlDb2x1bW4gPSAoU19pTGVmdCAtIDEpIDw8IDE7Ci0KLSAgICAvKiBDb3B5IHRoZSBsaW5lcyB1bmRlcm5lYXRoICovCi0gICAgZm9yIChpUm93ID0gU19pQm90dG9tIC0gMTsgaVJvdyA+PSBTX2lUb3A7IGlSb3ctLSkKLQltb3ZlZGF0YShTX3NlbFZpZGVvLCAoKChpUm93IC0gMSkgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCi0JCVNfc2VsVmlkZW8sICgoaVJvdyAqIENvbHVtbnMpIDw8IDEpICsgaUNvbHVtbiwKLQkJKFNfaVJpZ2h0IC0gU19pTGVmdCArIDEpIDw8IDEpOwotCi0gICAgLyogQ2xlYXIgdGhlIG5ldyByb3cgKi8KLSAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKLQotICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIChTX2lSaWdodCAtIFNfaUxlZnQpICsgMSwgU191bFNjcmVlbkJhc2UKLQkJCSArIChTX2lUb3AgLSAxKSAqIChDb2x1bW5zIDw8IDEpICsgaUNvbHVtbik7Ci19Ci0KLS8qCi0gKiBTY3JvbGwgdGhlIHNjcmVlbiBvbmUgbGluZSB1cCwgY2xlYXIgdGhlIGxhc3QgbGluZS4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1teXNjcm9sbCh2b2lkKQotewotICAgIHNob3J0CQlpUm93LCBpQ29sdW1uOwotCi0gICAgaUNvbHVtbiA9IChTX2lMZWZ0IC0gMSkgPDwgMTsKLQotICAgIC8qIENvcHkgdGhlIHNjcmVlbiAqLwotICAgIGZvciAoaVJvdyA9IFNfaVRvcDsgaVJvdyA8IFNfaUJvdHRvbTsgaVJvdysrKQotCW1vdmVkYXRhKFNfc2VsVmlkZW8sICgoaVJvdyAqIENvbHVtbnMpIDw8IDEpICsgaUNvbHVtbiwKLQkJU19zZWxWaWRlbywgKCgoaVJvdyAtIDEpICogQ29sdW1ucykgPDwgMSkgKyBpQ29sdW1uLAotCQkoU19pUmlnaHQgLSBTX2lMZWZ0ICsgMSkgPDwgMSk7Ci0KLSAgICAvKiBDbGVhciB0aGUgYm90dG9tIHJvdyAqLwotICAgIHNldGJsYW5rYnVmZmVyKFNfdWlBdHRyaWJ1dGUgfCAnICcpOwotCi0gICAgX2Rvc21lbXB1dHcoU19ibGFua2J1ZmZlciwgKFNfaVJpZ2h0IC0gU19pTGVmdCkgKyAxLCBTX3VsU2NyZWVuQmFzZQotCQkJICsgKFNfaUJvdHRvbSAtIDEpICogKENvbHVtbnMgPDwgMSkgKyBpQ29sdW1uKTsKLX0KLQotICAgIHN0YXRpYyBpbnQKLW15cHV0Y2goaW50IGlDaGFyKQotewotICAgIHVuc2lnbmVkIHNob3J0IHVpVmFsdWU7Ci0KLSAgICBpZiAoaUNoYXIgPT0gJ1xuJykKLSAgICB7Ci0JbXlmbHVzaCgpOwotCWlmIChTX2lDdXJyZW50Um93ID49IFNfaUJvdHRvbSAtIFNfaVRvcCkKLQkgICAgbXlzY3JvbGwoKTsKLQllbHNlCi0JewotCSAgICBTX2lDdXJyZW50Q29sdW1uID0gU19pTGVmdCAtIDE7Ci0JICAgIFNfaUN1cnJlbnRSb3crKzsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlDaGFyID09ICdccicpCi0gICAgewotCW15Zmx1c2goKTsKLQlTX2lDdXJyZW50Q29sdW1uID0gU19pTGVmdCAtIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlDaGFyID09ICdcYicpCi0gICAgewotCW15Zmx1c2goKTsKLQlpZiAoU19pQ3VycmVudENvbHVtbiA+PSBTX2lMZWZ0KQotCSAgICBTX2lDdXJyZW50Q29sdW1uLS07Ci0gICAgfQotICAgIGVsc2UgaWYgKGlDaGFyID09IDcpCi0gICAgewotCXNvdW5kKDQ0MCk7CS8qIHNob3J0IGJlZXAgKi8KLQlkZWxheSgyMDApOwotCW5vc291bmQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQl1aVZhbHVlID0gU191aUF0dHJpYnV0ZSB8ICh1bnNpZ25lZCBjaGFyKWlDaGFyOwotCi0JLyoKLQkgKiBOb3JtYWwgY2hhciAtIGFyZSB3ZSBzdGFydGluZyB0byBidWZmZXI/Ci0JICovCi0JaWYgKFNfbGluZWJ1ZmZlcnBvcyA9PSBTX2xpbmVidWZmZXIpCi0JewotCSAgICBTX2lCdWZmZXJDb2x1bW4gPSBTX2lDdXJyZW50Q29sdW1uOwotCSAgICBTX2lCdWZmZXJSb3cgPSBTX2lDdXJyZW50Um93OwotCX0KLQotCSpTX2xpbmVidWZmZXJwb3MrKyA9IHVpVmFsdWU7Ci0KLQlTX2lDdXJyZW50Q29sdW1uKys7Ci0JaWYgKFNfaUN1cnJlbnRDb2x1bW4gPj0gU19pUmlnaHQgJiYgU19pQ3VycmVudFJvdyA+PSBTX2lCb3R0b20gLSBTX2lUb3ApCi0JewotCSAgICBteWZsdXNoKCk7Ci0JICAgIG15c2Nyb2xsKCk7Ci0JICAgIFNfaUN1cnJlbnRDb2x1bW4gPSBTX2lMZWZ0IC0gMTsKLQkgICAgU19pQ3VycmVudFJvdysrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teXRleHRpbml0KHN0cnVjdCB0ZXh0X2luZm8gKnBUZXh0aW5mbykKLXsKLSAgICBTX3NlbFZpZGVvID0gX19kcG1pX3NlZ21lbnRfdG9fZGVzY3JpcHRvcihTX3VsU2NyZWVuQmFzZSA+PiA0KTsKLSAgICBTX3VpQXR0cmlidXRlID0gcFRleHRpbmZvLT5ub3JtYXR0ciA8PCA4OwotfQotCi0gICAgc3RhdGljIHZvaWQKLWdldF9zY3JlZW5iYXNlKHZvaWQpCi17Ci0gICAgc3RhdGljIHVuaW9uIFJFR1MJICAgIHJlZ3M7Ci0KLSAgICAvKiBvbGQgSGVyY3VsZXMgZ3JhZmljIGNhcmQgaGFzIGRpZmZlcmVudCBiYXNlIGFkZHJlc3MgKE1hY2V3aWN6KSAqLwotICAgIHJlZ3MuaC5haCA9IDB4MGY7Ci0gICAgKHZvaWQpaW50ODYoMHgxMCwgJnJlZ3MsICZyZWdzKTsJLyogaW50IDEwIDBmICovCi0gICAgaWYgKHJlZ3MuaC5hbCA9PSAweDA3KQkJLyogdmlkZW8gbW9kZSA3IC0tIGhlcmN1bGVzIG1vbm8gKi8KLQlTX3VsU2NyZWVuQmFzZSA9IDB4YjAwMDA7Ci0gICAgZWxzZQotCVNfdWxTY3JlZW5CYXNlID0gMHhiODAwMDsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teXRleHRhdHRyKGludCBpQXR0cmlidXRlKQotewotICAgIFNfdWlBdHRyaWJ1dGUgPSAodW5zaWduZWQgc2hvcnQpaUF0dHJpYnV0ZSA8PCA4OwotfQotCi0gICAgc3RhdGljIHZvaWQKLW15bm9ybXZpZGVvKHZvaWQpCi17Ci0gICAgbXl0ZXh0YXR0cihvcmlnX2F0dHIpOwotfQotCi0gICAgc3RhdGljIHZvaWQKLW15dGV4dGNvbG9yKGludCBpVGV4dENvbG9yKQotewotICAgIFNfdWlBdHRyaWJ1dGUgPSAodW5zaWduZWQgc2hvcnQpKChTX3VpQXR0cmlidXRlICYgMHhmMDAwKQotCQkJCQkgICB8ICh1bnNpZ25lZCBzaG9ydClpVGV4dENvbG9yIDw8IDgpOwotfQotCi0gICAgc3RhdGljIHZvaWQKLW15dGV4dGJhY2tncm91bmQoaW50IGlCa2dDb2xvcikKLXsKLSAgICBTX3VpQXR0cmlidXRlID0gKHVuc2lnbmVkIHNob3J0KSgoU191aUF0dHJpYnV0ZSAmIDB4MGYwMCkKLQkJCQkJIHwgKHVuc2lnbmVkIHNob3J0KShpQmtnQ29sb3IgPDwgMTIpKTsKLX0KLS8qCi0gKiBHZXRkaWdpdHM6IEdldCBhIG51bWJlciBmcm9tIGEgc3RyaW5nIGFuZCBza2lwIG92ZXIgaXQuCi0gKiBOb3RlOiB0aGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgY2hhcl91IHBvaW50ZXIhCi0gKi8KLQotICAgIHN0YXRpYyBsb25nCi1teWdldGRpZ2l0cyhjaGFyX3UgKipwcCkKLXsKLSAgICBjaGFyX3UJKnA7Ci0gICAgbG9uZwlyZXR2YWwgPSAwOwotCi0gICAgcCA9ICpwcDsKLSAgICBpZiAoKnAgPT0gJy0nKQkJLyogc2tpcCBuZWdhdGl2ZSBzaWduICovCi0JKytwOwotICAgIHdoaWxlIChWSU1fSVNESUdJVCgqcCkpCi0gICAgewotCXJldHZhbCA9IChyZXR2YWwgKiAxMCkgKyAoKnAgLSAnMCcpOwotCSsrcDsKLSAgICB9Ci0gICAgaWYgKCoqcHAgPT0gJy0nKQkJLyogcHJvY2VzcyBuZWdhdGl2ZSBzaWduICovCi0JcmV0dmFsID0gLXJldHZhbDsKLQotICAgICpwcCA9IHA7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLSNlbHNlCi0jIGRlZmluZSBteWdvdG94eSBnb3RveHkKLSMgZGVmaW5lIG15cHV0Y2ggcHV0Y2gKLSMgZGVmaW5lIG15c2Nyb2xsIHNjcm9sbAotIyBkZWZpbmUgbXlub3JtdmlkZW8gbm9ybXZpZGVvCi0jIGRlZmluZSBteXRleHRhdHRyIHRleHRhdHRyCi0jIGRlZmluZSBteXRleHRjb2xvciB0ZXh0Y29sb3IKLSMgZGVmaW5lIG15dGV4dGJhY2tncm91bmQgdGV4dGJhY2tncm91bmQKLSMgZGVmaW5lIG15Z2V0ZGlnaXRzIGdldGRpZ2l0cwotIyBkZWZpbmUgbXljbHJlb2wgY2xyZW9sCi0jIGRlZmluZSBteWNscnNjciBjbHJzY3IKLSMgZGVmaW5lIG15aW5zbGluZSBpbnNsaW5lCi0jIGRlZmluZSBteWRlbGxpbmUgZGVsbGluZQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QKLXsKLSAgICBjaGFyX3UJc2NhbmNvZGU7Ci0gICAgY2hhcl91CW1ldGFrZXk7Ci19IGFsdGtleV90YWJsZVtdID0KLXsKLSAgICB7MHgxZSwgMHhlMX0sIC8qIGEgKi8KLSAgICB7MHgzMCwgMHhlMn0sIC8qIGIgKi8KLSAgICB7MHgyZSwgMHhlM30sIC8qIGMgKi8KLSAgICB7MHgyMCwgMHhlNH0sIC8qIGQgKi8KLSAgICB7MHgxMiwgMHhlNX0sIC8qIGUgKi8KLSAgICB7MHgyMSwgMHhlNn0sIC8qIGYgKi8KLSAgICB7MHgyMiwgMHhlN30sIC8qIGcgKi8KLSAgICB7MHgyMywgMHhlOH0sIC8qIGggKi8KLSAgICB7MHgxNywgMHhlOX0sIC8qIGkgKi8KLSAgICB7MHgyNCwgMHhlYX0sIC8qIGogKi8KLSAgICB7MHgyNSwgMHhlYn0sIC8qIGsgKi8KLSAgICB7MHgyNiwgMHhlY30sIC8qIGwgKi8KLSAgICB7MHgzMiwgMHhlZH0sIC8qIG0gKi8KLSAgICB7MHgzMSwgMHhlZX0sIC8qIG4gKi8KLSAgICB7MHgxOCwgMHhlZn0sIC8qIG8gKi8KLSAgICB7MHgxOSwgMHhmMH0sIC8qIHAgKi8KLSAgICB7MHgxMCwgMHhmMX0sIC8qIHEgKi8KLSAgICB7MHgxMywgMHhmMn0sIC8qIHIgKi8KLSAgICB7MHgxZiwgMHhmM30sIC8qIHMgKi8KLSAgICB7MHgxNCwgMHhmNH0sIC8qIHQgKi8KLSAgICB7MHgxNiwgMHhmNX0sIC8qIHUgKi8KLSAgICB7MHgyZiwgMHhmNn0sIC8qIHYgKi8KLSAgICB7MHgxMSwgMHhmN30sIC8qIHcgKi8KLSAgICB7MHgyZCwgMHhmOH0sIC8qIHggKi8KLSAgICB7MHgxNSwgMHhmOX0sIC8qIHkgKi8KLSAgICB7MHgyYywgMHhmYX0sIC8qIHogKi8KLSAgICB7MHg3OCwgMHhiMX0sIC8qIDEgKi8KLSAgICB7MHg3OSwgMHhiMn0sIC8qIDIgKi8KLSAgICB7MHg3YSwgMHhiM30sIC8qIDMgKi8KLSAgICB7MHg3YiwgMHhiNH0sIC8qIDQgKi8KLSAgICB7MHg3YywgMHhiNX0sIC8qIDUgKi8KLSAgICB7MHg3ZCwgMHhiNn0sIC8qIDYgKi8KLSAgICB7MHg3ZSwgMHhiN30sIC8qIDcgKi8KLSAgICB7MHg3ZiwgMHhiOH0sIC8qIDggKi8KLSAgICB7MHg4MCwgMHhiOX0sIC8qIDkgKi8KLSAgICB7MHg4MSwgMHhiMH0sIC8qIDAgKi8KLX07Ci0KLS8qCi0gKiBUcmFuc2xhdGUgZXh0ZW5kZWQga2V5Y29kZXMgaW50byBtZXRhLWNoYXJzIHdoZXJlIGFwcGxpY2FibGUKLSAqLwotICAgIHN0YXRpYyBpbnQKLXRyYW5zbGF0ZV9hbHRrZXlzKGludCByYXdrZXkpCi17Ci0gICAgaW50IGksIGM7Ci0KLSAgICBpZiAoKHJhd2tleSAmIDB4ZmYpID09IDApCi0gICAgewotCWMgPSAocmF3a2V5ID4+IDgpOwotCWZvciAoaSA9IHNpemVvZihhbHRrZXlfdGFibGUpIC8gc2l6ZW9mKGFsdGtleV90YWJsZVswXSk7IC0taSA+PSAwOyApCi0JewotCSAgICBpZiAoYyA9PSBhbHRrZXlfdGFibGVbaV0uc2NhbmNvZGUpCi0JCXJldHVybiAoaW50KWFsdGtleV90YWJsZVtpXS5tZXRha2V5OwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJhd2tleTsKLX0KLQotLyoKLSAqIFNldCBub3JtYWwgZmcvYmcgY29sb3IsIGJhc2VkIG9uIFRfTUUuICBDYWxsZWQgd2hlbiB0X21lIGhhcyBiZWVuIHNldC4KLSAqLwotICAgIHZvaWQKLW1jaF9zZXRfbm9ybWFsX2NvbG9ycyh2b2lkKQotewotICAgIGNoYXJfdQkqcDsKLSAgICBpbnQJCW47Ci0KLSAgICBjdGVybV9ub3JtYWxfZmdfY29sb3IgPSAob3JpZ19hdHRyICYgMHhmKSArIDE7Ci0gICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChvcmlnX2F0dHIgPj4gNCkgJiAweGYpICsgMTsKLSAgICBpZiAoVF9NRVswXSA9PSBFU0MgJiYgVF9NRVsxXSA9PSAnfCcpCi0gICAgewotCXAgPSBUX01FICsgMjsKLQluID0gZ2V0ZGlnaXRzKCZwKTsKLQlpZiAoKnAgPT0gJ20nICYmIG4gPiAwKQotCXsKLQkgICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKG4gJiAweGYpICsgMTsKLQkgICAgY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChuID4+IDQpICYgMHhmKSArIDE7Ci0JfQotICAgIH0KLX0KLQotI2lmIGRlZmluZWQoTUNIX0NVUlNPUl9TSEFQRSkgfHwgZGVmaW5lZChQUk9UTykKLS8qCi0gKiBTYXZlL3Jlc3RvcmUgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IuCi0gKiBjYWxsIHdpdGggRkFMU0UgdG8gc2F2ZSwgVFJVRSB0byByZXN0b3JlCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotbWNoX3Jlc3RvcmVfY3Vyc29yX3NoYXBlKGludCByZXN0b3JlKQotewotICAgIHN0YXRpYyB1bmlvbiBSRUdTCSAgICByZWdzOwotICAgIHN0YXRpYyBpbnQJCSAgICBzYXZlZCA9IEZBTFNFOwotCi0gICAgaWYgKHJlc3RvcmUpCi0gICAgewotCWlmIChzYXZlZCkKLQkgICAgcmVncy5oLmFoID0gMHgwMTsJICAgIC8qIFNldCBDdXJzb3IgKi8KLQllbHNlCi0JICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlyZWdzLmguYWggPSAweDAzOwkgICAgLyogR2V0IEN1cnNvciAqLwotCXJlZ3MuaC5iaCA9IDB4MDA7CSAgICAvKiBQYWdlICovCi0Jc2F2ZWQgPSBUUlVFOwotICAgIH0KLQotICAgICh2b2lkKWludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHNoYXBlIG9mIHRoZSBjdXJzb3IuCi0gKiAndGhpY2tuZXNzJyBjYW4gYmUgZnJvbSAwICh0aGluKSB0byA3IChibG9jaykKLSAqLwotICAgIHN0YXRpYyB2b2lkCi1tY2hfc2V0X2N1cnNvcl9zaGFwZShpbnQgdGhpY2tuZXNzKQotewotICAgIHVuaW9uIFJFR1MJICAgIHJlZ3M7Ci0KLSAgICByZWdzLmguY2ggPSA3IC0gdGhpY2tuZXNzOwkgICAgLyogU3RhcnRpbmcgTGluZSAqLwotICAgIHJlZ3MuaC5jbCA9IDc7CQkgICAgLyogRW5kaW5nIExpbmUgKi8KLSAgICByZWdzLmguYWggPSAweDAxOwkJICAgIC8qIFNldCBDdXJzb3IgKi8KLSAgICAodm9pZClpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOwotfQotCi0gICAgdm9pZAotbWNoX3VwZGF0ZV9jdXJzb3Iodm9pZCkKLXsKLSAgICBpbnQJCWlkeDsKLSAgICBpbnQJCXRoaWNrbmVzczsKLQotICAgIC8qCi0gICAgICogSG93IHRoZSBjdXJzb3IgaXMgZHJhd24gZGVwZW5kcyBvbiB0aGUgY3VycmVudCBtb2RlLgotICAgICAqLwotICAgIGlkeCA9IGdldF9zaGFwZV9pZHgoRkFMU0UpOwotCi0gICAgaWYgKHNoYXBlX3RhYmxlW2lkeF0uc2hhcGUgPT0gU0hBUEVfQkxPQ0spCi0JdGhpY2tuZXNzID0gNzsKLSAgICBlbHNlCi0JdGhpY2tuZXNzID0gKDcgKiBzaGFwZV90YWJsZVtpZHhdLnBlcmNlbnRhZ2UgKyA5MCkgLyAxMDA7Ci0gICAgbWNoX3NldF9jdXJzb3Jfc2hhcGUodGhpY2tuZXNzKTsKLX0KLSNlbmRpZgotCi0vKgotICogUmV0dXJuIGFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IGF2YWlsYWJsZSBpbiBLYnl0ZS4KLSAqLwotICAgIGxvbmdfdQotbWNoX2F2YWlsX21lbShpbnQgc3BlY2lhbCkKLXsKLSNpZmRlZiBESkdQUAotICAgIHJldHVybiBfZ28zMl9kcG1pX3JlbWFpbmluZ192aXJ0dWFsX21lbW9yeSgpID4+IDEwOwotI2Vsc2UKLSAgICByZXR1cm4gY29yZWxlZnQoKSA+PiAxMDsKLSNlbmRpZgotfQotCi0jaWZkZWYgRkVBVF9NT1VTRQotCi0vKgotICogU2V0IGFyZWEgd2hlcmUgbW91c2UgY2FuIGJlIG1vdmVkIHRvOiBUaGUgd2hvbGUgc2NyZWVuLgotICogUm93cyBhbmQgQ29sdW1ucyBtdXN0IGJlIHZhbGlkIHdoZW4gY2FsbGluZyEKLSAqLwotICAgIHN0YXRpYyB2b2lkCi1tb3VzZV9hcmVhKHZvaWQpCi17Ci0gICAgdW5pb24gUkVHUwkgICAgcmVnczsKLQotICAgIGlmIChtb3VzZV9hdmFpbCkKLSAgICB7Ci0JcmVncy54LmN4ID0gMDsJLyogbW91c2UgdmlzaWJsZSBiZXR3ZWVuIGN4IGFuZCBkeCAqLwotCXJlZ3MueC5keCA9IENvbHVtbnMgKiBtb3VzZV94X2RpdiAtIDE7Ci0JcmVncy54LmF4ID0gNzsKLQkodm9pZClpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotCi0JcmVncy54LmN4ID0gMDsJLyogbW91c2UgdmlzaWJsZSBiZXR3ZWVuIGN4IGFuZCBkeCAqLwotCXJlZ3MueC5keCA9IFJvd3MgKiBtb3VzZV95X2RpdiAtIDE7Ci0JcmVncy54LmF4ID0gODsKLQkodm9pZClpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotICAgIH0KLX0KLQotICAgIHN0YXRpYyB2b2lkCi1zaG93X21vdXNlKGludCBvbikKLXsKLSAgICBzdGF0aWMgaW50CSAgICB3YXNfb24gPSBGQUxTRTsKLSAgICB1bmlvbiBSRUdTCSAgICByZWdzOwotCi0gICAgaWYgKG1vdXNlX2F2YWlsKQotICAgIHsKLQlpZiAoIW1vdXNlX2FjdGl2ZSB8fCBtb3VzZV9oaWRkZW4pCi0JICAgIG9uID0gRkFMU0U7Ci0JLyoKLQkgKiBDYXJlZnVsOiBFYWNoIHN3aXRjaCBvbiBtdXN0IGJlIGNvbXBlbnNhdGVkIGJ5IGV4YWN0bHkgb25lIHN3aXRjaAotCSAqIG9mZgotCSAqLwotCWlmICgob24gJiYgIXdhc19vbikgfHwgKCFvbiAmJiB3YXNfb24pKQotCXsKLQkgICAgd2FzX29uID0gb247Ci0JICAgIHJlZ3MueC5heCA9IG9uID8gMSA6IDI7Ci0JICAgIGludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7CS8qIHNob3cgbW91c2UgKi8KLQkgICAgaWYgKG9uKQotCQltb3VzZV9hcmVhKCk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qCi0gKiBWZXJzaW9uIG9mIGtiaGl0KCkgYW5kIGdldGNoKCkgdGhhdCB1c2UgZGlyZWN0IGNvbnNvbGUgSS9PLgotICogVGhpcyBhdm9pZHMgdHJvdWJsZSB3aXRoIENUUkwtUCBhbmQgdGhlIGxpa2UsIGFuZCBzaG91bGQgd29yayBvdmVyIGEgdGVsbmV0Ci0gKiBjb25uZWN0aW9uIChpdCB3b3JrcyBmb3IgWHZpKS4KLSAqLwotCi1zdGF0aWMgaW50IGNvbnNfa2V5ID0gLTE7Ci0KLS8qCi0gKiBUcnkgdG8gZ2V0IG9uZSBjaGFyYWN0ZXIgZGlyZWN0bHkgZnJvbSB0aGUgY29uc29sZS4KLSAqIElmIHRoZXJlIGlzIGEga2V5LCBpdCBpcyBzdG9yZWQgaW4gY29uc19rZXkuCi0gKiBPbmx5IGNhbGwgd2hlbiBjb25zX2tleSBpcyAtMSEKLSAqLwotICAgIHN0YXRpYyB2b2lkCi1jb25zX2dldGtleSh2b2lkKQotewotICAgIHVuaW9uIFJFR1MgcmVnczsKLQotICAgIC8qIGNhbGwgRE9TIGZ1bmN0aW9uIDY6IERpcmVjdCBjb25zb2xlIEkvTyAqLwotICAgIHJlZ3MuaC5haCA9IDB4MDY7Ci0gICAgcmVncy5oLmRsID0gMHhmZjsKLSAgICAodm9pZClpbnRkb3MoJnJlZ3MsICZyZWdzKTsKLSAgICBpZiAoKHJlZ3MueC5mbGFncyAmIDB4NDApID09IDApCS8qIHplcm8gZmxhZyBub3Qgc2V0PyAqLwotCWNvbnNfa2V5ID0gKHJlZ3MuaC5hbCAmIDB4ZmYpOwotfQotCi0vKgotICogUmV0dXJuIFRSVUUgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlLgotICovCi0gICAgc3RhdGljIGludAotY29uc19rYmhpdCh2b2lkKQotewotICAgIGlmIChjb25zX2tleSA8IDApCi0JY29uc19nZXRrZXkoKTsKLSAgICByZXR1cm4gKGNvbnNfa2V5ID49IDApOwotfQotCi0vKgotICogUmV0dXJuIGEgY2hhcmFjdGVyIGZyb20gdGhlIGNvbnNvbGUuCi0gKiBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB2aW1fa2JoaXQoKSByZXR1cm5zIFRSVUUuCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1jb25zX2dldGNoKHZvaWQpCi17Ci0gICAgaW50CSAgICBjID0gLTE7Ci0KLSAgICBpZiAoY29uc19rZXkgPCAwKQotCWNvbnNfZ2V0a2V5KCk7Ci0gICAgYyA9IGNvbnNfa2V5OwotICAgIGNvbnNfa2V5ID0gLTE7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLQotI2lmZGVmIERKR1BQCi0vKgotICogREpHUFAgcHJvdmlkZXMgYSBrYmhpdCgpIGZ1bmN0aW9uIHRoYXQgZ29lcyB0byB0aGUgQklPUyBpbnN0ZWFkIG9mIERPUy4KLSAqIFRoaXMgZG9lc24ndCB3b3JrIGZvciB0ZXJtaW5hbHMgY29ubmVjdGVkIHRvIGEgc2VyaWFsIHBvcnQuCi0gKiBSZWRlZmluZSBrYmhpdCgpIGhlcmUgdG8gbWFrZSBpdCB3b3JrLgotICovCi0gICAgc3RhdGljIGludAotdmltX2tiaGl0KHZvaWQpCi17Ci0gICAgdW5pb24gUkVHUyByZWdzOwotCi0gICAgcmVncy5oLmFoID0gMHgwYjsKLSAgICAodm9pZClpbnRkb3MoJnJlZ3MsICZyZWdzKTsKLSAgICByZXR1cm4gcmVncy5oLmFsOwotfQotCi0jaWZkZWYga2JoaXQKLSMgdW5kZWYga2JoaXQJICAgIC8qIG1pZ2h0IGhhdmUgYmVlbiBkZWZpbmVkIGluIGNvbmlvLmggKi8KLSNlbmRpZgotI2RlZmluZSBrYmhpdCgpCXZpbV9rYmhpdCgpCi0KLSNlbmRpZgotCi0vKgotICogU2ltdWxhdGUgV2FpdEZvckNoYXIoKSBieSBzbG93bHkgcG9sbGluZyB3aXRoIGJpb3NrZXkoMSkgb3Iga2JoaXQoKS4KLSAqCi0gKiBJZiBWaW0gc2hvdWxkIHdvcmsgb3ZlciB0aGUgc2VyaWFsIGxpbmUgYWZ0ZXIgYSAnY3R0eSBjb20xJyB3ZSBtdXN0IHVzZQotICoga2JoaXQoKSBhbmQgZ2V0Y2goKS4gKGp3KQotICogVXN1YWxseSBrYmhpdCgpIGlzIG5vdCB1c2VkLCBiZWNhdXNlIHRoZW4gQ1RSTC1DIGFuZCBDVFJMLVAKLSAqIHdpbGwgYmUgY2F1Z2h0IGJ5IERPUyAobW9vbCkuCi0gKgotICogcmV0dXJuIFRSVUUgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlLCBGQUxTRSBvdGhlcndpc2UKLSAqLwotCi0jZGVmaW5lIEZPUkVWRVIgMTk5OTk5OTk5OUwKLQotICAgIHN0YXRpYyAgaW50Ci1XYWl0Rm9yQ2hhcihsb25nIG1zZWMpCi17Ci0gICAgbG9uZwlzdGFydHRpbWUgPSAwOwotCi0gICAgaWYgKG1zZWMgIT0gMCkKLQlzdGFydHRpbWUgPSBiaW9zdGltZSgwLCAwTCk7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSNpZmRlZiBGRUFUX01PVVNFCi0JbG9uZwkJY2xpY2t0aW1lOwotCXN0YXRpYyBpbnQJb2xkX3N0YXR1cyA9IDA7Ci0JdW5pb24gUkVHUwlyZWdzOwotCWludAkJeCwgeTsKLQotCWlmIChtb3VzZV9hdmFpbCAmJiBtb3VzZV9hY3RpdmUgJiYgbW91c2VfY2xpY2sgPCAwKQotCXsKLQkgICAgcmVncy54LmF4ID0gMzsKLQkgICAgaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsJICAgIC8qIGNoZWNrIG1vdXNlIHN0YXR1cyAqLwotCQkvKiBvbmx5IHJlY29nbml6ZSBidXR0b24tZG93biBhbmQgYnV0dG9uLXVwIGV2ZW50ICovCi0JICAgIHggPSByZWdzLnguY3ggLyBtb3VzZV94X2RpdjsKLQkgICAgeSA9IHJlZ3MueC5keCAvIG1vdXNlX3lfZGl2OwotCSAgICBpZiAoKG9sZF9zdGF0dXMgPT0gMCkgIT0gKHJlZ3MueC5ieCA9PSAwKSkKLQkgICAgewotCQlpZiAob2xkX3N0YXR1cykJLyogYnV0dG9uIHVwICovCi0JCSAgICBtb3VzZV9jbGljayA9IE1PVVNFX1JFTEVBU0U7Ci0JCWVsc2UJCQkvKiBidXR0b24gZG93biAqLwotCQl7Ci0JCSAgICAvKgotCQkgICAgICogVHJhbnNsYXRlIE1TRE9TIG1vdXNlIGV2ZW50cyB0byBWaW0gbW91c2UgZXZlbnRzLgotCQkgICAgICogVE9ETzogc2hvdWxkIGhhbmRsZSBtaWRkbGUgbW91c2UgYnV0dG9uLCBieSBwcmVzc2luZwotCQkgICAgICogbGVmdCBhbmQgcmlnaHQgYXQgdGhlIHNhbWUgdGltZS4KLQkJICAgICAqLwotCQkgICAgaWYgKHJlZ3MueC5ieCAmIE1TRE9TX01PVVNFX0xFRlQpCi0JCQltb3VzZV9jbGljayA9IE1PVVNFX0xFRlQ7Ci0JCSAgICBlbHNlIGlmIChyZWdzLnguYnggJiBNU0RPU19NT1VTRV9SSUdIVCkKLQkJCW1vdXNlX2NsaWNrID0gTU9VU0VfUklHSFQ7Ci0JCSAgICBlbHNlIGlmIChyZWdzLnguYnggJiBNU0RPU19NT1VTRV9NSURETEUpCi0JCQltb3VzZV9jbGljayA9IE1PVVNFX01JRERMRTsKLQotCQkgICAgLyoKLQkJICAgICAqIEZpbmQgb3V0IGlmIHRoaXMgaXMgYSBtdWx0aS1jbGljawotCQkgICAgICovCi0JCSAgICBjbGlja3RpbWUgPSBiaW9zdGltZSgwLCAwTCk7Ci0JCSAgICBpZiAobW91c2VfY2xpY2tfeCA9PSB4ICYmIG1vdXNlX2NsaWNrX3kgPT0geQotCQkJICAgICYmIG1vdXNlX3RvcGxpbmUgPT0gY3Vyd2luLT53X3RvcGxpbmUKLSNpZmRlZiBGRUFUX0RJRkYKLQkJCSAgICAmJiBtb3VzZV90b3BmaWxsID09IGN1cndpbi0+d190b3BmaWxsCi0jZW5kaWYKLQkJCSAgICAmJiBtb3VzZV9jbGlja19jb3VudCAhPSA0Ci0JCQkgICAgJiYgbW91c2VfY2xpY2sgPT0gbW91c2VfbGFzdF9jbGljawotCQkJICAgICYmIGNsaWNrdGltZSA8IG1vdXNlX2NsaWNrX3RpbWUKLQkJCQkJCQkrIHBfbW91c2V0IC8gQklPU1RJQ0spCi0JCQkrK21vdXNlX2NsaWNrX2NvdW50OwotCQkgICAgZWxzZQotCQkJbW91c2VfY2xpY2tfY291bnQgPSAxOwotCQkgICAgbW91c2VfY2xpY2tfdGltZSA9IGNsaWNrdGltZTsKLQkJICAgIG1vdXNlX2xhc3RfY2xpY2sgPSBtb3VzZV9jbGljazsKLQkJICAgIG1vdXNlX2NsaWNrX3ggPSB4OwotCQkgICAgbW91c2VfY2xpY2tfeSA9IHk7Ci0JCSAgICBtb3VzZV90b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7Ci0jaWZkZWYgRkVBVF9ESUZGCi0JCSAgICBtb3VzZV90b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7Ci0jZW5kaWYKLQkJICAgIFNFVF9OVU1fTU9VU0VfQ0xJQ0tTKG1vdXNlX2NsaWNrLCBtb3VzZV9jbGlja19jb3VudCk7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIGlmIChvbGRfc3RhdHVzICYmICh4ICE9IG1vdXNlX3ggfHwgeSAhPSBtb3VzZV95KSkKLQkJbW91c2VfY2xpY2sgPSBNT1VTRV9EUkFHOwotCSAgICBvbGRfc3RhdHVzID0gcmVncy54LmJ4OwotCSAgICBpZiAobW91c2VfaGlkZGVuICYmIG1vdXNlX3ggPj0gMCAmJiAobW91c2VfeCAhPSB4IHx8IG1vdXNlX3kgIT0geSkpCi0JICAgIHsKLQkJbW91c2VfaGlkZGVuID0gRkFMU0U7Ci0JCXNob3dfbW91c2UoVFJVRSk7Ci0JICAgIH0KLQkgICAgbW91c2VfeCA9IHg7Ci0JICAgIG1vdXNlX3kgPSB5OwotCX0KLSNlbmRpZgotCi0JaWYgKChwX2NvbnNrID8gY29uc19rYmhpdCgpCi0JCQkJIDogcF9iaW9zayA/IGJpb3NrZXkoYmlvc2tleV9yZWFkeSkgOiBrYmhpdCgpKQotCQl8fCBjYnJrX3ByZXNzZWQKLSNpZmRlZiBGRUFUX01PVVNFCi0JCQkJCQkgICAgfHwgbW91c2VfY2xpY2sgPj0gMAotI2VuZGlmCi0JCSkKLQkgICAgcmV0dXJuIFRSVUU7Ci0JLyoKLQkgKiBVc2UgYmlvc3RpbWUoKSB0byB3YWl0IHVudGlsIG91ciB0aW1lIGlzIGRvbmUuCi0JICogV2UgYnVzeS13YWl0IGhlcmUuICBVbmZvcnR1bmF0ZWx5LCBkZWxheSgpIGFuZCB1c2xlZXAoKSBoYXZlIGJlZW4KLQkgKiByZXBvcnRlZCB0byBnaXZlIHByb2JsZW1zIHdpdGggdGhlIG9yaWdpbmFsIFdpbmRvd3MgOTUuICBUaGlzIGlzCi0JICogZml4ZWQgaW4gc2VydmljZSBwYWNrIDEsIGJ1dCBub3QgZXZlcnlib2R5IGluc3RhbGxlZCB0aGF0LgotCSAqIFRoZSBESkdQUCBpbXBsZW1lbnRhdGlvbiBvZiB1c2xlZXAoKSB1c2VzIGEgYnVzeS13YWl0IGxvb3AgdG9vLgotCSAqLwotCWlmIChtc2VjID09IDAgfHwgKG1zZWMgIT0gRk9SRVZFUgotCQkJICAgICYmIGJpb3N0aW1lKDAsIDBMKSA+IHN0YXJ0dGltZSArIG1zZWMgLyBCSU9TVElDSykpCi0JICAgIGJyZWFrOwotCi0jaWZkZWYgREpHUFAKLQkvKiBZaWVsZCB0aGUgQ1BVIHRvIHRoZSBuZXh0IHByb2Nlc3MuICovCi0JX19kcG1pX3lpZWxkKCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKgotICogZG9uJ3QgZG8gYW55dGhpbmcgZm9yIGFib3V0ICJtc2VjIiBtc2VjCi0gKi8KLSAgICB2b2lkCi1tY2hfZGVsYXkoCi0gICAgbG9uZwltc2VjLAotICAgIGludAkJaWdub3JlaW5wdXQpCi17Ci0gICAgbG9uZwlzdGFydHRpbWU7Ci0KLSAgICBpZiAoaWdub3JlaW5wdXQpCi0gICAgewotCS8qCi0JICogV2UgYnVzeS13YWl0IGhlcmUuICBVbmZvcnR1bmF0ZWx5LCBkZWxheSgpIGFuZCB1c2xlZXAoKSBoYXZlIGJlZW4KLQkgKiByZXBvcnRlZCB0byBnaXZlIHByb2JsZW1zIHdpdGggdGhlIG9yaWdpbmFsIFdpbmRvd3MgOTUuICBUaGlzIGlzCi0JICogZml4ZWQgaW4gc2VydmljZSBwYWNrIDEsIGJ1dCBub3QgZXZlcnlib2R5IGluc3RhbGxlZCB0aGF0LgotCSAqLwotCXN0YXJ0dGltZSA9IGJpb3N0aW1lKDAsIDBMKTsKLQl3aGlsZSAoYmlvc3RpbWUoMCwgMEwpIDwgc3RhcnR0aW1lICsgbXNlYyAvIEJJT1NUSUNLKQotCSAgICA7Ci0gICAgfQotICAgIGVsc2UKLQlXYWl0Rm9yQ2hhcihtc2VjKTsKLX0KLQotLyoKLSAqIG1jaF93cml0ZSgpOiB3cml0ZSB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc2NyZWVuCi0gKi8KLSAgICB2b2lkCi1tY2hfd3JpdGUoCi0gICAgY2hhcl91CSpzLAotICAgIGludAkJbGVuKQotewotICAgIGNoYXJfdQkqcDsKLSAgICBpbnQJCXJvdywgY29sOwotCi0gICAgaWYgKHRlcm1fY29uc29sZSAmJiBmdWxsX3NjcmVlbikKLQl3aGlsZSAobGVuLS0pCi0JewotCSAgICAvKiB0cmFuc2xhdGUgRVNDIHwgc2VxdWVuY2VzIGludG8gYmlvcyBjYWxscyAqLwotCSAgICBpZiAocF93ZCkJICAgIC8qIHRlc3Rpbmc6IHdhaXQgYSBiaXQgZm9yIGVhY2ggY2hhciAqLwotCQlXYWl0Rm9yQ2hhcihwX3dkKTsKLQotCSAgICBpZiAoc1swXSA9PSAnXG4nKQotI2lmZGVmIERKR1BQCi0JICAgIHsKLQkJbXlmbHVzaCgpOwotCQlTX2lDdXJyZW50Q29sdW1uID0gU19pTGVmdCAtIDE7Ci0JICAgIH0KLSNlbHNlCi0JCW15cHV0Y2goJ1xyJyk7Ci0jZW5kaWYKLQkgICAgZWxzZSBpZiAoc1swXSA9PSBFU0MgJiYgbGVuID4gMSAmJiBzWzFdID09ICd8JykKLQkgICAgewotCQlzd2l0Y2ggKHNbMl0pCi0JCXsKLSNpZmRlZiBESkdQUAotCQljYXNlICdCJzogICBTY3JlZW5WaXN1YWxCZWxsKCk7Ci0JCQkgICAgZ290byBnb3QzOwotI2VuZGlmCi0JCWNhc2UgJ0onOgotI2lmZGVmIERKR1BQCi0JCQkgICAgbXlmbHVzaCgpOwotI2VuZGlmCi0JCQkgICAgbXljbHJzY3IoKTsKLQkJCSAgICBnb3RvIGdvdDM7Ci0KLQkJY2FzZSAnSyc6Ci0jaWZkZWYgREpHUFAKLQkJCSAgICBteWZsdXNoKCk7Ci0jZW5kaWYKLQkJCSAgICBteWNscmVvbCgpOwotCQkJICAgIGdvdG8gZ290MzsKLQotCQljYXNlICdMJzoKLSNpZmRlZiBESkdQUAotCQkJICAgIG15Zmx1c2goKTsKLSNlbmRpZgotCQkJICAgIG15aW5zbGluZSgpOwotCQkJICAgIGdvdG8gZ290MzsKLQotCQljYXNlICdNJzoKLSNpZmRlZiBESkdQUAotCQkJICAgIG15Zmx1c2goKTsKLSNlbmRpZgotCQkJICAgIG15ZGVsbGluZSgpOwotZ290MzoJCQkgICAgcyArPSAzOwotCQkJICAgIGxlbiAtPSAyOwotCQkJICAgIGNvbnRpbnVlOwotCi0JCWNhc2UgJzAnOgotCQljYXNlICcxJzoKLQkJY2FzZSAnMic6Ci0JCWNhc2UgJzMnOgotCQljYXNlICc0JzoKLQkJY2FzZSAnNSc6Ci0JCWNhc2UgJzYnOgotCQljYXNlICc3JzoKLQkJY2FzZSAnOCc6Ci0JCWNhc2UgJzknOiAgIHAgPSBzICsgMjsKLQkJCSAgICByb3cgPSBteWdldGRpZ2l0cygmcCk7ICAgIC8qIG5vIGNoZWNrIGZvciBsZW5ndGghICovCi0JCQkgICAgaWYgKHAgPiBzICsgbGVuKQotCQkJCWJyZWFrOwotCQkJICAgIGlmICgqcCA9PSAnOycpCi0JCQkgICAgewotCQkJCSsrcDsKLQkJCQljb2wgPSBteWdldGRpZ2l0cygmcCk7IC8qIG5vIGNoZWNrIGZvciBsZW5ndGghICovCi0JCQkJaWYgKHAgPiBzICsgbGVuKQotCQkJCSAgICBicmVhazsKLQkJCQlpZiAoKnAgPT0gJ0gnIHx8ICpwID09ICdyJyB8fCAqcCA9PSAnVicpCi0JCQkJewotI2lmZGVmIERKR1BQCi0JCQkJICAgIG15Zmx1c2goKTsKLSNlbmRpZgotCQkJCSAgICBpZiAoKnAgPT0gJ0gnKSAgLyogc2V0IGN1cnNvciBwb3NpdGlvbiAqLwotCQkJCQlteWdvdG94eShjb2wsIHJvdyk7Ci0JCQkJICAgIGVsc2UgaWYgKCpwID09ICdWJykKLQkJCQkJbXl3aW5kb3cocm93LCBTX2lUb3AsIGNvbCwgU19pQm90dG9tKTsKLQkJCQkgICAgZWxzZQkgICAgLyogc2V0IHNjcm9sbCByZWdpb24gICovCi0JCQkJCW15d2luZG93KFNfaUxlZnQsIHJvdywgU19pUmlnaHQsIGNvbCk7Ci0JCQkJICAgIGxlbiAtPSBwIC0gczsKLQkJCQkgICAgcyA9IHAgKyAxOwotCQkJCSAgICBjb250aW51ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICAgIGVsc2UgaWYgKCpwID09ICdtJyB8fCAqcCA9PSAnZicgfHwgKnAgPT0gJ2InKQotCQkJICAgIHsKLQkJCQlpZiAoKnAgPT0gJ20nKQkgICAgLyogc2V0IGNvbG9yICovCi0JCQkJewotCQkJCSAgICBpZiAocm93ID09IDApCi0JCQkJCW15bm9ybXZpZGVvKCk7LyogcmVzZXQgY29sb3IgKi8KLQkJCQkgICAgZWxzZQotCQkJCQlteXRleHRhdHRyKHJvdyk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCpwID09ICdmJykgLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KLQkJCQkgICAgbXl0ZXh0Y29sb3Iocm93KTsKLQkJCQllbHNlCQkgICAgLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KLQkJCQkgICAgbXl0ZXh0YmFja2dyb3VuZChyb3cpOwotCi0JCQkJbGVuIC09IHAgLSBzOwotCQkJCXMgPSBwICsgMTsKLQkJCQljb250aW51ZTsKLQkJCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgICBteXB1dGNoKCpzKyspOwotCX0KLSAgICBlbHNlCi0gICAgewotCXdyaXRlKDEsIHMsICh1bnNpZ25lZClsZW4pOwotICAgIH0KLX0KLQotLyoKLSAqIG1jaF9pbmNoYXIoKTogbG93IGxldmVsIGlucHV0IGZ1bmN0aW9uLgotICogR2V0IGEgY2hhcmFjdGVycyBmcm9tIHRoZSBrZXlib2FyZC4KLSAqIElmIHRpbWUgPT0gMCBkbyBub3Qgd2FpdCBmb3IgY2hhcmFjdGVycy4KLSAqIElmIHRpbWUgPT0gbiB3YWl0IGEgc2hvcnQgdGltZSBmb3IgY2hhcmFjdGVycy4KLSAqIElmIHRpbWUgPT0gLTEgd2FpdCBmb3JldmVyIGZvciBjaGFyYWN0ZXJzLgotICoKLSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2J0YWluZWQKLSAqLwotICAgIGludAotbWNoX2luY2hhcigKLSAgICBjaGFyX3UJKmJ1ZiwKLSAgICBpbnQJCW1heGxlbiwKLSAgICBsb25nCXRpbWUsCi0gICAgaW50CQl0Yl9jaGFuZ2VfY250KQotewotICAgIGludAkJbGVuID0gMDsKLSAgICBpbnQJCWM7Ci0gICAgaW50CQl0bXBfYzsKLSAgICBzdGF0aWMgaW50CW5leHRjaGFyID0gMDsJICAgIC8qIG1heSBrZWVwIGNoYXJhY3RlciB3aGVuIG1heGxlbiA9PSAxICovCi0KLSAgICAvKgotICAgICAqIGlmIHdlIGdvdCBhIGN0cmwtQyB3aGVuIHdlIHdlcmUgYnVzeSwgdGhlcmUgd2lsbCBiZSBhICJeQyIgc29tZXdoZXJlCi0gICAgICogb24gdGhlIHNjcmVlbiwgc28gd2UgbmVlZCB0byByZWRpc3BsYXkgaXQuCi0gICAgICovCi0gICAgaWYgKGRlbGF5ZWRfcmVkcmF3KQotICAgIHsKLQlkZWxheWVkX3JlZHJhdyA9IEZBTFNFOwotCXVwZGF0ZV9zY3JlZW4oQ0xFQVIpOwotCXNldGN1cnNvcigpOwotCW91dF9mbHVzaCgpOwotICAgIH0KLQotICAgIC8qIHJldHVybiByZW1haW5pbmcgY2hhcmFjdGVyIGZyb20gbGFzdCBjYWxsICovCi0gICAgaWYgKG5leHRjaGFyKQotICAgIHsKLQkqYnVmID0gbmV4dGNoYXI7Ci0JbmV4dGNoYXIgPSAwOwotCXJldHVybiAxOwotICAgIH0KLQotI2lmZGVmIEZFQVRfTU9VU0UKLSAgICBpZiAodGltZSAhPSAwKQotCXNob3dfbW91c2UoVFJVRSk7Ci0jZW5kaWYKLSNpZmRlZiBESkdQUAotICAgIHNldF9zeXNfY3Vyc29yKCk7Ci0jZW5kaWYKLSAgICBpZiAodGltZSA+PSAwKQotICAgIHsKLQlpZiAoV2FpdEZvckNoYXIodGltZSkgPT0gMCkJLyogbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSAqLwotCXsKLSNpZmRlZiBGRUFUX01PVVNFCi0JICAgIHNob3dfbW91c2UoRkFMU0UpOwotI2VuZGlmCi0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci0gICAgZWxzZSAgICAvKiB0aW1lID09IC0xICovCi0gICAgewotCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF2YWlsYWJsZSB3aXRoaW4gMiBzZWNvbmRzIChkZWZhdWx0KQotCSAqIHdyaXRlIHRoZSBhdXRvc2NyaXB0IGZpbGUgdG8gZGlzay4gIE9yIGNhdXNlIHRoZSBDdXJzb3JIb2xkIGV2ZW50Ci0JICogdG8gYmUgdHJpZ2dlcmVkLgotCSAqLwotCWlmIChXYWl0Rm9yQ2hhcihwX3V0KSA9PSAwKQotCXsKLSNpZmRlZiBGRUFUX0FVVE9DTUQKLQkgICAgaWYgKHRyaWdnZXJfY3Vyc29yaG9sZCgpICYmIG1heGxlbiA+PSAzKQotCSAgICB7Ci0JCWJ1ZlswXSA9IEtfU1BFQ0lBTDsKLQkJYnVmWzFdID0gS1NfRVhUUkE7Ci0JCWJ1ZlsyXSA9IChpbnQpS0VfQ1VSU09SSE9MRDsKLQkJcmV0dXJuIDM7Ci0JICAgIH0KLSNlbmRpZgotCSAgICBiZWZvcmVfYmxvY2tpbmcoKTsKLQl9Ci0gICAgfQotICAgIFdhaXRGb3JDaGFyKEZPUkVWRVIpOwkvKiB3YWl0IGZvciBrZXkgb3IgbW91c2UgY2xpY2sgKi8KLQotLyoKLSAqIFRyeSB0byByZWFkIGFzIG1hbnkgY2hhcmFjdGVycyBhcyB0aGVyZSBhcmUsIHVudGlsIHRoZSBidWZmZXIgaXMgZnVsbC4KLSAqLwotICAgIC8qCi0gICAgICogd2Ugd2lsbCBnZXQgYXQgbGVhc3Qgb25lIGtleS4gR2V0IG1vcmUgaWYgdGhleSBhcmUgYXZhaWxhYmxlCi0gICAgICogQWZ0ZXIgYSBjdHJsLWJyZWFrIHdlIGhhdmUgdG8gcmVhZCBhIDAgKCEpIGZyb20gdGhlIGJ1ZmZlci4KLSAgICAgKiBiaW9za2V5KDEpIHdpbGwgcmV0dXJuIDAgaWYgbm8ga2V5IGlzIGF2YWlsYWJsZSBhbmQgd2hlbiBhCi0gICAgICogY3RybC1icmVhayB3YXMgdHlwZWQuIFdoZW4gY3RybC1icmVhayBpcyBoaXQsIHRoaXMgZG9lcyBub3QgYWx3YXlzCi0gICAgICogaW1wbGllcyBhIGtleSBoaXQuCi0gICAgICovCi0gICAgY2Jya19wcmVzc2VkID0gRkFMU0U7Ci0jaWZkZWYgRkVBVF9NT1VTRQotICAgIGlmIChtb3VzZV9jbGljayA+PSAwICYmIG1heGxlbiA+PSA1KQotICAgIHsKLQlsZW4gPSA1OwotCSpidWYrKyA9IEVTQyArIDEyODsKLQkqYnVmKysgPSAnTSc7Ci0JKmJ1ZisrID0gbW91c2VfY2xpY2s7Ci0JKmJ1ZisrID0gbW91c2VfeCArICchJzsKLQkqYnVmKysgPSBtb3VzZV95ICsgJyEnOwotCW1vdXNlX2NsaWNrID0gLTE7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSNpZmRlZiBGRUFUX01PVVNFCi0JbW91c2VfaGlkZGVuID0gVFJVRTsKLSNlbmRpZgotCWlmIChwX2Jpb3NrICYmICFwX2NvbnNrKQotCXsKLQkgICAgd2hpbGUgKChsZW4gPT0gMCB8fCBiaW9za2V5KGJpb3NrZXlfcmVhZHkpKSAmJiBsZW4gPCBtYXhsZW4pCi0JICAgIHsKLQkJYyA9IHRyYW5zbGF0ZV9hbHRrZXlzKGJpb3NrZXkoYmlvc2tleV9yZWFkKSk7IC8qIGdldCB0aGUga2V5ICovCi0JCS8qCi0JCSAqIHRyYW5zbGF0ZSBhIGZldyB0aGluZ3MgZm9yIGluY2hhcigpOgotCQkgKiAweDAwMDAgPT0gQ1RSTC1icmVhawkJLT4gMwkoQ1RSTC1DKQotCQkgKiAweDAzMDAgPT0gQ1RSTC1ACQktPiBOVUwKLQkJICogMHhubjAwID09IGV4dGVuZGVkIGtleSBjb2RlCS0+IEtfTlVMLCBubgotCQkgKiAweG5uZTAgPT0gZW5oYW5jZWQga2V5Ym9hcmQJLT4gS19OVUwsIG5uCi0JCSAqIEtfTlVMCQkJLT4gS19OVUwsIDMKLQkJICovCi0JCWlmIChjID09IDApCi0JCSAgICBjID0gMzsKLQkJZWxzZSBpZiAoYyA9PSAweDAzMDApCi0JCSAgICBjID0gTlVMOwotCQllbHNlIGlmICgoYyAmIDB4ZmYpID09IDAKLQkJCXx8IGMgPT0gS19OVUwKLQkJCXx8IGMgPT0gMHg0ZTJiCi0JCQl8fCBjID09IDB4NGEyZAotCQkJfHwgYyA9PSAweDM3MmEKLQkJCXx8ICgoYyAmIDB4ZmYpID09IDB4ZTAgJiYgYyAhPSAweGUwKSkKLQkJewotCQkgICAgaWYgKGMgPT0gS19OVUwpCi0JCQljID0gMzsKLQkJICAgIGVsc2UKLQkJCWMgPj49IDg7Ci0JCSAgICAqYnVmKysgPSBLX05VTDsKLQkJICAgICsrbGVuOwotCQl9Ci0KLQkJaWYgKGxlbiA8IG1heGxlbikKLQkJewotCQkgICAgKmJ1ZisrID0gYzsKLQkJICAgIGxlbisrOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJICAgIC8qIENvbnZlcnQgZnJvbSAndGVybWVuY29kaW5nJyB0byAnZW5jb2RpbmcnLiBPbmx5Ci0JCSAgICAgKiB0cmFuc2xhdGUgbm9ybWFsIGNoYXJhY3RlcnMsIG5vdCBrZXkgY29kZXMuICovCi0JCSAgICBpZiAoaW5wdXRfY29udi52Y190eXBlICE9IENPTlZfTk9ORQotCQkJCQkgICAgJiYgKGxlbiA9PSAxIHx8IGJ1ZlstMl0gIT0gS19OVUwpKQotCQkJbGVuICs9IGNvbnZlcnRfaW5wdXQoYnVmIC0gMSwgMSwgbWF4bGVuIC0gbGVuICsgMSkgLSAxOwotI2VuZGlmCi0JCX0KLQkJZWxzZQotCQkgICAgbmV4dGNoYXIgPSBjOwotCSAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHdoaWxlICgobGVuID09IDAgfHwgKHBfY29uc2sgPyBjb25zX2tiaGl0KCkgOiBrYmhpdCgpKSkKLQkJICAgICYmIGxlbiA8IG1heGxlbikKLQkgICAgewotCQlzd2l0Y2ggKGMgPSAocF9jb25zayA/IGNvbnNfZ2V0Y2goKSA6IGdldGNoKCkpKQotCQl7Ci0JCSAgICBjYXNlIDA6Ci0JCQkvKiBOVUwgbWVhbnMgdGhhdCB0aGVyZSBpcyBhbm90aGVyIGNoYXJhY3Rlci4KLQkJCSAqIEdldCBpdCBpbW1lZGlhdGVseSwgYmVjYXVzZSBrYmhpdCgpIGRvZXNuJ3QgYWx3YXlzCi0JCQkgKiByZXR1cm4gVFJVRSBmb3IgdGhlIHNlY29uZCBjaGFyYWN0ZXIuCi0JCQkgKi8KLQkJCWlmIChwX2NvbnNrKQotCQkJICAgIGMgPSBjb25zX2dldGNoKCk7Ci0JCQllbHNlCi0JCQkgICAgYyA9IGdldGNoKCk7Ci0JCQl0bXBfYyA9IHRyYW5zbGF0ZV9hbHRrZXlzKGMgPDwgOCk7Ci0JCQlpZiAodG1wX2MgPT0gKGMgPDwgOCkpCi0JCQl7Ci0JCQkgICAgKmJ1ZisrID0gS19OVUw7Ci0JCQkgICAgKytsZW47Ci0JCQl9Ci0JCQllbHNlCi0JCQkgICAgYyA9IHRtcF9jOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIEtfTlVMOgotCQkJKmJ1ZisrID0gS19OVUw7Ci0JCQkrK2xlbjsKLQkJCWMgPSAzOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIDM6Ci0JCQljYnJrX3ByZXNzZWQgPSBUUlVFOwotCQkJLypGQUxMVEhST1VHSCovCi0JCSAgICBkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGxlbiA8IG1heGxlbikKLQkJewotCQkgICAgKmJ1ZisrID0gYzsKLQkJICAgICsrbGVuOwotCQl9Ci0JCWVsc2UKLQkJICAgIG5leHRjaGFyID0gYzsKLQkgICAgfQotCX0KLSAgICB9Ci0jaWZkZWYgRkVBVF9NT1VTRQotICAgIHNob3dfbW91c2UoRkFMU0UpOwotI2VuZGlmCi0KLSAgICBiZWVwX2NvdW50ID0gMDsJICAgIC8qIG1heSBiZWVwIGFnYWluIG5vdyB0aGF0IHdlIGdvdCBzb21lIGNoYXJzICovCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotLyoKLSAqIHJldHVybiBub24temVybyBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKLSAqLwotICAgIGludAotbWNoX2NoYXJfYXZhaWwodm9pZCkKLXsKLSAgICByZXR1cm4gV2FpdEZvckNoYXIoMEwpOwotfQotCi0jaWZkZWYgREpHUFAKLSMgZGVmaW5lIElOVF9BUkcgICAgaW50Ci0jZWxzZQotIyBkZWZpbmUgSU5UX0FSRwotI2VuZGlmCi0KLS8qCi0gKiBmdW5jdGlvbiBmb3IgY3RybC1icmVhayBpbnRlcnJ1cHQKLSAqLwotICAgIHN0YXRpYyB2b2lkIGludGVycnVwdAotI2lmZGVmIERKR1BQCi1jYXRjaF9jYnJrKGludCBhKQotI2Vsc2UKLWNhdGNoX2Nicmsodm9pZCkKLSNlbmRpZgotewotICAgIGNicmtfcHJlc3NlZCA9IFRSVUU7Ci0gICAgY3RybGNfcHJlc3NlZCA9IFRSVUU7Ci19Ci0KLSNpZm5kZWYgREpHUFAKLS8qCi0gKiBjdHJsLWJyZWFrIGhhbmRsZXIgZm9yIERPUy4gTmV2ZXIgY2FsbGVkIHdoZW4gYSBjdHJsLWJyZWFrIGlzIHR5cGVkLCBiZWNhdXNlCi0gKiB3ZSBjYXRjaCBpbnRlcnJ1cHQgMWIuIElmIHlvdSB0eXBlIGN0cmwtQyB3aGlsZSBWaW0gaXMgd2FpdGluZyBmb3IgYQotICogY2hhcmFjdGVyIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhbGxlZC4gV2hlbiBhIGN0cmwtQyBpcyB0eXBlZCB3aGlsZSBWaW0gaXMKLSAqIGJ1c3kgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkLiBCeSB0aGF0IHRpbWUgYSBeQyBoYXMgYmVlbiBkaXNwbGF5ZWQgb24KLSAqIHRoZSBzY3JlZW4sIHNvIHdlIGhhdmUgdG8gcmVkaXNwbGF5IHRoZSBzY3JlZW4uIFdlIGNhbid0IGRvIHRoYXQgaGVyZSwKLSAqIGJlY2F1c2Ugd2UgbWF5IGJlIGNhbGxlZCBieSBET1MuIFRoZSByZWRyYXcgaXMgaW4gbWNoX2luY2hhcigpLgotICovCi0gICAgc3RhdGljIGludCBfY2RlY2wKLWNicmtfaGFuZGxlcih2b2lkKQotewotICAgIGRlbGF5ZWRfcmVkcmF3ID0gVFJVRTsKLSAgICByZXR1cm4gMTsJCSAgICAvKiByZXN1bWUgb3BlcmF0aW9uIGFmdGVyIGN0cmwtYnJlYWsgKi8KLX0KLQotLyoKLSAqIGZ1bmN0aW9uIGZvciBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQKLSAqIEZvciBET1MgMSBhbmQgMiByZXR1cm4gMCAoSWdub3JlKS4KLSAqIEZvciBET1MgMyBhbmQgbGF0ZXIgcmV0dXJuIDMgKEZhaWwpCi0gKi8KLSAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQKLWNhdGNoX2NpbnQoCi0gICAgdW5zaWduZWQgYnAsCi0gICAgdW5zaWduZWQgZGksCi0gICAgdW5zaWduZWQgc2ksCi0gICAgdW5zaWduZWQgZHMsCi0gICAgdW5zaWduZWQgZXMsCi0gICAgdW5zaWduZWQgZHgsCi0gICAgdW5zaWduZWQgY3gsCi0gICAgdW5zaWduZWQgYngsCi0gICAgdW5zaWduZWQgYXgpCi17Ci0gICAgYXggPSAoYXggJiAweGZmMDApOwkgICAgLyogc2V0IEFMIHRvIDAgKi8KLSAgICBpZiAoX29zbWFqb3IgPj0gMykKLQlheCB8PSAzOwkgICAgLyogc2V0IEFMIHRvIDMgKi8KLX0KLSNlbmRpZgotCi0vKgotICogU2V0IHRoZSBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgdXNlIHdpdGggVmltIG9uIG9yIG9mZi4KLSAqIG9uID09IFRSVUUgbWVhbnMgYXMgdXNlZCB3aXRoaW4gVmltCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotc2V0X2ludGVycnVwdHMoaW50IG9uKQotewotICAgIHN0YXRpYyBpbnQgc2F2ZWRfY2JyazsKLSNpZm5kZWYgREpHUFAKLSAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQgKCpvbGRfY2ludCkoKTsKLSNlbmRpZgotICAgIHN0YXRpYyB2b2lkIGludGVycnVwdCAoKm9sZF9jYnJrKShJTlRfQVJHKTsKLQotICAgIGlmIChvbikKLSAgICB7Ci0Jc2F2ZWRfY2JyayA9IGdldGNicmsoKTsJCS8qIHNhdmUgb2xkIGN0cmwtYnJlYWsgc2V0dGluZyAqLwotCXNldGNicmsoMCk7CQkJLyogZG8gbm90IGNoZWNrIGZvciBjdHJsLWJyZWFrICovCi0jaWZkZWYgREpHUFAKLQlvbGRfY2JyayA9IHNpZ25hbChTSUdJTlQsIGNhdGNoX2NicmspOwkvKiBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQgKi8KLSNlbHNlCi0Jb2xkX2NpbnQgPSBnZXR2ZWN0KDB4MjQpOwkvKiBzYXZlIG9sZCBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQgKi8KLQlzZXR2ZWN0KDB4MjQsIGNhdGNoX2NpbnQpOwkvKiBpbnN0YWxsIG91ciBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQgKi8KLQlvbGRfY2JyayA9IGdldHZlY3QoMHgxQik7CS8qIHNhdmUgb2xkIGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCi0Jc2V0dmVjdCgweDFCLCBjYXRjaF9jYnJrKTsJLyogaW5zdGFsbCBvdXIgY3RybC1icmVhayBpbnRlcnJ1cHQgKi8KLQljdHJsYnJrKGNicmtfaGFuZGxlcik7CQkvKiB2aW0ncyBjdHJsLWJyZWFrIGhhbmRsZXIgKi8KLSNlbmRpZgotCWlmICh0ZXJtX2NvbnNvbGUpCi0JICAgIG91dF9zdHIoVF9NRSk7CQkvKiBzZXQgY29sb3JzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0Jc2V0Y2JyayhzYXZlZF9jYnJrKTsJCS8qIHJlc3RvcmUgY3RybC1icmVhayBzZXR0aW5nICovCi0jaWZkZWYgREpHUFAKLQlzaWduYWwoU0lHSU5ULG9sZF9jYnJrKTsJLyogY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCi0jZWxzZQotCXNldHZlY3QoMHgyNCwgb2xkX2NpbnQpOwkvKiByZXN0b3JlIGNyaXRpY2FsIGVycm9yIGludGVycnVwdCAqLwotCXNldHZlY3QoMHgxQiwgb2xkX2NicmspOwkvKiByZXN0b3JlIGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCi0jZW5kaWYKLQkvKiByZXN0b3JlIGN0cmwtYnJlYWsgaGFuZGxlciwgaG93ID8/PyAqLwotCWlmICh0ZXJtX2NvbnNvbGUpCi0JICAgIG15bm9ybXZpZGVvKCk7CQkvKiByZXN0b3JlIHNjcmVlbiBjb2xvcnMgKi8KLSAgICB9Ci19Ci0KLS8qCi0gKiBXZSBoYXZlIG5vIGpvYiBjb250cm9sLCBmYWtlIGl0IGJ5IHN0YXJ0aW5nIGEgbmV3IHNoZWxsLgotICovCi0gICAgdm9pZAotbWNoX3N1c3BlbmQodm9pZCkKLXsKLSAgICBzdXNwZW5kX3NoZWxsKCk7Ci19Ci0KLWV4dGVybiBpbnQgX2Ztb2RlOwotCi0vKgotICogUHJlcGFyZSB3aW5kb3cgZm9yIHVzZSBieSBWaW0uCi0gKi8KLSAgICB2b2lkCi1tY2hfaW5pdCh2b2lkKQotewotICAgIHVuaW9uIFJFR1MgcmVnczsKLQotI2lmIGRlZmluZWQoREpHUFApICYmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpCi0gICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIHZpZGVvIGF0dHJpYnV0ZXMgYXQgdGhlIGN1cnNvci4gIFRoZXNlIHdpbGwgYmUgdXNlZCBhcyB0aGUKLSAgICAgKiBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0gICAgICovCi0gICAgcmVncy5oLmFoID0gMHgwODsKLSAgICByZWdzLmguYmggPSAweDAwOwkJLyogdmlkZW8gcGFnZSAwICovCi0gICAgaW50ODYoMHgxMCwgJnJlZ3MsICZyZWdzKTsKLSAgICBvcmlnX2F0dHIgPSByZWdzLmguYWg7Ci0gICAgbXlub3JtdmlkZW8oKTsKLSAgICBpZiAoY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID09IDApCi0JY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKG9yaWdfYXR0ciAmIDB4ZikgKyAxOwotICAgIGlmIChjdGVybV9ub3JtYWxfYmdfY29sb3IgPT0gMCkKLQljdGVybV9ub3JtYWxfYmdfY29sb3IgPSAoKG9yaWdfYXR0ciA+PiA0KSAmIDB4ZikgKyAxOwotCi0gICAgdGVybV9jb25zb2xlID0gVFJVRTsgICAgLyogYXNzdW1lIHVzaW5nIHRoZSBjb25zb2xlIGZvciB0aGUgdGhpbmdzIGhlcmUgKi8KLSAgICBfZm1vZGUgPSBPX0JJTkFSWTsJICAgIC8qIHdlIGRvIG91ciBvd24gQ1ItTEYgdHJhbnNsYXRpb24gKi8KLSAgICBvdXRfZmx1c2goKTsKLSAgICBzZXRfaW50ZXJydXB0cyhUUlVFKTsgICAvKiBjYXRjaCBpbnRlcnJ1cHRzICovCi0KLSNpZmRlZiBESkdQUAotICAgIC8qCi0gICAgICogVXNlIExvbmcgRmlsZSBOYW1lcyBieSBkZWZhdWx0LCBpZiAkTEZOIG5vdCBzZXQuCi0gICAgICovCi0gICAgaWYgKGdldGVudigiTEZOIikgPT0gTlVMTCkKLQlwdXRlbnYoIkxGTj15Iik7Ci0KLSAgICBnZXRfc2NyZWVuYmFzZSgpOwotI2VuZGlmCi0KLSNpZmRlZiBGRUFUX01PVVNFCi0vKiBmaW5kIG91dCBpZiBhIE1TIGNvbXBhdGlibGUgbW91c2UgaXMgYXZhaWxhYmxlICovCi0gICAgcmVncy54LmF4ID0gMDsKLSAgICAodm9pZClpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwotICAgIG1vdXNlX2F2YWlsID0gcmVncy54LmF4OwotICAgIC8qIGJlc3QgZ3Vlc3MgZm9yIG1vdXNlIGNvb3JkaW5hdGUgY29tcHV0YXRpb25zICovCi0gICAgbWNoX2dldF9zaGVsbHNpemUoKTsKLSAgICBpZiAoQ29sdW1ucyA8PSA0MCkKLQltb3VzZV94X2RpdiA9IDE2OwotICAgIGlmIChSb3dzID09IDMwKQotCW1vdXNlX3lfZGl2ID0gMTY7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogVHJ5IHN3aXRjaGluZyB0byAxNiBjb2xvcnMgZm9yIGJhY2tncm91bmQsIGluc3RlYWQgb2YgOCBjb2xvcnMgYW5kCi0gICAgICogYmxpbmtpbmcuICBEb2VzIHRoaXMgYWx3YXlzIHdvcms/ICBDYW4gdGhlIG9sZCB2YWx1ZSBiZSByZXN0b3JlZD8KLSAgICAgKi8KLSAgICByZWdzLnguYXggPSAweDEwMDM7Ci0gICAgcmVncy5oLmJsID0gMHgwMDsKLSAgICByZWdzLmguYmggPSAweDAwOwotICAgIGludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7Ci0KLSAgICAvKgotICAgICAqIFRlc3QgaWYgd2UgaGF2ZSBhbiBlbmhhbmNlZCBBVCBrZXlib2FyZC4gIFdyaXRlIDB4RkZGRiB0byB0aGUga2V5Ym9hcmQKLSAgICAgKiBidWZmZXIgYW5kIHRyeSB0byByZWFkIGl0IGJhY2suICBJZiB3ZSBjYW4ndCBpbiAxNiB0cmllcywgaXQncyBhbiBvbGQKLSAgICAgKiB0eXBlIFhUIGtleWJvYXJkLgotICAgICAqLwotICAgIHJlZ3MuaC5haCA9IDB4MDU7Ci0gICAgcmVncy54LmN4ID0gMHhmZmZmOwotICAgIGludDg2KDB4MTYsICZyZWdzLCAmcmVncyk7Ci0gICAgaWYgKHJlZ3MuaC5hbCAhPSAxKQkvKiBza2lwIHRoaXMgd2hlbiBrZXlib2FyZCBidWZmZXIgaXMgZnVsbCAqLwotICAgIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCXsKLQkgICAgcmVncy5oLmFoID0gMHgxMDsKLQkgICAgaW50ODYoMHgxNiwgJnJlZ3MsICZyZWdzKTsKLQkgICAgaWYgKHJlZ3MueC5heCA9PSAweGZmZmYpCi0JCWJyZWFrOwotCX0KLQlpZiAoaSA9PSAxNikJLyogMHhmZmZmIG5vdCByZWFkLCBtdXN0IGJlIG9sZCBrZXlib2FyZCAqLwotCXsKLQkgICAgYmlvc2tleV9yZWFkID0gMDsKLQkgICAgYmlvc2tleV9yZWFkeSA9IDE7Ci0JfQotICAgIH0KLQotI2lmZGVmIE1DSF9DVVJTT1JfU0hBUEUKLSAgICAvKiBTYXZlIHRoZSBvbGQgY3Vyc29yIHNoYXBlICovCi0gICAgbWNoX3Jlc3RvcmVfY3Vyc29yX3NoYXBlKEZBTFNFKTsKLSAgICAvKiBJbml0aWFsaXNlIHRoZSBjdXJzb3Igc2hhcGUgKi8KLSAgICBtY2hfdXBkYXRlX2N1cnNvcigpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERKR1BQKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQotICAgIC8qCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBpcyBhdmFpbGFibGUsIGllLiBhcmUgd2UKLSAgICAgKiBydW5uaW5nIGZyb20gYSBET1Mgc2Vzc2lvbiB3aXRoaW4gV2luZG93cy4gIE9idmlvdXNseSwgdGhlIFdpbmRvd3MKLSAgICAgKiBjbGlwYm9hcmQgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgcHVyZSBET1MuCi0gICAgICoKLSAgICAgKiBpbnQgMHgyZiwgQVggPSAweDE3MDAgaWRlbnRpZmllcyB0aGUgV2luZG93cyB2ZXJzaW9uIHdlJ3JlIHJ1bm5pbmcKLSAgICAgKiB1bmRlci4gIFVwb24gcmV0dXJuIGZyb20gdGhlIGludGVycnVwdCwgaWYgQVggaXMgdW5jaGFuZ2VkLCB3ZSdyZQotICAgICAqIHJ1bm5pbmcgdW5kZXIgcHVyZSBET1MgYW5kIG5vIFdpbmRvd3MgY2xpcGJvYXJkIGlzIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIFJlbWFyazogY291bGQgdXNlIGludDg2KCkgaGVyZSBidXQgX19kcG1pX2ludCgpIGlzIHJlY29tbWVuZGVkIGluCi0gICAgICogdGhlIERKR1BQIGRvY3MsIHNpbmNlIGludDg2KCkgZG9lc24ndCBjb3ZlciBhbGwgYXZhaWxhYmxlIGludGVycnVwdHMuCi0gICAgICovCi0gICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDA7Ci0gICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCi0JLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JZHBtaV9yZWdzLnguYXggPSAweDE3MDA7CS8qIGZvcmNlIGZhaWx1cmUgKi8KLQotICAgIGlmIChkcG1pX3JlZ3MueC5heCA9PSAweDE3MDApCS8qIG5vIGNoYW5nZSBpbiBBWD8gKi8KLQljbGlwX2luaXQoRkFMU0UpOwkJLyogbm8gY2xpcGJvYXJkIGF2YWlsYWJsZSwgdG9vIGJhZCAqLwotICAgIGVsc2UJCQkJLyogZWxzZSwgcnVubmluZyB1bmRlciBXaW5kb3dzLCBPSyAqLwotCWNsaXBfaW5pdChUUlVFKTsJCS8qIGNsaXBib2FyZCBpcyBhdmFpbGFibGUgKi8KLSNlbmRpZgotfQotCi0gICAgaW50Ci1tY2hfY2hlY2tfd2luKAotICAgIGludAkJYXJnYywKLSAgICBjaGFyCSoqYXJndikKLXsKLSAgICAvKiBzdG9yZSBhcmd2WzBdLCBtYXkgYmUgdXNlZCBmb3IgJFZJTSAqLwotICAgIGlmICgqYXJndlswXSAhPSBOVUwpCi0JZXhlX25hbWUgPSBGdWxsTmFtZV9zYXZlKChjaGFyX3UgKilhcmd2WzBdLCBGQUxTRSk7Ci0KLSAgICAvKgotICAgICAqIFRyeSB0aGUgRE9TIHNlYXJjaCBwYXRoLiAgVGhlIGV4ZWN1dGFibGUgbWF5IGluCi0gICAgICogZmFjdCBiZSBjYWxsZWQgZGlmZmVyZW50bHksIHNvIHRyeSB0aGlzIGxhc3QuCi0gICAgICovCi0gICAgaWYgKGV4ZV9uYW1lID09IE5VTEwgfHwgKmV4ZV9uYW1lID09IE5VTCkKLQlleGVfbmFtZSA9IHNlYXJjaHBhdGgoInZpbS5leGUiKTsKLQotICAgIGlmIChpc2F0dHkoMSkpCi0JcmV0dXJuIE9LOwotICAgIHJldHVybiBGQUlMOwotfQotCi0vKgotICogUmV0dXJuIFRSVUUgaWYgdGhlIGlucHV0IGNvbWVzIGZyb20gYSB0ZXJtaW5hbCwgRkFMU0Ugb3RoZXJ3aXNlLgotICovCi0gICAgaW50Ci1tY2hfaW5wdXRfaXNhdHR5KHZvaWQpCi17Ci0gICAgaWYgKGlzYXR0eShyZWFkX2NtZF9mZCkpCi0JcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0jaWYgZGVmaW5lZChVU0VfRk5BTUVfQ0FTRSkgfHwgZGVmaW5lZChQUk9UTykKLS8qCi0gKiBmbmFtZV9jYXNlKCk6IFNldCB0aGUgY2FzZSBvZiB0aGUgZmlsZSBuYW1lLCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KLSAqIFRPRE86IHNob3VsZCBleHBhbmQgc2hvcnQgdG8gbG9uZyBmaWxlIG5hbWVzLiAgTmVlZCB0byB1c2UgRE9TIGludGVycnVwdHMsCi0gKiBzZWUgREpHUFAgc291cmNlcyBsaWJjL2Rvcy9kaXIvZmluZGZpcnMuYy4KLSAqLwotICAgIHZvaWQKLWZuYW1lX2Nhc2UoY2hhcl91ICpuYW1lLCBpbnQgbGVuKQotewotICAgIGNoYXJfdQkgICAgKnRhaWw7Ci0gICAgc3RydWN0IGZmYmxrICAgIGZiOwotCi0gICAgc2xhc2hfYWRqdXN0KG5hbWUpOwotICAgIGlmIChmaW5kZmlyc3QobmFtZSwgJmZiLCAwKSA9PSAwKQotICAgIHsKLQl0YWlsID0gZ2V0dGFpbChuYW1lKTsKLQlpZiAobGVuID09IDAgPyBTVFJMRU4odGFpbCkgPT0gU1RSTEVOKGZiLmZmX25hbWUpCi0JCTogKHRhaWwgLSBuYW1lKSArIFNUUkxFTihmYi5mZl9uYW1lKSA8IGxlbikKLQkgICAgU1RSQ1BZKHRhaWwsIGZiLmZmX25hbWUpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKgotICogcmV0dXJuIHByb2Nlc3MgSUQKLSAqLwotICAgIGxvbmcKLW1jaF9nZXRfcGlkKHZvaWQpCi17Ci0gICAgcmV0dXJuIChsb25nKTA7Ci19Ci0KLS8qCi0gKiBDaGFuZ2UgZGVmYXVsdCBkcml2ZSAoanVzdCBsaWtlIF9jaGRyaXZlIG9mIEJvcmxhbmQgQyAzLjEpCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1jaGFuZ2VfZHJpdmUoaW50IGRyaXZlKQotewotICAgIHVuaW9uIFJFR1MgcmVnczsKLQotICAgIHJlZ3MuaC5haCA9IDB4MGU7Ci0gICAgcmVncy5oLmRsID0gZHJpdmUgLSAxOwotICAgIGludGRvcygmcmVncywgJnJlZ3MpOyAgIC8qIHNldCBkZWZhdWx0IGRyaXZlICovCi0gICAgcmVncy5oLmFoID0gMHgxOTsKLSAgICBpbnRkb3MoJnJlZ3MsICZyZWdzKTsgICAvKiBnZXQgZGVmYXVsdCBkcml2ZSAqLwotICAgIGlmIChyZWdzLmguYWwgPT0gZHJpdmUgLSAxKQotCXJldHVybiAwOwotICAgIHJldHVybiAtMTsKLX0KLQotLyoKLSAqIEdldCBhYnNvbHV0ZSBmaWxlIG5hbWUgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLgotICogQWxsIHNsYXNoZXMgYXJlIHJlcGxhY2VkIHdpdGggYmFja3NsYXNoZXMsIHRvIGF2b2lkIHRyb3VibGUgd2hlbiBjb21wYXJpbmcKLSAqIGZpbGUgbmFtZXMuICBXaGVuICdzaGVsbHNsYXNoJyBzZXQgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQuCi0gKgotICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQotICovCi0gICAgaW50Ci1tY2hfRnVsbE5hbWUoCi0gICAgY2hhcl91CSpmbmFtZSwKLSAgICBjaGFyX3UJKmJ1ZiwKLSAgICBpbnQJCWxlbiwKLSAgICBpbnQJCWZvcmNlKQotewotICAgIGlmICghZm9yY2UgJiYgbWNoX2lzRnVsbE5hbWUoZm5hbWUpKQkvKiBhbHJlYWR5IGV4cGFuZGVkICovCi0gICAgewotCXZpbV9zdHJuY3B5KGJ1ZiwgZm5hbWUsIGxlbiAtIDEpOwotCXNsYXNoX2FkanVzdChidWYpOwotCXJldHVybiBPSzsKLSAgICB9Ci0KLSNpZmRlZiBfX0JPUkxBTkRDX18JCS8qIE9ubHkgQm9ybGFuZCBDKysgaGFzIHRoaXMgKi8KLSAgICBpZiAoX2Z1bGxwYXRoKChjaGFyICopYnVmLCAoY2hhciAqKWZuYW1lLCBsZW4gLSAxKSA9PSBOVUxMKQotCXJldHVybiBGQUlMOwotICAgIHJldHVybiBPSzsKLSNlbHNlCQkJLyogYWxtb3N0IHRoZSBzYW1lIGFzIG1jaF9GdWxsTmFtZSgpIGluIG9zX3VuaXguYyAqLwotICAgIHsKLSMgaWYgMQotCWNoYXJfdQlmdWxscGF0aFtNQVhQQVRITF07Ci0KLQlpZiAoIV90cnVlbmFtZShmbmFtZSwgZnVsbHBhdGgpKQotCSAgICByZXR1cm4gRkFJTDsKLQlzbGFzaF9hZGp1c3QoZnVsbHBhdGgpOwkgICAgLyogT25seSBuZWVkZWQgd2hlbiAnc2hlbGxzbGFzaCcgc2V0ICovCi0JdmltX3N0cm5jcHkoYnVmLCBmdWxscGF0aCwgbGVuIC0gMSk7Ci0JcmV0dXJuIE9LOwotCi0jIGVsc2UgIC8qIE9sZCBjb2RlLCB0byBiZSBkZWxldGVkLi4uICovCi0JaW50CWw7Ci0JY2hhcl91CW9sZGRpcltNQVhQQVRITF07Ci0JY2hhcl91CSpwLCAqcTsKLQlpbnQJYzsKLQlpbnQJcmV0dmFsID0gT0s7Ci0KLQkqYnVmID0gMDsKLQkvKgotCSAqIGNoYW5nZSB0byB0aGUgZGlyZWN0b3J5IGZvciBhIG1vbWVudCwKLQkgKiBhbmQgdGhlbiBkbyB0aGUgZ2V0d2QoKSAoYW5kIGdldCBiYWNrIHRvIHdoZXJlIHdlIHdlcmUpLgotCSAqIFRoaXMgd2lsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lIHdpdGggIi4uLyIgdGhpbmdzLgotCSAqLwotCXAgPSB2aW1fc3RycmNocihmbmFtZSwgJy8nKTsKLQlxID0gdmltX3N0cnJjaHIoZm5hbWUsICdcXCcpOwotCWlmIChxICE9IE5VTEwgJiYgKHAgPT0gTlVMTCB8fCBxID4gcCkpCi0JICAgIHAgPSBxOwotCXEgPSB2aW1fc3RycmNocihmbmFtZSwgJzonKTsKLQlpZiAocSAhPSBOVUxMICYmIChwID09IE5VTEwgfHwgcSA+IHApKQotCSAgICBwID0gcTsKLQlpZiAocCAhPSBOVUxMKQotCXsKLQkgICAgaWYgKGdldGN3ZChvbGRkaXIsIE1BWFBBVEhMKSA9PSBOVUxMKQotCSAgICB7Ci0JCXAgPSBOVUxMOwkvKiBjYW4ndCBnZXQgY3VycmVudCBkaXI6IGRvbid0IGNoZGlyICovCi0JCXJldHZhbCA9IEZBSUw7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCWlmIChwID09IGZuYW1lKQkJCS8qIC9mbmFtZQkgICAgKi8KLQkJICAgIHEgPSBwICsgMTsJCQkvKiAtPiAvCQkgICAgKi8KLQkJZWxzZSBpZiAocSArIDEgPT0gcCkJCS8qIC4uLiBjOlxmb28JICAgICovCi0JCSAgICBxID0gcCArIDE7CQkJLyogLT4gYzpcCSAgICAqLwotCQllbHNlCQkJCS8qIGJ1dCBjOlxmb29cYmFyICAgKi8KLQkJICAgIHEgPSBwOwkJCS8qIC0+IGM6XGZvbwkgICAgKi8KLQotCQljID0gKnE7CQkJLyogdHJ1bmNhdGUgYXQgc3RhcnQgb2YgZm5hbWUgKi8KLQkJKnEgPSBOVUw7Ci0jIGlmZGVmIERKR1BQCi0JCVNUUkNQWShidWYsIGZuYW1lKTsKLQkJc2xhc2hfYWRqdXN0KGJ1Zik7CS8qIG5lZWRlZCB3aGVuIGZuYW1lIHN0YXJ0cyB3aXRoIFwgKi8KLQkJaWYgKG1jaF9jaGRpcihidWYpKQkvKiBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSAqLwotIyBlbHNlCi0JCWlmIChtY2hfY2hkaXIoZm5hbWUpKQkvKiBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSAqLwotIyBlbmRpZgotCQkgICAgcmV0dmFsID0gRkFJTDsKLQkJZWxzZQotCQl7Ci0JCSAgICBmbmFtZSA9IHE7Ci0JCSAgICBpZiAoYyA9PSBwc2VwYykJICAgIC8qIGlmIHdlIGN1dCB0aGUgbmFtZSBhdCBhICovCi0JCQlmbmFtZSsrOwkgICAgLyogJ1wnLCBkb24ndCBhZGQgaXQgYWdhaW4gKi8KLQkJfQotCQkqcSA9IGM7Ci0JICAgIH0KLQl9Ci0JaWYgKGdldGN3ZChidWYsIGxlbikgPT0gTlVMTCkKLQl7Ci0JICAgIHJldHZhbCA9IEZBSUw7Ci0JICAgICpidWYgPSBOVUw7Ci0JfQotIyAgaWZkZWYgVVNFX0ZOQU1FX0NBU0UKLQllbHNlCi0JewotCSAgICBjaGFyX3UJKmhlYWQ7Ci0JICAgIGNoYXJfdQkqdGFpbDsKLQkgICAgc3RydWN0IGZmYmxrIGZiOwotCSAgICBpbnQJCWM7Ci0JICAgIGludAkJYWRkZWQ7Ci0KLQkgICAgLyogQXBwYXJlbnRseSAibG9uZ25hfjEiIGlzbid0IGV4cGFuZGVkIGJ5IGdldGN3ZCgpLCBhdCBsZWFzdCBub3QKLQkgICAgICogZm9yIERKR1BQLiAgRXhwYW5kIGl0IGhlcmUuICBIYXZlIHRvIGRvIGVhY2ggZGlybmFtZQotCSAgICAgKiBzZXBhcmF0ZWx5LiAqLwotCSAgICBzbGFzaF9hZGp1c3QoYnVmKTsKLQkgICAgaGVhZCA9IGJ1ZjsKLQkgICAgaWYgKGlzYWxwaGEoKmhlYWQpICYmIGhlYWRbMV0gPT0gJzonKQotCQloZWFkICs9IDI7CS8qIHNraXAgImM6IiAqLwotCSAgICB3aGlsZSAoKmhlYWQgIT0gTlVMKQotCSAgICB7Ci0JCS8qIEFkdmFuY2UgImhlYWQiIHRvIHRoZSBzdGFydCBvZiBhIGRpcm5hbWUgYW5kICJ0YWlsIiB0byBqdXN0Ci0JCSAqIGFmdGVyIGl0LiAqLwotCQl3aGlsZSAoKmhlYWQgPT0gJy8nIHx8ICpoZWFkID09ICdcXCcpCi0JCSAgICArK2hlYWQ7Ci0JCWZvciAodGFpbCA9IGhlYWQ7ICp0YWlsICE9IE5VTDsgKyt0YWlsKQotCQkgICAgaWYgKCp0YWlsID09ICcvJyB8fCAqdGFpbCA9PSAnXFwnKQotCQkJYnJlYWs7Ci0JCWMgPSAqdGFpbDsKLQkJKnRhaWwgPSBOVUw7Ci0KLQkJaWYgKGZpbmRmaXJzdChidWYsICZmYiwgRkFfRElSRUMpID09IDApCi0JCXsKLQkJICAgIGFkZGVkID0gU1RSTEVOKGZiLmZmX25hbWUpOwotCQkgICAgaWYgKChoZWFkIC0gYnVmKSArIGFkZGVkICsgU1RSTEVOKHRhaWwgKyAxKSArIDIgPCBsZW4pCi0JCSAgICB7Ci0JCQlhZGRlZCAtPSAodGFpbCAtIGhlYWQpOwotCQkJaWYgKGFkZGVkICE9IDApCi0JCQkgICAgU1RSTU9WRSh0YWlsICsgMSArIGFkZGVkLCB0YWlsICsgMSk7Ci0JCQlTVFJDUFkoaGVhZCwgZmIuZmZfbmFtZSk7Ci0JCQl0YWlsICs9IGFkZGVkOwotCQkgICAgfQotCQl9Ci0JCSp0YWlsID0gYzsKLQkJaGVhZCA9IHRhaWw7Ci0JICAgIH0KLQl9Ci0jICBlbmRpZgotCWlmIChwICE9IE5VTEwpCi0JICAgIG1jaF9jaGRpcihvbGRkaXIpOwotCS8qCi0JICogQ29uY2F0ZW5hdGUgdGhlIGZpbGUgbmFtZSB0byB0aGUgcGF0aC4KLQkgKi8KLQlpZiAoKmZuYW1lICE9IE5VTCkKLQl7Ci0JICAgIGwgPSBTVFJMRU4oYnVmKTsKLQkgICAgaWYgKGwgPiAwICYmIGJ1ZltsIC0gMV0gIT0gJy8nICYmIGJ1ZltsIC0gMV0gIT0gJ1xcJykKLQkJc3RyY2F0KGJ1ZiwgcHNlcHMpOwotCSAgICBzdHJjYXQoYnVmLCBmbmFtZSk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci0jIGVuZGlmCi0gICAgfQotI2VuZGlmCi19Ci0KLS8qCi0gKiBSZXBsYWNlIGFsbCBzbGFzaGVzIGJ5IGJhY2tzbGFzaGVzLgotICogVGhpcyB1c2VkIHRvIGJlIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBidXQgTVMtRE9TIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMKLSAqIHdpdGggc2xhc2hlcyAoZS5nLiBpbiBhIGNvbW1hbmQgbmFtZSkuICBXZSBjYW4ndCBoYXZlIG1peGVkIHNsYXNoZXMgYW5kCi0gKiBiYWNrc2xhc2hlcywgYmVjYXVzZSBjb21wYXJpbmcgZmlsZSBuYW1lcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gIFRoZQotICogY29tbWFuZHMgdGhhdCB1c2UgYSBmaWxlIG5hbWUgc2hvdWxkIHRyeSB0byBhdm9pZCB0aGUgbmVlZCB0byB0eXBlIGEKLSAqIGJhY2tzbGFzaCB0d2ljZS4KLSAqIFdoZW4gJ3NoZWxsc2xhc2gnIHNldCBkbyBpdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLSAqLwotICAgIHZvaWQKLXNsYXNoX2FkanVzdChjaGFyX3UgKnApCi17Ci0jaWZkZWYgT0xEX0RKR1BQICAgIC8qIHRoaXMgc2VlbXMgdG8gaGF2ZSBiZWVuIGZpeGVkIGluIERKR1BQIDIuMDEgKi8KLSAgICAvKiBESkdQUCBjYW4ndCBoYW5kbGUgYSBmaWxlIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaCwgYW5kIHdoZW4gaXQKLSAgICAgKiBzdGFydHMgd2l0aCBhIHNsYXNoIHRoZXJlIHNob3VsZCBiZSBubyBiYWNrc2xhc2hlcyAqLwotICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICcvJykKLQl3aGlsZSAoKnApCi0JewotCSAgICBpZiAoKnAgPT0gJ1xcJykKLQkJKnAgPSAnLyc7Ci0JICAgIG1iX3B0cl9hZHYocCk7Ci0JfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHdoaWxlICgqcCkKLSAgICB7Ci0JaWYgKCpwID09IHBzZXBjTikKLQkgICAgKnAgPSBwc2VwYzsKLQltYl9wdHJfYWR2KHApOwotICAgIH0KLX0KLQotLyoKLSAqIFJldHVybiBUUlVFIGlmICJmbmFtZSIgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAqLwotICAgIGludAotbWNoX2lzRnVsbE5hbWUoY2hhcl91ICpmbmFtZSkKLXsKLSAgICAvKiBBIG5hbWUgbGlrZSAiZDovZm9vIiBhbmQgIi8vc2VydmVyL3NoYXJlIiBpcyBhYnNvbHV0ZSAqLwotICAgIHJldHVybiAoZm5hbWVbMF0gIT0gTlVMICYmIGZuYW1lWzFdID09ICc6JwotCQkJCSAgICAgJiYgKGZuYW1lWzJdID09ICcvJyB8fCBmbmFtZVsyXSA9PSAnXFwnKSkKLQl8fCAoZm5hbWVbMF0gPT0gZm5hbWVbMV0gJiYgKGZuYW1lWzBdID09ICcvJyB8fCBmbmFtZVswXSA9PSAnXFwnKSk7Ci19Ci0KLQotICAgIHZvaWQKLW1jaF9lYXJseV9pbml0KHZvaWQpCi17Ci19Ci0KLS8qCi0gKiBDYXJlZnVsOiBtY2hfZXhpdCgpIG1heSBiZSBjYWxsZWQgYmVmb3JlIG1jaF9pbml0KCkhCi0gKi8KLSAgICB2b2lkCi1tY2hfZXhpdChpbnQgcikKLXsKLSAgICBzZXR0bW9kZShUTU9ERV9DT09LKTsKLSAgICBzdG9wdGVybWNhcCgpOwotICAgIHNldF9pbnRlcnJ1cHRzKEZBTFNFKTsJICAgIC8qIHJlc3RvcmUgaW50ZXJydXB0cyAqLwotI2lmZGVmIERKR1BQCi0gICAgc2V0X3N5c19jdXJzb3IoKTsKLSNlbmRpZgotICAgIC8qIFNvbWVob3cgb3V0cHV0dGluZyBDUi1OTCBjYXVzZXMgdGhlIG9yaWdpbmFsIGNvbG9ycyB0byBiZSByZXN0b3JlZCAqLwotICAgIG91dF9jaGFyKCdccicpOwotICAgIG91dF9jaGFyKCdcbicpOwotICAgIG91dF9mbHVzaCgpOwotICAgIG1sX2Nsb3NlX2FsbChUUlVFKTsJCSAgICAvKiByZW1vdmUgYWxsIG1lbWZpbGVzICovCi0jaWZkZWYgTUNIX0NVUlNPUl9TSEFQRQotICAgIG1jaF9yZXN0b3JlX2N1cnNvcl9zaGFwZShUUlVFKTsKLSNlbmRpZgotICAgIGV4aXQocik7Ci19Ci0KLS8qCi0gKiBzZXQgdGhlIHR0eSBpbiAocmF3KSA/ICJyYXciIDogImNvb2tlZCIgbW9kZQotICogRG9lcyBub3QgY2hhbmdlIHRoZSB0dHksIGFzIGJpb3NrZXkoKSBhbmQga2JoaXQoKSB3b3JrIHJhdyBhbGwgdGhlIHRpbWUuCi0gKi8KLSAgICB2b2lkCi1tY2hfc2V0dG1vZGUoaW50IHRtb2RlKQotewotfQotCi0jaWZkZWYgRkVBVF9NT1VTRQotICAgIHZvaWQKLW1jaF9zZXRtb3VzZShpbnQgb24pCi17Ci0gICAgbW91c2VfYWN0aXZlID0gb247Ci0gICAgbW91c2VfaGlkZGVuID0gVFJVRTsJLyogZG9uJ3Qgc2hvdyBpdCB1bnRpbCBtb3ZlZCAqLwotfQotI2VuZGlmCi0KLS8qCi0gKiBzZXQgc2NyZWVuIG1vZGUKLSAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKLSAqLwotICAgIGludAotbWNoX3NjcmVlbm1vZGUoY2hhcl91ICphcmcpCi17Ci0gICAgaW50CQkgICAgbW9kZTsKLSAgICBpbnQJCSAgICBpOwotICAgIHN0YXRpYyBjaGFyCSAgICoobmFtZXNbXSkgPSB7IkJXNDAiLCAiQzQwIiwgIkJXODAiLCAiQzgwIiwgIk1PTk8iLCAiQzQzNTAifTsKLSAgICBzdGF0aWMgaW50CSAgICBtb2Rlc1tdICAgPSB7IEJXNDAsCSAgQzQwLAkgQlc4MCwJIEM4MCwJTU9OTywJQzQzNTB9OwotCi0gICAgbW9kZSA9IC0xOwotICAgIGlmIChWSU1fSVNESUdJVCgqYXJnKSkJCSAgICAvKiBtb2RlIG51bWJlciBnaXZlbiAqLwotCW1vZGUgPSBhdG9pKChjaGFyICopYXJnKTsKLSAgICBlbHNlCi0gICAgewotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKGNoYXJfdSAqKTsgKytpKQotCSAgICBpZiAoc3RyaWNtcChuYW1lc1tpXSwgKGNoYXIgKilhcmcpID09IDApCi0JICAgIHsKLQkJbW9kZSA9IG1vZGVzW2ldOwotCQlicmVhazsKLQkgICAgfQotICAgIH0KLSAgICBpZiAobW9kZSA9PSAtMSkKLSAgICB7Ci0JRU1TRygiRTM2MjogVW5zdXBwb3J0ZWQgc2NyZWVuIG1vZGUiKTsKLQlyZXR1cm4gRkFJTDsKLSAgICB9Ci0gICAgdGV4dG1vZGUobW9kZSk7CQkgICAgLyogdXNlIEJvcmxhbmQgZnVuY3Rpb24gKi8KLSNpZmRlZiBESkdQUAotICAgIC8qIGJhc2UgYWRkcmVzcyBtYXkgaGF2ZSBjaGFuZ2VkICovCi0gICAgZ2V0X3NjcmVlbmJhc2UoKTsKLSNlbmRpZgotCi0gICAgLyogU2NyZWVuIGNvbG9ycyBtYXkgaGF2ZSBjaGFuZ2VkLiAqLwotICAgIG91dF9zdHIoVF9NRSk7Ci0KLSNpZmRlZiBGRUFUX01PVVNFCi0gICAgaWYgKG1vZGUgPD0gMSB8fCBtb2RlID09IDQgfHwgbW9kZSA9PSA1IHx8IG1vZGUgPT0gMTMgfHwgbW9kZSA9PSAweDEzKQotCW1vdXNlX3hfZGl2ID0gMTY7Ci0gICAgZWxzZQotCW1vdXNlX3hfZGl2ID0gODsKLSAgICBpZiAobW9kZSA9PSAweDExIHx8IG1vZGUgPT0gMHgxMikKLQltb3VzZV95X2RpdiA9IDE2OwotICAgIGVsc2UgaWYgKG1vZGUgPT0gMHgxMCkKLQltb3VzZV95X2RpdiA9IDE0OwotICAgIGVsc2UKLQltb3VzZV95X2RpdiA9IDg7Ci0gICAgc2hlbGxfcmVzaXplZCgpOwotI2VuZGlmCi0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogU3RydWN0dXJlIHVzZWQgYnkgVHVyYm8tQy9Cb3JsYW5kLUMgdG8gc3RvcmUgdmlkZW8gcGFyYW1ldGVycy4KLSAqLwotI2lmbmRlZiBESkdQUAotZXh0ZXJuIHN0cnVjdCB0ZXh0X2luZm8gX3ZpZGVvOwotI2VuZGlmCi0KLS8qCi0gKiB0cnkgdG8gZ2V0IHRoZSByZWFsIHdpbmRvdyBzaXplCi0gKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCi0gKi8KLSAgICBpbnQKLW1jaF9nZXRfc2hlbGxzaXplKHZvaWQpCi17Ci0gICAgc3RydWN0IHRleHRfaW5mbyB0ZXh0aW5mbzsKLQotICAgIC8qCi0gICAgICogVGhlIHNjcmVlbndpZHRoIGlzIHJldHVybmVkIGJ5IHRoZSBCSU9TIE9LLgotICAgICAqIFRoZSBzY3JlZW5oZWlnaHQgaXMgaW4gYSBsb2NhdGlvbiBpbiB0aGUgYmlvcyBSQU0sIGlmIHRoZSBkaXNwbGF5IGlzCi0gICAgICogRUdBIG9yIFZHQS4KLSAgICAgKi8KLSAgICBpZiAoIXRlcm1fY29uc29sZSkKLQlyZXR1cm4gRkFJTDsKLSAgICBnZXR0ZXh0aW5mbygmdGV4dGluZm8pOwotICAgIENvbHVtbnMgPSB0ZXh0aW5mby5zY3JlZW53aWR0aDsKLSAgICBSb3dzID0gdGV4dGluZm8uc2NyZWVuaGVpZ2h0OwotI2lmbmRlZiBESkdQUAotICAgIGlmICh0ZXh0aW5mby5jdXJybW9kZSA+IDEwKQotCVJvd3MgPSAqKGNoYXIgZmFyICopTUtfRlAoMHg0MCwgMHg4NCkgKyAxOwotI2VuZGlmCi0KLSAgICBpZiAoQ29sdW1ucyA8IE1JTl9DT0xVTU5TIHx8IFJvd3MgPCBNSU5fTElORVMpCi0gICAgewotCS8qIHRoZXNlIHZhbHVlcyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGVybWNhcCBzaXplIG9yIGRlZmF1bHQgKi8KLQlDb2x1bW5zID0gODA7Ci0JUm93cyA9IDI1OwotCXJldHVybiBGQUlMOwotICAgIH0KLSNpZmRlZiBESkdQUAotICAgIG15dGV4dGluaXQoJnRleHRpbmZvKTsgICAvKiBBZGRlZCBieSBKTUwsIDEvMTUvOTggKi8KLSNlbmRpZgotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogU2V0IHRoZSBhY3RpdmUgd2luZG93IGZvciBkZWxsaW5lL2luc2xpbmUuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotc2V0X3dpbmRvdyh2b2lkKQotewotICAgIGlmICh0ZXJtX2NvbnNvbGUpCi0gICAgewotI2lmbmRlZiBESkdQUAotCV92aWRlby5zY3JlZW5oZWlnaHQgPSBSb3dzOwotI2VuZGlmCi0JbXl3aW5kb3coMSwgMSwgQ29sdW1ucywgUm93cyk7Ci0gICAgfQotICAgIHNjcmVlbl9zdGFydCgpOwotfQotCi0gICAgdm9pZAotbWNoX3NldF9zaGVsbHNpemUodm9pZCkKLXsKLSAgICAvKiBTaG91bGQgdHJ5IHRvIHNldCB0aGUgd2luZG93IHNpemUgdG8gUm93cyBhbmQgQ29sdW1ucy4KLSAgICAgKiBNYXkgaW52b2x2ZSBzd2l0Y2hpbmcgZGlzcGxheSBtb2RlLi4uLgotICAgICAqIFdlIGFzc3VtZSB0aGUgdXNlciBrbm93cyB0aGUgc2l6ZSBhbmQganVzdCB1c2UgaXQuICovCi19Ci0KLS8qCi0gKiBSb3dzIGFuZC9vciBDb2x1bW5zIGhhcyBjaGFuZ2VkLgotICovCi0gICAgdm9pZAotbWNoX25ld19zaGVsbHNpemUodm9pZCkKLXsKLSNpZmRlZiBGRUFUX01PVVNFCi0gICAgLyogYmVzdCBndWVzcyBmb3IgbW91c2UgY29vcmRpbmF0ZSBjb21wdXRhdGlvbnMgKi8KLSAgICBpZiAoQ29sdW1ucyA8PSA0MCkKLQltb3VzZV94X2RpdiA9IDE2OwotICAgIGlmIChSb3dzID09IDMwKQotCW1vdXNlX3lfZGl2ID0gMTY7Ci0jZW5kaWYKLSAgICBzZXRfd2luZG93KCk7Ci0jaWZkZWYgRkVBVF9NT1VTRQotICAgIG1vdXNlX2FyZWEoKTsJLyogc2V0IGFyZWEgd2hlcmUgbW91c2UgY2FuIGdvICovCi0jZW5kaWYKLX0KLQotI2lmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCi0vKgotICogQ2hlY2sgdGhlIG51bWJlciBvZiBDb2x1bW5zIHdpdGggYSBCSU9TIGNhbGwuICBUaGlzIGF2b2lkcyBhIGNyYXNoIG9mIHRoZQotICogRE9TIGNvbnNvbGUgd2hlbiAnY29sdW1ucycgaXMgc2V0IHRvIGEgdG9vIGxhcmdlIHZhbHVlLgotICovCi0gICAgdm9pZAotbWNoX2NoZWNrX2NvbHVtbnModm9pZCkKLXsKLSAgICBzdGF0aWMgdW5pb24gUkVHUwlyZWdzOwotCi0gICAgcmVncy5oLmFoID0gMHgwZjsKLSAgICAodm9pZClpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOwotICAgIGlmICgodW5zaWduZWQpQ29sdW1ucyA+ICh1bnNpZ25lZClyZWdzLmguYWgpCi0JQ29sdW1ucyA9ICh1bnNpZ25lZClyZWdzLmguYWg7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIGNhbGwgc2hlbGwsIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKLSAqIG9wdGlvbnM6IFNIRUxMXyosIHNlZSB2aW0uaC4KLSAqLwotICAgIGludAotbWNoX2NhbGxfc2hlbGwoCi0gICAgY2hhcl91CSpjbWQsCi0gICAgaW50CQlvcHRpb25zKQotewotICAgIGludAkJeDsKLSAgICBpbnQJCXRtb2RlID0gY3VyX3Rtb2RlOwotI2lmbmRlZiBESkdQUAotICAgIGNoYXJfdQkqbmV3Y21kOwotI2VuZGlmCi0KLSAgICBvdXRfZmx1c2goKTsKLSNpZmRlZiBESkdQUAotICAgIHNldF9zeXNfY3Vyc29yKCk7Ci0jZW5kaWYKLQotICAgIGlmIChvcHRpb25zICYgU0hFTExfQ09PS0VEKQotCXNldHRtb2RlKFRNT0RFX0NPT0spOwkvKiBzZXQgdG8gbm9ybWFsIG1vZGUgKi8KLSAgICBzZXRfaW50ZXJydXB0cyhGQUxTRSk7CS8qIHJlc3RvcmUgaW50ZXJydXB0cyAqLwotCi0jaWZkZWYgREpHUFAKLSAgICAvKiBpZ25vcmUgc2lnbmFscyB3aGlsZSBleHRlcm5hbCBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSAgICBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7Ci0gICAgc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOwotI2VuZGlmCi0gICAgaWYgKGNtZCA9PSBOVUxMKQotCXggPSBzeXN0ZW0oKGNoYXIgKilwX3NoKTsKLSAgICBlbHNlCi0gICAgewotI2lmZGVmIERKR1BQCi0JLyoKLQkgKiBVc2UgJ3NoZWxsJyBmb3Igc3lzdGVtKCkuCi0JICovCi0Jc2V0ZW52KCJTSEVMTCIsIChjaGFyICopcF9zaCwgMSk7Ci0JeCA9IHN5c3RlbShjbWQpOwotI2Vsc2UKLQkvKiB3ZSB1c2UgImNvbW1hbmQiIHRvIHN0YXJ0IHRoZSBzaGVsbCwgc2xvdyBidXQgZWFzeSAqLwotCW5ld2NtZCA9IGFsbG9jKFNUUkxFTihwX3NoKSArIFNUUkxFTihwX3NoY2YpICsgU1RSTEVOKGNtZCkgKyAzKTsKLQlpZiAobmV3Y21kID09IE5VTEwpCi0JICAgIHggPSAtMTsKLQllbHNlCi0JewotCSAgICBzcHJpbnRmKChjaGFyICopbmV3Y21kLCAiJXMgJXMgJXMiLCBwX3NoLCBwX3NoY2YsIGNtZCk7Ci0JICAgIHggPSBzeXN0ZW0oKGNoYXIgKiluZXdjbWQpOwotCSAgICB2aW1fZnJlZShuZXdjbWQpOwotCX0KLSNlbmRpZgotICAgIH0KLSNpZmRlZiBESkdQUAotICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19ERkwpOwotICAgIHNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHVEVSTSwgU0lHX0RGTCk7Ci0jZW5kaWYKLSAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQotCXNldHRtb2RlKFRNT0RFX1JBVyk7CS8qIHNldCB0byByYXcgbW9kZSAqLwotICAgIHNldF9pbnRlcnJ1cHRzKFRSVUUpOwkvKiBjYXRjaCBpbnRlcnJ1cHRzICovCi0KLSAgICBpZiAoeCAmJiAhKG9wdGlvbnMgJiBTSEVMTF9TSUxFTlQpICYmICFlbXNnX3NpbGVudCkKLSAgICB7Ci0JTVNHX1BVVFMoIlxuc2hlbGwgcmV0dXJuZWQgIik7Ci0JbXNnX291dG51bSgobG9uZyl4KTsKLQltc2dfcHV0Y2hhcignXG4nKTsKLSAgICB9Ci0KLSAgICByZXR1cm4geDsKLX0KLQotLyoKLSAqIGNoZWNrIGZvciBhbiAiaW50ZXJydXB0IHNpZ25hbCI6IENUUkwtYnJlYWsgb3IgQ1RSTC1DCi0gKi8KLSAgICB2b2lkCi1tY2hfYnJlYWtjaGVjayh2b2lkKQotewotICAgIGlmIChjdHJsY19wcmVzc2VkKQotICAgIHsKLQljdHJsY19wcmVzc2VkID0gRkFMU0U7Ci0JZ290X2ludCA9IFRSVUU7Ci0gICAgfQotfQotCi0vKgotICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW4gYSB3aWxkY2FyZCB0aGF0IGNhbiBiZSBleHBhbmRlZCBieQotICogZG9zX2V4cGFuZHBhdGgoKS4KLSAqLwotICAgIGludAotbWNoX2hhc19leHBfd2lsZGNhcmQoY2hhcl91ICpwKQotewotICAgIGZvciAoIDsgKnA7IG1iX3B0cl9hZHYocCkpCi0gICAgewotCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiPypbIiwgKnApICE9IE5VTEwKLQkJfHwgKCpwID09ICd+JyAmJiBwWzFdICE9IE5VTCkpCi0JICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZiAicCIgY29udGFpbiBhIHdpbGRjYXJkIG9yIGEgIn4xIiBraW5kIG9mIHRoaW5nIChjb3VsZCBiZSBhCi0gKiBzaG9ydGVuZWQgZmlsZSBuYW1lKS4KLSAqLwotICAgIGludAotbWNoX2hhc193aWxkY2FyZChjaGFyX3UgKnApCi17Ci0gICAgZm9yICggOyAqcDsgbWJfcHRyX2FkdihwKSkKLSAgICB7Ci0JaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKQotIyAgaWZkZWYgVklNX0JBQ0tUSUNLCi0JCQkJICAgICI/KiRbYCIKLSMgIGVsc2UKLQkJCQkgICAgIj8qJFsiCi0jICBlbmRpZgotCQkJCQkJLCAqcCkgIT0gTlVMTAotCQl8fCAoKnAgPT0gJ34nICYmIHBbMV0gIT0gTlVMKSkKLQkgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyoKLSAqIENoYW5nZSBkaXJlY3RvcnkgdG8gInBhdGgiLgotICogVGhlIG5vcm1hbCBjaGRpcigpIGRvZXMgbm90IGNoYW5nZSB0aGUgZGVmYXVsdCBkcml2ZS4gIFRoaXMgb25lIGRvZXMuCi0gKiBSZXR1cm4gMCBmb3Igc3VjY2VzcywgLTEgZm9yIGZhaWx1cmUuCi0gKi8KLSAgICBpbnQKLW1jaF9jaGRpcihjaGFyICpwYXRoKQotewotICAgIGlmIChwYXRoWzBdID09IE5VTCkJCSAgICAvKiBqdXN0IGNoZWNraW5nLi4uICovCi0JcmV0dXJuIDA7Ci0gICAgaWYgKHBfdmVyYm9zZSA+PSA1KQotICAgIHsKLQl2ZXJib3NlX2VudGVyKCk7Ci0Jc21zZygoY2hhcl91ICopImNoZGlyKCVzKSIsIHBhdGgpOwotCXZlcmJvc2VfbGVhdmUoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGhbMV0gPT0gJzonKQkJICAgIC8qIGhhcyBhIGRyaXZlIG5hbWUgKi8KLSAgICB7Ci0JaWYgKGNoYW5nZV9kcml2ZShUT0xPV0VSX0FTQyhwYXRoWzBdKSAtICdhJyArIDEpKQotCSAgICByZXR1cm4gLTE7CQkgICAgLyogaW52YWxpZCBkcml2ZSBuYW1lICovCi0JcGF0aCArPSAyOwotICAgIH0KLSAgICBpZiAoKnBhdGggPT0gTlVMKQkJICAgIC8qIGRyaXZlIG5hbWUgb25seSAqLwotCXJldHVybiAwOwotICAgIHJldHVybiBjaGRpcihwYXRoKTsJCSAgICAvKiBsZXQgdGhlIG5vcm1hbCBjaGRpcigpIGRvIHRoZSByZXN0ICovCi19Ci0KLSNpZmRlZiBESkdQUAotLyoKLSAqIG1jaF9yZW5hbWUoKSB3b3JrcyBhcm91bmQgYSBidWcgaW4gcmVuYW1lIChha2EgTW92ZUZpbGUpIGluCi0gKiBXaW5kb3dzIDk1OiByZW5hbWUoImZvby5iYXIiLCAiZm9vLmJhcn4iKSB3aWxsIGdlbmVyYXRlIGEKLSAqIGZpbGUgd2hvc2Ugc2hvcnQgZmlsZSBuYW1lIGlzICJGT08uQkFSIiAoaXRzIGxvbmcgZmlsZSBuYW1lIHdpbGwKLSAqIGJlIGNvcnJlY3Q6ICJmb28uYmFyfiIpLiAgQmVjYXVzZSBhIGZpbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5Ci0gKiBlaXRoZXIgaXRzIFNGTiBvciBpdHMgTEZOLCAiZm9vLmJhciIgaGFzIGVmZmVjdGl2ZWx5IGJlZW4KLSAqIHJlbmFtZWQgdG8gImZvby5iYXIiLCB3aGljaCBpcyBub3QgYXQgYWxsIHdoYXQgd2FzIHdhbnRlZC4gIFRoaXMKLSAqIHNlZW1zIHRvIGhhcHBlbiBvbmx5IHdoZW4gcmVuYW1pbmcgZmlsZXMgd2l0aCB0aHJlZS1jaGFyYWN0ZXIKLSAqIGV4dGVuc2lvbnMgYnkgYXBwZW5kaW5nIGEgc3VmZml4IHRoYXQgZG9lcyBub3QgaW5jbHVkZSAiLiIuCi0gKiBXaW5kb3dzIE5UIGdldHMgaXQgcmlnaHQsIGhvd2V2ZXIsIHdpdGggYW4gU0ZOIG9mICJGT09+MS5CQVIiLgotICogVGhpcyB3b3JrcyBsaWtlIG1jaF9yZW5hbWUgaW4gb3Nfd2luMzIuYywgYnV0IGlzIGEgYml0IHNpbXBsZXIuCi0gKgotICogTGlrZSByZW5hbWUoKSwgcmV0dXJucyAwIHVwb24gc3VjY2Vzcywgbm9uLXplcm8gdXBvbiBmYWlsdXJlLgotICogU2hvdWxkIHByb2JhYmx5IHNldCBlcnJubyBhcHByb3ByaWF0ZWx5IHdoZW4gZXJyb3JzIG9jY3VyLgotICovCi0KLSAgICBpbnQKLW1jaF9yZW5hbWUoY29uc3QgY2hhciAqT2xkRmlsZSwgY29uc3QgY2hhciAqTmV3RmlsZSkKLXsKLSAgICBjaGFyX3UgICpUZW1wRmlsZTsKLSAgICBpbnQJICAgIHJldHZhbDsKLSAgICBpbnQJICAgIGZkOwotCi0gICAgLyogcmVuYW1lKCkgd29ya3MgY29ycmVjdGx5IHdpdGhvdXQgbG9uZyBmaWxlIG5hbWVzLCBzbyB1c2UgdGhhdCAqLwotICAgIGlmICghX1VTRV9MRk4pCi0JcmV0dXJuIHJlbmFtZShPbGRGaWxlLCBOZXdGaWxlKTsKLQotICAgIGlmICgoVGVtcEZpbGUgPSBhbGxvYygodW5zaWduZWQpKFNUUkxFTihPbGRGaWxlKSArIDEzKSkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotCi0gICAgU1RSQ1BZKFRlbXBGaWxlLCBPbGRGaWxlKTsKLSAgICBTVFJDUFkoZ2V0dGFpbChUZW1wRmlsZSksICJheGxxd3FoeS5iYX4iKTsKLSAgICBpZiAocmVuYW1lKE9sZEZpbGUsIFRlbXBGaWxlKSkKLQlyZXR2YWwgPSAtMTsKLSAgICBlbHNlCi0gICAgewotCS8qIG5vdyBjcmVhdGUgYW4gZW1wdHkgZmlsZSBjYWxsZWQgT2xkRmlsZTsgdGhpcyBwcmV2ZW50cwotCSAqIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHVzaW5nIE9sZEZpbGUgYXMgYW4gYWxpYXMgKFNGTikKLQkgKiBpZiB3ZSdyZSByZW5hbWluZyB3aXRoaW4gdGhlIHNhbWUgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUsCi0JICogd2UncmUgZWRpdGluZyBhIGZpbGUgY2FsbGVkIGZpbGVuYW1lLmFzYy50eHQgYnkgaXRzIFNGTiwKLQkgKiBmaWxlbmF+MS50eHQuICBJZiB3ZSByZW5hbWUgZmlsZW5hfjEudHh0IHRvIGZpbGVuYX4xLnR4dH4KLQkgKiAoaS5lLiwgd2UncmUgbWFraW5nIGEgYmFja3VwIHdoaWxlIHdyaXRpbmcgaXQpLCB0aGUgU0ZOCi0JICogZm9yIGZpbGVuYX4xLnR4dH4gd2lsbCBiZSBmaWxlbmF+MS50eHQsIGJ5IGRlZmF1bHQsIHdoaWNoCi0JICogd2lsbCBjYXVzZSBhbGwgc29ydHMgb2YgcHJvYmxlbXMgbGF0ZXIgaW4gYnVmX3dyaXRlKCkuICBTbywgd2UKLQkgKiBjcmVhdGUgYW4gZW1wdHkgZmlsZSBjYWxsZWQgZmlsZW5hfjEudHh0IGFuZCB0aGUgc3lzdGVtIHdpbGwgaGF2ZQotCSAqIHRvIGZpbmQgc29tZSBvdGhlciBTRk4gZm9yIGZpbGVuYX4xLnR4dH4sIHN1Y2ggYXMgZmlsZW5hfjIudHh0Ci0JICovCi0JaWYgKChmZCA9IG9wZW4oT2xkRmlsZSwgT19SRFdSfE9fQ1JFQVR8T19FWENMLCAwNDQ0KSkgPCAwKQotCSAgICByZXR1cm4gLTE7Ci0JcmV0dmFsID0gcmVuYW1lKFRlbXBGaWxlLCBOZXdGaWxlKTsKLQljbG9zZShmZCk7Ci0JbWNoX3JlbW92ZSgoY2hhcl91ICopT2xkRmlsZSk7Ci0KLQkvKiBJZiByZW5hbWluZyB0byBOZXdGaWxlIGZhaWxlZCwgcmVuYW1lIFRlbXBGaWxlIGJhY2sgdG8gT2xkRmlsZSwgc28KLQkgKiB0aGF0IGl0IGxvb2tzIGxpa2Ugbm90aGluZyBoYXBwZW5lZC4gKi8KLQlpZiAocmV0dmFsKQotCSAgICByZW5hbWUoVGVtcEZpbGUsIE9sZEZpbGUpOwotICAgIH0KLSAgICB2aW1fZnJlZShUZW1wRmlsZSk7Ci0KLSAgICByZXR1cm4gcmV0dmFsOyAgLyogc3VjY2VzcyAqLwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFBST1RPKQotLyoKLSAqIHNldGxvY2FsZSgpIGZvciBESkdQUCB3aXRoIE1TLURPUyBjb2RlcGFnZSBzdXBwb3J0Ci0gKiBBdXRob3I6IEN5cmlsIFNsb2JpbiA8c2xvYmluQGZlLm1zay5ydT4KLSAqCi0gKiBTY2FsZWQgZG93biBhIGxvdCBmb3IgdXNlIGJ5IFZpbTogT25seSBzdXBwb3J0IHNldGxvY2FsZShMQ19BTEwsICIiKS4KLSAqLwotCi0jdW5kZWYgc2V0bG9jYWxlCi0KLSNpZm5kZWYgUFJPVE8KLSMgaW5jbHVkZSA8Z28zMi5oPgotIyBpbmNsdWRlIDxpbmxpbmVzL2N0eXBlLmhhPgotI2VuZGlmCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNkZWZpbmUgVVBDQVNFIChfX2RqX0lTQUxOVU0gfCBfX2RqX0lTQUxQSEEgfCBfX2RqX0lTR1JBUEggfCBfX2RqX0lTUFJJTlQgfCBfX2RqX0lTVVBQRVIpCi0jZGVmaW5lIExPQ0FTRSAoX19kal9JU0FMTlVNIHwgX19kal9JU0FMUEhBIHwgX19kal9JU0dSQVBIIHwgX19kal9JU1BSSU5UIHwgX19kal9JU0xPV0VSKQotCi0gICAgY2hhciAqCi1kamdwcF9zZXRsb2NhbGUodm9pZCkKLXsKLSAgICBfX2RwbWlfcmVncyByZWdzOwotICAgIHN0cnVjdCB7IGNoYXIgaWQ7IHVuc2lnbmVkIHNob3J0IG9mZiwgc2VnOyB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpbmZvOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzB4ODJdLCBsb3dlciwgdXBwZXI7Ci0gICAgaW50IGk7Ci0KLSAgICByZWdzLnguYXggPSAweDY1MDI7Ci0gICAgcmVncy54LmJ4ID0gMHhmZmZmOwotICAgIHJlZ3MueC5keCA9IDB4ZmZmZjsKLSAgICByZWdzLnguY3ggPSA1OwotICAgIHJlZ3MueC5lcyA9IF9fdGIgPj4gNDsKLSAgICByZWdzLnguZGkgPSBfX3RiICYgMHhmOwotCi0gICAgX19kcG1pX2ludCgweDIxLCAmcmVncyk7Ci0KLSAgICBpZiAocmVncy54LmZsYWdzICYgMSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGRvc21lbWdldChfX3RiLCA1LCAmaW5mbyk7Ci0gICAgZG9zbWVtZ2V0KChpbmZvLnNlZyA8PCA0KSArIGluZm8ub2ZmLCAweDgyLCBidWZmZXIpOwotCi0gICAgaWYgKCooc2hvcnQgKilidWZmZXIgIT0gMHg4MCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIEZpeCBwcm9ibGVtIG9mIHVuZGVyc2NvcmVzIGJlaW5nIHJlcGxhY2VkIHdpdGggeS11bWxhdXQuIChMZXZpbikgKi8KLSAgICBpZiAoYnVmZmVyWzI2XSA9PSAweDVmKQotCWJ1ZmZlclsyNl0gPSAweDk4OwotCi0gICAgZm9yIChpID0gMDsgaSA8IDB4ODA7IGkrKykKLSAgICB7Ci0JbG93ZXIgPSBpICsgMHg4MDsKLQl1cHBlciA9IChidWZmZXIrMilbaV07Ci0JaWYgKGxvd2VyICE9IHVwcGVyKQotCXsKLQkgICAgX19kal9jdHlwZV9mbGFnc1tsb3dlcisxXSA9IExPQ0FTRTsKLQkgICAgX19kal9jdHlwZV90b3VwcGVyW2xvd2VyKzFdID0gdXBwZXI7Ci0JICAgIGlmIChfX2RqX2N0eXBlX2ZsYWdzW3VwcGVyKzFdID09IDApCi0JCV9fZGpfY3R5cGVfZmxhZ3NbdXBwZXIrMV0gPSBVUENBU0U7Ci0JICAgIGlmIChfX2RqX2N0eXBlX3RvbG93ZXJbdXBwZXIrMV0gPT0gdXBwZXIpCi0JCV9fZGpfY3R5cGVfdG9sb3dlclt1cHBlcisxXSA9IGxvd2VyOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gIkMiOwotfQotCi0jaWYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkgfHwgZGVmaW5lZChQUk9UTykKLQotLyoKLSAqIENsaXBib2FyZCBzdHVmZiwgZm9yIGN1dHRpbmcgYW5kIHBhc3RpbmcgdGV4dCB0byBvdGhlciB3aW5kb3dzLgotICoKLSAqIEltcGxlbWVudGF0aW9uIG9mIERPUy9XaW5kb3dzIGNsaXBib2FyZCBkYXRhIHRyYW5zZmVyCi0gKiBieSBEYXZpZCBLb3RjaGFuIChka290Y2hhbkBzeW1wYXRpY28uY2EpCi0gKi8KLQotI2RlZmluZSBDRl9URVhUCSAgICAweDAxICAgIC8qIFdpbmRvd3MgY2xpcGJvYXJkIGZvcm1hdDogV2luZG93cyAoQU5TSSkgdGV4dCAqLwotI2RlZmluZSBDRl9PRU1URVhUICAweDA3ICAgIC8qIFdpbmRvd3MgY2xpcGJvYXJkIGZvcm1hdDogT0VNIChET1MpIHRleHQgKi8KLSNkZWZpbmUgQ0ZfVklNQ0xJUCAgMHgwNCAgICAvKiB0cmljazogU1lMSyBjbGlwYm9hcmQgZm9ybWF0IGZvciBWaW1DbGlwYm9hcmQgKi8KLQotc3RhdGljIGludCBXaW4xNk9wZW5DbGlwYm9hcmQodm9pZCk7Ci1zdGF0aWMgaW50IFdpbjE2Q2xvc2VDbGlwYm9hcmQodm9pZCk7Ci1zdGF0aWMgaW50IFdpbjE2RW1wdHlDbGlwYm9hcmQodm9pZCk7Ci1zdGF0aWMgY2hhcl91ICpXaW4xNkdldENsaXBib2FyZERhdGEoaW50IGNsaXBfZGF0YV9mb3JtYXQpOwotc3RhdGljIGludCBXaW4xNlNldENsaXBib2FyZERhdGEoaW50IGNsaXBfZGF0YV9mb3JtYXQsIGNoYXJfdSAqY2xpcF9kYXRhLCBpbnQgY2xpcF9kYXRhX3NpemUsIGludCBjbGlwX2RhdGFfdHlwZSk7Ci0KLS8qCi0gKiBNYWtlIHZpbSB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgUmV0dXJuIE9LIHVwb24gc3VjY2Vzcy4KLSAqLwotICAgIGludAotY2xpcF9tY2hfb3duX3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKLXsKLSAgICAvKgotICAgICAqIE5ldmVyIGFjdHVhbGx5IG93biB0aGUgY2xpcGJvYXJkLiAgSWYgYW5vdGhlciBhcHBsaWNhdGlvbiBzZXRzIHRoZQotICAgICAqIGNsaXBib2FyZCwgd2UgZG9uJ3Qgd2FudCB0byB0aGluayB0aGF0IHdlIHN0aWxsIG93biBpdC4KLSAgICAgKi8KLSAgICByZXR1cm4gRkFJTDsKLX0KLQotLyoKLSAqIE1ha2UgdmltIE5PVCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotICovCi0gICAgdm9pZAotY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCi17Ci0gICAgLyogTm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgKi8KLX0KLQotLyoKLSAqIFJlYWQgdGhlIFdpbmRvd3MgY2xpcGJvYXJkIHRleHQgYW5kIHB1dCBpdCBpbiBWaW0ncyBjbGlwYm9hcmQgcmVnaXN0ZXIuCi0gKi8KLSAgICB2b2lkCi1jbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCkKLXsKLSAgICBpbnQJCXR5cGUgPSBNQVVUTzsKLSAgICBjaGFyX3UJKnBBbGxvY2F0ZWQgPSBOVUxMOwotICAgIGNoYXJfdQkqcENsaXBUZXh0ID0gTlVMTDsKLSAgICBpbnQJCWNsaXBfZGF0YV9mb3JtYXQgPSAwOwotCi0gICAgaWYgKFdpbjE2T3BlbkNsaXBib2FyZCgpKQotICAgIHsKLQkvKiBDaGVjayBmb3IgVmltJ3Mgb3duIGNsaXBib2FyZCBmb3JtYXQgZmlyc3QuICBUaGUgQ0ZfVklNQ0xJUCBmb3JtYXQKLQkgKiBpcyBqdXN0IG9yZGluYXJ5IHRleHQgKGxpa2UgQ0ZfVEVYVCkgZXhjZXB0IHByZXBlbmRlZCBieSB0aGUKLQkgKiBzZWxlY3Rpb24gdHlwZSAoYXMgYSBzaW5nbGUgY2hhcmFjdGVyKS4gIE5vdGUgdGhhdCB1bmRlciBET1Mgd2UKLQkgKiBhY3R1YWxseSBjYW5ub3QgZGVmaW5lIGEgY3VzdG9tIENGX1ZJTUNMSVAgY2xpcGJvYXJkIGZvcm1hdDsgd2UKLQkgKiB1c2UgaW5zdGVhZCBvbmUgb2YgdGhlIGV4aXN0aW5nIFdpbmRvd3MtZGVmaW5lZCBmb3JtYXRzLCB1c3VhbGx5Ci0JICogIkRJRiIgb3IgIlNZTEsiLiAgU2VlIFdpbjE2R2V0Q2xpcGJvYXJkRGF0YSgpIGZvciBkZXRhaWxzLgotCSAqCi0JICogTm90ZSB0aGF0IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YSgpIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotCSAqIGJsb2NrIGl0IGFsbG9jYXRlZC4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSB0aGUgc3RhcnQgb2YgdGhlCi0JICogY2xpcGJvYXJkIHRleHQgZGF0YTogdGhlcmUgbWF5IGJlIG90aGVyIGJ5dGVzIGFoZWFkIG9mIHRoZQotCSAqIHRleHQgKHBhcnRpY3VsYXJseSBmb3IgQ0ZfVklNQ0xJUCkgd2hpY2ggYXJlIHVzZWQgZm9yIGRhdGEKLQkgKiBtYW5hZ2VtZW50LiAgU28gcENsaXBUZXh0IGlzIG5vdCBuZWNlc3NhcmlseSA9PSBwQWxsb2NhdGVkLgotCSAqLwotCi0JaWYgKChwQWxsb2NhdGVkID0gV2luMTZHZXRDbGlwYm9hcmREYXRhKENGX1ZJTUNMSVApKSAhPSBOVUxMKQotCXsKLQkgICAgY2xpcF9kYXRhX2Zvcm1hdCA9IENGX1ZJTUNMSVA7Ci0JICAgIHBDbGlwVGV4dCA9IHBBbGxvY2F0ZWQ7Ci0KLQkgICAgc3dpdGNoICgqcENsaXBUZXh0KyspCS8qIGFmdGVyICsrLCBwQ2xpcFRleHQgcG9pbnRzIHRvIHRleHQgKi8KLQkgICAgewotCQlkZWZhdWx0OgotCQljYXNlICdMJzoJdHlwZSA9IE1MSU5FOwlicmVhazsKLQkJY2FzZSAnQyc6CXR5cGUgPSBNQ0hBUjsJYnJlYWs7Ci0JCWNhc2UgJ0InOgl0eXBlID0gTUJMT0NLOwlicmVhazsKLQkgICAgfQotCX0KLQotCS8qIE90aGVyd2lzZSwgY2hlY2sgZm9yIHRoZSBub3JtYWwgV2luZG93cyB0ZXh0IGZvcm1hdHMuICBUaGVyZSBhcmUKLQkgKiB0d28gb2YgdGhlc2U6IENGX1RFWFQgKGNvbW1vbikgYW5kIENGX09FTVRFWFQgKHVzZWQgZm9yIERPUwotCSAqIGNvbXBhdGliaWxpdHkpLiAgRXhwZXJpbWVudHMgc2hvdyB0aGF0LCB1bmRlciB0aGUgRE9TL1dpbmRvd3MKLQkgKiBjbGlwYm9hcmQgaW50ZXJmYWNlLCB3cml0aW5nIENGX1RFWFQgZGF0YSB0byB0aGUgY2xpcGJvYXJkCi0JICogYXV0b21hdGljYWxseSBjcmVhdGVzIGEgQ0ZfT0VNVEVYVCBmb3JtYXQgYXMgd2VsbC4KLQkgKi8KLQotCWVsc2UgaWYgKChwQWxsb2NhdGVkID0gV2luMTZHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpKSAhPSBOVUxMKQotCXsKLQkgICAgY2xpcF9kYXRhX2Zvcm1hdCA9IENGX1RFWFQ7Ci0JICAgIHBDbGlwVGV4dCA9IHBBbGxvY2F0ZWQ7Ci0JfQotCi0JZWxzZSBpZiAoKHBBbGxvY2F0ZWQgPSBXaW4xNkdldENsaXBib2FyZERhdGEoQ0ZfT0VNVEVYVCkpICE9IE5VTEwpCi0JewotCSAgICBjbGlwX2RhdGFfZm9ybWF0ID0gQ0ZfT0VNVEVYVDsKLQkgICAgcENsaXBUZXh0ID0gcEFsbG9jYXRlZDsKLQl9Ci0KLQkvKiBEaWQgd2UgZ2V0IGFueXRoaW5nPyAqLwotCi0JaWYgKHBDbGlwVGV4dCAhPSBOVUxMKQotCXsKLQkgICAgY2hhcl91ICpwRGVzdDsKLQkgICAgY2hhcl91ICpwU3RhcnQ7Ci0JICAgIGNoYXJfdSAqcEVuZDsKLQotCSAgICBsb25nX3UgY2xpcF9kYXRhX3NpemUgPSAwOwotCi0JICAgIC8qIFRoZSBXaW5kb3dzIGNsaXBib2FyZCBub3JtYWxseSBzdG9yZXMgaXRzIHRleHQgbGluZXMgdGVybWluYXRlZAotCSAgICAgKiBieSA8Q1I+PE5MPi4gIEJ1dCBWaW0gdXNlcyBvbmx5IDxOTD4sIHNvIHRyYW5zbGF0ZSB0aGUgPENSPjxOTD4KLQkgICAgICogaW50byA8Tkw+LiAgQWxzbywgd2F0Y2ggZm9yIHBvc3NpYmxlIG51bGwgYnl0ZXMgYXQgdGhlIGVuZCBvZgotCSAgICAgKiBwQ2xpcFRleHQuICBUaGVzZSBhcmUgcGFkZGluZyBhZGRlZCBieSAiZ2V0X2NsaXBib2FyZF9kYXRhIgotCSAgICAgKiAoaW50IDB4MmYsIEFYPSAweDE3MDUpIGluIG9yZGVyIHRvIHJvdW5kIHRoZSBkYXRhIHNpemUgdXAgdG8gdGhlCi0JICAgICAqIG5leHQgbXVsdGlwbGUgb2YgMzIgYnl0ZXMuICBTZWUgV2luMTZHZXRDbGlwYm9hcmREYXRhKCkgZm9yCi0JICAgICAqIGRldGFpbHMuCi0JICAgICAqLwotCi0JICAgIHBEZXN0ID0gc3Ryc3RyKCBwQ2xpcFRleHQsICJcclxuIiApOyAgICAvKiBmaW5kIGZpcnN0IDxDUj48Tkw+ICovCi0KLQkgICAgaWYgKHBEZXN0ICE9IE5VTEwpCQkJLyogZm91bmQgb25lPyAqLwotCSAgICB7Ci0JCXBTdGFydCA9IHBEZXN0ICsgMTsJCS8qIHBvaW50cyB0byA8Tkw+IGFmdGVyIDxDUj4gKi8KLQkJcEVuZCA9IHN0cnN0ciggcFN0YXJ0LCAiXHJcbiIgKTsvKiBmaW5kIG5leHQgPENSPjxOTD4gKi8KLQotCQl3aGlsZSAocEVuZCAhPSBOVUxMKQkJLyogZm91bmQgb25lPyAqLwotCQl7Ci0JCSAgICBtZW1tb3ZlKHBEZXN0LCBwU3RhcnQsIChsb25nKShwRW5kIC0gcFN0YXJ0KSk7Ci0JCQkJCQkJLyogZXhjbHVkZSA8Q1I+ICovCi0JCSAgICBwRGVzdCArPSAobG9uZykocEVuZCAtIHBTdGFydCk7CS8qIG5ldyBkZXN0aW5hdGlvbiAqLwotCQkgICAgcFN0YXJ0ID0gcEVuZCArIDE7CQkJLyogbmV3IHN0YXJ0aW5nIHBvaW50ICovCi0JCSAgICBwRW5kID0gc3Ryc3RyKHBTdGFydCwgIlxyXG4iKTsJLyogZmluZCBuZXh0IDxDUj48Tkw+ICovCi0JCX0KLQotCQkvKiBGZWxsIG91dCBvZiB3aGlsZSgpIGxvb3A6IG5vIG1vcmUgPENSPjxOTD4gcGFpcnMuICBKdXN0IGNvcHkKLQkJICogdGhlIHJlc3Qgb2YgdGhlIGRhdGEsIHVwIHRvIHRoZSBmaXJzdCBudWxsIGJ5dGUuICAqLwotCQlwRW5kID0gc3RyY2hyKHBTdGFydCwgJ1wwJyk7CQkvKiBmaW5kIGZpcnN0IG51bGwgKi8KLQotCQltZW1tb3ZlKHBEZXN0LCBwU3RhcnQsIChsb25nKShwRW5kIC0gcFN0YXJ0KSk7IC8qIGV4Y2x1ZGUgbnVsICovCi0JCXBEZXN0ICs9IChsb25nKShwRW5kIC0gcFN0YXJ0KTsKLQkJKnBEZXN0ID0gJ1wwJzsJCQkJICAgIC8qIHRlcm1pbmF0ZSAqLwotCi0JCS8qIE5vdyB0aGF0IGFsbCA8Q1I+PE5MPiBwYWlycyBoYXZlIGJlZW4gImNvbXByZXNzZWQiIGludG8ganVzdAotCQkgKiA8Tkw+J3MsIGRldGVybWluZSB0aGUgdHJ1ZSB0ZXh0IGxlbmd0aC4gICovCi0JCWNsaXBfZGF0YV9zaXplID0gKGxvbmdfdSkocERlc3QgLSBwQ2xpcFRleHQpOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQkvKiBubyA8Q1I+PE5MPiBwYWlycyBhdCBhbGwgKi8KLQkJLyogU2luY2UgdGhlIGRhdGEgbWF5IGhhdmUgYmVlbiBwYWRkZWQgd2l0aCB0cmFpbGluZyBudWxscywKLQkJICogZGV0ZXJtaW5lIHRoZSB0cnVlIHN0cmluZyBsZW5ndGguICovCi0JCWNsaXBfZGF0YV9zaXplID0gU1RSTEVOKHBDbGlwVGV4dCk7CS8qIHRydWUgZGF0YSBsZW5ndGggKi8KLQkgICAgfQotCi0JICAgIC8qIENvcHkgdGhlIGNsZWFuZWQtdXAgZGF0YSBvdmVyIHRvIFZpbSdzIGNsaXBib2FyZCAiKiIgcmVnaXN0ZXIuICovCi0JICAgIGNsaXBfeWFua19zZWxlY3Rpb24odHlwZSwgcENsaXBUZXh0LCBjbGlwX2RhdGFfc2l6ZSwgY2JkKTsKLQotCSAgICAvKiBGcmVlIHRoZSBtZW1vcnkgdGhhdCBXaW4xNkdldENsaXBib2FyZERhdGEoKSBhbGxvY2F0ZWQuICovCi0JICAgIHZpbV9mcmVlKHBBbGxvY2F0ZWQpOwotCX0KLQotCVdpbjE2Q2xvc2VDbGlwYm9hcmQoKTsKLQotICAgIH0gIC8vIGVuZCBpZiAoV2luMTZPcGVuQ2xpcGJvYXJkKCkpCi19Ci0KLS8qCi0gKiBTZW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgVmltIHRleHQgdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLgotICovCi0gICAgdm9pZAotY2xpcF9tY2hfc2V0X3NlbGVjdGlvbiggVmltQ2xpcGJvYXJkICpjYmQgKQotewotICAgIGNoYXJfdQkqcENsaXBEYXRhID0gTlVMTDsKLSAgICBsb25nX3UJY2xpcF9kYXRhX3NpemU7Ci0gICAgaW50CQljbGlwX2RhdGFfdHlwZTsKLQotICAgIC8qIElmIHRoZSAnKicgcmVnaXN0ZXIgaXNuJ3QgYWxyZWFkeSBmaWxsZWQgaW4sIGZpbGwgaXQgaW4gbm93LiAqLwotICAgIGNiZC0+b3duZWQgPSBUUlVFOwotICAgIGNsaXBfZ2V0X3NlbGVjdGlvbihjYmQpOwotICAgIGNiZC0+b3duZWQgPSBGQUxTRTsKLQotICAgIC8qCi0gICAgICogY2xpcF9jb252ZXJ0X3NlbGVjdGlvbigpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgdGV4dCB0byBzZW5kIHRvIHRoZSBXaW5kb3dzIGNsaXBib2FyZCwgdG9nZXRoZXIgd2l0aCBhIGNvdW50Ci0gICAgICogb2YgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIChieXRlcykgaW4gdGhlIGJ1ZmZlci4gIFRoZSBmdW5jdGlvbidzCi0gICAgICogcmV0dXJuIHZhbHVlIGlzIHRoZSAndHlwZScgb2Ygc2VsZWN0aW9uOiBNTElORSwgTUNIQVIsIG9yIE1CTE9DSzsKLSAgICAgKiBvciAtMSBmb3IgZmFpbHVyZS4KLSAgICAgKi8KLSAgICBjbGlwX2RhdGFfdHlwZSA9IGNsaXBfY29udmVydF9zZWxlY3Rpb24oJnBDbGlwRGF0YSwgJmNsaXBfZGF0YV9zaXplLCBjYmQpOwotCi0gICAgaWYgKGNsaXBfZGF0YV90eXBlIDwgMCkJICAgIC8qIGNvdWxkIG5vdCBjb252ZXJ0PyAqLwotCXJldHVybjsJCQkgICAgLyogZWFybHkgZXhpdCAqLwotCi0gICAgaWYgKFdpbjE2T3BlbkNsaXBib2FyZCgpKQotICAgIHsKLQlpZiAoV2luMTZFbXB0eUNsaXBib2FyZCgpKQotCXsKLQkgICAgaW50IHNlbnRPSzsKLQotCSAgICBzZW50T0sgPSBXaW4xNlNldENsaXBib2FyZERhdGEoQ0ZfVEVYVCwgcENsaXBEYXRhLAotCQkJCQkgICAgICBjbGlwX2RhdGFfc2l6ZSwgY2xpcF9kYXRhX3R5cGUpOwotCSAgICBzZW50T0sgPSBXaW4xNlNldENsaXBib2FyZERhdGEoQ0ZfVklNQ0xJUCwKLQkJCSBwQ2xpcERhdGEsIGNsaXBfZGF0YV9zaXplLCBjbGlwX2RhdGFfdHlwZSkgJiYgc2VudE9LOwotCi0JICAgIGlmICghc2VudE9LKQotCSAgICB7Ci0JCS8qIG9uZSBvciBib3RoIG9mIFdpbjE2U2V0Q2xpcGJvYXJkRGF0YSgpIGZhaWxlZC4gKi8KLQkJLyogVGVjaG5pY2FsbHkgd2UgZG9uJ3Qga25vdyB3aHkgV2luMTZTZXRDbGlwYm9hcmREYXRhKCkKLQkJICogZmFpbGVkLCBidXQgYWxtb3N0IGFsd2F5cyBpdCB3aWxsIGJlIGJlY2F1c2UgdGhlcmUgd2Fzbid0Ci0JCSAqIGVub3VnaCBET1MgbWVtb3J5IHRvIGJ1ZmZlciB0aGUgZGF0YSwgc28gcmVwb3J0IHRoYXQgYXMgdGhlCi0JCSAqIHByb2JsZW0uCi0JCSAqCi0JCSAqIFdlIHJlcG9ydCB0aGUgZXJyb3IgaGVyZSAoaW5zdGVhZCBvZiBpbgotCQkgKiBXaW4xNlNldENsaXBib2FyZERhdGEoKSkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBlcnJvcgotCQkgKiByZXBvcnRlZCB0d2ljZS4KLQkJICovCi0JCUVNU0coIkU0NTA6IFNlbGVjdGlvbiB0b28gbGFyZ2UsIGNhbm5vdCBhbGxvY2F0ZSBET1MgYnVmZmVyIik7Ci0JICAgIH0KLQl9Ci0KLQlXaW4xNkNsb3NlQ2xpcGJvYXJkKCk7Ci0gICAgfQotCi0gICAgLyogcmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGNsaXBfY29udmVydF9zZWxlY3Rpb24oKSAqLwotICAgIHZpbV9mcmVlKHBDbGlwRGF0YSk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qCi0gKiBXaW4xNk9wZW5DbGlwYm9hcmQ6IG9wZW4gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgVGhlIGNsaXBib2FyZCBtdXN0IGJlIG9wZW4KLSAqIGJlZm9yZSBpdCBjYW4gYmUgY29tbXVuaWNhdGVkIHdpdGggYXQgYWxsLiAgUmV0dXJuIFRSVUUgb24gc3VjY2VzcywKLSAqIEZBTFNFIG9uIGZhaWx1cmUuCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1XaW4xNk9wZW5DbGlwYm9hcmQodm9pZCkKLXsKLSAgICBfX2RwbWlfcmVncyAgZHBtaV9yZWdzOwotCi0gICAgbG9uZyAgICBzdGFydF90aW1lOwotICAgIGludAkgICAgdGlja19jb3VudDsKLQotICAgIC8qIGludCAweDJmLCBBWCA9IDB4MTcwMSBhdHRlbXB0cyB0byBvcGVuIHRoZSBXaW5kb3dzIGNsaXBib2FyZC4gIFVwb24KLSAgICAgKiByZXR1cm4gZnJvbSB0aGUgaW50ZXJydXB0LCBpZiBBWCBpcyBub24temVybywgdGhlIGNsaXBib2FyZCB3YXMKLSAgICAgKiBzdWNjZXNzZnVsbHkgb3BlbmVkLiAgSWYgQVggaXMgemVybywgdGhlIGNsaXBib2FyZCBjb3VsZCBub3QgYmUgb3BlbmVkCi0gICAgICogYmVjYXVzZSBpdCBpcyBjdXJyZW50bHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvY2Vzcy4KLSAgICAgKgotICAgICAqIFJlbWFyazogb3RoZXIgRE9TIHByb2dyYW1zIEkgKGRrKSBoYXZlIHdyaXR0ZW4gdGhhdCB1c2UgdGhlIFdpbmRvd3MKLSAgICAgKiBjbGlwYm9hcmQgc29tZXRpbWVzIGVuY291bnRlciB0aGUgcHJvYmxlbSB0aGF0IHRoZSBjbGlwYm9hcmQgY2Fubm90Ci0gICAgICogYmUgb3BlbmVkIGV2ZW4gdGhvdWdoIGl0IGlzIGRlbW9uc3RyYWJseSBub3QgaW4gdXNlIGJ5IGFueSBvdGhlcgotICAgICAqIHByb2Nlc3MuICBJbiBhbGwgY2FzZXMsIHJlcGVhdGVkIGF0dGVtcHRzIHRvIG9wZW4gdGhlIGNsaXBib2FyZAotICAgICAqIGV2ZW50dWFsbHkgc3VjY2VlZCwgYnV0IHRoZSBpbml0aWFsIGF0dGVtcHQgb2NjYXNpb25hbGx5IGZhaWxzLgotICAgICAqCi0gICAgICogVGhlIHByb2JsZW0gaXMgaW50ZXJtaXR0ZW50IGFuZCBhcHBlYXJzIHRvIGJlIHJlbGF0ZWQgdG8gRE9TIGJlaW5nCi0gICAgICogImJ1c3kiIGF0IGNlcnRhaW4gdW5wcmVkaWN0YWJsZSB0aW1lcy4gIERPUyBtYWludGFpbnMgdHdvIGludGVybmFsCi0gICAgICogZmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGl0J3MgYnVzeTogSW5ET1MgYW5kIENyaXRFcnIuICBUaGUKLSAgICAgKiBsb2NhdGlvbiBvZiBJbkRPUyBjYW4gYmUgZm91bmQgYnkgY2FsbGluZyBpbnQgMHgyMSwgQUggPSAweDM0LiAgVGhlCi0gICAgICogbG9jYXRpb24gb2YgQ3JpdEVyciBjYW4gYmUgZm91bmQgYnkgY2FsbGluZyBpbnQgMHgyMSwgQVggPSAweDVkMDYuCi0gICAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGZsYWdzIGlzIHNldCwgRE9TIGlzICJidXN5IiBhbmQgY2Fubm90IGJlCi0gICAgICogaW50ZXJydXB0ZWQuICBTZWUgIlVuZG9jdW1lbnRlZCBET1MiIGJ5IFNjaHVsbWFuIGV0IGFsIGZvciBkZXRhaWxzLgotICAgICAqCi0gICAgICogSG93ZXZlciBoZXJlIEkgdGFrZSB0aGUgZWFzaWVyIGFwcHJvYWNoIHRoYXQgaWYgdGhlIGZpcnN0IGNhbGwgdG8gb3BlbgotICAgICAqIHRoZSBjbGlwYm9hcmQgZG9lcyBub3Qgc3VjY2VlZCwganVzdCB0cnkgYWdhaW4uICBJbiBmYWN0LCB0cnkgb25jZSBwZXIKLSAgICAgKiBiaW9zdGltZSgpIGNsb2NrIHRpY2ssIHVwIHRvIDE4IHRpbWVzIChhYm91dCBvbmUgc2Vjb25kKS4KLSAgICAgKi8KLQotICAgIHRpY2tfY291bnQgPSAwOwotCi0gICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDE7CS8qIG9wZW4gV2luZG93cyBjbGlwYm9hcmQgKi8KLSAgICBpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLSAgICB7Ci0JLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBub3Qgb3BlbiAqLwotICAgIH0KLQotICAgIC8qIHdhaXQgdXAgdG8gb25lIHNlY29uZCAqLwotICAgIHdoaWxlIChkcG1pX3JlZ3MueC5heCA9PSAwICYmIHRpY2tfY291bnQrKyA8IDE4KQotICAgIHsKLQkvKiBXYWl0IG9uZSBjbG9jayB0aWNrICgxOC4yIHRpY2tzL3NlYyA9IDU1IG1zZWMgcGVyIHRpY2spLgotCSAqCi0JICogV2UgYnVzeS13YWl0IGhlcmUuICBVbmZvcnR1bmF0ZWx5LCBkZWxheSgpIGFuZCB1c2xlZXAoKSBoYXZlIGJlZW4KLQkgKiByZXBvcnRlZCB0byBnaXZlIHByb2JsZW1zIHdpdGggdGhlIG9yaWdpbmFsIFdpbmRvd3MgOTUuICBUaGlzIGlzCi0JICogZml4ZWQgaW4gc2VydmljZSBwYWNrIDEsIGJ1dCBub3QgZXZlcnlib2R5IGluc3RhbGxlZCB0aGF0LgotCSAqLwotCXN0YXJ0X3RpbWUgPSBiaW9zdGltZSgwLCAwTCk7Ci0Jd2hpbGUgKGJpb3N0aW1lKDAsIDBMKSA9PSBzdGFydF90aW1lKQotCSAgICA7Ci0KLQlkcG1pX3JlZ3MueC5heCA9IDB4MTcwMTsgICAgLyogb3BlbiBXaW5kb3dzIGNsaXBib2FyZCAqLwotCWlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotCXsKLQkgICAgLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JICAgIHJldHVybiBGQUxTRTsJCS8qIEZBTFNFIC0tPiBjbGlwYm9hcmQgbm90IG9wZW4gKi8KLQl9Ci0gICAgfQotCi0gICAgLyogQ291bGRuJ3Qgb3BlbiB0aGUgY2xpcGJvYXJkLCBldmVuIGFmdGVyIDE4IGF0dGVtcHRzPyAqLwotCi0gICAgaWYgKHRpY2tfY291bnQgPj0gMTggJiYgZHBtaV9yZWdzLnguYXggPT0gMCkKLQlyZXR1cm4gRkFMU0U7CQkvKiBGQUxTRSAtLT4gY2xpcGJvYXJkIG5vdCBvcGVuICovCi0KLSAgICByZXR1cm4gVFJVRTsJLyogVFJVRSAtLT4gY2xpcGJvYXJkIG9wZW5lZCBzdWNjZXNzZnVsbHksIE9LICovCi19Ci0KLS8qCi0gKiBXaW4xNkNsb3NlQ2xpcGJvYXJkOiBjbG9zZSB0aGUgV2luZG93cyBjbGlwYm9hcmQuICBSZXR1cm4gVFJVRSBvbgotICogc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZS4gIFRoaXMgZnVuY3Rpb24gY2FuIGFsd2F5cyBiZSBjYWxsZWQsCi0gKiB3aGV0aGVyIHRoZSBjbGlwYm9hcmQgaXMgb3BlbiBvciBub3QuCi0gKi8KLSAgICBzdGF0aWMgaW50Ci1XaW4xNkNsb3NlQ2xpcGJvYXJkKHZvaWQpCi17Ci0gICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKLQotICAgIC8qIENsb3NlIHRoZSBjbGlwYm9hcmQuICBUaGlzIGludGVycnVwdCBjYW4gYWx3YXlzIGJlIGNhbGxlZCwgZXZlbgotICAgICAqIGlmIHRoZSBjbGlwYm9hcmQgaXMgYWxyZWFkeSBjbG9zZWQuCi0gICAgICovCi0KLSAgICBkcG1pX3JlZ3MueC5heCA9IDB4MTcwODsJICAgIC8qIGNsb3NlIHRoZSBjbGlwYm9hcmQgKi8KLSAgICBpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLSAgICB7Ci0JLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBjb3VsZCBub3QgYmUgY2xvc2VkICovCi0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7CS8qIFRSVUUgLS0+IGNsaXBib2FyZCBjbG9zZWQgc3VjY2Vzc2Z1bGx5LCBPSyAqLwotfQotCi0vKgotICogV2luMTZFbXB0eUNsaXBib2FyZDogZW1wdHkgdGhlIChwcmV2aW91c2x5IG9wZW5lZCkgV2luZG93cyBjbGlwYm9hcmQuCi0gKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlLgotICovCi0gICAgc3RhdGljIGludAotV2luMTZFbXB0eUNsaXBib2FyZCh2b2lkKQotewotICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7Ci0KLSAgICAvKiBpbnQgMHgyZiwgQVggPSAweDE3MDIgYXR0ZW1wdHMgdG8gZW1wdHkgdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgVXBvbgotICAgICAqIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQsIGlmIEFYID09IDAsIHRoZSBjbGlwYm9hcmQgY291bGQgbm90IGJlCi0gICAgICogZW1wdGllZCAoZm9yIHNvbWUgcmVhc29uKS4KLSAgICAgKi8KLSAgICBkcG1pX3JlZ3MueC5heCA9IDB4MTcwMjsgICAgLyogIGVtcHR5IHRoZSBXaW5kb3dzIGNsaXBib2FyZCAqLwotICAgIGlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotICAgIHsKLQkvKiByZWFsLW1vZGUgaW50ZXJydXB0IGZhaWxlZD8gKi8KLQlyZXR1cm4gRkFMU0U7CQkvKiBGQUxTRSAtLT4gY2xpcGJvYXJkIGNvdWxkIG5vdCBiZSBlbXB0aWVkICovCi0gICAgfQotCi0gICAgLyogRGlkIHdlIHN1Y2NlZWQgaW4gY2xlYXJpbmcgdGhlIGNsaXBib2FyZD8gKi8KLSAgICBpZiAoZHBtaV9yZWdzLnguYXggPT0gMCkKLQlyZXR1cm4gRkFMU0U7CQkvKiBGQUxTRSAtLT4gY2xpcGJvYXJkIGNvdWxkIG5vdCBiZSBlbXB0aWVkICovCi0KLSAgICByZXR1cm4gVFJVRTsJCS8qIFRSVUUgLS0+IGNsaXBib2FyZCB3YXMgZW1wdGllZCwgT0sgKi8KLX0KLQotLyoKLSAqIEZyZWVET1NNZW1vcnk6IGEgaGVscGVyIGZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IHByZXZpb3VzbHkKLSAqIGFsbG9jYXRlZCBieSBhIGNhbGwgdG8gX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoKS4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1GcmVlRE9TTWVtb3J5KGludCBwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvcikKLXsKLSAgICAvKiBGcmVlIHRoZSBET1MgYnVmZmVyIGFuZCByZWxlYXNlIHRoZSBEUE1JIHByb3QtbW9kZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEl0J3MgaW1wb3J0YW50IHRoYXQgRE9TIG1lbW9yeSBiZSBwcm9wZXJseSByZWxlYXNlZCBiZWNhdXNlCi0gICAgICogdGhlcmUncyBvbmx5IGEgbGltaXRlZCBhbW91bnQgb2YgaXQuICBUaGVyZWZvcmUsIGlmIHRoZSBjYWxsCi0gICAgICogdG8gX19kcG1pX2ZyZWVfZG9zX21lbW9yeSgpIGZhaWxzLCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UKLSAgICAgKiB1bmNvbmRpdGlvbmFsbHkuCi0gICAgICovCi0gICAgaWYgKF9fZHBtaV9mcmVlX2Rvc19tZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpID09IC0xKQotCUVNU0coIkU0NTE6IGNvdWxkIG5vdCBmcmVlIERPUyBtZW1vcnkgYnVmZmVyIChESkdQUCkiKTsKLX0KLQotLyoKLSAqIFdpbjE2R2V0Q2xpcGJvYXJkRGF0YTogcXVlcnkgdGhlIFdpbmRvd3MgY2xpcGJvYXJkIGFzIHRvIHdoZXRoZXIgZGF0YQotICogaXMgYXZhaWxhYmxlIGluIGEgcGFydGljdWxhciBjbGlwYm9hcmQgZm9ybWF0LiAgSWYgZGF0YSBpcwotICogYXZhaWxhYmxlLCBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgaXQgYW5kIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUKLSAqIGNsaXBib2FyZCBpbnRvIHRoZSBidWZmZXIuICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuICBJZgotICogbm8gZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHJlcXVlc3RlZCBmb3JtYXQsIHJldHVybiBOVUxMLgotICoKLSAqIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgbWVtb3J5IHRvIGhvbGQgdGhlIHJldHJpZXZlZCBjbGlwYm9hcmQKLSAqIGRhdGEuICBJdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIHRoaXMgbWVtb3J5Ci0gKiBvbmNlIGl0J3MgZmluaXNoZWQgdXNpbmcgaXQuICBUaGUgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBieQotICogY2FsbGluZyB2aW1fZnJlZSgpLgotICovCi0gICAgc3RhdGljIGNoYXJfdSAqCi1XaW4xNkdldENsaXBib2FyZERhdGEoaW50IGNsaXBfZGF0YV9mb3JtYXQpCi17Ci0gICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKLQotICAgIGludAkJcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzczsKLSAgICBpbnQJCXByb3RlY3RlZF9tb2RlX3NlbGVjdG9yOwotCi0gICAgY2hhcl91CSpjbGlwX2RhdGFfYnVmZmVyOwotICAgIGxvbmdfdQljbGlwX2RhdGFfc2l6ZTsKLQotICAgIC8qIFdlIG9ubHkgaGFuZGxlIGNsaXBib2FyZCBmb3JtYXRzIHdlIHJlY29nbml6ZSwgb3RoZXJzIGFyZSBpZ25vcmVkLgotICAgICAqCi0gICAgICogSXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIGEgY3VzdG9tIGNsaXBib2FyZCBmb3JtYXQgZm9yIFZpbUNsaXBib2FyZAotICAgICAqIGRhdGEgdW5kZXIgRE9TLCBzbyBvbmUgb2YgdGhlIHByZWRlZmluZWQgV2luZG93cyBmb3JtYXRzIGhhZCB0byBiZQotICAgICAqIHVzZWQgZm9yIENGX1ZJTUNMSVAuICBUd28gb2JzY3VyZSBmb3JtYXRzLCBwb3B1bGFyIHdoZW4gV2luZG93cyAzLjAKLSAgICAgKiBjYW1lIG91dCBidXQgbm8gbG9uZ2VyIGluIG11Y2ggdXNlIHRvZGF5LCBhcmUgdGhlIERJRiBhbmQgU1lMSyBmb3JtYXRzLgotICAgICAqIERJRiBpcyB0aGUgRGF0YSBJbnRlcmNoYW5nZSBGb3JtYXQsIFNZTEsgaXMgdGhlIFN5bWJvbGljIExpbmsgZm9ybWF0LgotICAgICAqIFRoZXkgYXJlIGJvdGggdGV4dCBmb3JtYXRzIGFuZCBlaXRoZXIgb25lIGNhbiBiZSBoaWphY2tlZCBmb3IgdXNlIGFzCi0gICAgICogInRoZSBWaW1DbGlwYm9hcmQgZm9ybWF0Ii4gIE9mIGNvdXJzZSwgdGhpcyBjb25mbGljdHMgd2l0aCBhbnlvbmUgd2hvCi0gICAgICogc3RpbGwgKmlzKiB1c2luZyBESUYgb3IgU1lMSyBkYXRhIGZvcm1hdHMsIGJ1dCB0aGF0IHdpbGwgYmUgdmVyeSBmZXcKLSAgICAgKiBwZW9wbGUuCi0gICAgICoKLSAgICAgKiBJIChkaykgY2hvc2UgU1lMSyBhcyB0aGUgbW9yZSBvYnNjdXJlIGZvcm1hdCBiZWNhdXNlIGl0IHdhcyB1c2VkCi0gICAgICogbW9zdGx5IGZvciBNaWNyb3NvZnQgTXVsdGlwbGFuICh0aGUgcHJlLWN1cnNvciB0byBFeGNlbCkgYW5kIGl0J3Mgbm90Ci0gICAgICogbGlrZWx5IE11bHRpcGxhbiBpcyB1c2VkIGFueXdoZXJlIG11Y2ggYW55bW9yZS4gIE1pbmQgeW91LCBFeGNlbCBjYW4KLSAgICAgKiBzdGlsbCBleHBvcnQgdG8gYm90aCBESUYgYW5kIFNZTEsgZm9ybWF0cy4KLSAgICAgKi8KLQotICAgIHN3aXRjaCAoY2xpcF9kYXRhX2Zvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSBDRl9WSU1DTElQOgkJICAgIC8qIFZpbSdzIG93biBzcGVjaWFsIGNsaXBib2FyZCBmb3JtYXQgKi8KLSAgICBjYXNlIENGX1RFWFQ6CQkgICAgLyogV2luZG93cyB0ZXh0ICovCi0gICAgY2FzZSBDRl9PRU1URVhUOgkJICAgIC8qIERPUyAoT0VNKSB0ZXh0ICovCi0KLQkvKiBpbnQgMHgyZiwgQVggPSAweDE3MDQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgY3VycmVudGx5Ci0JICogb24gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLCBmb3IgdGhlIHNwZWNpZmllZCBmb3JtYXQuICBVcG9uIHJldHVybgotCSAqIGZyb20gdGhlIGludGVycnVwdCwgRFg6QVggPSB0aGUgbnVtYmVyIG9mIGJ5dGVzLCByb3VuZGVkIHVwIHRvIHRoZQotCSAqIG5lYXJlc3QgbXVsdGlwbGUgb2YgMzIuCi0JICovCi0KLQlkcG1pX3JlZ3MueC5heCA9IDB4MTcwNDsgICAgLyogZ2V0IHNpemUgb2YgY2xpcGJkIGRhdGEgKi8KLQlkcG1pX3JlZ3MueC5keCA9IGNsaXBfZGF0YV9mb3JtYXQ7Ci0JaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCi0JewotCSAgICAvKiByZWFsLW1vZGUgaW50ZXJydXB0IGZhaWxlZD8gKi8KLQkgICAgcmV0dXJuIE5VTEw7CQkJCSAgICAvKiBlYXJseSBleGl0ICovCi0JfQotCi0JLyogRGlkIHdlIGdldCBhbnl0aGluZz8gIElmIG5vdCwgdGhpcyBpcyBub3QgYW4gZXJyb3IuICovCi0JaWYgKGRwbWlfcmVncy54LmR4ID09IDAgJiYgZHBtaV9yZWdzLnguYXggPT0gMCkKLQl7Ci0JICAgIC8qIG5vIENGX1ZJTUNMSVAgZGF0YT8gKi8KLQkgICAgcmV0dXJuIE5VTEw7CQkJCSAgICAvKiBlYXJseSBleGl0ICovCi0JfQotCi0JLyogVGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHJlcXVlc3RlZCBjbGlwYm9hcmQgZm9ybWF0LgotCSAqCi0JICogQ2FsY3VsYXRlIGRhdGEgc2l6ZS4gIFJlbWVtYmVyIHRoaXMgaXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdAotCSAqIG11bHRpcGxlIG9mIDMyLCBzbyBjbGlwX2RhdGFfc2l6ZSBpcyBhY3R1YWxseSBhbiB1cHBlciBsaW1pdC4KLQkgKiBUaGUgZXh0cmEgYnl0ZXMsIGlmIGFueSwgYXJlIHNldCB0byBudWxsICgweDAwKSB3aGVuIHRoZSBkYXRhIGlzCi0JICogcmVhZCBmcm9tIHRoZSBjbGlwYm9hcmQuICAoTGF0ZXI6KSBhY3R1YWxseSBJJ20gbm8gbG9uZ2VyIHN1cmUKLQkgKiB0aGlzIGlzIHN0cmljdGx5IHRydWU6IHRoZSBlbmQtb2YtZGF0YSBpcyBtYXJrZWQgYnkgYSBudWxsLCBidXQKLQkgKiB0aGUgZXh0cmEgYnl0ZXMgYXBwZWFyIHRvIHNvbWV0aW1lcyBiZSBudWxsLCBzb21ldGltZXMgbm90LgotCSAqIFRoZXkgbWF5IGp1c3QgYmUgZ2FyYmFnZS4KLQkgKi8KLQljbGlwX2RhdGFfc2l6ZSA9IGRwbWlfcmVncy54LmF4ICsgKGRwbWlfcmVncy54LmR4IDw8IDE2KTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSB0byByZXRyaWV2ZSB0aGUgZGF0YS4gIFRoZSBidWZmZXIgaGFzIHRvIGxpZSBpbiB0aGUKLQkgKiBET1MgbWVtb3J5IHJlZ2lvbiAoaW4gdGhlIGZpcnN0IDEgTUJ5dGUgb2YgYWRkcmVzcyBzcGFjZSkgYmVjYXVzZQotCSAqIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBpbnRlcmZhY2UgZXhwZWN0cyBhIDE2LWJpdCBzZWdtZW50Om9mZnNldAotCSAqIHBvaW50ZXIgdG8gYSBidWZmZXIgYWRkcmVzcyB3aXRoaW4gdGhlIERPUyByZWdpb24uICBNdXN0IHRoZXJlZm9yZQotCSAqIHVzZSBfX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgpIGluc3RlYWQgb2YgbGFsbG9jKCkgb3IgYWxsb2MoKS4KLQkgKi8KLQlyZWFsX21vZGVfc2VnbWVudF9hZGRyZXNzID0gX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoCi0JCShjbGlwX2RhdGFfc2l6ZSArIDE1KSA+PiA0LAkvKiBidWZmZXIgc2l6ZSwgaW4gMTYtYnl0ZSBwYXJhZ3JhcGhzICovCi0JCSZwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CS8qIHByb3QtbW9kZSBzZWxlY3RvciBmb3IgdGhlIGFkZHJlc3MgKi8KLQotCWlmIChyZWFsX21vZGVfc2VnbWVudF9hZGRyZXNzID09IC0xKQotCXsKLQkgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotCi0JICAgIC8qIFRlY2huaWNhbGx5IHdlIGRvbid0IGtub3cgd2h5IHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgYnV0Ci0JICAgICAqIGFsbW9zdCBhbHdheXMgaXQgd2lsbCBiZSBiZWNhdXNlIHRoZXJlIHdhc24ndCBlbm91Z2ggRE9TCi0JICAgICAqIG1lbW9yeSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LCBzbyByZXBvcnQgdGhhdCBhcyB0aGUgcHJvYmxlbS4KLQkgICAgICogT24gbXkgc3lzdGVtLCBESkdQUCBpcyBhYmxlIHRvIHNhdGlzZnkgYSBET1MgYWxsb2NhdGlvbiByZXF1ZXN0Ci0JICAgICAqIHVwIHRvIGFib3V0IDYwMEsgaW4gc2l6ZS4gIFRoaXMgZGVwZW5kcyBvbiB5b3VyIEhJTUVNLlNZUyBhbmQKLQkgICAgICogRU1NMzg2LkVYRSBzZXR0aW5ncyBob3dldmVyLgotCSAgICAgKi8KLQkgICAgRU1TRygiRTQ1MjogQ2xpcGJvYXJkIGRhdGEgdG9vIGxhcmdlLCBjYW5ub3QgYWxsb2NhdGUgRE9TIGJ1ZmZlciIpOwotCSAgICByZXR1cm4gTlVMTDsJCQkJICAgIC8qIGVhcmx5IGV4aXQgKi8KLQl9Ci0KLQkvKiBDb3B5IGRhdGEgZnJvbSB0aGUgY2xpcGJvYXJkIGludG8gdGhlIGJ1ZmZlci4gIEV4cGVyaW1lbnRzIHNob3cgdGhhdAotCSAqIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBpcyBzbWFydCBlbm91Z2ggdG8gaGFuZGxlIGRhdGEgdHJhbnNmZXJzCi0JICogbGFyZ2VyIHRoYW4gNjRLIHByb3Blcmx5LCBldmVuIHRob3VnaCB0aGUgYnVmZmVyIGFkZHJlc3MgaXMgYSAxNi1iaXQKLQkgKiBzZWdtZW50Om9mZnNldCAod2hpY2ggd291bGQgbm9ybWFsbHkgbGltaXQgdGhlIGJsb2NrIHNpemUgdG8gNjRLCi0JICogdW5sZXNzIEVTIGdldHMgaW5jcmVtZW50ZWQpLgotCSAqLwotCWRwbWlfcmVncy54LmF4ID0gMHgxNzA1OwkvKiBnZXQgY2xpcGJvYXJkIGRhdGEgKi8KLQlkcG1pX3JlZ3MueC5keCA9IGNsaXBfZGF0YV9mb3JtYXQ7CQkvKiBDRl9WSU1DTElQICovCi0JZHBtaV9yZWdzLnguZXMgPSByZWFsX21vZGVfc2VnbWVudF9hZGRyZXNzOwkvKiBidWZmZXIgYWQ6IHNlZ21lbnQgKi8KLQlkcG1pX3JlZ3MueC5ieCA9IDA7CQkJCS8qIGJ1ZmZlciBhZDogb2Zmc2V0ICovCi0JaWYgKF9fZHBtaV9pbnQoIDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotCXsKLQkgICAgLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JICAgIEVNU0coIkU0NTM6IGNvdWxkIG5vdCBjb3B5IGNsaXBib2FyZCBkYXRhIHRvIERPUyBidWZmZXIiKTsKLQkgICAgRnJlZURPU01lbW9yeShwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CS8qIGNsZWFuIHVwIERPUyBtZW0gKi8KLQkgICAgcmV0dXJuIE5VTEw7CQkJCS8qIGVhcmx5IGV4aXQgKi8KLQl9Ci0KLQkvKiBDbGlwYm9hcmQgZGF0YSBpcyBub3cgaW4gRE9TIG1lbW9yeSBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLQkgKiBFUzpCWC4gIENvcHkgdGhpcyBpbnRvIG9yZGluYXJ5IG1lbW9yeSB0aGF0IFZpbSBjYW4gYWNjZXNzIChpZS4KLQkgKiBwcm90LW1vZGUgbWVtb3J5KS4gIEFsbG9jYXRlIG9uZSBleHRyYSBieXRlIHRvIGVuc3VyZSB0aGUgdGV4dAotCSAqIGlzIHRlcm1pbmF0ZWQgcHJvcGVybHkgKGluIGNhc2UgaXQgd2FzIHNvbWVob3cgY29ycnVwdGVkKS4KLQkgKi8KLQljbGlwX2RhdGFfYnVmZmVyID0gKGNoYXJfdSAqKWxhbGxvYyhjbGlwX2RhdGFfc2l6ZSArIDEsIFRSVUUpOwotCi0JaWYgKGNsaXBfZGF0YV9idWZmZXIgPT0gTlVMTCkKLQl7Ci0JICAgIC8qIGFsbG9jYXRpb24gZmFpbGVkPyAqLwotCSAgICBFTVNHKCJFNDU0OiBjb3VsZCBub3QgYWxsb2NhdGUgY2xpcGJvYXJkIG1lbW9yeSBidWZmZXIiKTsKLQkgICAgRnJlZURPU01lbW9yeShwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CS8qIGNsZWFuIHVwIERPUyBtZW0gKi8KLQkgICAgcmV0dXJuIE5VTEw7CQkJCS8qIGVhcmx5IGV4aXQgKi8KLQl9Ci0KLQkqKGNsaXBfZGF0YV9idWZmZXIgKyBjbGlwX2RhdGFfc2l6ZSkgPSAnXDAnOwkvKiBlbnN1cmUgdGVybWluYXRlZCAqLwotCi0JLyogQ29weSB0aGUgZGF0YSBmcm9tIERPUyBtZW1vcnkgdG8gVmltLWFjY2Vzc2libGUgbWVtb3J5LiAqLwotCW1vdmVkYXRhKAkJCQkvKiBESkdQUCB2ZXJzaW9uIG9mIG1lbWNweSgpICovCi0JCXByb3RlY3RlZF9tb2RlX3NlbGVjdG9yLCAwLCAvKiBzb3VyY2U6IERPUyBhZCAodmlhIHNlbGVjdG9yKSAqLwotCQlfbXlfZHMoKSwgKHVuc2lnbmVkKWNsaXBfZGF0YV9idWZmZXIsCi0JCQkJCQkvKiB0YXJnZXQ6IG5vcm1hbCBtZW0gYWRkcmVzcyAqLwotCQljbGlwX2RhdGFfc2l6ZSk7CQkvKiBob3cgbWFueSBieXRlcyAqLwotCi0JLyogRnJlZSB0aGUgRE9TIGJ1ZmZlciBhbmQgcmVsZWFzZSB0aGUgRFBNSSBwcm90LW1vZGUgc2VsZWN0b3IuICovCi0JRnJlZURPU01lbW9yeShwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CSAvKiBjbGVhbiB1cCBET1MgbWVtb3J5ICovCi0KLQlyZXR1cm4gY2xpcF9kYXRhX2J1ZmZlcjsgICAgLyogcmV0dXJuIHBvaW50ZXIgdG8gYWxsb2NhdGVkIGJ1ZmZlciAqLwotCi0gICAgZGVmYXVsdDoJCS8qIHVua25vd24gY2xpcGJvYXJkIGZvcm1hdCAqLwotCXJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLyoKLSAqIFdpbjE2U2V0Q2xpcGJvYXJkRGF0YTogc2VuZCAnY2xpcF9kYXRhX3NpemUnIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgYnVmZmVyCi0gKiBwb2ludGVkIHRvIGJ5ICdjbGlwX2RhdGEnLCB0byB0aGUgV2luZG93cyBjbGlwYm9hcmQuICBUaGUgZGF0YSBpcwotICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBjbGlwYm9hcmQgYXMgYmVpbmcgaW4gdGhlICdjbGlwX2RhdGFfZm9ybWF0JwotICogZm9ybWF0LgotICovCi0gICAgc3RhdGljIGludAotV2luMTZTZXRDbGlwYm9hcmREYXRhKAotCWludAljbGlwX2RhdGFfZm9ybWF0LAotCWNoYXJfdQkqY2xpcF9kYXRhLAotCWludAljbGlwX2RhdGFfc2l6ZSwKLQlpbnQJY2xpcF9kYXRhX3R5cGUpCi17Ci0gICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKLQotICAgIGludAkJcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzczsKLSAgICBpbnQJCXByb3RlY3RlZF9tb2RlX3NlbGVjdG9yOwotICAgIGxvbmdfdQlwcm90ZWN0ZWRfbW9kZV9vZmZzZXQgPSAwTDsKLSAgICBpbnQJCXRvdGFsX3NpemUgPSBjbGlwX2RhdGFfc2l6ZTsKLQotICAgIGNoYXJfdQkqY2xpcF9zZWxfdHlwZTsKLQotICAgIC8qIElmIHdlJ3JlIHVzaW5nIHRoZSBDRl9WSU1DTElQIGN1c3RvbSBmb3JtYXQsIGFsbG9jYXRlIGFuIGV4dHJhCi0gICAgICogYnl0ZSBmb3IgY2xpcF9zZWxfdHlwZSwgd2hpY2ggaXMgYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZQotICAgICAqIG9mIHRleHQgc2VsZWN0aW9uOiBNTElORSwgTUNIQVIsIG9yIE1CTE9DSy4KLSAgICAgKi8KLSAgICBpZiAoY2xpcF9kYXRhX2Zvcm1hdCA9PSBDRl9WSU1DTElQKQotCXRvdGFsX3NpemUrKzsJCQkvKiBleHRyYSBieXRlIGZvciBtYXJrZXIgKi8KLQotICAgIC8qIERhdGEgY2Fubm90IGJlIHNlbnQgZGlyZWN0bHkgZnJvbSBhIFZpbSBzdHJpbmcgKHBDbGlwRGF0YSkgdG8KLSAgICAgKiB0aGUgV2luZG93cyBjbGlwYm9hcmQsIGJlY2F1c2UgdGhlIFdpbmRvd3MgY2xpcGJvYXJkIGludGVyZmFjZQotICAgICAqIGV4cGVjdHMgYSAxNi1iaXQgKERPUykgc2VnbWVudDpvZmZzZXQgYWRkcmVzcyBmb3IgdGhlIHNvdXJjZQotICAgICAqIGJ1ZmZlci4gIFRoZXJlZm9yZSB3ZSBtdXN0IGNyZWF0ZSBhICJ0cmFuc2ZlciBidWZmZXIiIGluIHRoZSBET1MKLSAgICAgKiBtZW1vcnkgcmVnaW9uIChpbiB0aGUgZmlyc3QgMSBNQnl0ZSBvZiBhZGRyZXNzIHNwYWNlKSBhbmQgY29weQotICAgICAqIHRoZSBWaW0gc3RyaW5nIGludG8gdGhhdC4gIEZyb20gdGhlcmUsIHRoZSBkYXRhIGNhbiB0aGVuIGJlIHNlbnQKLSAgICAgKiB0byB0aGUgV2luZG93cyBjbGlwYm9hcmQuCi0gICAgICoKLSAgICAgKiBUbyBhbGxvY2F0ZSBET1MgbWVtb3J5LCB3ZSBtdXN0IHVzZSBfX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgpCi0gICAgICogaW5zdGVhZCBvZiBsYWxsb2MoKSBvciBhbGxvYygpLiAgSWYgdGhlIGFsbG9jYXRpb24gZmFpbHMsIGl0IHdpbGwKLSAgICAgKiBhbG1vc3QgaW52YXJpYWJseSBiZSBiZWNhdXNlIHRoZXJlIGlzIG5vdCBlbm91Z2ggRE9TIG1lbW9yeQotICAgICAqIGF2YWlsYWJsZSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiBjbGlwX2RhdGEuICBUaGVyZSBpcyBub3RoaW5nCi0gICAgICogd2UgY2FuIGRvIGFib3V0IHRoaXMsIHdlIHNpbXBseSBoYXZlIHRvIGZhaWwuCi0gICAgICovCi0gICAgcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9IF9fZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KAotCSAgICAodG90YWxfc2l6ZSArIDE1KSA+PiA0LAkvKiBidWZmZXIgc2l6ZSwgaW4gMTYtYnl0ZSBwYXJhZ3JhcGhzICovCi0JICAgICZwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CS8qIHByb3QtbW9kZSBzZWxlY3RvciBmb3IgdGhlIGFkZHJlc3MgKi8KLQotICAgIGlmIChyZWFsX21vZGVfc2VnbWVudF9hZGRyZXNzID09IC0xKQotICAgIHsKLQkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0JLyogVGVjaG5pY2FsbHkgd2UgZG9uJ3Qga25vdyB3aHkgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCBidXQKLQkgKiBhbG1vc3QgYWx3YXlzIGl0IHdpbGwgYmUgYmVjYXVzZSB0aGVyZSB3YXNuJ3QgZW5vdWdoIERPUwotCSAqIG1lbW9yeSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LiAgT24gbXkgc3lzdGVtLCBESkdQUCBpcyBhYmxlCi0JICogdG8gc2F0aXNmeSBhIERPUyBhbGxvY2F0aW9uIHJlcXVlc3QgdXAgdG8gYWJvdXQgNjAwSyBpbiBzaXplLgotCSAqIFRoaXMgZGVwZW5kcyBob3dldmVyIG9uIEhJTUVNLlNZUyBhbmQgRU1NMzg2LkVYRSBzZXR0aW5ncy4KLQkgKi8KLQlyZXR1cm4gRkFMU0U7CQkJCS8qIGVhcmx5IGV4aXQgKi8KLSAgICB9Ci0KLSAgICAvKiBDb3B5IGRhdGEgZnJvbSBWaW0ncyBidWZmZXIgKGNsaXBfZGF0YSkgaW50byB0aGUgRE9TIHRyYW5zZmVyIGJ1ZmZlci4KLSAgICAgKiBUaGlzIGNhbiBiZSBsYXJnZXIgdGhhbiA2NEs7IG1vdmVkYXRhKCkgdGFrZXMgY2FyZSBvZiBjcm9zc2luZyBhbnkKLSAgICAgKiAxNi1iaXQgc2VnbWVudCBib3VuZGFyaWVzLgotICAgICAqCi0gICAgICogSWYgd2UncmUgdXNpbmcgVmltJ3MgY3VzdG9tIGNsaXBib2FyZCBmb3JtYXQsIHdlIG11c3QgY29weSBvbmUgZXh0cmEKLSAgICAgKiBieXRlIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIHNlbGVjdGlvbjogbGluZSwgY2hhcmFjdGVyLCBvciBibG9jay4KLSAgICAgKi8KLSAgICBpZiAoY2xpcF9kYXRhX2Zvcm1hdCA9PSBDRl9WSU1DTElQKQotICAgIHsKLQlzd2l0Y2ggKGNsaXBfZGF0YV90eXBlKQotCXsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBNTElORToJICAgIGNsaXBfc2VsX3R5cGUgPSAiTCI7CWJyZWFrOwotCSAgICBjYXNlIE1DSEFSOgkgICAgY2xpcF9zZWxfdHlwZSA9ICJDIjsJYnJlYWs7Ci0JICAgIGNhc2UgTUJMT0NLOiAgICBjbGlwX3NlbF90eXBlID0gIkIiOwlicmVhazsKLQl9Ci0KLQltb3ZlZGF0YSgKLQkJX215X2RzKCksICh1bnNpZ25lZCljbGlwX3NlbF90eXBlLAotCQkJCQkgICAgLyogc291cmNlOiBub3JtYWwgbWVtb3J5IGFkZHJlc3MgKi8KLQkJcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IsIDAsIC8qIHRhcmdldDogRE9TIGFkICh2aWEgc2VsZWN0b3IpICovCi0JCTEpOwkJCSAgICAvKiBob3cgbWFueSBieXRlcyB0byBjb3B5ICovCi0KLQlwcm90ZWN0ZWRfbW9kZV9vZmZzZXQgKz0gU1RSTEVOKGNsaXBfc2VsX3R5cGUpOwkvKiBhbGxvdyBmb3IgbWFya2VyICovCi0gICAgfQotCi0gICAgbW92ZWRhdGEoCi0JX215X2RzKCksICh1bnNpZ25lZCljbGlwX2RhdGEsCS8qIHNvdXJjZTogbm9ybWFsIG1lbW9yeSBhZGRyZXNzICovCi0JcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IsCS8qIHRhcmdldDogRE9TIGFkZHJlc3MgKHZpYSBzZWxlY3RvcikgKi8KLQlwcm90ZWN0ZWRfbW9kZV9vZmZzZXQsCQkvKiBub24temVybywgaWYgdXNpbmcgY2xpcF9zZWxfdHlwZSAqLwotCWNsaXBfZGF0YV9zaXplKTsJCS8qIGhvdyBtYW55IGJ5dGVzIHRvIGNvcHkgKi8KLQotICAgIC8qIFNlbmQgZGF0YSBmcm9tIHRoZSBET1MgdHJhbnNmZXIgYnVmZmVyIHRvIHRoZSBXaW5kb3dzIGNsaXBib2FyZC4KLSAgICAgKiBpbnQgMHgyZiwgQVggPSAweDE3MDMgc2VuZHMgU0k6Q1ggYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBidWZmZXIKLSAgICAgKiBhdCBFUzpCWCwgdG8gdGhlIGNsaXBib2FyZC4KLSAgICAgKi8KLSAgICBkcG1pX3JlZ3MueC5heCA9IDB4MTcwMzsJCQkvKiBzZW5kIGNsaXBib2FyZCBkYXRhICovCi0gICAgZHBtaV9yZWdzLnguZHggPSBjbGlwX2RhdGFfZm9ybWF0OwkJLyogZmxhZzogZm9ybWF0IG9mIHRoZSBkYXRhICovCi0gICAgZHBtaV9yZWdzLnguc2kgPSAoKHRvdGFsX3NpemUgPj4gMTYpCi0JICAgICYgMHgwMDAwZmZmZkwpOwkJCS8qIGhpIHdvcmQgb2YgZGF0YSBzaXplICovCi0gICAgZHBtaV9yZWdzLnguY3ggPSAodG90YWxfc2l6ZSAmIDB4MDAwMGZmZmZMKTsKLQkJCQkJCS8qIGxvIHdvcmQgb2YgZGF0YSBzaXplICovCi0gICAgZHBtaV9yZWdzLnguZXMgPSByZWFsX21vZGVfc2VnbWVudF9hZGRyZXNzOwkvKiBidWZmZXIgYWRkcmVzczogc2VnbWVudCAqLwotICAgIGRwbWlfcmVncy54LmJ4ID0gMDsJCQkJLyogYnVmZmVyIGFkZHJlc3M6IG9mZnNldCAqLwotICAgIGlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotICAgIHsKLQkvKiByZWFsLW1vZGUgaW50ZXJydXB0IGZhaWxlZC4gKi8KLQlGcmVlRE9TTWVtb3J5KHByb3RlY3RlZF9tb2RlX3NlbGVjdG9yKTsgICAvKiBjbGVhbiB1cCBET1MgbWVtb3J5ICovCi0JcmV0dXJuIEZBTFNFOwkJCQkgIC8qIGVhcmx5IGV4aXQgKi8KLSAgICB9Ci0KLSAgICAvKiBGcmVlIHRoZSBET1MgYnVmZmVyIGFuZCByZWxlYXNlIHRoZSBEUE1JIHByb3QtbW9kZSBzZWxlY3Rvci4gKi8KLSAgICBGcmVlRE9TTWVtb3J5KHByb3RlY3RlZF9tb2RlX3NlbGVjdG9yKTsJICAvKiBjbGVhbiB1cCBET1MgbWVtb3J5ICovCi0KLSAgICByZXR1cm4gVFJVRTsJLyogVFJVRSAtLT4gZGF0YSBzdWNjZXNzZnVsbHkgc2VudCB0byBjbGlwYm9hcmQgKi8KLX0KLQotI2VuZGlmCS8qIEZFQVRfQ0xJUEJPQVJEICovCi0jZW5kaWYgLyogREpHUFAgKi8KLQotLyogY29tbW9uIE1TLURPUyBhbmQgV2luMTYgY29kZSBmb2xsb3dzICovCi0KLSAgICBzdGF0aWMgaW50Ci12aW1fY2htb2QoY2hhcl91ICpuYW1lKQotewotICAgIGNoYXJfdQkqcDsKLSAgICBpbnQJCWY7Ci0gICAgaW50CQljID0gMDsKLQotICAgIC8qIGNobW9kKCkgY2FuJ3QgaGFuZGxlIGEgZmlsZSBuYW1lIHdpdGggYSB0cmFpbGluZyBzbGFzaCwgcmVtb3ZlIGl0LgotICAgICAqIEJ1dCBkb24ndCByZW1vdmUgaXQgZm9yICIvIiBvciAiYzovIi4gKi8KLSAgICBwID0gbmFtZSArIFNUUkxFTihuYW1lKTsKLSAgICBpZiAocCA+IG5hbWUpCi0JLS1wOwotICAgIGlmIChwID4gbmFtZSAmJiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpICYmIHBbLTFdICE9ICc6JykKLSAgICB7Ci0JYyA9ICpwOwkJCQkvKiByZW1vdmUgdHJhaWxpbmcgKGJhY2spc2xhc2ggKi8KLQkqcCA9IE5VTDsKLSAgICB9Ci0gICAgZWxzZQotCXAgPSBOVUxMOwotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoX19CT1JMQU5EQ19fID4gMHg0MTApCi0gICAgLyogdGhpcyBhbHNvIHNldHMgdGhlIGFyY2hpdmUgYml0LCBzdXBwb3J0ZWQgYnkgQm9ybGFuZCBDIDQuMCBhbmQgbGF0ZXIsCi0gICAgICogd2hlcmUgX19CT1JMQU5EQ19fIGlzIDB4NDUwICgzLjEgaXMgMHg0MTApICovCi0gICAgZiA9IF9ydGxfY2htb2QoKGNoYXIgKiluYW1lLCAwLCAwKTsKLSNlbHNlCi0gICAgZiA9IF9jaG1vZCgoY2hhciAqKW5hbWUsIDAsIDApOwotI2VuZGlmCi0gICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9IGM7CQkJCS8qIHB1dCBiYWNrIChiYWNrKXNsYXNoICovCi0gICAgcmV0dXJuIGY7Ci19Ci0KLS8qCi0gKiBnZXQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgJ25hbWUnCi0gKiBSZXR1cm5zIC0xIGZvciBlcnJvci4KLSAqIFJldHVybnMgRkFfYXR0cmlidXRlcyBkZWZpbmVkIGluIGRvcy5oCi0gKi8KLSAgICBsb25nCi1tY2hfZ2V0cGVybShjaGFyX3UgKm5hbWUpCi17Ci0gICAgcmV0dXJuIChsb25nKXZpbV9jaG1vZChuYW1lKTsJLyogZ2V0IGZpbGUgbW9kZSAqLwotfQotCi0vKgotICogc2V0IGZpbGUgcGVybWlzc2lvbiBmb3IgJ25hbWUnIHRvICdwZXJtJwotICoKLSAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKLSAqLwotICAgIGludAotbWNoX3NldHBlcm0oCi0gICAgY2hhcl91CSpuYW1lLAotICAgIGxvbmcJcGVybSkKLXsKLSAgICBwZXJtIHw9IEZBX0FSQ0g7CSAgICAvKiBmaWxlIGhhcyBjaGFuZ2VkLCBzZXQgYXJjaGl2ZSBiaXQgKi8KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+IDB4NDEwKQotICAgIHJldHVybiAoX3J0bF9jaG1vZCgoY2hhciAqKW5hbWUsIDEsIChpbnQpcGVybSkgPT0gLTEgPyBGQUlMIDogT0spOwotI2Vsc2UKLSAgICByZXR1cm4gKF9jaG1vZCgoY2hhciAqKW5hbWUsIDEsIChpbnQpcGVybSkgPT0gLTEgPyBGQUlMIDogT0spOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBTZXQgaGlkZGVuIGZsYWcgZm9yICJuYW1lIi4KLSAqLwotICAgIHZvaWQKLW1jaF9oaWRlKGNoYXJfdSAqbmFtZSkKLXsKLSAgICAvKiBET1MgNi4yIHNoYXJlLmV4ZSBjYXVzZXMgInNlZWsgZXJyb3Igb24gZmlsZSB3cml0ZSIgZXJyb3JzIHdoZW4gbWFraW5nCi0gICAgICogdGhlIHN3YXAgZmlsZSBoaWRkZW4uICBUaHVzIGRvbid0IGRvIGl0LiAqLwotfQotCi0vKgotICogcmV0dXJuIFRSVUUgaWYgIm5hbWUiIGlzIGEgZGlyZWN0b3J5Ci0gKiByZXR1cm4gRkFMU0UgaWYgIm5hbWUiIGlzIG5vdCBhIGRpcmVjdG9yeQotICogcmV0dXJuIEZBTFNFIGZvciBlcnJvcgotICoKLSAqIGJld2FyZSBvZiBhIHRyYWlsaW5nIChiYWNrKXNsYXNoCi0gKi8KLSAgICBpbnQKLW1jaF9pc2RpcihjaGFyX3UgKm5hbWUpCi17Ci0gICAgaW50CQlmOwotCi0gICAgZiA9IHZpbV9jaG1vZChuYW1lKTsKLSAgICBpZiAoZiA9PSAtMSkKLQlyZXR1cm4gRkFMU0U7CQkgICAgLyogZmlsZSBkb2VzIG5vdCBleGlzdCBhdCBhbGwgKi8KLSAgICBpZiAoKGYgJiBGQV9ESVJFQykgPT0gMCkKLQlyZXR1cm4gRkFMU0U7CQkgICAgLyogbm90IGEgZGlyZWN0b3J5ICovCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gMSBpZiAibmFtZSIgY2FuIGJlIGV4ZWN1dGVkLCAwIGlmIG5vdC4KLSAqIElmICJ1c2VfcGF0aCIgaXMgRkFMU0Ugb25seSBjaGVjayBpZiAibmFtZSIgaXMgZXhlY3V0YWJsZS4KLSAqIFJldHVybiAtMSBpZiB1bmtub3duLgotICovCi0gICAgaW50Ci1tY2hfY2FuX2V4ZSgKLSAgICBjaGFyX3UJKm5hbWUsCi0gICAgY2hhcl91CSoqcGF0aCwKLSAgICBpbnQJCXVzZV9wYXRoKQotewotICAgIGNoYXIJKnA7Ci0gICAgaW50CQltb2RlOwotCi0gICAgaWYgKCF1c2VfcGF0aCkKLSAgICB7Ci0JLyogVE9ETzogcHJvcGVyIGNoZWNrIGlmIGZpbGUgaXMgZXhlY3V0YWJsZS4gKi8KLQltb2RlID0gdmltX2NobW9kKG5hbWUpOwotCXJldHVybiBtb2RlICE9IC0xICYmIChtb2RlICYgRkFfRElSRUMpID09IDA7Ci0gICAgfQotICAgIHAgPSBzZWFyY2hwYXRoKG5hbWUpOwotICAgIGlmIChwID09IE5VTEwgfHwgbWNoX2lzZGlyKHApKQotCXJldHVybiBGQUxTRTsKLSAgICBpZiAocGF0aCAhPSBOVUxMKQotCSpwYXRoID0gdmltX3N0cnNhdmUocCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gKiBDaGVjayB3aGF0ICJuYW1lIiBpczoKLSAqIE5PREVfTk9STUFMOiBmaWxlIG9yIGRpcmVjdG9yeSAob3IgZG9lc24ndCBleGlzdCkKLSAqIE5PREVfV1JJVEFCTEU6IHdyaXRhYmxlIGRldmljZSwgc29ja2V0LCBmaWZvLCBldGMuCi0gKiBOT0RFX09USEVSOiBub24td3JpdGFibGUgdGhpbmdzCi0gKi8KLSAgICBpbnQKLW1jaF9ub2RldHlwZShjaGFyX3UgKm5hbWUpCi17Ci0gICAgaWYgKFNUUklDTVAobmFtZSwgIkFVWCIpID09IDAKLQkgICAgfHwgU1RSSUNNUChuYW1lLCAiQ09OIikgPT0gMAotCSAgICB8fCBTVFJJQ01QKG5hbWUsICJDTE9DSyQiKSA9PSAwCi0JICAgIHx8IFNUUklDTVAobmFtZSwgIk5VTCIpID09IDAKLQkgICAgfHwgU1RSSUNNUChuYW1lLCAiUFJOIikgPT0gMAotCSAgICB8fCAoKFNUUk5JQ01QKG5hbWUsICJDT00iLCAzKSA9PSAwCi0JCSAgICB8fCBTVFJOSUNNUChuYW1lLCAiTFBUIiwgMykgPT0gMCkKLQkJJiYgVklNX0lTRElHSVQobmFtZVszXSkKLQkJJiYgbmFtZVs0XSA9PSBOVUwpKQotCXJldHVybiBOT0RFX1dSSVRBQkxFOwotICAgIC8qIFRPRE86IE5PREVfT1RIRVI/ICovCi0gICAgcmV0dXJuIE5PREVfTk9STUFMOwotfQotCi0vKgotICogR2V0IG5hbWUgb2YgY3VycmVudCBkaXJlY3RvcnkgaW50byBidWZmZXIgJ2J1Zicgb2YgbGVuZ3RoICdsZW4nIGJ5dGVzLgotICogUmV0dXJuIE9LIGZvciBzdWNjZXNzLCBGQUlMIGZvciBmYWlsdXJlLgotICovCi0gICAgaW50Ci1tY2hfZGlybmFtZSgKLSAgICBjaGFyX3UJKmJ1ZiwKLSAgICBpbnQJCWxlbikKLXsKLSNpZmRlZiBESkdQUAotICAgIGlmIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgPT0gTlVMTCkKLQlyZXR1cm4gRkFJTDsKLSAgICAvKiB0dXJuIHRoZSAnLydzIHJldHVybmVkIGJ5IERKR1BQIGludG8gJ1wncyAqLwotICAgIHNsYXNoX2FkanVzdChidWYpOwotICAgIHJldHVybiBPSzsKLSNlbHNlCi0gICAgcmV0dXJuIChnZXRjd2QoKGNoYXIgKilidWYsIGxlbikgIT0gTlVMTCA/IE9LIDogRkFJTCk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIHRoaXMgdmVyc2lvbiBvZiByZW1vdmUgaXMgbm90IHNjYXJlZCBieSBhIHJlYWRvbmx5IChiYWNrdXApIGZpbGUKLSAqCi0gKiByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZSAoanVzdCBsaWtlIHJlbW92ZSgpKQotICovCi0gICAgaW50Ci1tY2hfcmVtb3ZlKGNoYXJfdSAqbmFtZSkKLXsKLSAgICAodm9pZCltY2hfc2V0cGVybShuYW1lLCAwKTsgICAgLyogZGVmYXVsdCBwZXJtaXNzaW9ucyAqLwotICAgIHJldHVybiB1bmxpbmsoKGNoYXIgKiluYW1lKTsKLX0KLQotLyoKLSAqIFNwZWNpYWwgdmVyc2lvbiBvZiBnZXRlbnYoKTogVXNlIHVwcGVyY2FzZSBuYW1lLgotICovCi0gICAgY2hhcl91ICoKLW1jaF9nZXRlbnYoY2hhcl91ICpuYW1lKQotewotICAgIGludAkJaTsKLSNkZWZpbmUgTUFYRU5WTEVOIDUwCi0gICAgY2hhcl91CXZhcl9jb3B5W01BWEVOVkxFTiArIDFdOwotICAgIGNoYXJfdQkqcDsKLSAgICBjaGFyX3UJKnJlczsKLQotICAgIC8qCi0gICAgICogVGFrZSBhIGNvcHkgb2YgdGhlIGFyZ3VtZW50LCBhbmQgZm9yY2UgaXQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgcGFzc2luZwotICAgICAqIHRvIGdldGVudigpLiAgT24gRE9TIHN5c3RlbXMsIGdldGVudigpIGRvZXNuJ3QgbGlrZSBsb3dlci1jYXNlIGFyZ3VtZW50Ci0gICAgICogKHVubGlrZSBXaW4zMiBldCBhbC4pICBJZiB0aGUgbmFtZSBpcyB0b28gbG9uZyB0byBmaXQgaW4gdmFyX2NvcHlbXQotICAgICAqIGFsbG9jYXRlIG1lbW9yeS4KLSAgICAgKi8KLSAgICBpZiAoKGkgPSBTVFJMRU4obmFtZSkpID4gTUFYRU5WTEVOKQotCXAgPSBhbGxvYyhpICsgMSk7Ci0gICAgZWxzZQotCXAgPSB2YXJfY29weTsKLSAgICBpZiAocCA9PSBOVUxMKQotCXAgPSBuYW1lOyAgIC8qIG91dCBvZiBtZW1vcnksIGZhbGwgYmFjayB0byB1bm1vZGlmaWVkIG5hbWUgKi8KLSAgICBlbHNlCi0gICAgewotCWZvciAoaSA9IDA7IG5hbWVbaV0gIT0gTlVMOyArK2kpCi0JICAgIHBbaV0gPSB0b3VwcGVyKG5hbWVbaV0pOwotCXBbaV0gPSBOVUw7Ci0gICAgfQotCi0gICAgcmVzID0gKGNoYXJfdSAqKWdldGVudigoY2hhciAqKXApOwotCi0gICAgaWYgKHAgIT0gdmFyX2NvcHkgJiYgcCAhPSBuYW1lKQotCXZpbV9mcmVlKHApOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqIEluc2VydCB1c2VyIG5hbWUgaW4gc1tsZW5dLgotICovCi0gICAgaW50Ci1tY2hfZ2V0X3VzZXJfbmFtZSgKLSAgICBjaGFyX3UJKnMsCi0gICAgaW50CQlsZW4pCi17Ci0gICAgKnMgPSBOVUw7Ci0gICAgcmV0dXJuIEZBSUw7Ci19Ci0KLS8qCi0gKiBJbnNlcnQgaG9zdCBuYW1lIGlzIHNbbGVuXS4KLSAqLwotICAgIHZvaWQKLW1jaF9nZXRfaG9zdF9uYW1lKAotICAgIGNoYXJfdQkqcywKLSAgICBpbnQJCWxlbikKLXsKLSNpZmRlZiBESkdQUAotICAgIHZpbV9zdHJuY3B5KHMsICJQQyAoMzIgYml0cyBWaW0pIiwgbGVuIC0gMSk7Ci0jZWxzZQotICAgIHZpbV9zdHJuY3B5KHMsICJQQyAoMTYgYml0cyBWaW0pIiwgbGVuIC0gMSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3NyYy9vc19tc2Rvcy5oIGIvc3JjL29zX21zZG9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWY0NzguLjAwMDAwMDAKLS0tIGEvc3JjL29zX21zZG9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKLSAqCi0gKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgotICoKLSAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgotICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCi0gKi8KLQotLyoKLSAqIE1TRE9TIE1hY2hpbmUtZGVwZW5kZW50IHRoaW5ncy4KLSAqLwotCi0jaW5jbHVkZSAib3NfZG9zLmgiCQkvKiBjb21tb24gTVMtRE9TIGFuZCBXaW4zMiBzdHVmZiAqLwotCi0jZGVmaW5lIEJJTkFSWV9GSUxFX0lPCi0jZGVmaW5lIFVTRV9FWEVfTkFNRQkJLyogdXNlIGFyZ3ZbMF0gZm9yICRWSU0gKi8KLSNkZWZpbmUgU1lOQ19EVVBfQ0xPU0UJCS8qIHN5bmMoKSBhIGZpbGUgd2l0aCBkdXAoKSBhbmQgY2xvc2UoKSAqLwotI2RlZmluZSBVU0VfVEVSTV9DT05TT0xFCi0jaWZkZWYgREpHUFAKLSMgaW5jbHVkZSA8ZmNudGwuaD4JCS8qIGRlZmluZXMgX1VTRV9MRk4gKi8KLSMgZGVmaW5lIFVTRV9MT05HX0ZOQU1FIF9VU0VfTEZOICAgIC8qIGRlY2lkZSBhdCBydW4gdGltZSAqLwotIyBkZWZpbmUgVVNFX0ZOQU1FX0NBU0UKLSMgZGVmaW5lIEhBVkVfUFVURU5WCi0jZWxzZQotIyBkZWZpbmUgU0hPUlRfRk5BTUUJCS8qIGFsd2F5cyA4LjMgZmlsZSBuYW1lICovCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI2RlZmluZSBIQVZFX1NUUklOR19ICi0jZGVmaW5lIEhBVkVfRkNOVExfSAotI2RlZmluZSBIQVZFX1NUUkNTUE4KLSNkZWZpbmUgSEFWRV9TVFJJQ01QCi0jZGVmaW5lIEhBVkVfU1RSRlRJTUUJCS8qIGd1ZXNzZWQgKi8KLSNkZWZpbmUgSEFWRV9TVFJOSUNNUAotI2RlZmluZSBIQVZFX01FTVNFVAotI2RlZmluZSBIQVZFX1FTT1JUCi0jZGVmaW5lIEhBVkVfU1RfTU9ERQkJLyogaGF2ZSBzdGF0LnN0X21vZGUgKi8KLSNkZWZpbmUgSEFWRV9NQVRIX0gKLSNpZiBkZWZpbmVkKF9fREFURV9fKSAmJiBkZWZpbmVkKF9fVElNRV9fKQotIyBkZWZpbmUgSEFWRV9EQVRFX1RJTUUKLSNlbmRpZgotI2RlZmluZSBCUkVBS0NIRUNLX1NLSVAJICAgIDEJLyogY2FsbCBtY2hfYnJlYWtjaGVjaygpIGVhY2ggdGltZSwgaXQncyBmYXN0ICovCi0jZGVmaW5lIEhBVkVfQVZBSUxfTUVNCi0KLS8qCi0gKiBCb3JsYW5kIEMrKyAzLjEgZG9lc24ndCBoYXZlIF9SVExFTlRSWUYKLSAqLwotI2lmZGVmIF9fQk9STEFORENfXwotIyBpZiBfX0JPUkxBTkRDX18gPCAweDQ1MAotIyAgZGVmaW5lIF9SVExFTlRSWUYKLSMgZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIEZOQU1FX0lMTEVHQUwgIlwiKj8+PHwiIC8qIGlsbGVnYWwgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZSAqLwotCi0vKiBjcHJvdG8gZmFpbHMgb24gbWlzc2luZyBpbmNsdWRlIGZpbGVzICovCi0jaWZuZGVmIFBST1RPCi0jIGluY2x1ZGUgPGRvcy5oPgotIyBpbmNsdWRlIDxkaXIuaD4KLSMgaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBESkdQUAotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZGVmaW5lIEhBVkVfTE9DQUxFX0gKLSMgZGVmaW5lIHNldGxvY2FsZShjLCBwKSAgICBkamdwcF9zZXRsb2NhbGUoKQotI2VuZGlmCi0KLSNpZm5kZWYgREpHUFAKLXR5cGVkZWYgbG9uZyBvZmZfdDsKLSNlbmRpZgotCi0vKgotICogVHJ5IHNldmVyYWwgZGlyZWN0b3JpZXMgdG8gcHV0IHRoZSB0ZW1wIGZpbGVzLgotICovCi0jZGVmaW5lIFRFTVBESVJOQU1FUwkiJFRNUCIsICIkVEVNUCIsICJjOlxcVE1QIiwgImM6XFxURU1QIiwgIiIKLSNkZWZpbmUgVEVNUE5BTUVMRU4JMTI4Ci0KLSNpZm5kZWYgREZMVF9NQVhNRU0KLSMgZGVmaW5lIERGTFRfTUFYTUVNCTI1NgkJLyogdXNlIHVwIHRvIDI1NktieXRlIGZvciBidWZmZXIgKi8KLSNlbmRpZgotI2lmbmRlZiBERkxUX01BWE1FTVRPVAotIyBkZWZpbmUgREZMVF9NQVhNRU1UT1QJMAkJLyogZGVjaWRlIGluIHNldF9pbml0ICovCi0jZW5kaWYKLQotI2lmZGVmIERKR1BQCi0jIGRlZmluZSBCQVNFTkFNRUxFTiAgKF9VU0VfTEZOPzI1MDo4KQkvKiBsZW5ndGggb2YgYmFzZSBvZiBmaWxlIG5hbWUgKi8KLSNlbHNlCi0jIGRlZmluZSBCQVNFTkFNRUxFTgkgICAgOAkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZSBuYW1lICovCi0jZW5kaWYKLQotLyogY29kZXMgZm9yIG1zZG9zIG1vdXNlIGV2ZW50ICovCi0jZGVmaW5lIE1TRE9TX01PVVNFX0xFRlQJMHgwMQotI2RlZmluZSBNU0RPU19NT1VTRV9SSUdIVAkweDAyCi0jZGVmaW5lIE1TRE9TX01PVVNFX01JRERMRQkweDA0Ci0KLSNpZmRlZiBESkdQUAotaW50IG1jaF9yZW5hbWUoY29uc3QgY2hhciAqT2xkRmlsZSwgY29uc3QgY2hhciAqTmV3RmlsZSk7Ci0jZWxzZQotIyBkZWZpbmUgbWNoX3JlbmFtZShzcmMsIGRzdCkgcmVuYW1lKHNyYywgZHN0KQotI2VuZGlmCi0KLSNpZmRlZiBESkdQUAotIyBkZWZpbmUgdmltX21rZGlyKHgsIHkpIG1rZGlyKChjaGFyICopKHgpLCB5KQotI2Vsc2UKLSMgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBta2RpcigoY2hhciAqKSh4KSkKLSNlbmRpZgotI2RlZmluZSBtY2hfcm1kaXIoeCkgcm1kaXIoKGNoYXIgKikoeCkpCi0KLSNkZWZpbmUgbWNoX3NldGVudihuYW1lLCB2YWwsIHgpIHNldGVudihuYW1lLCB2YWwsIHgpCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8uaCBiL3NyYy9wcm90by5oCmluZGV4IDg0M2Q0MjIuLjdlNDE4MGIgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by5oCisrKyBiL3NyYy9wcm90by5oCkBAIC0zOCw5ICszOCw2IEBACiAjIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKFZNUykKICMgIGluY2x1ZGUgIm9zX3VuaXgucHJvIgogIyBlbmRpZgotIyBpZiBkZWZpbmVkKE1TRE9TKQotIyAgaW5jbHVkZSAib3NfbXNkb3MucHJvIgotIyBlbmRpZgogIyBpZmRlZiBXSU4zMjY0CiAjICBpbmNsdWRlICJvc193aW4zMi5wcm8iCiAjICBpbmNsdWRlICJvc19tc3dpbi5wcm8iCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vb3NfbXNkb3MucHJvIGIvc3JjL3Byb3RvL29zX21zZG9zLnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzYTNjNy4uMDAwMDAwMAotLS0gYS9zcmMvcHJvdG8vb3NfbXNkb3MucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogb3NfbXNkb3MuYyAqLwotdm9pZCBtY2hfc2V0X25vcm1hbF9jb2xvcnModm9pZCk7Ci12b2lkIG1jaF91cGRhdGVfY3Vyc29yKHZvaWQpOwotbG9uZ191IG1jaF9hdmFpbF9tZW0oaW50IHNwZWNpYWwpOwotdm9pZCBtY2hfZGVsYXkobG9uZyBtc2VjLCBpbnQgaWdub3JlaW5wdXQpOwotdm9pZCBtY2hfd3JpdGUoY2hhcl91ICpzLCBpbnQgbGVuKTsKLWludCBtY2hfaW5jaGFyKGNoYXJfdSAqYnVmLCBpbnQgbWF4bGVuLCBsb25nIHRpbWUsIGludCB0Yl9jaGFuZ2VfY250KTsKLWludCBtY2hfY2hhcl9hdmFpbCh2b2lkKTsKLXZvaWQgbWNoX3N1c3BlbmQodm9pZCk7Ci12b2lkIG1jaF9pbml0KHZvaWQpOwotaW50IG1jaF9jaGVja193aW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKLWludCBtY2hfaW5wdXRfaXNhdHR5KHZvaWQpOwotdm9pZCBmbmFtZV9jYXNlKGNoYXJfdSAqbmFtZSwgaW50IGxlbik7Ci1sb25nIG1jaF9nZXRfcGlkKHZvaWQpOwotaW50IG1jaF9GdWxsTmFtZShjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmJ1ZiwgaW50IGxlbiwgaW50IGZvcmNlKTsKLXZvaWQgc2xhc2hfYWRqdXN0KGNoYXJfdSAqcCk7Ci1pbnQgbWNoX2lzRnVsbE5hbWUoY2hhcl91ICpmbmFtZSk7Ci12b2lkIG1jaF9lYXJseV9pbml0KHZvaWQpOwotdm9pZCBtY2hfZXhpdChpbnQgcik7Ci12b2lkIG1jaF9zZXR0bW9kZShpbnQgdG1vZGUpOwotdm9pZCBtY2hfc2V0bW91c2UoaW50IG9uKTsKLWludCBtY2hfc2NyZWVubW9kZShjaGFyX3UgKmFyZyk7Ci1pbnQgbWNoX2dldF9zaGVsbHNpemUodm9pZCk7Ci12b2lkIG1jaF9zZXRfc2hlbGxzaXplKHZvaWQpOwotdm9pZCBtY2hfbmV3X3NoZWxsc2l6ZSh2b2lkKTsKLXZvaWQgbWNoX2NoZWNrX2NvbHVtbnModm9pZCk7Ci1pbnQgbWNoX2NhbGxfc2hlbGwoY2hhcl91ICpjbWQsIGludCBvcHRpb25zKTsKLXZvaWQgbWNoX2JyZWFrY2hlY2sodm9pZCk7Ci1pbnQgbWNoX2hhc19leHBfd2lsZGNhcmQoY2hhcl91ICpwKTsKLWludCBtY2hfaGFzX3dpbGRjYXJkKGNoYXJfdSAqcCk7Ci1pbnQgbWNoX2NoZGlyKGNoYXIgKnBhdGgpOwotY2hhciAqZGpncHBfc2V0bG9jYWxlKHZvaWQpOwotaW50IGNsaXBfbWNoX293bl9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpOwotdm9pZCBjbGlwX21jaF9sb3NlX3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCk7Ci12b2lkIGNsaXBfbWNoX3JlcXVlc3Rfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKTsKLXZvaWQgY2xpcF9tY2hfc2V0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCk7Ci1sb25nIG1jaF9nZXRwZXJtKGNoYXJfdSAqbmFtZSk7Ci1pbnQgbWNoX3NldHBlcm0oY2hhcl91ICpuYW1lLCBsb25nIHBlcm0pOwotdm9pZCBtY2hfaGlkZShjaGFyX3UgKm5hbWUpOwotaW50IG1jaF9pc2RpcihjaGFyX3UgKm5hbWUpOwotaW50IG1jaF9jYW5fZXhlKGNoYXJfdSAqbmFtZSwgY2hhcl91ICoqcGF0aCwgaW50IHVzZV9wYXRoKTsKLWludCBtY2hfbm9kZXR5cGUoY2hhcl91ICpuYW1lKTsKLWludCBtY2hfZGlybmFtZShjaGFyX3UgKmJ1ZiwgaW50IGxlbik7Ci1pbnQgbWNoX3JlbW92ZShjaGFyX3UgKm5hbWUpOwotY2hhcl91ICptY2hfZ2V0ZW52KGNoYXJfdSAqbmFtZSk7Ci1pbnQgbWNoX2dldF91c2VyX25hbWUoY2hhcl91ICpzLCBpbnQgbGVuKTsKLXZvaWQgbWNoX2dldF9ob3N0X25hbWUoY2hhcl91ICpzLCBpbnQgbGVuKTsKLS8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3JlZ2V4cC5jIGIvc3JjL3JlZ2V4cC5jCmluZGV4IDllZDVjNzUuLmNkN2RjM2YgMTAwNjQ0Ci0tLSBhL3NyYy9yZWdleHAuYworKysgYi9zcmMvcmVnZXhwLmMKQEAgLTEzMzgsMTIgKzEzMzgsNiBAQAogICAgIGlmIChyZWcoUkVHX05PUEFSRU4sICZmbGFncykgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKIAotICAgIC8qIFNtYWxsIGVub3VnaCBmb3IgcG9pbnRlci1zdG9yYWdlIGNvbnZlbnRpb24/ICovCi0jaWZkZWYgU01BTExfTUFMTE9DCQkvKiAxNiBiaXQgc3RvcmFnZSBhbGxvY2F0aW9uICovCi0gICAgaWYgKHJlZ3NpemUgPj0gNjU1MzZMIC0gMjU2TCkKLQlFTVNHX1JFVF9OVUxMKF8oIkUzMzk6IFBhdHRlcm4gdG9vIGxvbmciKSk7Ci0jZW5kaWYKLQogICAgIC8qIEFsbG9jYXRlIHNwYWNlLiAqLwogICAgIHIgPSAoYnRfcmVncHJvZ19UICopbGFsbG9jKHNpemVvZihidF9yZWdwcm9nX1QpICsgcmVnc2l6ZSwgVFJVRSk7CiAgICAgaWYgKHIgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3NyYy9zY3JlZW4uYyBiL3NyYy9zY3JlZW4uYwppbmRleCBjN2I0NmVlLi5iMjkzODY5IDEwMDY0NAotLS0gYS9zcmMvc2NyZWVuLmMKKysrIGIvc3JjL3NjcmVlbi5jCkBAIC0zMTkxLDE1ICszMTkxLDEzIEBACiAJICAgIH0KIAl9CiAKLSNpZm5kZWYgTVNET1MKIAkvKiBDaGVjayBpZiB0aGUgY2hhcmFjdGVyIHVuZGVyIHRoZSBjdXJzb3Igc2hvdWxkIG5vdCBiZSBpbnZlcnRlZCAqLwogCWlmICghaGlnaGxpZ2h0X21hdGNoICYmIGxudW0gPT0gY3Vyd2luLT53X2N1cnNvci5sbnVtICYmIHdwID09IGN1cndpbgotIyBpZmRlZiBGRUFUX0dVSQorI2lmZGVmIEZFQVRfR1VJCiAJCSYmICFndWkuaW5fdXNlCi0jIGVuZGlmCisjZW5kaWYKIAkJKQogCSAgICBub2ludmN1ciA9IFRSVUU7Ci0jZW5kaWYKIAogCS8qIGlmIGludmVydGluZyBpbiB0aGlzIGxpbmUgc2V0IGFyZWFfaGlnaGxpZ2h0aW5nICovCiAJaWYgKGZyb21jb2wgPj0gMCkKQEAgLTkzNzksOCArOTM3Nyw4IEBACiAgICAgICogU2NyZWVuTGluZXNbXSB3aGVuIHRfQ1YgaXNuJ3QgZGVmaW5lZC4gIFRoYXQncyBmYXN0ZXIgdGhhbiB1c2luZwogICAgICAqIHdpbl9saW5lKCkuCiAgICAgICogRG9uJ3QgdXNlIGEgc2Nyb2xsIHJlZ2lvbiB3aGVuIHdlIGFyZSBnb2luZyB0byByZWRyYXcgdGhlIHRleHQsIHdyaXRpbmcKLSAgICAgKiBhIGNoYXJhY3RlciBpbiB0aGUgbG93ZXIgcmlnaHQgY29ybmVyIG9mIHRoZSBzY3JvbGwgcmVnaW9uIGNhdXNlcyBhCi0gICAgICogc2Nyb2xsLXVwIGluIHRoZSBESkdQUCB2ZXJzaW9uLgorICAgICAqIGEgY2hhcmFjdGVyIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjcm9sbCByZWdpb24gbWF5IGNhdXNlIGEKKyAgICAgKiBzY3JvbGwtdXAgLgogICAgICAqLwogICAgIGlmIChzY3JvbGxfcmVnaW9uCiAjaWZkZWYgRkVBVF9WRVJUU1BMSVQKZGlmZiAtLWdpdCBhL3NyYy9zdHJ1Y3RzLmggYi9zcmMvc3RydWN0cy5oCmluZGV4IGNmNWFlMmIuLmM0N2VlZjMgMTAwNjQ0Ci0tLSBhL3NyYy9zdHJ1Y3RzLmgKKysrIGIvc3JjL3N0cnVjdHMuaApAQCAtMTg0NSw5ICsxODQ1LDcgQEAKICNlbmRpZgogICAgIGludAkJYl9wX3JvOwkJLyogJ3JlYWRvbmx5JyAqLwogICAgIGxvbmcJYl9wX3N3OwkJLyogJ3NoaWZ0d2lkdGgnICovCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgaW50CQliX3Bfc247CQkvKiAnc2hvcnRuYW1lJyAqLwotI2VuZGlmCiAjaWZkZWYgRkVBVF9TTUFSVElOREVOVAogICAgIGludAkJYl9wX3NpOwkJLyogJ3NtYXJ0aW5kZW50JyAqLwogI2VuZGlmCkBAIC0xOTgzLDkgKzE5ODEsNyBAQAogCQkJCSAgIGFjY2VzcyBiX3NwZWxsIHdpdGhvdXQgI2lmZGVmLiAqLwogI2VuZGlmCiAKLSNpZm5kZWYgU0hPUlRfRk5BTUUKICAgICBpbnQJCWJfc2hvcnRuYW1lOwkvKiB0aGlzIGZpbGUgaGFzIGFuIDguMyBmaWxlIG5hbWUgKi8KLSNlbmRpZgogCiAjaWZkZWYgRkVBVF9NWlNDSEVNRQogICAgIHZvaWQJKmJfbXpzY2hlbWVfcmVmOyAvKiBUaGUgTXpTY2hlbWUgcmVmZXJlbmNlIHRvIHRoaXMgYnVmZmVyICovCmRpZmYgLS1naXQgYS9zcmMvc3ludGF4LmMgYi9zcmMvc3ludGF4LmMKaW5kZXggMmRkNTQ2NS4uYjM4NWQxYSAxMDA2NDQKLS0tIGEvc3JjL3N5bnRheC5jCisrKyBiL3NyYy9zeW50YXguYwpAQCAtODA1NSw3ICs4MDU1LDcgQEAKICAgICB2b2lkCiByZXN0b3JlX2N0ZXJtX2NvbG9ycyh2b2lkKQogewotI2lmIGRlZmluZWQoTVNET1MpIHx8IChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikpCisjaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCiAgICAgLyogU2luY2UgdF9tZSBoYXMgYmVlbiBzZXQsIHRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdXNlcgogICAgICAqIHdhbnRzIHRvIHVzZSB0aGlzIGFzIGRlZmF1bHQgY29sb3JzLiAgTmVlZCB0byByZXNldCBkZWZhdWx0CiAgICAgICogYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9ycy4gKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXJtLmMgYi9zcmMvdGVybS5jCmluZGV4IGIzOGE0MzYuLmE5N2ZlNTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXJtLmMKKysrIGIvc3JjL3Rlcm0uYwpAQCAtMTAsNyArMTAsNyBAQAogICoKICAqIHRlcm0uYzogZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgdGVybWluYWwKICAqCi0gKiBwcmltaXRpdmUgdGVybWNhcCBzdXBwb3J0IGZvciBBbWlnYSwgTVNET1MsIGFuZCBXaW4zMiBpbmNsdWRlZAorICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EgYW5kIFdpbjMyIGluY2x1ZGVkCiAgKgogICogTk9URTogcGFkZGluZyBhbmQgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBwZXJmb3JtZWQsCiAgKiB3aGVuIGNvbXBpbGluZyB3aXRob3V0IEhBVkVfVEdFVEVOVCwgd2UgdXNlIHRwdXRzKCkgYW5kIHRnb3RvKCkgZHVtbWllcy4KQEAgLTQyOCw3ICs0MjgsNyBAQAogIyAgZW5kaWYKICMgZW5kaWYKIAotIyBpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCisjIGlmIGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKIC8qCiAgKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgd2hlbiBuYW5zaS5zeXMgb3IgZXF1aXZhbGVudCBoYXMgYmVlbiBpbnN0YWxsZWQuCiAgKiBGdW5jdGlvbiBrZXlzIG9uIGEgUEMgYXJlIHByZWNlZGVkIHdpdGggYSBOVUwuIFRoZXNlIGFyZSBjb252ZXJ0ZWQgaW50bwpAQCAtNTEzLDEwNyArNTEzLDYgQEAKICAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKICMgZW5kaWYKIAotIyBpZiBkZWZpbmVkKE1TRE9TKQotLyoKLSAqIFRoZXNlIGNvZGVzIGFyZSB2YWxpZCBmb3IgdGhlIHBjIHZpZGVvLiAgVGhlIGVudHJpZXMgdGhhdCBzdGFydCB3aXRoIEVTQyB8Ci0gKiBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvbmlvIGNhbGxzIGluIG9zX21zZG9zLmMuIERlZmF1bHQgZm9yIE1TRE9TLgotICovCi0gICAgeyhpbnQpS1NfTkFNRSwJInBjdGVybSJ9LAotICAgIHsoaW50KUtTX0NFLAkiXDAzM3xLIn0sCi0gICAgeyhpbnQpS1NfQUwsCSJcMDMzfEwifSwKLSAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAotIyAgaWZkZWYgVEVSTUlORk8KLSAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwKLSMgICBpZmRlZiBGRUFUX1ZFUlRTUExJVAotICAgIHsoaW50KUtTX0NTViwJIlwwMzN8JWklcDElZDslcDIlZFYifSwKLSMgICBlbmRpZgotIyAgZWxzZQotICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVkOyVkciJ9LAotIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCi0gICAgeyhpbnQpS1NfQ1NWLAkiXDAzM3wlaSVkOyVkViJ9LAotIyAgIGVuZGlmCi0jICBlbmRpZgotICAgIHsoaW50KUtTX0NMLAkiXDAzM3xKIn0sCi0gICAgeyhpbnQpS1NfTUUsCSJcMDMzfDBtIn0sCS8qIG5vcm1hbCAqLwotICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JleSAqLwotICAgIHsoaW50KUtTX01ELAkiXDAzM3wxNW0ifSwJLyogYm9sZDogd2hpdGUgdGV4dCAqLwotICAgIHsoaW50KUtTX1NFLAkiXDAzM3wwbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KLSAgICB7KGludClLU19TTywJIlwwMzN8MzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCi0gICAgeyhpbnQpS1NfQ1pILAkiXDAzM3wyMjVtIn0sCS8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCi0gICAgeyhpbnQpS1NfQ1pSLAkiXDAzM3wwbSJ9LAkvKiBpdGFsaWMgbW9kZSBlbmQgKi8KLSAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwotICAgIHsoaW50KUtTX1VFLAkiXDAzM3wwbSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGUgZW5kICovCi0gICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCS8qIGFsbG93IDE2IGNvbG9ycyAqLwotIyAgaWZkZWYgVEVSTUlORk8KLSAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwotICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JXAxJWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCi0jICBlbHNlCi0gICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KLSAgICB7KGludClLU19DQUYsCSJcMDMzfCVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwotIyAgZW5kaWYKLSAgICB7KGludClLU19NUywJInkifSwKLSAgICB7KGludClLU19VVCwJInkifSwKLSAgICB7KGludClLU19MRSwJIlxiIn0sCi0jICBpZmRlZiBURVJNSU5GTwotICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVwMSVkOyVwMiVkSCJ9LAotIyAgZWxzZQotICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LAotIyAgZW5kaWYKLSNpZmRlZiBESkdQUAotICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCi0jZW5kaWYKLSAgICB7S19VUCwJCSJcMzE2SCJ9LAotICAgIHtLX0RPV04sCQkiXDMxNlAifSwKLSAgICB7S19MRUZULAkJIlwzMTZLIn0sCi0gICAge0tfUklHSFQsCQkiXDMxNk0ifSwKLSAgICB7S19TX0xFRlQsCQkiXDMxNnMifSwKLSAgICB7S19TX1JJR0hULAkJIlwzMTZ0In0sCi0gICAge0tfU19UQUIsCQkiXDMxNlwwMTcifSwKLSAgICB7S19GMSwJCSJcMzE2OyJ9LAotICAgIHtLX0YyLAkJIlwzMTY8In0sCi0gICAge0tfRjMsCQkiXDMxNj0ifSwKLSAgICB7S19GNCwJCSJcMzE2PiJ9LAotICAgIHtLX0Y1LAkJIlwzMTY/In0sCi0gICAge0tfRjYsCQkiXDMxNkAifSwKLSAgICB7S19GNywJCSJcMzE2QSJ9LAotICAgIHtLX0Y4LAkJIlwzMTZCIn0sCi0gICAge0tfRjksCQkiXDMxNkMifSwKLSAgICB7S19GMTAsCQkiXDMxNkQifSwKLSAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwKLSAgICB7S19GMTIsCQkiXDMxNlwyMDYifSwKLSAgICB7S19TX0YxLAkJIlwzMTZUIn0sCi0gICAge0tfU19GMiwJCSJcMzE2VSJ9LAotICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKLSAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCi0gICAge0tfU19GNSwJCSJcMzE2WCJ9LAotICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKLSAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCi0gICAge0tfU19GOCwJCSJcMzE2WyJ9LAotICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCi0gICAge0tfU19GMTAsCQkiXDMxNl0ifSwKLSAgICB7S19TX0YxMSwJCSJcMzE2XDIwNyJ9LAotICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCi0gICAge0tfSU5TLAkJIlwzMTZSIn0sCi0gICAge0tfREVMLAkJIlwzMTZTIn0sCi0gICAge0tfSE9NRSwJCSJcMzE2RyJ9LAotICAgIHtLX0VORCwJCSJcMzE2TyJ9LAotICAgIHtLX1BBR0VET1dOLAkiXDMxNlEifSwKLSAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKLSAgICB7S19LUExVUywJCSJcMzE2TiJ9LAotICAgIHtLX0tNSU5VUywJCSJcMzE2SiJ9LAotICAgIHtLX0tNVUxUSVBMWSwJIlwzMTY3In0sCi0gICAge0tfSzAsCQkiXDMxNlwzMzIifSwKLSAgICB7S19LMSwJCSJcMzE2XDMzNiJ9LAotICAgIHtLX0syLAkJIlwzMTZcMzQyIn0sCi0gICAge0tfSzMsCQkiXDMxNlwzNDYifSwKLSAgICB7S19LNCwJCSJcMzE2XDM1MiJ9LAotICAgIHtLX0s1LAkJIlwzMTZcMzU2In0sCi0gICAge0tfSzYsCQkiXDMxNlwzNjIifSwKLSAgICB7S19LNywJCSJcMzE2XDM2NiJ9LAotICAgIHtLX0s4LAkJIlwzMTZcMzcyIn0sCi0gICAge0tfSzksCQkiXDMxNlwzNzYifSwKLSMgZW5kaWYKLQogIyBpZiBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKIC8qCiAgKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgZm9yIHRoZSBXaW4zMiBDb25zb2xlIC4gIFRoZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aApAQCAtMTM2OSwxMCArMTI2OCw2IEBACiAjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJ3aW4zMiIKICNlbmRpZgogCi0jaWZkZWYgTVNET1MKLSMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInBjdGVybSIKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChfX01JTlRfXykKICMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImFuc2kiCiAjZW5kaWYKQEAgLTE5NzEsNyArMTg2Niw3IEBACiAJLyogdGVybWNhcCBmYWlsZWQgdG8gcmVwb3J0IHNpemUgKi8KIAkvKiBzZXQgZGVmYXVsdHMsIGluIGNhc2UgdWlfZ2V0X3NoZWxsc2l6ZSgpIGFsc28gZmFpbHMgKi8KIAl3aWR0aCA9IDgwOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAJaGVpZ2h0ID0gMjU7CSAgICAvKiBjb25zb2xlIGlzIG9mdGVuIDI1IGxpbmVzICovCiAjZWxzZQogCWhlaWdodCA9IDI0OwkgICAgLyogbW9zdCB0ZXJtaW5hbHMgYXJlIDI0IGxpbmVzICovCkBAIC00NDgyLDcgKzQzNzcsNyBAQAogCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NT1VTRSkKIAkgICAgewogCQkvKgotCQkgKiBGb3IgeHRlcm0gYW5kIE1TRE9TIHdlIGdldCAiPHRfbW91c2U+c2NyIiwgd2hlcmUKKwkJICogRm9yIHh0ZXJtIHdlIGdldCAiPHRfbW91c2U+c2NyIiwgd2hlcmUKIAkJICogIHMgPT0gZW5jb2RlZCBidXR0b24gc3RhdGU6CiAJCSAqCSAgIDB4MjAgPSBsZWZ0IGJ1dHRvbiBkb3duCiAJCSAqCSAgIDB4MjEgPSBtaWRkbGUgYnV0dG9uIGRvd24KQEAgLTQ2NDYsNyArNDU0MSw3IEBACiAjZW5kaWYKIAkgICAgKQogCXsKLSMgIGlmICFkZWZpbmVkKE1TV0lOKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGlmICFkZWZpbmVkKE1TV0lOKQogCQkvKgogCQkgKiBIYW5kbGUgbW91c2UgZXZlbnRzLgogCQkgKiBSZWNvZ25pemUgdGhlIHh0ZXJtIG1vdXNlIHdoZWVsLCBidXQgbm90IGluIHRoZSBHVUksIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL3VuZG8uYyBiL3NyYy91bmRvLmMKaW5kZXggMjdlMjIxOC4uMmJmODE1YiAxMDA2NDQKLS0tIGEvc3JjL3VuZG8uYworKysgYi9zcmMvdW5kby5jCkBAIC02NDEsOSArNjQxLDkgQEAKIAl1X2dldGJvdCgpOwogICAgIH0KIAotI2lmICFkZWZpbmVkKFVOSVgpICYmICFkZWZpbmVkKERKR1BQKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19FTVhfXykKKyNpZiAhZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19FTVhfXykKIAkvKgotCSAqIFdpdGggQW1pZ2EgYW5kIE1TRE9TIDE2IGJpdCB3ZSBjYW4ndCBoYW5kbGUgYmlnIHVuZG8ncywgYmVjYXVzZQorCSAqIFdpdGggQW1pZ2Egd2UgY2FuJ3QgaGFuZGxlIGJpZyB1bmRvJ3MsIGJlY2F1c2UKIAkgKiB0aGVuIHVfYWxsb2NfbGluZSB3b3VsZCBoYXZlIHRvIGFsbG9jYXRlIGEgYmxvY2sgbGFyZ2VyIHRoYW4gMzJLCiAJICovCiAgICAgaWYgKHNpemUgPj0gODAwMCkKZGlmZiAtLWdpdCBhL3NyYy91bmluc3RhbC5jIGIvc3JjL3VuaW5zdGFsLmMKaW5kZXggMDUzMmViOS4uNzlmNmVmNiAxMDA2NDQKLS0tIGEvc3JjL3VuaW5zdGFsLmMKKysrIGIvc3JjL3VuaW5zdGFsLmMKQEAgLTI4OSw0MSArMjg5LDcgQEAKICAgICBzdGF0aWMgdm9pZAogZGVsZXRlX3VuaW5zdGFsbF9rZXkodm9pZCkKIHsKLSNpZmRlZiBXSU4zMjY0CiAgICAgcmVnX2RlbGV0ZV9rZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXFVuaW5zdGFsbFxcVmltICIgVklNX1ZFUlNJT05fU0hPUlQpOwotI2Vsc2UKLSAgICBGSUxFCSpmZDsKLSAgICBjaGFyCWJ1ZltCVUZTSVpFXTsKLQotICAgIC8qCi0gICAgICogT24gREpHUFAgd2UgZGVsZXRlIHJlZ2lzdHJ5IGVudHJpZXMgYnkgY3JlYXRpbmcgYSAuaW5mIGZpbGUgYW5kCi0gICAgICogaW5zdGFsbGluZyBpdC4KLSAgICAgKi8KLSAgICBmZCA9IGZvcGVuKCJ2aW0uaW5mIiwgInciKTsKLSAgICBpZiAoZmQgIT0gTlVMTCkKLSAgICB7Ci0JZnByaW50ZihmZCwgIlt2ZXJzaW9uXVxuIik7Ci0JZnByaW50ZihmZCwgInNpZ25hdHVyZT1cIiRDSElDQUdPJFwiXG5cbiIpOwotCWZwcmludGYoZmQsICJbRGVmYXVsdEluc3RhbGxdXG4iKTsKLQlmcHJpbnRmKGZkLCAiRGVsUmVnPURlbGV0ZU1lXG5cbiIpOwotCWZwcmludGYoZmQsICJbRGVsZXRlTWVdXG4iKTsKLQlmcHJpbnRmKGZkLCAiSEtMTSxcIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXFZpbSAiIFZJTV9WRVJTSU9OX1NIT1JUICJcIlxuIik7Ci0JZmNsb3NlKGZkKTsKLQotCS8qIERvbid0IGtub3cgaG93IHRvIGRldGVjdCBXaW4gTlQgd2l0aCBESkdQUC4gIEhhY2s6IEp1c3QgdHJ5IHRoZSBXaW4KLQkgKiA5NS85OC9NRSBtZXRob2QsIHNpbmNlIHRoZSBESkdQUCB2ZXJzaW9uIGNhbid0IHVzZSBsb25nIGZpbGVuYW1lcwotCSAqIG9uIFdpbiBOVCBhbnl3YXkuICovCi0Jc3ByaW50ZihidWYsICJydW5kbGwgc2V0dXB4LmRsbCxJbnN0YWxsSGluZlNlY3Rpb24gRGVmYXVsdEluc3RhbGwgMTMyICVzXFx2aW0uaW5mIiwgaW5zdGFsbGRpcik7Ci0JcnVuX2NvbW1hbmQoYnVmKTsKLSNpZiAwCi0JLyogV2luZG93cyBOVCBtZXRob2QgKHVudGVzdGVkKS4gKi8KLQlzcHJpbnRmKGJ1ZiwgInJ1bmRsbDMyIHN5c3NldHVwLFNldHVwSW5mT2JqZWN0SW5zdGFsbEFjdGlvbiBEZWZhdWx0SW5zdGFsbCAxMjggJXNcXHZpbS5pbmYiLCBpbnN0YWxsZGlyKTsKLQlydW5fY29tbWFuZChidWYpOwotI2VuZGlmCi0KLQlyZW1vdmUoInZpbS5pbmYiKTsKLSAgICB9Ci0jZW5kaWYKIH0KIAogICAgIGludApkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uYyBiL3NyYy92ZXJzaW9uLmMKaW5kZXggYzIzZGI4Mi4uZTgyMjYxOSAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uYworKysgYi9zcmMvdmVyc2lvbi5jCkBAIC03NDksNiArNzQ5LDggQEAKIHN0YXRpYyBpbnQgaW5jbHVkZWRfcGF0Y2hlc1tdID0KIHsgICAvKiBBZGQgbmV3IHBhdGNoIG51bWJlciBiZWxvdyB0aGlzIGxpbmUgKi8KIC8qKi8KKyAgICAxMzk5LAorLyoqLwogICAgIDEzOTgsCiAvKiovCiAgICAgMTM5NywKQEAgLTM3MDksMTMgKzM3MTEsNiBAQAogIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgotI2lmZGVmIE1TRE9TCi0jIGlmZGVmIERKR1BQCi0gICAgTVNHX1BVVFMoXygiXG4zMi1iaXQgTVMtRE9TIHZlcnNpb24iKSk7Ci0jIGVsc2UKLSAgICBNU0dfUFVUUyhfKCJcbjE2LWJpdCBNUy1ET1MgdmVyc2lvbiIpKTsKLSMgZW5kaWYKLSNlbmRpZgogI2lmZGVmIE1BQ09TCiAjIGlmZGVmIE1BQ09TX1gKICMgIGlmZGVmIE1BQ09TX1hfVU5JWApkaWZmIC0tZ2l0IGEvc3JjL3ZpbS5oIGIvc3JjL3ZpbS5oCmluZGV4IDdhN2E3NTguLjQxNTY2NzEgMTAwNjQ0Ci0tLSBhL3NyYy92aW0uaAorKysgYi9zcmMvdmltLmgKQEAgLTI3LDggKzI3LDcgQEAKICMgZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIFwKLQl8fCBkZWZpbmVkKF9fRU1YX18pCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQoX19FTVhfXykKICMgaW5jbHVkZSAidmltaW8uaCIKICNlbmRpZgogCkBAIC0xNjQsMjEgKzE2Myw2IEBACiAjaWZkZWYgV0lOMzI2NAogIyBkZWZpbmUgVklNX1NJWkVPRl9JTlQgNAogI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgaWZkZWYgREpHUFAKLSMgIGlmbmRlZiBGRUFUX0dVSV9HVEsJCS8qIGF2b2lkIHByb2JsZW1zIHdoZW4gZ2VuZXJhdGluZyBwcm90b3R5cGVzICovCi0jICAgZGVmaW5lIFZJTV9TSVpFT0ZfSU5UIDQJLyogMzIgYml0IGludHMgKi8KLSMgIGVuZGlmCi0jICBkZWZpbmUgRE9TMzIKLSMgIGRlZmluZSBGRUFUX0NMSVBCT0FSRAotIyBlbHNlCi0jICBpZm5kZWYgRkVBVF9HVUlfR1RLCQkvKiBhdm9pZCBwcm9ibGVtcyB3aGVuIGdlbmVyYXRpbmcgcHJvdG90eXBlcyAqLwotIyAgIGRlZmluZSBWSU1fU0laRU9GX0lOVCAyCS8qIDE2IGJpdCBpbnRzICovCi0jICBlbmRpZgotIyAgZGVmaW5lIFNNQUxMX01BTExPQwkJLyogMTYgYml0IHN0b3JhZ2UgYWxsb2NhdGlvbiAqLwotIyAgZGVmaW5lIERPUzE2Ci0jIGVuZGlmCi0jZW5kaWYKIAogI2lmZGVmIEFNSUdBCiAgIC8qIEJlIGNvbnNlcnZhdGl2ZSBhYm91dCBzaXplb2YoaW50KS4gSXQgY291bGQgYmUgNCB0b28uICovCkBAIC0zMDMsMTAgKzI4Nyw2IEBACiAjIGluY2x1ZGUgIm9zX2FtaWdhLmgiCiAjZW5kaWYKIAotI2lmZGVmIE1TRE9TCi0jIGluY2x1ZGUgIm9zX21zZG9zLmgiCi0jZW5kaWYKLQogI2lmZGVmIFdJTjMyNjQKICMgaW5jbHVkZSAib3Nfd2luMzIuaCIKICNlbmRpZgpAQCAtNDYyLDExICs0NDIsMTEgQEAKICNpZmRlZiBfRENDCiAjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjZW5kaWYKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoSEFWRV9FUlJOT19IKSB8fCBkZWZpbmVkKERKR1BQKSBcCisjaWYgZGVmaW5lZChIQVZFX0VSUk5PX0gpIFwKIAl8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkgfHwgZGVmaW5lZChfX0VNWF9fKQogIyBpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvd2luZG93LmMgYi9zcmMvd2luZG93LmMKaW5kZXggYWUxNzY2MC4uZWU2OTkyMSAxMDA2NDQKLS0tIGEvc3JjL3dpbmRvdy5jCisrKyBiL3NyYy93aW5kb3cuYwpAQCAtNjQzOCw3ICs2NDM4LDcgQEAKIAkvKiBzb21ldGhpbmcgZmFpbGVkOyB1c2UgdGhlIGZpbGUgbmFtZSAodHJ1bmNhdGUgd2hlbiB0b28gbG9uZykgKi8KIAl2aW1fc3RybmNweShidWYsIGZuYW1lLCBsZW4gLSAxKTsKICAgICB9Ci0jaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKSB8fCBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykgfHwgZGVmaW5lZChNU1dJTikKICAgICBzbGFzaF9hZGp1c3QoYnVmKTsKICNlbmRpZgogICAgIHJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9zcmMveHhkL01ha2VfYmMzLm1hayBiL3NyYy94eGQvTWFrZV9iYzMubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWUyNTIxLi4wMDAwMDAwCi0tLSBhL3NyYy94eGQvTWFrZV9iYzMubWFrCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBTaW1wbGUgbWFrZWZpbGUgZm9yIEJvcmxhbmQgQysrIDQuMAotIyAzLjEgY2FuIE5PVCBiZSB1c2VkLCBpdCBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgZmlsZW5vKCkgZGVmaW5lLgotCi0jIENvbW1hbmQgbGluZSB2YXJpYWJsZXM6Ci0jIEJPUgkJcGF0aCB0byByb290IG9mIEJvcmxhbmQgQyAoRTpcQk9STEFOREMpCi0jIERFQlVHCQlzZXQgdG8gInllcyIgZm9yIGRlYnVnZ2luZyAobm8pCi0KLSFpZm5kZWYgQk9SCi1CT1IJPSBlOlxiYzQKLSFlbmRpZgotCi0haWYgKCIkKERFQlVHKSIgPT0gInllcyIpCi1ERUJVR19GTEFHID0gLXYgLURERUJVRwotIWVsc2UKLURFQlVHX0ZMQUcgPQotIWVuZGlmCi0KLUNDCT0gJChCT1IpXGJpblxiY2MKLUlOQwk9IC1JJChCT1IpXGluY2x1ZGUKLUxJQgk9IC1MJChCT1IpXGxpYgotCi0jIFRoZSBmb2xsb3dpbmcgY29tcGlsZSBvcHRpb25zIGNhbiBiZSBjaGFuZ2VkIGZvciBiZXR0ZXIgbWFjaGluZXMuCi0jCXJlcGxhY2UgLTEtIHdpdGggLTIgdG8gcHJvZHVjZSBjb2RlIGZvciBhIDgwMjg2IG9yIGhpZ2hlcgotIwlyZXBsYWNlIC0xLSB3aXRoIC0zIHRvIHByb2R1Y2UgY29kZSBmb3IgYSA4MDM4NiBvciBoaWdoZXIKLSMJYWRkIC12IGZvciBzb3VyY2UgZGVidWdnaW5nCi1PUFRJTUlaRT0gLTEtIC1PeAotCi1DRkxBR1MJPSAtQSAtbWMgLURNU0RPUyAkKERFQlVHX0ZMQUcpICQoT1BUSU1JWkUpICQoSU5DKSAkKExJQikKLQoteHhkLmV4ZTogeHhkLmMKLQkkKENDKSAkKENGTEFHUykgeHhkLmMKZGlmZiAtLWdpdCBhL3NyYy94eGQvTWFrZV9kamcubWFrIGIvc3JjL3h4ZC9NYWtlX2RqZy5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZWVkMzEuLjAwMDAwMDAKLS0tIGEvc3JjL3h4ZC9NYWtlX2RqZy5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgVGhlIG1vc3Qgc2ltcGxpc3RpYyBNYWtlZmlsZSwgZm9yIERKR1BQIG9uIE1TLURPUwotCi1DRkxBR1MgPSAtTzIgLVdhbGwKLQoteHhkLmV4ZTogeHhkLmMKLQlnY2MgJChDRkxBR1MpIC1zIC1vIHh4ZC5leGUgeHhkLmMgLWxwYwotCi1jbGVhbjoKLQlkZWwgeHhkLmV4ZQo=